{"title":"Tofu \u0026 Soy Products","description":"\u003cdiv style=\"max-width:940px;margin:8px auto 16px;line-height:1.6;text-align:center;\"\u003e\u003cp\u003eTofu and soy essentials — silken and firm tofu, tofu skin, tofu puff, yuba and edamame. See all vegetables: \u003ca href=\"\/collections\/vegetables\"\u003eVegetables\u003c\/a\u003e.\u003c\/p\u003e\u003c\/div\u003e","products":[{"product_id":"fresh-ever-green-smooth-tofu-approximately-300g","title":"Ever Green Silken Tofu, 300g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;\"\u003e\n  \u003ch1 style=\"margin:0;font-size:26px;font-weight:800;\"\u003eEver Green Silken Tofu, 300g\u003c\/h1\u003e\n  \u003cp style=\"margin:8px 0 0;color:#334155;\"\u003eUltra-smooth, custard-soft tofu that slips into cold dishes, soups, and delicate steam-custards. Neutral, clean soy flavour; effortlessly versatile.\u003c\/p\u003e\n  \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_88ccd9e0-4500-40e8-a68b-648493d9b7b1.jpg?v=1745982966\" alt=\"Ever Green Silken Tofu 300g\" style=\"width:100%;max-height:360px;object-fit:cover;border-radius:12px;margin-top:12px;\"\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;\"\u003e\n    \u003cli\u003eFeathery, spoon-tender texture that’s perfect for chilled plates and light broths.\u003c\/li\u003e\n    \u003cli\u003ePlant-powered protein with a clean, refreshing taste.\u003c\/li\u003e\n    \u003cli\u003eReady in minutes — no pressing needed; minimal prep, maximum silk.\u003c\/li\u003e\n    \u003cli\u003ePlays well with soy, sesame, ginger, vinegar, and gentle heat.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 14px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;\"\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eChilled soy–sesame tofu with spring onion \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLight \u0026amp; fresh\u003c\/span\u003e\n\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eSpoon over a block, drizzle with \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e and a few drops of \u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\"\u003esesame oil\u003c\/a\u003e, then top with finely sliced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003espring onion\u003c\/a\u003e and grated ginger. Ready in 1–2 minutes.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eSilken tofu + enoki in a light broth\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eSimmer tofu cubes and \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eenoki\u003c\/a\u003e in a gentle stock made with \u003ca href=\"\/products\/cygnet-clear-soup-hot-pot-base-200g-mild-chinese-shabu-shabu-broth-seasoning\"\u003eclear soup base\u003c\/a\u003e for 2–4 minutes. Finish with a pinch of white pepper and a few drops of sesame oil.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eSteamed egg \u0026amp; tofu custard with prawns\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eBlend silken tofu with beaten \u003ca href=\"\/products\/pace-farm-free-range-eggs-12-extra-large-700g\"\u003eeggs\u003c\/a\u003e, season lightly, pour into a shallow dish, and top with chopped \u003ca href=\"\/products\/australian-raw-king-prawns-peeled-tail-on-flash-frozen-700g\"\u003eking prawns\u003c\/a\u003e. Steam gently 10–12 minutes until just set; splash with soy and sesame oil.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eSpicy soy–vinegar tofu bowl\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eWhisk \u003ca href=\"\/products\/dl-black-soybean-brewed-light-soy-sauce-480ml-limited-import\"\u003elight soy\u003c\/a\u003e with a splash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e and a spoon of \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003echili crisp\u003c\/a\u003e. Spoon over tofu; add spring onion and toasted sesame seeds.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;\"\u003e\n    \u003cli\u003eOpen and drain gently; for neat cubes, slice in the pack then slide out.\u003c\/li\u003e\n    \u003cli\u003eAvoid vigorous stirring — use a spoon to lift and nudge; add sauces at the end.\u003c\/li\u003e\n    \u003cli\u003eFor warm dishes, slip tofu into barely simmering broth for 2–4 minutes to heat through without breaking.\u003c\/li\u003e\n    \u003cli\u003eThicken sauces separately (cornstarch slurry) before pouring over the tofu to keep textures silky.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;\"\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eHengshun Zhenjiang Aromatic Vinegar 550ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eLee Kum Kee Pure Sesame Oil 207ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003eShallot Bunch (spring onion)\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eEnoki Mushrooms\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\"\u003eEvergreen Yangchun Noodles 500g\u003c\/a\u003e\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;\"\u003e\n    \u003ca href=\"\/products\/fresh-ever-green-chinese-style-tofu-approximately-500g\" style=\"display:block;border:1px solid #e2e8f0;border-radius:12px;padding:12px;color:inherit;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eEver Green Classic Tofu, 500g\u003c\/div\u003e\n      \u003cdiv style=\"color:#64748b;font-size:13px;\"\u003eEveryday block tofu for stir-fries\u003c\/div\u003e\n    \u003c\/a\u003e\n    \u003ca href=\"\/products\/fresh-ever-green-aged-tofu-approximately-900g\" style=\"display:block;border:1px solid #e2e8f0;border-radius:12px;padding:12px;color:inherit;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eEver Green Traditional Firm Tofu, 900g\u003c\/div\u003e\n      \u003cdiv style=\"color:#64748b;font-size:13px;\"\u003eHearty, braise-friendly texture\u003c\/div\u003e\n    \u003c\/a\u003e\n    \u003ca href=\"\/products\/fresh-ever-green-tofu-puffs-approximately-150g\" style=\"display:block;border:1px solid #e2e8f0;border-radius:12px;padding:12px;color:inherit;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eEver Green Fried Tofu Puffs 150g\u003c\/div\u003e\n      \u003cdiv style=\"color:#64748b;font-size:13px;\"\u003eGreat for hotpot and curry\u003c\/div\u003e\n    \u003c\/a\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"margin-top:12px;\"\u003e\n    \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;\"\u003eExplore all tofu \u0026amp; soy products →\u003c\/a\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151479386399,"sku":"A9323536580015","price":2.69,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_88ccd9e0-4500-40e8-a68b-648493d9b7b1.jpg?v=1745982966"},{"product_id":"fresh-ever-green-tofu-approximately-900g","title":"Ever Green Original Tofu - Regular Firm 900g - Limited 1 PP","description":"\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\u003cdiv id=\"umall-desc\" style=\"--brand: #DB3A35; max-width: 860px; margin: 0 auto; padding: 16px;\"\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px;\"\u003e\n\u003ch2 style=\"margin: 0 0 6px; font-size: 22px; font-weight: 800; color: #0f172a;\"\u003eEver Green Tofu 900g\u003c\/h2\u003e\n\u003cdiv style=\"color: #64748b; font-size: 14px;\"\u003eAlso known as bean curd\u003c\/div\u003e\n\u003cdiv style=\"color: #64748b; font-size: 14px;\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv style=\"color: #64748b; font-size: 14px;\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cspan\u003eLimit 1 per customer. Not valid with multi-buy discounts.\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 10px; font-size: 18px; font-weight: bold;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n\u003cul style=\"margin: 8px 0 0 18px; color: #334155; font-size: 14px; line-height: 1.6;\"\u003e\n\u003cli\u003eMild, clean flavor that soaks up sauces and aromatics beautifully.\u003c\/li\u003e\n\u003cli\u003eGenerous 900g block—perfect for family meals, meal prep, or hot pot.\u003c\/li\u003e\n\u003cli\u003eVersatile texture for steaming, pan-searing, stir-frying, braising, or soup.\u003c\/li\u003e\n\u003cli\u003ePlant-based protein that works in both classic Asian dishes and modern bowls.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 10px; font-size: 18px; font-weight: bold;\"\u003eHow to enjoy\u003c\/h3\u003e\n\u003cdiv style=\"display: grid; gap: 14px;\"\u003e\n\u003cdiv\u003e\n\u003ch4 style=\"margin: 0 0 4px; font-size: 16px; font-weight: bold; color: #111827;\"\u003eSteamed tofu with soy-scallion dressing \u003cspan style=\"display: inline-flex; align-items: center; border: 1px solid rgba(219,58,53,.2); color: var(--brand); background: rgba(219,58,53,.08); border-radius: 999px; padding: 2px 8px; font-size: 12px; font-weight: 600; margin-left: 8px;\"\u003eLow‑calorie\u003c\/span\u003e\n\u003c\/h4\u003e\n\u003cp style=\"margin: 0; color: #334155; font-size: 14px;\"\u003eSteam thick slices, then spoon over a light mix of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy sauce\u003c\/a\u003e and finely sliced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003espring onions\u003c\/a\u003e. Finish with a few drops of sesame oil (optional).\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003ch4 style=\"margin: 0 0 4px; font-size: 16px; font-weight: bold; color: #111827;\"\u003eWeeknight tofu and broccoli stir-fry\u003c\/h4\u003e\n\u003cp style=\"margin: 0; color: #334155; font-size: 14px;\"\u003ePan-sear tofu cubes until golden, toss with \u003ca href=\"\/products\/fresh-broccoli-approximately-900g-1000g\"\u003ebroccoli\u003c\/a\u003e, garlic, and a splash of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e. Stir-fry on high for 3–5 minutes.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003ch4 style=\"margin: 0 0 4px; font-size: 16px; font-weight: bold; color: #111827;\"\u003eQuick mapo tofu (home‑style)\u003c\/h4\u003e\n\u003cp style=\"margin: 0; color: #334155; font-size: 14px;\"\u003eSimmer tofu in a fragrant sauce of \u003ca href=\"\/products\/congbanlv-doubanjiang-broad-bean-chilli-paste-450g-sichuan-fermented-soybean-sauce\"\u003edoubanjiang\u003c\/a\u003e, garlic, and a little \u003ca href=\"\/products\/borrowdale-free-range-pork-mince-500g-frozen\"\u003epork mince\u003c\/a\u003e. Finish with a drizzle of \u003ca href=\"\/products\/chuan-lao-hui-sichuan-pepper-oil-210ml\"\u003eSichuan pepper oil\u003c\/a\u003e.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003ch4 style=\"margin: 0 0 4px; font-size: 16px; font-weight: bold; color: #111827;\"\u003eTomato hot pot with tofu and mushrooms\u003c\/h4\u003e\n\u003cp style=\"margin: 0; color: #334155; font-size: 14px;\"\u003eDrop chunky tofu into a bubbling \u003ca href=\"\/products\/haidilao-tomato-hot-pot-base-200g\"\u003etomato hot pot base\u003c\/a\u003e with \u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eshimeji\u003c\/a\u003e and \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e for a cozy, crowd-pleasing meal.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 10px; font-size: 18px; font-weight: bold;\"\u003ePrep Tips\u003c\/h3\u003e\n\u003cul style=\"margin: 8px 0 0 18px; color: #334155; font-size: 14px; line-height: 1.6;\"\u003e\n\u003cli\u003eFor extra-crispy edges in stir-fries, pat dry and dust lightly with cornstarch before pan-searing.\u003c\/li\u003e\n\u003cli\u003eCut to match the method: large slabs for steaming, 2–3 cm cubes for stir-fries and braises.\u003c\/li\u003e\n\u003cli\u003ePre-sear tofu in a hot pan 2–4 minutes per side to lock in texture, then add sauces.\u003c\/li\u003e\n\u003cli\u003eAdd tofu towards the end of soup\/hot pot and simmer gently to avoid breaking.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 10px; font-size: 18px; font-weight: bold;\"\u003ePairs well\u003c\/h3\u003e\n\u003cul style=\"margin: 8px 0 0 18px; color: #334155; font-size: 14px; line-height: 1.8;\"\u003e\n\u003cli\u003e\u003ca href=\"\/products\/kikkoman-all-purpose-soy-sauce-1-6l\"\u003eKikkoman All‑Purpose Soy Sauce\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eLee Kum Kee Pure Sesame Oil\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003eCrispy Chili Oil with Peanuts\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-1000g\"\u003eJiangxi Rice Noodles (1kg)\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eShiitake Mushrooms\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\"\u003eSnow Pea Sprouts\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 10px; font-size: 18px; font-weight: bold;\"\u003eMore in this category\u003c\/h3\u003e\n\u003cul style=\"margin: 8px 0 10px 18px; color: #334155; font-size: 14px; line-height: 1.8;\"\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-smooth-tofu-approximately-300g\"\u003eEver Green Silken Tofu, 300g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-brick-dried-tofu-approximately-650g\"\u003eEver Green Hard Tofu, 650g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-tofu-puffs-approximately-150g\"\u003eEver Green Fried Tofu Puffs 150g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-dried-tofu-4-pieces-approximately-400g\"\u003eEver Green Dried Tofu – 4 Pieces, 400g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/ever-green-fresh-regular-tofu-900g\"\u003eEver Green Fresh Regular Tofu – 900g\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp style=\"margin: 0; color: #334155; font-size: 14px;\"\u003e\u003ca href=\"\/collections\/tofu-soy-products\"\u003eBrowse all Tofu \u0026amp; Soy Products →\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 8px; font-size: 18px; font-weight: bold;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin: 6px 0 10px; color: #334155; font-size: 14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; border: 1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align: left; padding: 10px; border-right: 1px solid #e5e7eb; background: #f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align: left; padding: 10px; background: #f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 12px; border-top: 1px solid #e5e7eb; border-right: 1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding: 12px; border-top: 1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\n\u003cul style=\"margin: 6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color: #a9a9a9; font-size: 12px; margin: 10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color: #db3a35; text-decoration: underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin: 8px 0 0; color: #334155; font-size: 14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color: #db3a35; text-decoration: underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003csection style=\"border: 1px solid #e2e8f0; background: #fff; border-radius: 16px; padding: 20px; margin-top: 16px;\"\u003e\n\u003ch3 style=\"margin: 0 0 8px; font-size: 18px; font-weight: bold;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size: 13px; color: #666; margin: 0 0 8px;\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color: #db3a35; text-decoration: underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width: 100%; border-collapse: collapse; border: 1px solid #e5e7eb;\"\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 10px; border-right: 1px solid #e5e7eb; border-top: 1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding: 10px; border-top: 1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 10px; border-right: 1px solid #e2e8f0; border-top: 1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding: 10px; border-top: 1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color: #999; font-size: 12px;\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding: 10px; border-right: 1px solid #e5e7eb; border-top: 1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding: 10px; border-top: 1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color: #999; font-size: 12px;\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151479681311,"sku":"A9323536008885","price":4.39,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_c72ed85b-6aaf-444a-a39b-19dd6444dc48.jpg?v=1745982964"},{"product_id":"fresh-ever-green-chinese-style-tofu-approximately-500g","title":"Ever Green Classic Tofu, 500g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:16px;color:#0f172a;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:24px;margin-top:0;\"\u003e\n  \u003ch2 style=\"margin:0 0 6px;font-size:24px;font-weight:800;color:#0f172a;\"\u003eEver Green Classic Tofu, 500g\u003c\/h2\u003e\n  \u003cp style=\"margin:6px 0 0;color:#475569;font-size:14px;\"\u003eA versatile, smooth block that holds its shape in stir-fries, turns silky in soups, and soaks up sauces beautifully.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;line-height:1.7;\"\u003e\n    \u003cli\u003eMellow, clean soy flavour that pairs with everything from soy–ginger to spicy mala.\u003c\/li\u003e\n    \u003cli\u003eMedium‑firm texture: cube for stir‑fries, slice for pan‑searing, or gently simmer for soups.\u003c\/li\u003e\n    \u003cli\u003eNeutral base for bold sauces — marinate briefly and it drinks up seasoning fast.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003col style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;line-height:1.7;\"\u003e\n    \u003cli style=\"margin:0 0 10px;\"\u003e\n      \u003cstrong\u003eGarlicky Bok Choy \u0026amp; Shiitake Tofu Stir‑Fry\u003c\/strong\u003e — Pat tofu dry, sear cubes until golden (3–4 minutes), then toss with sliced shiitake and crunchy bok choy. Splash in light soy and a few drops of sesame oil; stir 1–2 minutes more.\n      \u003cdiv style=\"margin-top:6px;color:#64748b;\"\u003e\n        Try with: \u003ca href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\" style=\"color:var(--brand);\"\u003eShanghai Bok Choy\u003c\/a\u003e, \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\" style=\"color:var(--brand);\"\u003eShiitake Mushrooms\u003c\/a\u003e, \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:var(--brand);\"\u003eLight Soy Sauce\u003c\/a\u003e, \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\" style=\"color:var(--brand);\"\u003eSesame Oil\u003c\/a\u003e\n      \u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin:0 0 10px;\"\u003e\n      \u003cstrong\u003eTomato Tofu Egg‑Drop Soup\u003c\/strong\u003e\u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth‑based\u003c\/span\u003e — Simmer a tomato hot‑pot base with water, add tofu slices and napa cabbage (2–4 minutes), then stream in beaten egg; finish with white pepper.\n      \u003cdiv style=\"margin-top:6px;color:#64748b;\"\u003e\n        Try with: \u003ca href=\"\/products\/haidilao-tomato-hot-pot-base-200g\" style=\"color:var(--brand);\"\u003eHaidilao Tomato Hot Pot Base\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-local-napa-cabbage-1-piece\" style=\"color:var(--brand);\"\u003eNapa Cabbage\u003c\/a\u003e\n      \u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin:0 0 10px;\"\u003e\n      \u003cstrong\u003eChilled Tofu with Scallion–Soy Dressing\u003c\/strong\u003e — Spoon over a quick mix of light soy, a splash of rice vinegar, pinch of sugar, and lots of chopped scallion. Great as a refreshing side.\n      \u003cdiv style=\"margin-top:6px;color:#64748b;\"\u003e\n        Try with: \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\" style=\"color:var(--brand);\"\u003eSpring Onions\u003c\/a\u003e, \u003ca href=\"\/products\/hengshun-white-rice-vinegar-500ml\" style=\"color:var(--brand);\"\u003eWhite Rice Vinegar\u003c\/a\u003e, \u003ca href=\"\/products\/kikkoman-all-purpose-soy-sauce-1-6l\" style=\"color:var(--brand);\"\u003eKikkoman Soy Sauce\u003c\/a\u003e\n      \u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin:0 0 0;\"\u003e\n      \u003cstrong\u003eCozy Tofu Noodle Bowl with Enoki \u0026amp; Choi Sum\u003c\/strong\u003e — Cook rice vermicelli (3–5 minutes). Blanch enoki and choi sum (30–60 seconds). Ladle over hot broth and top with warm tofu; finish with a touch of oyster sauce.\n      \u003cdiv style=\"margin-top:6px;color:#64748b;\"\u003e\n        Try with: \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\" style=\"color:var(--brand);\"\u003eJiangxi Rice Vermicelli\u003c\/a\u003e, \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\" style=\"color:var(--brand);\"\u003eEnoki Mushrooms\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-green-stemmed-vegetable-hearts-bundle\" style=\"color:var(--brand);\"\u003eChoi Sum\u003c\/a\u003e, \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\" style=\"color:var(--brand);\"\u003eOyster Sauce\u003c\/a\u003e\n      \u003c\/div\u003e\n    \u003c\/li\u003e\n  \u003c\/ol\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;line-height:1.7;\"\u003e\n    \u003cli\u003eDrain and gently pat dry. For extra structure in stir‑fries, press between paper towels under a light plate for 10–15 minutes.\u003c\/li\u003e\n    \u003cli\u003ePan‑sear in a thin film of oil until golden before saucing to lock in texture.\u003c\/li\u003e\n    \u003cli\u003eFor soups, add tofu near the end and simmer gently to keep slices intact.\u003c\/li\u003e\n    \u003cli\u003eMarinate briefly (10–20 minutes) with soy, garlic, and a touch of sesame oil for flavourful browning.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;line-height:1.7;\"\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:var(--brand);\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\" style=\"color:var(--brand);\"\u003eLee Kum Kee Pure Sesame Oil 207ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chois-oyster-mushrooms-400g\" style=\"color:var(--brand);\"\u003eChois Oyster Mushrooms - 400g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\" style=\"color:var(--brand);\"\u003eFresh Snow Pea Sprouts - 160g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/bull-head-clear-chicken-broth-411ml-canned-chicken-stock\" style=\"color:var(--brand);\"\u003eBull Head Clear Chicken Broth 411ml\u003c\/a\u003e\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n  \u003cp style=\"margin:6px 0 0;font-size:14px;color:#334155;\"\u003eExplore more tofu and soy favourites for hotpot, stir‑fries, and quick meals.\u003c\/p\u003e\n  \u003cp style=\"margin:10px 0 0;\"\u003e\u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:var(--brand);font-weight:700;\"\u003eBrowse all Tofu \u0026amp; Soy Products →\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151479845151,"sku":"A9323536008786","price":4.29,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_3648668a-94b9-44e1-80e1-077f7169a00c.jpg?v=1712383823"},{"product_id":"fresh-ever-green-five-spice-dried-tofu-approximately-220g","title":"Ever Green Five-Spice Dried Tofu, 220g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;line-height:1.6;color:#334155;font-family:system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, Apple Color Emoji, Segoe UI Emoji;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:24px;margin-top:16px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:24px;font-weight:800;color:#0f172a;\"\u003eEver Green Five-Spice Dried Tofu, 220g\u003c\/h1\u003e\n  \u003cp style=\"margin:6px 0 0;\"\u003eFirm, ready-to-eat tofu infused with a fragrant five-spice soy braise—perfect for quick stir-fries, salads, noodles, and hot pot.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h2\u003e\n  \u003cul style=\"margin:8px 0 0 18px;\"\u003e\n    \u003cli\u003ePre-seasoned with aromatic spices—just slice and serve or warm through.\u003c\/li\u003e\n    \u003cli\u003eDense, pleasantly chewy texture that holds up in stir-fries and soups.\u003c\/li\u003e\n    \u003cli\u003eProtein-rich, versatile base for quick weeknight meals.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h2\u003e\n  \u003col style=\"margin:8px 0 0 18px;\"\u003e\n    \u003cli style=\"margin-bottom:12px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eWok-tossed ginger-bok choy stir-fry\u003c\/div\u003e\n      \u003cdiv\u003eSlice tofu into batons; stir-fry briefly with \u003ca style=\"color:#DB3A35;\" href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\"\u003eShanghai bok choy\u003c\/a\u003e, \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/chois-oyster-mushrooms-400g\"\u003eoyster mushrooms\u003c\/a\u003e, and \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\"\u003eginger\u003c\/a\u003e. Finish with a splash of \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/haday-golden-label-light-soy-sauce-1-28l\"\u003elight soy sauce\u003c\/a\u003e and a drizzle of \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e. Cook just 2–4 minutes to keep it crisp-tender.\u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin-bottom:12px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eCold sesame rice vermicelli bowl\u003c\/div\u003e\n      \u003cdiv\u003eToss chilled tofu slices with cooked, cooled \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e, a tangy mix of \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e and \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e, plus a spoon of \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003ecrispy chili oil\u003c\/a\u003e. Add shredded veggies and serve cool.\u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin-bottom:12px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eBroth-based hot pot add‑in\u003c\/div\u003e\n      \u003cdiv\u003eSlip pieces into simmering \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/haidilao-tomato-hot-pot-base-200g\"\u003etomato hot pot\u003c\/a\u003e with \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eenoki mushrooms\u003c\/a\u003e. Simmer 3–5 minutes so the tofu soaks up the broth without getting soft.\u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eChilled tofu ribbon salad \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLow‑calorie\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003eCut tofu into thin ribbons; toss with blanched \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/fresh-bean-sprouts-approximately-400g\"\u003ebean sprouts\u003c\/a\u003e, chopped \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/fresh-bunch-of-coriander\"\u003ecoriander\u003c\/a\u003e, and a light splash of \n        \u003ca style=\"color:#DB3A35;\" href=\"\/products\/hengshun-white-rice-vinegar-500ml\"\u003ewhite rice vinegar\u003c\/a\u003e. Chill 10–15 minutes before serving.\u003c\/div\u003e\n    \u003c\/li\u003e\n  \u003c\/ol\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h2\u003e\n  \u003cul style=\"margin:8px 0 0 18px;\"\u003e\n    \u003cli\u003eReady to eat—enjoy straight from the pack or warm gently.\u003c\/li\u003e\n    \u003cli\u003eFor stir-fries, add near the end and toss 2–4 minutes to keep texture.\u003c\/li\u003e\n    \u003cli\u003eTo refresh flavor, briefly blanch in hot water or simmer in your sauce for 3–5 minutes.\u003c\/li\u003e\n    \u003cli\u003eSeason lightly—the tofu is already savory from soy and spices.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h2\u003e\n  \u003cul style=\"margin:8px 0 0 18px;\"\u003e\n    \u003cli\u003e\n\u003ca style=\"color:#DB3A35;\" href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eOyster sauce\u003c\/a\u003e or \n      \u003ca style=\"color:#DB3A35;\" href=\"\/products\/kikkoman-all-purpose-soy-sauce-1-6l\"\u003esoy sauce\u003c\/a\u003e for instant umami.\u003c\/li\u003e\n    \u003cli\u003e\n\u003ca style=\"color:#DB3A35;\" href=\"\/products\/haitian-sesame-fragrant-oil-150ml\"\u003eToasty sesame oil\u003c\/a\u003e to finish.\u003c\/li\u003e\n    \u003cli\u003e\n\u003ca style=\"color:#DB3A35;\" href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003eBaby bok choy\u003c\/a\u003e and \n      \u003ca style=\"color:#DB3A35;\" href=\"\/products\/chois-shiitake-mushrooms-300g\"\u003eshiitake mushrooms\u003c\/a\u003e in quick sautés.\u003c\/li\u003e\n    \u003cli\u003eA little heat from \u003ca style=\"color:#DB3A35;\" href=\"\/products\/cuihong-spicy-chili-oil-200g\"\u003espicy chili oil\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eNoodles like \u003ca style=\"color:#DB3A35;\" href=\"\/products\/chunsi-jiangxi-rice-vermicelli-300g\"\u003erice vermicelli\u003c\/a\u003e for cold or hot bowls.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;display:flex;align-items:center;justify-content:space-between;gap:16px;\"\u003e\n  \u003cdiv\u003e\n    \u003ch2 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h2\u003e\n    \u003cp style=\"margin:6px 0 0;\"\u003eExplore more tofu and soy-based favorites to mix and match.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv\u003e\n    \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;font-weight:700;\"\u003eBrowse all tofu \u0026amp; soy products →\u003c\/a\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151480008991,"sku":"A9323536001015","price":4.99,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_dba98e4d-92c7-4c11-8563-0ead4c10ba66.jpg?v=1712383828"},{"product_id":"fresh-ever-green-aged-tofu-approximately-900g","title":"Ever Green Traditional Firm Tofu, 900g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:8px 0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.6\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;\"\u003e\u003cdiv style=\"display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;\"\u003e\n\u003cdiv style=\"flex:1 1 280px;min-width:260px;\"\u003e\n\u003ch1 style=\"margin:0 0 6px;font-size:26px;font-weight:800;\"\u003eEver Green Traditional Firm Tofu, 900g\u003c\/h1\u003e\n\u003cp style=\"margin:6px 0 0;color:#475569;font-size:14px;\"\u003eA generous 900g block of versatile, protein‑rich tofu with a classic firm bite—ideal for stir‑fries, braises, grilling, and soups.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"flex:0 0 220px;max-width:220px\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_5c2663a8-d3e5-485f-8882-ed93b430a2ff.jpg?v=1712383835\" alt=\"Ever Green Traditional Firm Tofu, 900g\" style=\"width:100%;height:auto;border-radius:12px;border:1px solid #e2e8f0\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch2 style=\"margin:0 0 10px;font-size:20px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h2\u003e\n\u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003eHolds its shape—perfect for pan‑searing, tossing into wok dishes, or simmering in flavorful sauces.\u003c\/li\u003e\n\u003cli\u003eClean, neutral taste that soaks up marinades and broths beautifully.\u003c\/li\u003e\n\u003cli\u003ePlant‑based protein that plays well with bold aromatics (garlic, ginger, scallion) and classic sauces (soy, oyster, vinegar).\u003c\/li\u003e\n\u003cli\u003eFamily‑size 900g block—meal prep once, cook multiple dishes through the week.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch2 style=\"margin:0 0 10px;font-size:20px;font-weight:700;\"\u003eHow to enjoy\u003c\/h2\u003e\n\u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;\"\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003ch3 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eGinger‑garlic bok choy stir‑fry tofu\u003c\/h3\u003e\n    \u003cp style=\"margin:6px 0;color:#475569;font-size:14px;\"\u003ePress, cube, then sear tofu until golden. Toss with sliced ginger and garlic, a splash of oyster sauce, and quick‑wilted \u003ca href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\"\u003eShanghai bok choy\u003c\/a\u003e. Try with \u003ca href=\"\/products\/peeled-garlic-cloves-250g\"\u003epeeled garlic\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\"\u003eginger\u003c\/a\u003e, a drizzle of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e, and \u003ca href=\"\/products\/88-canola-oil-1l\"\u003ecanola oil\u003c\/a\u003e. Stir‑fry in a hot wok for 4-6 minutes.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003ch3 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eSoy‑braised tofu with shiitake \u0026amp; baby bok choy\u003c\/h3\u003e\n    \u003cp style=\"margin:6px 0;color:#475569;font-size:14px;\"\u003eBrown tofu cubes, then simmer 6-10 minutes with sliced \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eshiitake\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e, light soy, a touch of dark soy, and water\/stock. Finish with a few drops of sesame oil.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003ch3 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eHot‑and‑sour tofu \u0026amp; mushroom soup \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth‑based\u003c\/span\u003e\n\u003c\/h3\u003e\n    \u003cp style=\"margin:6px 0;color:#475569;font-size:14px;\"\u003eGently simmer tofu batons in a clear mushroom broth like \u003ca href=\"\/products\/colorful-yunnan-matsutake-mushroom-soup-mix-68g-dried-mushroom-broth-kit\"\u003ematsutake soup mix\u003c\/a\u003e with slivered \u003ca href=\"\/products\/fresh-wood-ear-mushrooms-approximately-100g\"\u003ewood ear\u003c\/a\u003e, white pepper, and a dash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e. Light, tangy, and satisfying.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003ch3 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eCrispy tofu rice vermicelli bowl with chili crisp\u003c\/h3\u003e\n    \u003cp style=\"margin:6px 0;color:#475569;font-size:14px;\"\u003eToss cornstarch‑dusted tofu cubes and pan‑crisp 5-7 minutes. Serve over softened \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e with scallions and a spoon of \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003echili crisp\u003c\/a\u003e. Add fresh bite with a \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003eshallot bunch\u003c\/a\u003e.\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp style=\"margin:10px 0 0;color:#94a3b8;font-size:12px;\"\u003eTip: For saucy dishes, cut slightly larger cubes so tofu stays tender inside.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch2 style=\"margin:0 0 10px;font-size:20px;font-weight:700;\"\u003ePrep Tips\u003c\/h2\u003e\n\u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003ePress 10-20 minutes between paper towels to remove excess moisture for better searing.\u003c\/li\u003e\n\u003cli\u003eFor extra‑crispy edges, toss cubes lightly in cornstarch before pan‑frying.\u003c\/li\u003e\n\u003cli\u003eSeason early: marinate 10-15 minutes with light soy, a pinch of sugar, and sesame oil.\u003c\/li\u003e\n\u003cli\u003eAdd tofu towards the end of stir‑fries and soups to keep pieces intact.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch2 style=\"margin:0 0 10px;font-size:20px;font-weight:700;\"\u003ePairs well\u003c\/h2\u003e\n\u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003e\n\u003ca href=\"\/products\/chois-oyster-mushrooms-400g\"\u003eOyster mushrooms\u003c\/a\u003e or other mixed mushrooms\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/products\/fresh-garlic-leaves-green-garlic-1-bundle\"\u003eGreen garlic (garlic leaves)\u003c\/a\u003e or scallions\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eLight soy sauce\u003c\/a\u003e for seasoning\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eToasted sesame oil\u003c\/a\u003e to finish\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/products\/hengshun-9-degree-rice-vinegar-500ml\"\u003eRice vinegar\u003c\/a\u003e for brightness\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/products\/chuan-lao-hui-pixian-red-oil-broad-bean-paste-1kg\"\u003ePixian doubanjiang\u003c\/a\u003e for a spicy, savory kick\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:20px;font-weight:700;\"\u003eMore in this category\u003c\/h2\u003e\n  \u003ca href=\"\/collections\/tofu-soy-products\" style=\"display:inline-block;border:1px solid #e2e8f0;background:#fff;border-radius:999px;padding:10px 14px;font-size:14px;color:var(--brand);font-weight:700;\"\u003eShop all Tofu \u0026amp; Soy Products →\u003c\/a\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151480172831,"sku":"A9323536008908","price":5.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_5c2663a8-d3e5-485f-8882-ed93b430a2ff.jpg?v=1712383835"},{"product_id":"fresh-ever-green-silken-tofu-approximately-500g","title":"Ever Green Momen Tofu, 500g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:12px 14px;color:#0f172a;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;\"\u003e\u003cdiv style=\"display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;\"\u003e\n\u003cdiv style=\"flex:1 1 260px;min-width:260px;\"\u003e\n\u003ch1 style=\"margin:0 0 6px;font-size:24px;font-weight:800;color:#0f172a;\"\u003eEver Green Momen Tofu, 500g\u003c\/h1\u003e\n\u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eA versatile cotton-style tofu with a delicate yet sturdy set — smooth enough for soups and salads, firm enough for gentle stir-fries.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv style=\"flex:0 0 220px;max-width:220px;width:100%;\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_6ca96e8f-a82d-4096-abfb-dd776104e9f2.jpg?v=1712383842\" alt=\"Ever Green Momen Tofu 500g\" style=\"width:100%;height:auto;border-radius:12px;border:1px solid #e2e8f0;\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n\u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003eClean soybean flavour with a gentle, custardy bite.\u003c\/li\u003e\n\u003cli\u003eHolds shape in soups and braises, yet silky enough for chilled dishes.\u003c\/li\u003e\n\u003cli\u003eEveryday-friendly: quick to portion, season, and cook.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n\u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;\"\u003e \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n\u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eChilled tofu with soy, vinegar \u0026amp; scallions \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLow‑calorie\u003c\/span\u003e\n\u003c\/h4\u003e\n\u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eSpoon over \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e and a splash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eblack vinegar\u003c\/a\u003e, finish with a drizzle of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e and sliced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003eshallots\u003c\/a\u003e. Ready in 2–3 minutes.\u003c\/p\u003e\n\u003c\/div\u003e \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n\u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eCozy mushroom hotpot tofu\u003c\/h4\u003e\n\u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eSimmer bite-size tofu in a light broth using \u003ca href=\"\/products\/haidilao-mushroom-flavor-hot-pot-seasoning-150g\"\u003emushroom hot pot base\u003c\/a\u003e, add \u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eshimeji\u003c\/a\u003e and a handful of \u003ca href=\"\/products\/fresh-green-stemmed-vegetable-hearts-bundle\"\u003echoi sum\u003c\/a\u003e for a comforting bowl.\u003c\/p\u003e\n\u003c\/div\u003e \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n\u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eVeg-forward tofu \u0026amp; green bean stir-fry\u003c\/h4\u003e\n\u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003ePan-sear tofu cubes, toss with \u003ca href=\"\/products\/fresh-seasonal-green-beans-approximately-500g\"\u003egreen beans\u003c\/a\u003e, a spoon of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e and a dash of \u003ca href=\"\/products\/haday-golden-label-light-soy-sauce-1-28l\"\u003elight soy\u003c\/a\u003e. Cook 4–6 minutes until glossy.\u003c\/p\u003e\n\u003c\/div\u003e \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n\u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eWeeknight mapo-style tofu\u003c\/h4\u003e\n\u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eSauté a little \u003ca href=\"\/products\/borrowdale-free-range-pork-mince-500g-frozen\"\u003epork mince\u003c\/a\u003e, bloom \u003ca href=\"\/products\/chuan-lao-hui-pixian-red-oil-broad-bean-paste-1kg\"\u003ePixian doubanjiang\u003c\/a\u003e, then simmer tofu until saucy. Spoon over steamed rice.\u003c\/p\u003e\n\u003c\/div\u003e \u003c\/div\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n\u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003eFor cleaner cuts, drain briefly and slice with a sharp, thin knife.\u003c\/li\u003e\n\u003cli\u003eStir-fry success: pat dry and pan-sear undisturbed 2–4 minutes per side for light crust.\u003c\/li\u003e\n\u003cli\u003eSoup\/hotpot: slide pieces in last and simmer gently 3–5 minutes to warm through.\u003c\/li\u003e\n\u003cli\u003eWant extra hold? Dust surfaces lightly with starch before searing.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n\u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e \u003cli\u003e\u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\"\u003eChuan Lao Hui Pure Sesame Oil 320ml\u003c\/a\u003e\u003c\/li\u003e \u003cli\u003e\u003ca href=\"\/products\/chois-shiitake-mushrooms-300g\"\u003eChois Shiitake Mushrooms - 300g\u003c\/a\u003e\u003c\/li\u003e \u003cli\u003e\u003ca href=\"\/products\/fresh-green-stemmed-vegetable-hearts-bundle\"\u003eGreen-Stemmed Choi Sum, 1 Bundle\u003c\/a\u003e\u003c\/li\u003e \u003cli\u003e\u003ca href=\"\/products\/hokkaido-sansanmaru-japanese-rice-5kg\"\u003eHokkaido Sansanmaru Japanese Rice - 5kg\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;text-align:center;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n\u003ca href=\"\/collections\/tofu-soy-products\" style=\"display:inline-block;color:var(--brand);font-weight:700;border-bottom:1px solid var(--brand);\"\u003eExplore all tofu \u0026amp; soy products\u003c\/a\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151480336671,"sku":"A9323536008892","price":4.29,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_6ca96e8f-a82d-4096-abfb-dd776104e9f2.jpg?v=1712383842"},{"product_id":"fresh-ever-green-tea-scented-dried-vegetables-approximately-250g","title":"Tea-Flavored Dried Tofu, 250g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:8px 10px 18px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#334155;line-height:1.5;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;display:flex;gap:16px;align-items:center;\"\u003e\u003cdiv style=\"flex:1 1 120px;max-width:140px;\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_f693da7c-f00a-4ee0-8be5-d479169a5eb9.jpg?v=1712383848\" alt=\"Tea-Flavored Dried Tofu, 250g\" style=\"width:100%;height:auto;border-radius:12px;border:1px solid #e2e8f0;\"\u003e\u003c\/div\u003e\n\u003cdiv style=\"flex:4 1 480px;\"\u003e\n\u003ch1 style=\"margin:0 0 6px;font-size:22px;font-weight:800;\"\u003eTea-Flavored Dried Tofu, 250g\u003c\/h1\u003e\n\u003cp style=\"margin:4px 0 0;font-size:14px;color:#475569;\"\u003eFirm, bouncy, and delicately scented with tea aromatics — ready to slice for cold dishes, noodle bowls, stir-fries, and hotpot.\u003c\/p\u003e\n\u003c\/div\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:18px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n\u003cul style=\"margin:6px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003eBalanced tea aroma that complements, not overpowers, savory seasonings.\u003c\/li\u003e\n\u003cli\u003eFirm dougan-style texture that holds up in stir-fries, braises, and hotpot.\u003c\/li\u003e\n\u003cli\u003eConvenient: pre-cooked and ready to eat — great for quick cold appetizers.\u003c\/li\u003e\n\u003cli\u003eVersatile protein swap for salads, noodles, rice bowls, and lunch boxes.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:18px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n\u003col style=\"margin:6px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003e\n\u003cstrong\u003eChilled sesame–garlic tofu strips\u003c\/strong\u003e\u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLow‑calorie\u003c\/span\u003e — Julienne and toss with a splash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eblack vinegar\u003c\/a\u003e, a few drops of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e, and minced \u003ca href=\"\/products\/fresh-dried-garlic-heads-approximately-500g\"\u003egarlic\u003c\/a\u003e. Chill briefly for a refreshing starter.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003e5‑minute wok fry with bell pepper and spring onion\u003c\/strong\u003e — Stir‑fry matchsticks of tofu with sliced \u003ca href=\"\/products\/fresh-green-lantern-peppers-pack-of-3\"\u003egreen capsicum\u003c\/a\u003e and \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003espring onion\u003c\/a\u003e; finish with a dash of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy sauce\u003c\/a\u003e.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eHot pot ready\u003c\/strong\u003e — Cut into chunky slices and simmer in your favorite spicy broth, like \u003ca href=\"\/products\/haidilao-spicy-hot-pot-soup-base-500g\"\u003eHaidilao Spicy Hot Pot Base\u003c\/a\u003e, for a few minutes to soak up flavor.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eRice vermicelli toss\u003c\/strong\u003e — Combine warm tofu strips with cooked \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e, a spoon of \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003echili crisp\u003c\/a\u003e, and a squeeze of citrus for a quick noodle bowl.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eBento snack with pickled bamboo shoots\u003c\/strong\u003e — Slice and pair with \u003ca href=\"\/products\/long-hong-pickled-bamboo-shoots-600g\"\u003epickled bamboo shoots\u003c\/a\u003e for a savory, ready‑to‑pack side.\u003c\/li\u003e\n\u003c\/ol\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:18px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n\u003cul style=\"margin:6px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003eReady to eat: slice or shred directly for cold dishes. For hot dishes, warm gently to keep it tender.\u003c\/li\u003e\n\u003cli\u003eBest cuts: matchsticks for salads\/noodles; bite‑size rectangles for hotpot; thin slices for quick stir‑fries.\u003c\/li\u003e\n\u003cli\u003eSeason lightly: the tea marinade is subtle — layer with soy, vinegar, sesame oil, and aromatics to taste.\u003c\/li\u003e\n\u003cli\u003eHeat smart: add near the end of stir‑fries and simmer only 2–4 minutes in soups to avoid drying.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:18px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n\u003cul style=\"margin:6px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n\u003cli\u003e\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eLee Kum Kee Pure Sesame Oil 207ml\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eHengshun Zhenjiang Aromatic Vinegar 550ml\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003eChuanwazi Crispy Chili Oil with Peanuts 200g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-green-lantern-peppers-pack-of-3\"\u003eGreen Bell Peppers - Pack of 3\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eChois Shimeji Mushrooms - 150g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003eChunsi Jiangxi Rice Vermicelli 300g\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:18px;margin-top:16px;text-align:center;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n\u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;font-weight:700;\"\u003eBrowse all tofu \u0026amp; soy products\u003c\/a\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e2e8f0;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e2e8f0;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e2e8f0;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e2e8f0;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e2e8f0;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e2e8f0;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e2e8f0;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151480795423,"sku":"A9323536002227","price":4.99,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_f693da7c-f00a-4ee0-8be5-d479169a5eb9.jpg?v=1712383848"},{"product_id":"fresh-ever-green-chinese-style-tofu-approximately-300g","title":"Ever Green Chinese Style Tofu, 300g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#334155;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:24px;margin-top:16px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:24px;font-weight:800;color:#0f172a;\"\u003eEver Green Chinese Style Tofu, 300g\u003c\/h1\u003e\n  \u003cp style=\"margin:6px 0 0;\"\u003eA versatile, tender‑firm tofu that soaks up flavor beautifully—perfect for quick stir‑fries, soups, braises, and chilled dishes.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:0 0 0 18px;\"\u003e\n    \u003cli\u003eMild, clean taste that takes on sauces and aromatics effortlessly.\u003c\/li\u003e\n    \u003cli\u003eBalanced texture—sturdy enough to pan‑sear, tender enough for soups.\u003c\/li\u003e\n    \u003cli\u003ePlant‑powered protein for everyday meals, from weeknight noodles to hotpot.\u003c\/li\u003e\n    \u003cli\u003eConvenient 300g block—easy to portion, marinate, and cook.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:flex;flex-direction:column;gap:14px;\"\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eGarlic‑ginger tofu \u0026amp; gai lan stir‑fry with oyster sauce\u003c\/h4\u003e\n      \u003cp style=\"margin:0;\"\u003ePat tofu dry, cube, then sear until golden (2–4 minutes per side). Toss with blanched \u003ca href=\"\/products\/fresh-bunch-of-chinese-broccoli-kai-lan-hearts\"\u003eChinese Broccoli (Gai Lan)\u003c\/a\u003e, ginger, and a spoon of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eHaitian Premium Oyster Sauce 700g\u003c\/a\u003e. Finish with a splash of water to glaze.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eMapo‑style tofu with beef mince \u0026amp; Pixian doubanjiang\u003c\/h4\u003e\n      \u003cp style=\"margin:0;\"\u003eBrown a little \u003ca href=\"\/products\/angus-prime-ground-beef-500g\"\u003eAngus Prime Beef Mince 500g\u003c\/a\u003e, stir in \u003ca href=\"\/products\/chuan-lao-hui-pixian-red-oil-broad-bean-paste-1kg\"\u003ePixian Doubanjiang\u003c\/a\u003e, garlic, and stock. Slide in tofu cubes and simmer 3–5 minutes; finish with Sichuan pepper and spring onions.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eBroth‑based tofu, shiitake \u0026amp; greens soup \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth‑based\u003c\/span\u003e\n\u003c\/h4\u003e\n      \u003cp style=\"margin:0;\"\u003eSimmer water with \u003ca href=\"\/products\/cygnet-clear-soup-hot-pot-base-200g-mild-chinese-shabu-shabu-broth-seasoning\"\u003eCygnet Clear Soup Hot Pot Base\u003c\/a\u003e. Add tofu cubes, \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eShiitake Mushrooms 100g\u003c\/a\u003e, and a handful of \u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\"\u003eSnow Pea Sprouts\u003c\/a\u003e for 2–4 minutes. Season to taste.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eCrispy tofu rice bowl with sesame‑soy drizzle\u003c\/h4\u003e\n      \u003cp style=\"margin:0;\"\u003eDust tofu with cornstarch, pan‑sear till crisp, and serve over hot \u003ca href=\"\/products\/beidahuang-wuchang-rice-vacuum-pack-5kg\"\u003eWuchang Rice\u003c\/a\u003e. Drizzle with \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eSesame Oil\u003c\/a\u003e and light soy; add quick‑pickled veggies if you like.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eChilled tofu with scallion‑soy \u0026amp; chili crisp\u003c\/h4\u003e\n      \u003cp style=\"margin:0;\"\u003eSpoon a mix of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eLight Soy Sauce\u003c\/a\u003e, a touch of vinegar, and sliced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003eSpring Onions\u003c\/a\u003e over cold tofu. Finish with a dab of \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003eCrispy Chili Oil\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:0 0 0 18px;\"\u003e\n    \u003cli\u003eDrain and pat dry well for better browning; press briefly between paper towels if needed.\u003c\/li\u003e\n    \u003cli\u003eFor crispy edges, toss cubes lightly in cornstarch and pan‑sear over medium heat 2–4 minutes per side.\u003c\/li\u003e\n    \u003cli\u003eAdd tofu towards the end of simmered dishes to keep pieces intact.\u003c\/li\u003e\n    \u003cli\u003eSeason from the outside in: finish with soy sauce, sesame oil, or vinegar right before serving.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:0 0 0 18px;\"\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eLee Kum Kee Pure Sesame Oil 207ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eHengshun Zhenjiang Aromatic Vinegar 550ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\"\u003eEvergreen Yangchun Noodles 500g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eChois Enoki Mushrooms - 300g\u003c\/a\u003e\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;display:flex;justify-content:space-between;align-items:center;gap:10px;\"\u003e\n  \u003cdiv\u003e\n    \u003ch3 style=\"margin:0 0 6px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n    \u003cp style=\"margin:0;color:#475569;\"\u003eDiscover more tofu and soy favourites for easy meals.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:var(--brand);font-weight:700;\"\u003eShop all Tofu \u0026amp; Soy Products →\u003c\/a\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151481188639,"sku":"A9323536580022","price":2.69,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_ba54bdd2-b13f-4d10-ae90-825b18774f7c.jpg?v=1712383861"},{"product_id":"fresh-ever-green-smooth-strip-tofu-approximately-250g","title":"Ever Green Smooth Strip Tofu, 250g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.55;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:24px;margin-top:16px;\"\u003e\n  \u003cdiv style=\"display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;\"\u003e\n    \u003ch1 style=\"margin:0;font-size:26px;font-weight:800;color:#0f172a;\"\u003eEver Green Smooth Strip Tofu, 250g\u003c\/h1\u003e\n    \u003cspan style=\"display:inline-block;border:1px solid #e2e8f0;border-radius:999px;padding:6px 10px;font-size:12px;color:#475569;background:#f8fafc;\"\u003eSilky, ready-cut strips\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h2\u003e\n  \u003cul style=\"margin:10px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003ePre-cut, silky tofu strips that soak up sauces and broths beautifully.\u003c\/li\u003e\n    \u003cli\u003eQuick-cooking — great for stir-fries, soups, salads and hotpot.\u003c\/li\u003e\n    \u003cli\u003eNeutral, clean tofu flavour with a tender, bouncy bite.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h2\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;\"\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;background:#fff;padding:14px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eChilled sesame–vinegar salad \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLow-calorie\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cdiv style=\"color:#334155;font-size:14px;margin-top:6px;\"\u003eToss tofu strips with blanched \u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\"\u003esnow pea sprouts\u003c\/a\u003e, a splash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang black vinegar\u003c\/a\u003e, a touch of \u003ca href=\"\/products\/kikkoman-all-purpose-soy-sauce-1-6l\"\u003esoy sauce\u003c\/a\u003e and a drizzle of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e. Optional heat: \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003echili crisp\u003c\/a\u003e. For extra body, fold through chilled \u003ca href=\"\/products\/hankun-crispy-konjac-yam-threads-200g\"\u003ekonjac threads\u003c\/a\u003e.\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;background:#fff;padding:14px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eWok-tossed with bok choy and oyster sauce\u003c\/div\u003e\n      \u003cdiv style=\"color:#334155;font-size:14px;margin-top:6px;\"\u003eSear tofu strips on high heat, then add \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e and a spoon of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e. Finish with smashed \u003ca href=\"\/products\/peeled-garlic-cloves-250g\"\u003egarlic\u003c\/a\u003e and a splash of water to glaze; 2–4 minutes total.\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;background:#fff;padding:14px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eComforting vermicelli soup bowl\u003c\/div\u003e\n      \u003cdiv style=\"color:#334155;font-size:14px;margin-top:6px;\"\u003eSimmer a light base with \u003ca href=\"\/products\/bull-head-clear-chicken-broth-411ml-canned-chicken-stock\"\u003eclear chicken broth\u003c\/a\u003e, add tofu strips and \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eenoki mushrooms\u003c\/a\u003e, then drop in \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e. Season with soy and white pepper.\u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;background:#fff;padding:14px;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eHotpot add‑in\u003c\/div\u003e\n      \u003cdiv style=\"color:#334155;font-size:14px;margin-top:6px;\"\u003eSwish tofu strips in a bubbling \u003ca href=\"\/products\/haidilao-tomato-hot-pot-base-200g\"\u003etomato hot pot\u003c\/a\u003e for a minute or two. Mix textures with bouncy \u003ca href=\"\/products\/ever-green-fried-tofu-puffs-200g\"\u003etofu puffs\u003c\/a\u003e and leafy veg.\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h2\u003e\n  \u003cul style=\"margin:10px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003eRinse briefly and gently separate strands before cooking.\u003c\/li\u003e\n    \u003cli\u003eFor stir‑fries, cook over high heat with a little oil; 2–3 minutes keeps the texture tender.\u003c\/li\u003e\n    \u003cli\u003eFor soups\/hotpot, add in the last 1–2 minutes so the strips stay silky and don’t break.\u003c\/li\u003e\n    \u003cli\u003eSeason off the heat with soy, sesame oil or vinegar to preserve a clean, delicate taste.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h2\u003e\n  \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eSoy sauce, oyster sauce, black vinegar, sesame oil, garlic, ginger, chili oil, enoki or shimeji mushrooms, bok choy, bean sprouts, rice vermicelli, clear broths and tomato hotpot.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch2 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h2\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;\"\u003e\n    \u003ca href=\"\/products\/fresh-ever-green-chinese-style-tofu-approximately-500g\" style=\"display:block;border:1px solid #e2e8f0;background:#fff;border-radius:12px;padding:12px;color:#0f172a;\"\u003e\u003cdiv style=\"font-weight:700;\"\u003eEver Green Classic Tofu, 500g\u003c\/div\u003e\n\u003cdiv style=\"font-size:13px;color:#475569;margin-top:4px;\"\u003eEveryday firm tofu for stir‑fries \u0026amp; stews\u003c\/div\u003e\u003c\/a\u003e\n    \u003ca href=\"\/products\/fresh-ever-green-dried-tofu-4-pieces-approximately-400g\" style=\"display:block;border:1px solid #e2e8f0;background:#fff;border-radius:12px;padding:12px;color:#0f172a;\"\u003e\u003cdiv style=\"font-weight:700;\"\u003eEver Green Dried Tofu – 4 pcs, 400g\u003c\/div\u003e\n\u003cdiv style=\"font-size:13px;color:#475569;margin-top:4px;\"\u003eChewy, high‑protein snack or stir‑fry\u003c\/div\u003e\u003c\/a\u003e\n    \u003ca href=\"\/products\/fresh-ever-green-brick-dried-tofu-approximately-650g\" style=\"display:block;border:1px solid #e2e8f0;background:#fff;border-radius:12px;padding:12px;color:#0f172a;\"\u003e\u003cdiv style=\"font-weight:700;\"\u003eEver Green Hard Tofu, 650g\u003c\/div\u003e\n\u003cdiv style=\"font-size:13px;color:#475569;margin-top:4px;\"\u003eHolds shape in braises \u0026amp; pan‑sears\u003c\/div\u003e\u003c\/a\u003e\n    \u003ca href=\"\/products\/ever-green-fried-tofu-puffs-200g\" style=\"display:block;border:1px solid #e2e8f0;background:#fff;border-radius:12px;padding:12px;color:#0f172a;\"\u003e\u003cdiv style=\"font-weight:700;\"\u003eEver Green Fried Tofu Puffs, 200g\u003c\/div\u003e\n\u003cdiv style=\"font-size:13px;color:#475569;margin-top:4px;\"\u003eSpongy puffs perfect for hotpot \u0026amp; curry\u003c\/div\u003e\u003c\/a\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"margin-top:12px;text-align:center;\"\u003e\n    \u003ca href=\"\/collections\/tofu-soy-products\" style=\"display:inline-block;color:#DB3A35;font-weight:700;\"\u003eShop all Tofu \u0026amp; Soy 7\u003c\/a\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151481352479,"sku":"A9323536800014","price":2.39,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_1265659e-c79c-4426-a61d-4d9d08bbe227.jpg?v=1712383868"},{"product_id":"fresh-ever-green-tofu-puffs-approximately-150g","title":"Ever Green Fried Tofu Puffs 150g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:8px 12px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;margin-top:8px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:26px;font-weight:800;\"\u003eEver Green Fried Tofu Puffs 150g\u003c\/h1\u003e\n  \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003eLight, spongy tofu pillows that soak up sauces and broth—ideal for soups, stir‑fries, and hotpot.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003eCrisp‑outside, airy‑inside texture that drinks up flavors in minutes.\u003c\/li\u003e\n    \u003cli\u003ePre‑fried and ready to use—great for quick weeknight cooking.\u003c\/li\u003e\n    \u003cli\u003eVersatile across Asian cuisines: yong tau foo, laksa, curry, hotpot, stir‑fries.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:1fr;gap:12px;\"\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eBroth‑soaked noodle soup \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLow‑calorie\u003c\/span\u003e\n\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eSimmer puffs in clear stock for 2–4 minutes, then ladle over \u003ca href=\"\/products\/double-phoenix-jiangmen-rice-noodles-454g\"\u003erice vermicelli\u003c\/a\u003e with blanched \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e. Finish with a splash of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e and white pepper. Try with \u003ca href=\"\/products\/bull-head-clear-chicken-broth-411ml-canned-chicken-stock\"\u003eclear chicken broth\u003c\/a\u003e for ease.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eVelvety shiitake stir‑fry with greens\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eStir‑fry sliced puffs with \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eshiitake\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-green-stemmed-vegetable-hearts-bundle\"\u003echoi sum\u003c\/a\u003e, and \u003ca href=\"\/products\/peeled-garlic-cloves-250g\"\u003egarlic\u003c\/a\u003e. Glaze with \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e and a dash of water; toss just until saucy.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eHotpot hero\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eAdd puffs to a bubbling \u003ca href=\"\/products\/haidilao-tomato-hot-pot-base-200g\"\u003etomato hotpot base\u003c\/a\u003e during the last 3–5 minutes so they soak but stay bouncy. Pair with \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eenoki mushrooms\u003c\/a\u003e and \u003ca href=\"\/products\/australian-raw-king-prawns-peeled-tail-on-flash-frozen-700g\"\u003eking prawns\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n      \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eStuffed tofu puffs (yong tau foo‑style)\u003c\/h4\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eCut a slit and stuff with \u003ca href=\"\/products\/borrowdale-free-range-pork-mince-500g-frozen\"\u003elean pork mince\u003c\/a\u003e, minced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003espring onion\u003c\/a\u003e and \u003ca href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\"\u003eginger\u003c\/a\u003e. Pan‑sear, then braise 6–8 minutes with \u003ca href=\"\/products\/haitian-premium-soy-sauce-1-9l\"\u003esoy sauce\u003c\/a\u003e and a splash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003eFor extra‑clean flavor, briefly blanch puffs in hot water for 10–20 seconds, then drain.\u003c\/li\u003e\n    \u003cli\u003eMake a small slit or poke a hole—this helps puffs absorb sauces and broth evenly.\u003c\/li\u003e\n    \u003cli\u003eFor a crisp finish, air‑fry or oven‑toast at high heat for 3–5 minutes before adding to dishes.\u003c\/li\u003e\n    \u003cli\u003eAdd near the end of cooking: about 2–4 minutes in soups or the last minute of stir‑fries.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003e\n    Try with \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy sauce\u003c\/a\u003e, a drizzle of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e, a spoon of \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003ecrispy chili oil\u003c\/a\u003e, slurpy \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-1000g\"\u003erice noodles\u003c\/a\u003e, tender \u003ca href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\"\u003eShanghai bok choy\u003c\/a\u003e, and umami \u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eshimeji mushrooms\u003c\/a\u003e.\n  \u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n  \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eExplore more tofu \u0026amp; soy favourites in our collection: \u003ca href=\"\/collections\/tofu-soy-products\"\u003eTofu \u0026amp; Soy Products\u003c\/a\u003e.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151481549087,"sku":"A9323536001251","price":5.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_d3396893-f0ea-4695-8eb4-a3215eda092f.jpg?v=1712383876"},{"product_id":"fresh-ever-green-egg-strip-tofu-approximately-150g","title":"Ever Green Egg Strip Tofu, 150g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:10px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.55;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:22px;font-weight:800;\"\u003eEver Green Egg Strip Tofu, 150g\u003c\/h1\u003e\n  \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eSilky, egg-enriched tofu pre-cut into tender strips. It soaks up sauces beautifully, holds shape in stir-fries and soups, and cooks in minutes—perfect for quick, comforting meals.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;\"\u003e\n    \u003cli\u003eDelicate egg-tofu texture with gentle savory notes.\u003c\/li\u003e\n    \u003cli\u003ePre-cut strips save prep time—drop straight into the pan, soup, or hotpot.\u003c\/li\u003e\n    \u003cli\u003eVersatile across stir-fries, noodle soups, hotpots, and chilled salads.\u003c\/li\u003e\n    \u003cli\u003eHolds together better than silken tofu while staying soft and silky.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:1fr;gap:14px;\"\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eWok-tossed with oyster mushrooms \u0026amp; greens\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eSear the strips, then toss with \u003ca href=\"\/products\/chois-oyster-mushrooms-400g\" style=\"color:var(--brand);\"\u003eoyster mushrooms\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\" style=\"color:var(--brand);\"\u003eShanghai bok choy\u003c\/a\u003e, and a spoon of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\" style=\"color:var(--brand);\"\u003eoyster sauce\u003c\/a\u003e. Finish with a splash of water to glaze; cook 2–4 minutes until glossy.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eChilled sesame–scallion ribbons\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eBlanch strips, chill, then dress with \u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\" style=\"color:var(--brand);\"\u003esesame oil\u003c\/a\u003e, a dash of \u003ca href=\"\/products\/hengshun-white-rice-vinegar-500ml\" style=\"color:var(--brand);\"\u003erice vinegar\u003c\/a\u003e and \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:var(--brand);\"\u003elight soy\u003c\/a\u003e. Top with sliced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\" style=\"color:var(--brand);\"\u003espring onions\u003c\/a\u003e for a cool starter.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eBroth-based hotpot add-in \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth-based\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eSlide the strips into a clear, light broth like \u003ca href=\"\/products\/cygnet-clear-soup-hot-pot-base-200g-mild-chinese-shabu-shabu-broth-seasoning\" style=\"color:var(--brand);\"\u003eCygnet Clear Soup Hot Pot Base\u003c\/a\u003e; add a handful of \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\" style=\"color:var(--brand);\"\u003eenoki mushrooms\u003c\/a\u003e. Simmer 2–3 minutes until just set.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;\"\u003eWeeknight noodle soup\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eWarm \u003ca href=\"\/products\/bull-head-clear-chicken-broth-411ml-canned-chicken-stock\" style=\"color:var(--brand);\"\u003eclear chicken broth\u003c\/a\u003e, add \u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\" style=\"color:var(--brand);\"\u003eyangchun noodles\u003c\/a\u003e, ginger slices, and tofu strips; simmer 3–5 minutes for a cozy bowl.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;\"\u003e\n    \u003cli\u003ePat dry before searing for better browning and fewer splatters.\u003c\/li\u003e\n    \u003cli\u003eHandle gently; use a wide spatula to turn so the strips don’t break.\u003c\/li\u003e\n    \u003cli\u003eFor stir-fries, sear first, remove, then toss back in with sauce at the end.\u003c\/li\u003e\n    \u003cli\u003eFor soups\/hotpot, add near the end and simmer briefly to keep the texture silky.\u003c\/li\u003e\n    \u003cli\u003eOptional: dust lightly with cornstarch for a delicate glaze in saucy dishes.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;\"\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\" style=\"color:var(--brand);\"\u003eHaitian Premium Oyster Sauce 700g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:var(--brand);\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\" style=\"color:var(--brand);\"\u003eChuan Lao Hui Pure Sesame Oil 320ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/fresh-dried-garlic-heads-approximately-500g\" style=\"color:var(--brand);\"\u003eGarlic Bulbs 500g\u003c\/a\u003e \u0026amp; \u003ca href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\" style=\"color:var(--brand);\"\u003eGinger 500g\u003c\/a\u003e\n\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\" style=\"color:var(--brand);\"\u003eChois Shiitake Mushrooms - 100g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-1000g\" style=\"color:var(--brand);\"\u003eChunsi Jiangxi Rice Noodles - 1kg\u003c\/a\u003e or \u003ca href=\"\/products\/hankun-crispy-konjac-yam-threads-200g\" style=\"color:var(--brand);\"\u003eKonnyaku Yam Threads 200g\u003c\/a\u003e\n\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 10px 18px;color:#334155;\"\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-chinese-style-tofu-approximately-500g\" style=\"color:var(--brand);\"\u003eEver Green Classic Tofu, 500g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-silken-tofu-approximately-500g\" style=\"color:var(--brand);\"\u003eEver Green Momen Tofu, 500g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-dried-tofu-4-pieces-approximately-400g\" style=\"color:var(--brand);\"\u003eEver Green Dried Tofu - 4 Pieces, 400g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/ever-green-fried-tofu-puffs-200g\" style=\"color:var(--brand);\"\u003eEver Green Fried Tofu Puffs - 200g\u003c\/a\u003e\u003c\/li\u003e\n  \u003c\/ul\u003e\n  \u003ca href=\"\/collections\/tofu-soy-products\" style=\"display:inline-block;color:var(--brand);font-weight:700;\"\u003eBrowse all tofu \u0026amp; soy products →\u003c\/a\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151481712927,"sku":"A9323536720022","price":3.19,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_24257df0-cffd-49dc-a562-852cd315a028.jpg?v=1736929216"},{"product_id":"fresh-ever-green-fresh-vegetarian-chicken-approx-350g","title":"Ever Green Fresh Vegetarian Chicken 350g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#334155;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch2 style=\"margin:0 0 6px;font-size:24px;font-weight:800;\"\u003eEver Green Fresh Vegetarian Chicken 350g\u003c\/h2\u003e\n\u003cp style=\"margin:6px 0 0;color:#475569;font-size:14px;\"\u003eTender, plant-based soy protein with a satisfying bite — ready to slice, shred, stir-fry or simmer. Soaks up sauces beautifully for quick weeknight meals.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n\u003cul style=\"margin:0 0 0 18px;padding:0;\"\u003e\n\u003cli\u003eVersatile texture: great seared, simmered, or served cold as a salad “shreds.”\u003c\/li\u003e\n\u003cli\u003eFast: cooks through in about 3–5 minutes so dinner’s on the table quickly.\u003c\/li\u003e\n\u003cli\u003eFlavor sponge: takes on light soy, sesame, chili oil, and vinegars effortlessly.\u003c\/li\u003e\n\u003cli\u003eNo bones, no trimming — just open, slice, and cook.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n\u003cdiv style=\"display:flex;flex-direction:column;gap:14px;\"\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eGarlic‑ginger stir‑fry with bok choy\u003c\/div\u003e\n    \u003cp style=\"margin:0;color:#475569;\"\u003eSlice and sear until lightly golden, then add bok choy stems and leaves, garlic and ginger. Splash with \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:#DB3A35;\"\u003elight soy\u003c\/a\u003e and a touch of sesame oil; toss 1–2 minutes more. Try it with \u003ca href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\" style=\"color:#DB3A35;\"\u003eShanghai bok choy\u003c\/a\u003e.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eBroth-based rice vermicelli soup \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth-based\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003cp style=\"margin:0;color:#475569;\"\u003eSimmer a light pot with \u003ca href=\"\/products\/bashu-shijia-mushroom-hot-pot-soup-base-150g\" style=\"color:#DB3A35;\"\u003emushroom hot pot base\u003c\/a\u003e and water. Add thin slices of vegetarian chicken and \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\" style=\"color:#DB3A35;\"\u003erice vermicelli\u003c\/a\u003e; cook 3–4 minutes. Finish with spring onion and a dash of white pepper.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eCold sesame‑chili “shredded chicken” salad\u003c\/div\u003e\n    \u003cp style=\"margin:0;color:#475569;\"\u003eShred by hand or slice into thin strips. Toss with a spoon of sesame oil, a splash of \u003ca href=\"\/products\/hengshun-white-rice-vinegar-500ml\" style=\"color:#DB3A35;\"\u003erice vinegar\u003c\/a\u003e, soy, sugar, and chili oil. Add cucumbers and coriander for crunch. Try \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\" style=\"color:#DB3A35;\"\u003epure sesame oil\u003c\/a\u003e for aroma.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n    \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eOyster mushroom rice bowl\u003c\/div\u003e\n    \u003cp style=\"margin:0;color:#475569;\"\u003eStir‑fry strips with \u003ca href=\"\/products\/chois-oyster-mushrooms-400g\" style=\"color:#DB3A35;\"\u003eoyster mushrooms\u003c\/a\u003e, soy, and a touch of sugar until glazed. Serve over fluffy \u003ca href=\"\/products\/beidahuang-wuchang-rice-vacuum-pack-5kg\" style=\"color:#DB3A35;\"\u003eWuchang rice\u003c\/a\u003e with scallions.\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n\u003cul style=\"margin:0 0 0 18px;padding:0;\"\u003e\n\u003cli\u003eFor neat strips, chill briefly, then slice against the grain; for a rustic “shred,” pull apart by hand.\u003c\/li\u003e\n\u003cli\u003eSear over medium‑high heat with a thin oil coating to develop caramelized edges without drying.\u003c\/li\u003e\n\u003cli\u003eAdd sauces in the last minute to prevent sticking and keep flavors bright.\u003c\/li\u003e\n\u003cli\u003eFor soups, add near the end and simmer briefly (2–4 minutes) to warm through.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n\u003cul style=\"margin:0 0 0 18px;padding:0;\"\u003e\n\u003cli\u003e\u003ca href=\"\/products\/dl-black-soybean-brewed-light-soy-sauce-480ml-limited-import\" style=\"color:#DB3A35;\"\u003eDL Black Soybean Brewed Light Soy Sauce 480ml\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chuan-nan-spicy-chili-oil-326g\" style=\"color:#DB3A35;\"\u003eChuan Nan Spicy Chili Oil 326g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-broccoli-approximately-900g-1000g\" style=\"color:#DB3A35;\"\u003eBroccoli 900g–1000g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\" style=\"color:#DB3A35;\"\u003eChois Shimeji Mushrooms - 150g\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\" style=\"color:#DB3A35;\"\u003eEvergreen Yangchun Noodles 500g\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n\u003cp style=\"margin:0;\"\u003eExplore more tofu and soy favourites: \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;\"\u003eTofu \u0026amp; Soy Products Collection\u003c\/a\u003e\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151481876767,"sku":"A9323536001107","price":5.19,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_14d4b279-2dda-42cc-9484-3945851ce51e.jpg?v=1712383885"},{"product_id":"fresh-ever-green-dried-tofu-4-pieces-approximately-400g","title":"Ever Green Dried Tofu - 4 Pieces, 400g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;margin-top:16px;\"\u003e\n    \u003ch1 style=\"margin:0 0 6px;font-size:26px;font-weight:800;\"\u003eEver Green Dried Tofu - 4 Pieces, 400g\u003c\/h1\u003e\n    \u003cp style=\"margin:6px 0 0;color:#475569;font-size:14px;\"\u003eFirm, protein-packed pressed tofu that holds its shape in stir-fries, soups, and salads.\u003c\/p\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n    \u003cul style=\"margin:0 0 0 18px;color:#334155;font-size:14px;\"\u003e\n      \u003cli\u003eExtra-firm bite: slice into ribbons, batons, or cubes without crumbling.\u003c\/li\u003e\n      \u003cli\u003eSoaks up sauces beautifully while staying pleasantly chewy.\u003c\/li\u003e\n      \u003cli\u003eVersatile across stir-fry, cold salads, noodle bowls, hotpot, and lunch boxes.\u003c\/li\u003e\n      \u003cli\u003eNeutral, clean taste that pairs with soy, vinegar, chili oil, garlic, and ginger.\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch3 style=\"margin:0 12px 14px 0;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n\n    \u003cdiv style=\"display:grid;gap:12px;\"\u003e\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n        \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eGinger–garlic stir-fry with bell peppers\u003c\/h4\u003e\n        \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eCut tofu into batons; sear until golden, then toss with sliced \u003ca href=\"\/products\/fresh-green-lantern-peppers-pack-of-3\"\u003egreen bell peppers\u003c\/a\u003e, slivered \u003ca href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\"\u003eginger\u003c\/a\u003e, a little \u003ca href=\"\/products\/peeled-garlic-cloves-250g\"\u003egarlic\u003c\/a\u003e, light soy, and a dash of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e. Stir-fry on high for 2–4 minutes until crisp‑tender.\u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n        \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eChilled tofu ribbon salad \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLight \u0026amp; fresh\u003c\/span\u003e\n\u003c\/h4\u003e\n        \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eShave tofu into thin ribbons and toss with \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e, a splash of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e, a spoon of \u003ca href=\"\/products\/cuihong-spicy-chili-oil-200g\"\u003echili oil\u003c\/a\u003e, and chopped \u003ca href=\"\/products\/fresh-bunch-of-coriander\"\u003ecoriander\u003c\/a\u003e and \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003espring onions\u003c\/a\u003e. Serve cool for a refreshing side.\u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n        \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eBrothy noodle bowl with mushrooms and bok choy\u003c\/h4\u003e\n        \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eSimmer tofu slices in warm \u003ca href=\"\/products\/bull-head-clear-chicken-broth-411ml-canned-chicken-stock\"\u003eclear chicken broth\u003c\/a\u003e; add soaked \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e, a handful of \u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eshimeji mushrooms\u003c\/a\u003e, and \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e. Season to taste with light soy. Ready in minutes.\u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n        \u003ch4 style=\"margin:0 0 6px;font-size:16px;font-weight:700;\"\u003eSichuan-style spicy braise (doubanjiang tofu)\u003c\/h4\u003e\n        \u003cp style=\"margin:6px 0 0;color:#334155;font-size:14px;\"\u003eBriefly pan-fry tofu cubes, then simmer with \u003ca href=\"\/products\/chuan-lao-hui-pi-county-red-oil-broad-bean-paste-500g\"\u003ePixian broad bean chili paste\u003c\/a\u003e, a dash of \u003ca href=\"\/products\/haitian-dark-soy-sauce-500ml\"\u003edark soy\u003c\/a\u003e, sliced \u003ca href=\"\/products\/fresh-yellow-onions-1kg\"\u003eonion\u003c\/a\u003e, and a splash of water until saucy. Spoon over hot \u003ca href=\"\/products\/arawana-northeast-rice-5kg\"\u003esteamed rice\u003c\/a\u003e.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n    \u003cul style=\"margin:0 0 0 18px;color:#334155;font-size:14px;\"\u003e\n      \u003cli\u003ePat dry, then slice evenly (ribbons for salads; 1–2 cm batons or 1.5–2 cm cubes for wok cooking).\u003c\/li\u003e\n      \u003cli\u003eFor ultra-clean flavor, blanch slices in lightly salted water for 30–60 seconds; drain well.\u003c\/li\u003e\n      \u003cli\u003ePre-sear in a thin film of oil until lightly golden before saucing to lock in texture.\u003c\/li\u003e\n      \u003cli\u003eAvoid overcooking; stir-fry or simmer just 2–4 minutes after adding sauce for best bite.\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n    \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:10px;font-size:14px;\"\u003e\n      \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:#DB3A35;\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\n      \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\" style=\"color:#DB3A35;\"\u003eLee Kum Kee Pure Sesame Oil 207ml\u003c\/a\u003e\n      \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\" style=\"color:#DB3A35;\"\u003eHengshun Zhenjiang Aromatic Vinegar 550ml\u003c\/a\u003e\n      \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\" style=\"color:#DB3A35;\"\u003eChuanwazi Crispy Chili Oil with Peanuts 200g\u003c\/a\u003e\n      \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-1000g\" style=\"color:#DB3A35;\"\u003eChunsi Jiangxi Rice Noodles - 1kg\u003c\/a\u003e\n      \u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\" style=\"color:#DB3A35;\"\u003eFresh Snow Pea Sprouts - 160g\u003c\/a\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n    \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003eExplore more tofu, tofu skins, and soy specialties in our curated range.\u003c\/p\u003e\n    \u003cp style=\"margin:10px 0 0;\"\u003e\u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;\"\u003eShop all tofu \u0026amp; soy products\u003c\/a\u003e\u003c\/p\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151482532127,"sku":"A9323536011229","price":4.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_c176c11f-6791-43e6-a648-faaf02dd4793.jpg?v=1712383900"},{"product_id":"fresh-ever-green-brick-dried-tofu-approximately-650g","title":"Ever Green Hard Tofu, 650g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;line-height:1.6;color:#334155;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:24px;margin-top:12px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:26px;font-weight:800;color:#0f172a;\"\u003eEver Green Hard Tofu, 650g\u003c\/h1\u003e\n  \u003cp style=\"margin:6px 0 0;font-size:14px;color:#475569;\"\u003eA firm, versatile block that holds its shape in stir‑fries, braises, grills and chilled salads.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003eFirm, dense texture that sears beautifully without crumbling.\u003c\/li\u003e\n    \u003cli\u003eNeutral flavour that soaks up marinades, sauces and broths.\u003c\/li\u003e\n    \u003cli\u003eProtein‑rich, plant‑based staple for quick weeknight cooking.\u003c\/li\u003e\n    \u003cli\u003eGenerous 650g brick for meal prep, hotpot, or family stir‑fries.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 12px 12px 0;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:grid;gap:12px;\"\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;margin-bottom:4px;\"\u003eWeeknight garlic‑ginger tofu \u0026amp; gai lan stir‑fry\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;font-size:14px;\"\u003eSear tofu cubes until golden, then toss with sliced \u003ca href=\"\/products\/fresh-bunch-of-chinese-broccoli-kai-lan-hearts\" style=\"color:#DB3A35;\"\u003egai lan\u003c\/a\u003e, a splash of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\" style=\"color:#DB3A35;\"\u003eoyster sauce\u003c\/a\u003e and a drizzle of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:#DB3A35;\"\u003elight soy\u003c\/a\u003e. Stir‑fry on high heat for 2–4 minutes until glossy and crisp‑tender.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;margin-bottom:4px;\"\u003eBroth hotpot tofu with enoki \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth‑based\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;font-size:14px;\"\u003eSimmer tofu slices in a light, savory pot made with \u003ca href=\"\/products\/haidilao-mushroom-flavor-hot-pot-seasoning-150g\" style=\"color:#DB3A35;\"\u003emushroom hot pot base\u003c\/a\u003e. Add \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\" style=\"color:#DB3A35;\"\u003eenoki mushrooms\u003c\/a\u003e and greens; cook 3–5 minutes for a clean, comforting bowl.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;margin-bottom:4px;\"\u003eChilled black‑vinegar tofu salad\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;font-size:14px;\"\u003eBlanch or steam tofu slices briefly, cool, then spoon over a tangy mix of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\" style=\"color:#DB3A35;\"\u003eZhenjiang vinegar\u003c\/a\u003e, soy, garlic and a few drops of \u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\" style=\"color:#DB3A35;\"\u003esesame oil\u003c\/a\u003e. Finish with spring onions and toasted sesame.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;margin-bottom:4px;\"\u003eCrispy tofu rice noodles with bean sprouts\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;font-size:14px;\"\u003ePan‑sear tofu batons until browned; toss with soaked \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\" style=\"color:#DB3A35;\"\u003erice vermicelli\u003c\/a\u003e, crunchy \u003ca href=\"\/products\/fresh-bean-sprouts-approximately-400g\" style=\"color:#DB3A35;\"\u003ebean sprouts\u003c\/a\u003e, soy and a touch of chili oil. Stir‑fry 2–3 minutes to finish.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003ePress 10–20 minutes between paper towels or a clean tea towel to remove excess moisture for better browning.\u003c\/li\u003e\n    \u003cli\u003eCut to match your cooking: 2–3 cm cubes for stir‑fry, 1 cm slices for pan‑searing, thin batons for noodles, thicker slabs for grilling.\u003c\/li\u003e\n    \u003cli\u003eMarinate briefly (10–15 minutes) in light soy, garlic and a little cornstarch for extra surface seasoning and crisp edges.\u003c\/li\u003e\n    \u003cli\u003eUse a well‑heated pan and enough oil to lightly coat; sear undisturbed 2–3 minutes per side before tossing.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:8px 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/kikkoman-all-purpose-soy-sauce-1-6l\" style=\"color:#DB3A35;\"\u003eKikkoman All‑Purpose Soy Sauce\u003c\/a\u003e or \u003ca href=\"\/products\/haitian-dark-soy-sauce-500ml\" style=\"color:#DB3A35;\"\u003eHaitian Dark Soy\u003c\/a\u003e for depth and colour.\u003c\/li\u003e\n    \u003cli\u003eNutty finish with \u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\" style=\"color:#DB3A35;\"\u003epure sesame oil\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eHeat and crunch from \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\" style=\"color:#DB3A35;\"\u003eSichuan chili crisp\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eBright acidity using \u003ca href=\"\/products\/hengshun-white-rice-vinegar-500ml\" style=\"color:#DB3A35;\"\u003ewhite rice vinegar\u003c\/a\u003e or black vinegar.\u003c\/li\u003e\n    \u003cli\u003eNoodle partners: \u003ca href=\"\/products\/changqing-fresh-egg-noodles-500g\" style=\"color:#DB3A35;\"\u003efresh egg noodles\u003c\/a\u003e or rice vermicelli.\u003c\/li\u003e\n    \u003cli\u003eQuick greens like \u003ca href=\"\/products\/fresh-hydroponically-grown-shanghai-bok-choy-1-bundle\" style=\"color:#DB3A35;\"\u003eShanghai bok choy\u003c\/a\u003e.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;display:flex;align-items:center;justify-content:space-between;gap:12px;\"\u003e\n  \u003cdiv\u003e\n    \u003ch3 style=\"margin:0 0 6px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n    \u003cp style=\"margin:6px 0 0;font-size:14px;color:#475569;\"\u003eExplore tofu, tofu puffs, bean curd sheets and more.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv\u003e\n    \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;text-decoration:underline;font-weight:700;\"\u003eBrowse all tofu \u0026amp; soy products\u003c\/a\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151482695967,"sku":"A9323536001268","price":6.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_2d5ea63c-a15e-4902-87ed-73384d2ddccc.jpg?v=1712383904"},{"product_id":"fresh-ever-green-braised-vegetarian-chicken-approx-325g","title":"Ever Green Braised-Flavor Vegetarian Chicken (Tasty Chicken Style Soya), 325g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#334155;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;margin-top:16px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:22px;font-weight:800;color:#0f172a;\"\u003eEver Green Braised-Flavor Vegetarian Chicken (Tasty Chicken Style Soya), 325g\u003c\/h1\u003e\n  \u003cp style=\"margin:8px 0 0;\"\u003eTender, ready-to-eat soy “chicken” with classic Chinese braised aromas. Slice, shred or cube and it’s weeknight-ready.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:10px 0 0 18px;\"\u003e\n    \u003cli\u003eDeep, savory braise-style seasoning that plays well with soy sauce, vinegar, garlic and sesame.\u003c\/li\u003e\n    \u003cli\u003eFirm-but-tender bite that holds up to stir-frying, pan-searing, and soups.\u003c\/li\u003e\n    \u003cli\u003eConvenient: pre-cooked and delicious hot or cold—perfect for noodles, salads and lunch boxes.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003col style=\"margin:0 0 0 18px;\"\u003e\n    \u003cli style=\"margin:10px 0;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eGinger–scallion stir‑fry\u003c\/div\u003e\n      \u003cdiv\u003ePan‑sear slices until lightly golden, then toss with \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003eBaby Bok Choy\u003c\/a\u003e and \u003ca href=\"\/products\/chois-oyster-mushrooms-400g\"\u003eOyster Mushrooms\u003c\/a\u003e. Finish with a splash of \u003ca href=\"\/products\/kikkoman-all-purpose-soy-sauce-1-6l\"\u003esoy sauce\u003c\/a\u003e and a few drops of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e. Cook the veg 2–4 minutes so they stay crisp‑tender.\u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin:10px 0;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eBroth‑based shirataki noodle bowl \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth‑based\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003eWarm slices in a light mushroom broth made with \u003ca href=\"\/products\/colorful-yunnan-matsutake-mushroom-soup-mix-68g-dried-mushroom-broth-kit\"\u003eMatsutake Soup Mix\u003c\/a\u003e, add rinsed \u003ca href=\"\/products\/hankun-crispy-konjac-yam-threads-200g\"\u003ekonjac (shirataki) noodles\u003c\/a\u003e and a handful of \u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\"\u003esnow pea sprouts\u003c\/a\u003e. Simple, aromatic, and satisfying.\u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin:10px 0;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eCrunchy lettuce wraps with chili crisp\u003c\/div\u003e\n      \u003cdiv\u003eQuick‑sear strips and spoon into crisp \u003ca href=\"\/products\/fresh-round-lettuce-1-head\"\u003elettuce cups\u003c\/a\u003e. Drizzle with \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003ecrispy chili oil\u003c\/a\u003e and a dash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e.\u003c\/div\u003e\n    \u003c\/li\u003e\n    \u003cli style=\"margin:10px 0;\"\u003e\n      \u003cdiv style=\"font-weight:700;color:#0f172a;\"\u003eEasy mushroom hotpot add‑in\u003c\/div\u003e\n      \u003cdiv\u003eSlice and swish for 1–2 minutes in a gentle pot made with \u003ca href=\"\/products\/haidilao-mushroom-flavor-hot-pot-seasoning-150g\"\u003emushroom hotpot base\u003c\/a\u003e, plus \u003ca href=\"\/products\/fresh-bean-sprouts-approximately-400g\"\u003ebean sprouts\u003c\/a\u003e and \u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eshimeji\u003c\/a\u003e.\u003c\/div\u003e\n    \u003c\/li\u003e\n  \u003c\/ol\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:10px 0 0 18px;\"\u003e\n    \u003cli\u003eFor best texture, pat dry and pan‑sear pieces 1–2 minutes per side before saucing.\u003c\/li\u003e\n    \u003cli\u003eSlice across the “grain” for neat strips, or shred by hand for saucy noodles and rice bowls.\u003c\/li\u003e\n    \u003cli\u003eIt’s already seasoned—taste before adding extra salt or soy.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:10px 0 0 18px;\"\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eLight soy sauce\u003c\/a\u003e and \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e for quick pan sauces.\u003c\/li\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eSesame oil\u003c\/a\u003e for a nutty finish; add a touch at the end.\u003c\/li\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\"\u003eCrispy chili oil\u003c\/a\u003e for heat and crunch.\u003c\/li\u003e\n    \u003cli\u003eVeggies like \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e and \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eshiitake\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eNoodles such as \u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\"\u003eYangchun wheat noodles\u003c\/a\u003e for comforting bowls.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;display:flex;align-items:center;justify-content:space-between;gap:12px;\"\u003e\n  \u003cdiv\u003e\n    \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n    \u003cp style=\"margin:6px 0 0;\"\u003eExplore more tofu, bean curd, and soy‑based favorites.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv\u003e\n    \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:var(--brand);font-weight:700;\"\u003eBrowse all Tofu \u0026amp; Soy Products →\u003c\/a\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151482990879,"sku":"A9323536012004","price":5.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_08951093-d2e1-4059-b39e-bc70899d5b69.jpg?v=1712383910"},{"product_id":"fresh-ever-green-dried-tofu-blocks-approximately-600g-pack-of-6","title":"Ever Green Dried Tofu Blocks, 600g, Pack of 6","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;margin-top:16px;\"\u003e\n  \u003ch1 style=\"margin:0 0 6px;font-size:26px;font-weight:800;\"\u003eEver Green Dried Tofu Blocks, 600g, Pack of 6\u003c\/h1\u003e\n  \u003cp style=\"margin:6px 0 0;color:#475569;font-size:14px;\"\u003eFirm, gently pressed dried tofu with a tight bite — perfect for slicing, stir‑frying, braising, and cold salads.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:0 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003eHolds shape in the wok and simmer pots — won’t crumble like soft tofu.\u003c\/li\u003e\n    \u003cli\u003eSoaks up marinades and sauces while keeping a satisfying, meaty chew.\u003c\/li\u003e\n    \u003cli\u003eVersatile: great in stir‑fries, braises, soups, noodle bowls, and chilled salads.\u003c\/li\u003e\n    \u003cli\u003eConvenient value pack — pre‑pressed blocks for quick prep.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;\"\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eGarlic chive stir‑fry with soy glaze\u003c\/div\u003e\n      \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003eSlice tofu into batons and sear until golden. Toss with chopped \u003ca href=\"\/products\/peeled-garlic-cloves-250g\"\u003egarlic\u003c\/a\u003e, slivered \u003ca href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\"\u003eginger\u003c\/a\u003e, and a quick sauce of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e and a touch of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e. Finish with a handful of snipped \u003ca href=\"\/products\/fresh-bundle-of-chives-pack-of-2\"\u003echives\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eChilled tofu ribbon salad with sesame \u0026amp; rice vinegar \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eLow‑calorie\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003eShave thin ribbons or matchsticks, then toss with \u003ca href=\"\/products\/hengshun-white-rice-vinegar-500ml\"\u003erice vinegar\u003c\/a\u003e, a drizzle of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003esesame oil\u003c\/a\u003e, a pinch of sugar, and sliced \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\"\u003espring onions\u003c\/a\u003e. Crisp, tangy, and refreshing.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eSoy‑braised tofu with shiitake \u0026amp; bok choy\u003c\/div\u003e\n      \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003ePan‑brown cubes, then simmer with \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eshiitake\u003c\/a\u003e, \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebok choy\u003c\/a\u003e, broth, and \u003ca href=\"\/products\/haitian-dark-soy-sauce-500ml\"\u003edark soy\u003c\/a\u003e until glazed. Serve over steamed \u003ca href=\"\/products\/hokkaido-sansanmaru-japanese-rice-5kg\"\u003eJapanese rice\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:14px;padding:14px;background:#fff;\"\u003e\n      \u003cdiv style=\"font-weight:700;margin-bottom:6px;\"\u003eClear‑broth tofu noodle soup with enoki\u003c\/div\u003e\n      \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003eAdd sliced tofu to a gentle shabu‑shabu style broth using \u003ca href=\"\/products\/cygnet-clear-soup-hot-pot-base-200g-mild-chinese-shabu-shabu-broth-seasoning\"\u003eclear soup base\u003c\/a\u003e. Finish with \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eenoki\u003c\/a\u003e, \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e, and a handful of \u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\"\u003epea sprouts\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:0 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003eRinse, pat dry, and slice evenly for quick, uniform cooking.\u003c\/li\u003e\n    \u003cli\u003eFor extra tenderness, blanch slices in simmering water for 30–60 seconds, then drain well.\u003c\/li\u003e\n    \u003cli\u003eMarinate 10–20 minutes in light soy, a touch of sugar, and sesame oil for deeper flavor.\u003c\/li\u003e\n    \u003cli\u003ePan‑sear over medium‑high heat until edges turn golden before saucing or braising.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:0 0 0 18px;color:#334155;font-size:14px;\"\u003e\n    \u003cli\u003e\n\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eLight soy sauce\u003c\/a\u003e or a splash of \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\"\u003eZhenjiang vinegar\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eAromatic oils: \u003ca href=\"\/products\/chuan-lao-hui-pure-sesame-oil-320ml\"\u003epure sesame oil\u003c\/a\u003e for finishing.\u003c\/li\u003e\n    \u003cli\u003eUmami boosters: \u003ca href=\"\/products\/chois-oyster-mushrooms-400g\"\u003eoyster mushrooms\u003c\/a\u003e or \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\"\u003eshiitake\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eNoodles for quick bowls: \u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\"\u003eYangchun noodles\u003c\/a\u003e or \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e.\u003c\/li\u003e\n    \u003cli\u003eFragrant aromatics: \u003ca href=\"\/products\/fresh-green-leaf-farm-tender-ginger-approximately-500g\"\u003eginger\u003c\/a\u003e and \u003ca href=\"\/products\/peeled-garlic-cloves-250g\"\u003egarlic\u003c\/a\u003e.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;text-align:center;\"\u003e\n  \u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n  \u003cp style=\"margin:0;color:#334155;font-size:14px;\"\u003eDiscover tofu, tofu puffs, silken tofu, and more in our soy collection.\u003c\/p\u003e\n  \u003cp style=\"margin:10px 0 0;\"\u003e\u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:var(--brand);font-weight:700;\"\u003eExplore more Tofu \u0026amp; Soy Products\u003c\/a\u003e\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151483056415,"sku":"A9323536001220","price":6.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_06657dc2-1160-4898-92f9-2c659fccb7b1.jpg?v=1712383917"},{"product_id":"fresh-ever-green-fried-tofu-6-pieces-bag-approximately-500g","title":"Ever Green Fried Tofu - 6 Pieces\/Bag, 500g","description":"\u003cdiv id=\"umall-desc\" style=\"max-width:860px;margin:0 auto;padding:16px 0;--brand:#DB3A35;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;line-height:1.6;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;margin-top:0;\"\u003e\n    \u003ch1 style=\"margin:0 0 6px;font-size:26px;font-weight:800;color:#111827;\"\u003eEver Green Fried Tofu - 6 Pieces\/Bag, 500g\u003c\/h1\u003e\n    \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003eLight, springy fried tofu that soaks up sauces like a sponge—perfect for fast stir-fries, soups, noodles and hotpot. Ready to use, no pressing needed.\u003c\/p\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h2\u003e\n    \u003cul style=\"margin:0;padding-left:18px;color:#334155;\"\u003e\n      \u003cli\u003ePorous puffs absorb broths, sauces and seasonings for big flavor in minutes.\u003c\/li\u003e\n      \u003cli\u003ePre-fried and ready to cook—just toss, simmer, or skewer.\u003c\/li\u003e\n      \u003cli\u003eHolds shape in stir-fries and hotpots without crumbling.\u003c\/li\u003e\n      \u003cli\u003eNeutral, gently nutty tofu taste that pairs with everything from soy and garlic to spicy-sour dressings.\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch2 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h2\u003e\n    \u003cdiv style=\"display:grid;grid-template-columns:1fr;gap:14px;\"\u003e\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n        \u003cp style=\"margin:0 0 6px;\"\u003e\u003cstrong\u003eWok-tossed with gai lan and shiitake\u003c\/strong\u003e\u003c\/p\u003e\n        \u003cp style=\"margin:0;color:#334155;\"\u003eHalve tofu pieces and sear until golden, then toss with \u003ca href=\"\/products\/fresh-bunch-of-chinese-broccoli-kai-lan-hearts\" style=\"color:var(--brand);\"\u003egai lan\u003c\/a\u003e, \u003ca href=\"\/products\/chois-shiitake-mushrooms-100g\" style=\"color:var(--brand);\"\u003eshiitake\u003c\/a\u003e, garlic and a splash of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\" style=\"color:var(--brand);\"\u003eoyster sauce\u003c\/a\u003e. Stir-fry on high heat for 2–4 minutes for glossy, savory tofu.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n        \u003cp style=\"margin:0 0 6px;\"\u003e\u003cstrong\u003eBroth noodle bowl\u003c\/strong\u003e\u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth‑based\u003c\/span\u003e\u003c\/p\u003e\n        \u003cp style=\"margin:0;color:#334155;\"\u003eSimmer tofu with light stock like \u003ca href=\"\/products\/bull-head-clear-chicken-broth-411ml-canned-chicken-stock\" style=\"color:var(--brand);\"\u003eclear chicken broth\u003c\/a\u003e and add \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\" style=\"color:var(--brand);\"\u003erice vermicelli\u003c\/a\u003e and a handful of \u003ca href=\"\/products\/fresh-snow-pea-sprouts-160g\" style=\"color:var(--brand);\"\u003esnow pea sprouts\u003c\/a\u003e. Clean, cozy, and slurpable.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n        \u003cp style=\"margin:0 0 6px;\"\u003e\u003cstrong\u003eHotpot hero\u003c\/strong\u003e\u003c\/p\u003e\n        \u003cp style=\"margin:0;color:#334155;\"\u003eDrop tofu into a bubbling pot made with \u003ca href=\"\/products\/haidilao-mushroom-flavor-hot-pot-seasoning-150g\" style=\"color:var(--brand);\"\u003emushroom hot pot base\u003c\/a\u003e; finish with a cluster of \u003ca href=\"\/products\/chois-enoki-mushrooms-300g\" style=\"color:var(--brand);\"\u003eenoki\u003c\/a\u003e. The puffs soak up flavorful broth beautifully.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv style=\"border:1px solid #e2e8f0;border-radius:12px;padding:14px;background:#fff;\"\u003e\n        \u003cp style=\"margin:0 0 6px;\"\u003e\u003cstrong\u003eSpicy‑sour tofu salad\u003c\/strong\u003e\u003c\/p\u003e\n        \u003cp style=\"margin:0;color:#334155;\"\u003eSlice warm tofu and toss with \u003ca href=\"\/products\/hengshun-zhenjiang-aromatic-vinegar-550ml\" style=\"color:var(--brand);\"\u003eZhenjiang vinegar\u003c\/a\u003e, a spoon of \u003ca href=\"\/products\/chuanwazi-crispy-chili-oil-with-peanuts-200g-sichuan-chili-crisp\" style=\"color:var(--brand);\"\u003echili crisp\u003c\/a\u003e, and chopped \u003ca href=\"\/products\/fresh-bunch-of-coriander\" style=\"color:var(--brand);\"\u003ecoriander\u003c\/a\u003e for a punchy side.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h2\u003e\n    \u003cul style=\"margin:0;padding-left:18px;color:#334155;\"\u003e\n      \u003cli\u003eFor cleaner flavor, blanch puffs in hot water for 10–20 seconds, then drain before cooking.\u003c\/li\u003e\n      \u003cli\u003eHalve or quarter to expose more surface area—better for soaking sauces.\u003c\/li\u003e\n      \u003cli\u003ePan‑sear over medium‑high with a touch of oil until edges crisp (2–3 minutes), then add aromatics and sauce.\u003c\/li\u003e\n      \u003cli\u003eSimmer gently in soups or hotpot so they absorb broth without turning soggy.\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h2\u003e\n    \u003cul style=\"margin:0;padding-left:18px;color:#334155;\"\u003e\n      \u003cli\u003e\n\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\" style=\"color:var(--brand);\"\u003eLight soy sauce\u003c\/a\u003e or a touch of \u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\" style=\"color:var(--brand);\"\u003epure sesame oil\u003c\/a\u003e for savory depth.\u003c\/li\u003e\n      \u003cli\u003eFresh aromatics like \u003ca href=\"\/products\/fresh-bundle-of-spring-onions\" style=\"color:var(--brand);\"\u003espring onions\u003c\/a\u003e and a kick from \u003ca href=\"\/products\/fresh-red-chili-peppers-approximately-250g\" style=\"color:var(--brand);\"\u003ered chilies\u003c\/a\u003e.\u003c\/li\u003e\n      \u003cli\u003eNoodles like \u003ca href=\"\/products\/fresh-evergreen-yangchun-noodles-500g\" style=\"color:var(--brand);\"\u003eYangchun wheat noodles\u003c\/a\u003e for easy bowls.\u003c\/li\u003e\n      \u003cli\u003eQuick greens: \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\" style=\"color:var(--brand);\"\u003ebaby bok choy\u003c\/a\u003e for a fresh, crunchy side.\u003c\/li\u003e\n    \u003c\/ul\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n    \u003ch2 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h2\u003e\n    \u003cdiv style=\"display:flex;flex-wrap:wrap;gap:10px;\"\u003e\n      \u003ca href=\"\/products\/fresh-ever-green-chinese-style-tofu-approximately-500g\" style=\"color:var(--brand);display:inline-block;padding:8px 10px;border:1px solid #e2e8f0;border-radius:10px;background:#fff;\"\u003eEver Green Classic Tofu, 500g\u003c\/a\u003e\n      \u003ca href=\"\/products\/fresh-ever-green-five-spice-dried-tofu-approximately-220g\" style=\"color:var(--brand);display:inline-block;padding:8px 10px;border:1px solid #e2e8f0;border-radius:10px;background:#fff;\"\u003eEver Green Five‑Spice Dried Tofu, 220g\u003c\/a\u003e\n      \u003ca href=\"\/products\/fresh-ever-green-tofu-puffs-approximately-150g\" style=\"color:var(--brand);display:inline-block;padding:8px 10px;border:1px solid #e2e8f0;border-radius:10px;background:#fff;\"\u003eEver Green Fried Tofu Puffs 150g\u003c\/a\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"margin-top:12px;\"\u003e\n      \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:var(--brand);font-weight:700;\"\u003eBrowse all tofu \u0026amp; soy products →\u003c\/a\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n  \u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151483253023,"sku":"A9323536001237","price":6.49,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_ca295fcb-10eb-48b1-8b2a-195fb90c914a.jpg?v=1712383930"},{"product_id":"fresh-ever-green-smooth-fried-tofu-approximately-300g","title":"Fried Silken Tofu, 300g","description":"\u003cdiv id=\"umall-desc\" style=\"--brand:#DB3A35;max-width:860px;margin:0 auto;padding:10px 12px;\"\u003e\n\u003cstyle\u003e#umall-desc a{ text-decoration:none !important; border-bottom:1px solid var(--brand) !important; } #umall-desc a:hover{ opacity:.85; }\u003c\/style\u003e\n\n\n\n\n\n\n\u003cstyle\u003e\n\/* DESC ENHANCER v1 *\/\n#umall-desc .um-slider{ display:grid; grid-auto-flow:column; grid-auto-columns:180px; gap:12px; overflow-x:auto; padding:2px 2px 8px; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; margin-top:12px; }\n#umall-desc .um-slider::-webkit-scrollbar{ height:8px; }\n#umall-desc .um-slider::-webkit-scrollbar-thumb{ background:#e5e7eb; border-radius:999px; }\n#umall-desc .um-card{ scroll-snap-align:start; border:1px solid #e5e7eb; border-radius:12px; overflow:hidden; background:#fff; display:flex; flex-direction:column; text-decoration:none; color:inherit; }\n#umall-desc a.um-card{ border-bottom:1px solid #e5e7eb !important; text-decoration:none !important; }\n#umall-desc a[style*=\"border-radius:999\"]{ border-bottom:1px solid #e2e8f0 !important; text-decoration:none !important; }\n#umall-desc .um-imgbox{ background:#fff; display:flex; align-items:center; justify-content:center; width:100%; aspect-ratio:1\/1; height:auto; position:relative; }\n#umall-desc .um-imgbox img{ max-width:100%; max-height:100%; object-fit:contain; }\n#umall-desc .um-badge{ position:absolute; top:8px; left:8px; background:rgba(219,58,53,.92); color:#fff; font-weight:700; font-size:12px; padding:2px 6px; border-radius:6px; display:none; }\n#umall-desc .um-meta{ padding:10px 10px 12px; display:flex; flex-direction:column; gap:6px; }\n#umall-desc .um-title{ font-size:14px; font-weight:600; color:#0f172a; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; min-height:38px; }\n#umall-desc .um-price{ font-size:14px; font-weight:700; color:var(--brand); display:flex; align-items:center; gap:8px; }\n#umall-desc .um-price s{ color:#94a3b8; font-weight:500; }\n#umall-desc .um-recipes{ display:grid; grid-template-columns:repeat(1,minmax(0,1fr)); gap:12px; margin-top:12px; }\n@media (min-width:640px){ #umall-desc .um-recipes{ grid-template-columns:repeat(2,minmax(0,1fr)); } }\n@media (min-width:1024px){ #umall-desc .um-recipes{ grid-template-columns:repeat(3,minmax(0,1fr)); } }\n#umall-desc .um-rcard{ border:1px solid #e2e8f0; border-radius:12px; background:#fff; padding:16px; }\n#umall-desc .um-rcard h4{ margin:0 0 6px; font-size:16px; font-weight:700; color:#0f172a; }\n#umall-desc .um-rcard p, #umall-desc .um-rcard div{ margin:0; font-size:14px; color:#334155; }\n#umall-desc .um-section-title{ margin:16px 0 10px; font-size:16px; font-weight:800; }\n\u003c\/style\u003e\n\n\n\n\n\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:22px;\"\u003e\n  \u003ch2 style=\"margin:0 0 6px;font-size:22px;font-weight:800;color:#111827;\"\u003eFried Silken Tofu, 300g\u003c\/h2\u003e\n  \u003cp style=\"margin:8px 0 0;color:#334155;\"\u003eDelicately soft inside with a light golden crust outside. Pre‑fried for convenience—ready to slide into stir‑fries, soups, and noodle bowls.\u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eWhy you’ll love it\u003c\/h3\u003e\n  \u003cul style=\"margin:6px 0 0 18px;color:#334155;line-height:1.6;\"\u003e\n    \u003cli\u003eSilken interior stays tender while the outer layer catches sauces beautifully.\u003c\/li\u003e\n    \u003cli\u003ePre‑fried convenience—just reheat and combine with your favourite veg, noodles, or broth.\u003c\/li\u003e\n    \u003cli\u003eExcellent in quick stir‑fries and hotpots; holds shape better than plain silken tofu.\u003c\/li\u003e\n    \u003cli\u003eNeutral, clean flavour that absorbs aromatics like soy, garlic, and sesame.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 12px;font-size:18px;font-weight:700;\"\u003eHow to enjoy\u003c\/h3\u003e\n  \u003cdiv style=\"display:flex;flex-direction:column;gap:12px;color:#334155;\"\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;color:#111827;\"\u003eWok‑tossed with baby bok choy \u0026amp; oyster‑soy glaze\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;\"\u003eCrisp tofu briefly, then toss with \u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003ebaby bok choy\u003c\/a\u003e, a splash of \u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003elight soy\u003c\/a\u003e, and a spoon of \u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eoyster sauce\u003c\/a\u003e. 2–4 minutes over high heat.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;color:#111827;\"\u003eBrothy mushroom noodle bowl \u003cspan style=\"display:inline-flex;align-items:center;border:1px solid rgba(219,58,53,.2);color:var(--brand);background:rgba(219,58,53,.08);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600;margin-left:8px\"\u003eBroth-based\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;\"\u003eSimmer tofu with \u003ca href=\"\/products\/chois-shimeji-mushrooms-150g\"\u003eshimeji mushrooms\u003c\/a\u003e in a light \u003ca href=\"\/products\/colorful-yunnan-matsutake-mushroom-soup-mix-68g-dried-mushroom-broth-kit\"\u003emushroom broth\u003c\/a\u003e, then add a handful of \u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-300g\"\u003erice vermicelli\u003c\/a\u003e. Finish with spring onion. Comforting and light.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;color:#111827;\"\u003eSatay‑glazed tofu with sweet red capsicum\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;\"\u003ePan‑sear tofu until edges crisp, add sliced \u003ca href=\"\/products\/fresh-red-lantern-peppers-pack-of-3\"\u003ered bell peppers\u003c\/a\u003e, then glaze with a spoon of \u003ca href=\"\/products\/bull-head-brand-satay-sauce-250g\"\u003esatay sauce\u003c\/a\u003e and a drizzle of \u003ca href=\"\/products\/chuan-lao-hui-spicy-chili-oil-210ml\"\u003echili oil\u003c\/a\u003e. Great with steamed rice.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv\u003e\n      \u003cdiv style=\"font-weight:700;color:#111827;\"\u003eMushroom mapo‑style tofu over rice\u003c\/div\u003e\n      \u003cp style=\"margin:6px 0 0;\"\u003eSimmer tofu and \u003ca href=\"\/products\/chois-oyster-mushrooms-400g\"\u003eoyster mushrooms\u003c\/a\u003e in a quick sauce of \u003ca href=\"\/products\/chuan-lao-hui-pixian-red-oil-broad-bean-paste-1kg\"\u003ePixian doubanjiang\u003c\/a\u003e, garlic, and stock. Spoon over hot \u003ca href=\"\/products\/beidahuang-wuchang-rice-vacuum-pack-5kg\"\u003eWuchang rice\u003c\/a\u003e.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePrep Tips\u003c\/h3\u003e\n  \u003cul style=\"margin:6px 0 0 18px;color:#334155;line-height:1.6;\"\u003e\n    \u003cli\u003ePat dry and cut into bite‑size pieces for even heating and crisp edges.\u003c\/li\u003e\n    \u003cli\u003eAir‑fry or oven‑reheat at 180–200°C for 5–8 minutes to refresh the crust before saucing.\u003c\/li\u003e\n    \u003cli\u003eFor soup\/hotpot, blanch 20–30 seconds to remove excess surface oil, then add near the end to keep it tender.\u003c\/li\u003e\n    \u003cli\u003eStir‑fry on high heat and add sauces in the last 30–60 seconds to prevent sogginess.\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003ePairs well\u003c\/h3\u003e\n  \u003cul style=\"margin:6px 0 0 18px;color:#334155;line-height:1.7;\"\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-light-soy-sauce-500ml\"\u003eHaitian Premium Light Soy Sauce 500ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/haitian-premium-oyster-sauce-700g\"\u003eHaitian Premium Oyster Sauce 700g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/lee-kum-kee-pure-sesame-oil-207ml\"\u003eLee Kum Kee Pure Sesame Oil 207ml\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chois-enoki-mushrooms-300g\"\u003eEnoki Mushrooms - 300g\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-baby-bok-choy-pack-of-2\"\u003eBaby Bok Choy, Pack of 2\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/chunsi-jiangxi-rice-noodles-1000g\"\u003eChunsi Jiangxi Rice Noodles - 1kg\u003c\/a\u003e\u003c\/li\u003e\n    \u003cli\u003e\u003ca href=\"\/products\/fresh-ever-green-chinese-style-tofu-approximately-300g\"\u003eEver Green Chinese Style Tofu, 300g\u003c\/a\u003e\u003c\/li\u003e\n  \u003c\/ul\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\n  \u003ch3 style=\"margin:0 0 10px;font-size:18px;font-weight:700;\"\u003eMore in this category\u003c\/h3\u003e\n  \u003cp style=\"margin:6px 0 0;color:#334155;\"\u003e\n    Explore more tofu and soy favourites: \u003ca href=\"\/collections\/tofu-soy-products\" style=\"color:#DB3A35;\"\u003ebrowse the full Tofu \u0026amp; Soy collection →\u003c\/a\u003e\n  \u003c\/p\u003e\n\u003c\/section\u003e\n\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery \u0026amp; Timing\u003c\/h3\u003e\n\u003cp style=\"margin:6px 0 10px;color:#334155;font-size:14px;\"\u003eYou can \u003cstrong\u003eTrack\u003c\/strong\u003e the courier's location in \u003cstrong\u003eReal‑Time\u003c\/strong\u003e online! Get your order as soon as the \u003cstrong\u003eNext Day\u003c\/strong\u003e (for most areas in Sydney).\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth style=\"text-align:left;padding:10px;border-right:1px solid #e5e7eb;background:#f8fafc;\"\u003eOrder Time\u003c\/th\u003e\n\u003cth style=\"text-align:left;padding:10px;background:#f8fafc;\"\u003eArrival Time\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;border-right:1px solid #e5e7eb;\"\u003eToday\u003c\/td\u003e\n\u003ctd style=\"padding:12px;border-top:1px solid #e5e7eb;\"\u003e\n\u003cstrong\u003eNext Day (2 options):\u003c\/strong\u003e\u003cul style=\"margin:6px 0 0 18px;\"\u003e\n\u003cli\u003e11:30AM – 06:30PM\u003c\/li\u003e\n\u003cli\u003e05:00PM – 11:00PM\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"color:#a9a9a9;font-size:12px;margin:10px 0 0;\"\u003e* Canceling after the cutoff may incur fees. \u003ca href=\"\/pages\/return-refund-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eClick here\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp style=\"margin:8px 0 0;color:#334155;font-size:14px;\"\u003eDetails: \u003ca href=\"\/pages\/delivery-information\" style=\"color:#DB3A35;text-decoration:underline;\"\u003eDelivery Information\u003c\/a\u003e.\u003c\/p\u003e\u003c\/section\u003e\n\u003csection style=\"border:1px solid #e2e8f0;background:#fff;border-radius:16px;padding:20px;margin-top:16px;\"\u003e\u003ch3 style=\"margin:0 0 8px;font-size:18px;font-weight:700;\"\u003eDelivery Fees\u003c\/h3\u003e\n\u003cp style=\"font-size:13px;color:#666;margin:0 0 8px\"\u003e* A flat \u003cstrong\u003e$2 service \u0026amp; packaging fee\u003c\/strong\u003e will be added at checkout — \u003ca href=\"https:\/\/www.umall.com.au\/policies\/shipping-policy\" style=\"color:#DB3A35;text-decoration:underline;\"\u003esee details\u003c\/a\u003e.\u003c\/p\u003e\n\u003ctable style=\"width:100%;border-collapse:collapse;border:1px solid #e5e7eb;\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$69.00 and up\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e\u003cstrong\u003eFree\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e2e8f0;border-top:1px solid #e5e7eb;\"\u003e$20 – $68.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$4.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"padding:10px;border-right:1px solid #e5e7eb;border-top:1px solid #e5e7eb;\"\u003e$0.01 – $19.99\u003c\/td\u003e\n\u003ctd style=\"padding:10px;border-top:1px solid #e5e7eb;\"\u003e$7.99 \u003cspan style=\"color:#999;font-size:12px\"\u003e(was $10)\u003c\/span\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/section\u003e\n\u003c\/div\u003e\n\n\n\n\n\n\n\n\n\n\u003cscript\u003e\n\/* DESC ENHANCER JS v1 *\/\n(function(){\n  const root = document.getElementById('umall-desc');\n  if(!root) return;\n\n  const handleFromHref = (href)=\u003e{\n    try{ const u = new URL(href, location.origin); const parts=u.pathname.split('\/').filter(Boolean); const i=parts.findIndex(p=\u003ep==='products'); if(i\u003e=0\u0026\u0026parts[i+1]) return parts[i+1]; }catch(e){}\n    return null;\n  };\n  const money = (cents)=\u003e{ if(window.Shopify \u0026\u0026 Shopify.formatMoney) return Shopify.formatMoney(cents, \"A${{amount}}\"); return typeof cents==='number' ? 'A$'+(cents\/100).toFixed(2) : ''; };\n  const buildProdCard = (handle)=\u003e{ const a=document.createElement('a'); a.className='um-card'; a.href='\/products\/'+handle; a.setAttribute('data-handle',handle); a.innerHTML='\u003cdiv class=\"um-imgbox\"\u003e\u003cimg alt=\"'+handle+'\" loading=\"lazy\"\/\u003e\u003cspan class=\"um-badge\"\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"um-meta\"\u003e\u003cdiv class=\"um-title\"\u003e'+handle.replace(\/-\/g,' ')+'\u003c\/div\u003e\u003cdiv class=\"um-price\"\u003e\u003c\/div\u003e\u003c\/div\u003e'; return a; };\n  const hydrate = async (a)=\u003e{ const h=a.getAttribute('data-handle'); try{ const r=await fetch('\/products\/'+h+'.js',{credentials:'same-origin'}); if(!r.ok) return; const p=await r.json(); const img=a.querySelector('img'); if(p.images\u0026\u0026p.images[0]) img.src=p.images[0]; const t=a.querySelector('.um-title'); t.textContent=p.title||t.textContent; const vs=(p.variants||[]); const avail=vs.filter(v=\u003ev.available); const arr=avail.length?avail:vs; if(arr.length){ const min=Math.min(...arr.map(v=\u003ev.price)); const maxCompare=Math.max(...arr.map(v=\u003ev.compare_at_price||0)); const price=a.querySelector('.um-price'); price.textContent=''; const cur=document.createElement('span'); cur.textContent=money(min); price.appendChild(cur); if(maxCompare \u0026\u0026 maxCompare\u003emin){ const s=document.createElement('s'); s.textContent=money(maxCompare); price.appendChild(document.createTextNode(' ')); price.appendChild(s); const badge=a.querySelector('.um-badge'); const off=Math.round((1-min\/maxCompare)*100); badge.textContent='-'+off+'%'; badge.style.display='inline-block'; } } }catch(e){} };\n\n  const ensureAfter = (refNode, node)=\u003e{ if(!refNode || !node) return; if(node.parentElement) return; refNode.parentElement.insertBefore(node, refNode.nextSibling); };\n\n  \/\/ How to enjoy → 卡片（保留原内容；隐藏原块；标题统一“Recipes with this product”）\n  try{\n    \/\/ 1) 更鲁棒地找到标题（h2\/h3\/h4）\n    const enjoyH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(how to enjoy|ways to enjoy|serving ideas|recipes with this product|食用建议|食用灵感|食法)\/i.test(h.textContent));\n    if(enjoyH){\n      const container = enjoyH.parentElement;\n      \/\/ 2) 就近查找列表或段落（同容器或下一个兄弟）\n      let listEl = container.querySelector('ol, ul');\n      if(!listEl){ const sib = enjoyH.nextElementSibling; if(sib){ listEl = sib.querySelector \u0026\u0026 sib.querySelector('ol, ul'); } }\n\n      \/\/ 3) 容器若不存在则创建\n      let cardsHost = container.querySelector('#um-recipes-cards');\n      if(!cardsHost){ cardsHost=document.createElement('div'); cardsHost.id='um-recipes-cards'; cardsHost.className='um-recipes'; ensureAfter(listEl||enjoyH, cardsHost); }\n      let prodHost = container.querySelector('#um-recipes-products');\n      if(!prodHost){ prodHost=document.createElement('div'); prodHost.id='um-recipes-products'; prodHost.className='um-slider'; ensureAfter(cardsHost, prodHost); }\n\n      const links = new Set();\n      let items = [];\n      if(listEl){ items = Array.from(listEl.children).filter(n=\u003en.tagName==='LI'); }\n      \/\/ 4) 若没有列表，尝试用同容器的段落或“网格DIV\/ARTICLE”作为卡片项\n      if(items.length === 0){\n        let ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n        if(ps.length \u003c 2){ const sib = enjoyH.nextElementSibling; if(sib){ ps = Array.from(sib.querySelectorAll(':scope \u003e p')); } }\n        items = ps;\n      }\n      \/\/ 5) 同容器下寻找“网格容器”（含多个子块，且子块内有 h4\/strong）\n      let gridToHide = null;\n      if(items.length === 0){\n        const ch = Array.from(container.children || []);\n        for(const el of ch){\n          if(el === enjoyH) continue;\n          if(el.children \u0026\u0026 el.children.length \u003e= 2){\n            const first = el.children[0];\n            if((first.querySelector \u0026\u0026 first.querySelector('h3, h4, h5, strong, b, div[style*=\"font-weight:700\"]'))){\n              items = Array.from(el.children);\n              gridToHide = el;\n              break;\n            }\n          }\n        }\n      }\n      \/\/ 6) 仍然没有，则看紧跟标题的下一个块（如显示为卡片的 div\/article 列表）\n      if(items.length === 0){\n        const sib = enjoyH.nextElementSibling;\n        if(sib){\n          const children = Array.from(sib.children || []);\n          if(children.length \u003e= 2){ items = children; gridToHide = sib; }\n        }\n      }\n\n      if(items.length){\n        items.forEach((node, idx)=\u003e{\n          const card=document.createElement('article'); card.className='um-rcard';\n          const titleNode = node.querySelector \u0026\u0026 node.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b, a');\n          const h4=document.createElement('h4'); h4.textContent = titleNode ? (titleNode.textContent.trim()||('Recipe '+(idx+1))) : ('Recipe '+(idx+1));\n          const clone = node.cloneNode(true);\n          const rm = clone.querySelector \u0026\u0026 clone.querySelector('h3, h4, h5, div[style*=\"font-weight:700\"], strong, b'); if(rm) rm.remove();\n          const body=document.createElement('div'); while(clone.firstChild){ body.appendChild(clone.firstChild); }\n          card.appendChild(h4); card.appendChild(body); cardsHost.appendChild(card);\n          (node.querySelectorAll ? node.querySelectorAll('a[href]') : []).forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h) links.add(h); });\n        });\n        \/\/ 统一标题并隐藏原内容块\n        enjoyH.textContent = 'Recipes with this product';\n        if(listEl){ listEl.style.display='none'; }\n        else if(gridToHide){ gridToHide.style.display='none'; }\n        else {\n          \/\/ 隐藏直接段落（避免把其它段落隐藏过多，仅隐藏紧邻的）\n          const ps = Array.from(container.querySelectorAll(':scope \u003e p'));\n          ps.forEach(p=\u003e{ p.style.display='none'; });\n        }\n      }\n      if(prodHost \u0026\u0026 links.size){ Array.from(links).forEach(h=\u003e{ const a=buildProdCard(h); prodHost.appendChild(a); hydrate(a); }); }\n    }\n  }catch(e){}\n\n  \/\/ Pairs well → 滑动卡片（并将标题统一为 “Pairs well with these products”）\n  try{\n    const pairsH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(pairs\\s*well|pairswell|配搭建议|搭配推荐|搭配)\/i.test(h.textContent));\n    if(pairsH){\n      const section=pairsH.parentElement; const ul=section.querySelector('ul');\n      \/\/ 统一标题文案\n      pairsH.textContent = 'Pairs well with these products';\n      let host=section.querySelector('#um-pairs-slider');\n      if(!host){ host=document.createElement('div'); host.id='um-pairs-slider'; host.className='um-slider'; ensureAfter(ul||pairsH, host); }\n      const unique=new Set();\n      \/\/ 允许 p 段落或任意容器中的产品链接\n      section.querySelectorAll('a[href]').forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)) unique.add(h); });\n      unique.forEach(h=\u003e{ const card=buildProdCard(h); host.appendChild(card); hydrate(card); });\n    }\n  }catch(e){}\n\n  \/\/ More in this category → 条件滑动，成功后隐藏原标题与列表，把 Explore CTA 放到滑动条上方\n  try{\n    const moreH = Array.from(root.querySelectorAll('h2,h3,h4')).find(h=\u003e\/(more in this category|同类推荐|更多此分类)\/i.test(h.textContent));\n    if(moreH){ const section=moreH.parentElement; const ul=section.querySelector('ul'); let host=section.querySelector('#um-more-slider'); if(!host){ host=document.createElement('div'); host.id='um-more-slider'; host.className='um-slider'; ensureAfter(ul||moreH, host); } if(ul){ const links=ul.querySelectorAll('a[href]'); if(links.length\u003e=2){ const unique=new Set(); links.forEach(a=\u003e{ const h=handleFromHref(a.getAttribute('href')); if(h \u0026\u0026 !unique.has(h)){ unique.add(h); const card=buildProdCard(h); host.appendChild(card); hydrate(card); } }); if(host.children.length){ ul.style.display='none'; moreH.style.display='none'; const ctaWrap = Array.from(section.querySelectorAll('div')).find(d=\u003ed.querySelector('a[href^=\"\/collections\/\"]')); if(ctaWrap){ section.insertBefore(ctaWrap, host); } } } } }\n  }catch(e){}\n})();\n\u003c\/script\u003e\n\n\n\n\n\n\n\n\n","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48151483318559,"sku":"9323536001091","price":5.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/d14a3d957c2f7fbd6b6a31615ef56083ariDGRNovivIvlZtxubgRn3uv4G4KU2x.jpg?v=1712383934"},{"product_id":"frozen-mingfa-quick-freeze-tripe-knots-200g","title":"[Frozen] MingFa Quick-Freeze Tripe Knots 200g","description":"\u003cp\u003eMingFa Quick-Freeze Tripe Knots are a convenient, frozen option for authentic Asian cuisine, pre-tied and ready to cook. Weighing 200g, these tripe knots are quick-frozen to preserve their freshness and flavor.\u003c\/p\u003e","brand":"Mingfa","offers":[{"title":"Default Title","offer_id":48152071373087,"sku":"6784521100206","price":2.69,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_6b9a8886-20f7-48c8-ba8e-1de7834452e4.jpg?v=1712390364"},{"product_id":"frozen-wugu-tang-gao-bei-shop-five-spice-tofu-strips-500g","title":"[Frozen] Wugu Tang Gao Bei Shop Five-Spice Tofu Strips 500g","description":"\u003cp\u003eThese are frozen five-spice tofu strips from Wugu Tang Gao Bei Shop, weighing 500g. They are perfect for adding a flavorful protein source to your meals.\u003c\/p\u003e","brand":"Wugu Tang","offers":[{"title":"Default Title","offer_id":48152082350367,"sku":"A754351320439","price":8.29,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_32aa557e-e6ea-4fb5-bd7c-2177e3969141.jpg?v=1712390395"},{"product_id":"frozen-yun-yan-premium-yunnan-specialty-tofu-620g","title":"[Frozen] Yun Yan Premium Yunnan Specialty Tofu 620g","description":"Yun Yan Premium Yunnan Specialty Tofu is a high-quality frozen tofu sourced from Yunnan, China, known for its unique texture and flavor.\u003cbr\u003eThis 620g pack is perfect for adding a protein-rich, nutritious element to your meals.","brand":"Yunyan Shangpin","offers":[{"title":"Default Title","offer_id":48152086053151,"sku":"A6972524450033","price":10.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/12c62fc1754d9eb9874fc210afe8b1a6iOCuPIsRxpzyaXPZ403HaunEolpooQjV.jpg?v=1712390422"},{"product_id":"frozen-wugu-tang-gao-beidian-aromatic-soybean-rolls-five-spice-flavor-500g","title":"[Frozen] Wugu Tang Gao Beidian Aromatic Soybean Rolls, Five-Spice Flavor, 500g","description":"\u003cp\u003eWugu Tang Gao Beidian Aromatic Soybean Rolls are a flavorful frozen food product, seasoned with a unique blend of five spices. This 500g pack offers a convenient and delicious plant-based protein source.\u003c\/p\u003e","brand":"Wugu Tang","offers":[{"title":"Default Title","offer_id":48152092246303,"sku":"A754351320453","price":9.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_bd3b59ea-a9e8-470f-a129-b65975009c09.jpg?v=1712390462"},{"product_id":"frozen-wugu-tang-original-flavoured-gao-bei-dian-soybean-rolls-500g","title":"[Frozen] Wugu Tang Original Flavoured Gao Bei Dian Soybean Rolls, 500g","description":"Wugu Tang's Original Flavoured Gao Bei Dian Soybean Rolls are a delicious and convenient frozen food option, packed with protein and traditional Chinese flavours.\u003cbr\u003eEach 500g pack offers multiple servings, perfect for quick meals or appetizers.","brand":"Wugu Tang","offers":[{"title":"Default Title","offer_id":48152093950239,"sku":"A754351320446","price":9.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_1539713e-dc0e-4d60-b731-57c61dfe62b8.jpg?v=1712390470"},{"product_id":"frozen-eb-seaweed-and-tofu-skin-380g","title":"[Frozen] EB Seaweed and Tofu Skin 380g","description":"\u003cp\u003eA frozen pack of EB Seaweed and Tofu Skin weighing 380g. It's a convenient and nutritious option for quick meals, offering the health benefits of seaweed and tofu.\u003c\/p\u003e","brand":"EB","offers":[{"title":"Default Title","offer_id":48152104567071,"sku":"A9555894503478","price":6.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_942e3122-1a9f-46e5-8f3a-6a345edf98dd.jpg?v=1712390499"},{"product_id":"frozen-ausnew-tofu-fish-800g","title":"TVI Frozen Fish Tofu - 800g","description":"Aushin Tofu Fish is a frozen, 800g pack of tofu-based, fish-flavored product, perfect for vegan and vegetarian diets.\u003cbr\u003eIt offers a high-protein, low-fat alternative to traditional fish, ready to cook straight from the freezer.","brand":"Aushin","offers":[{"title":"Default Title","offer_id":48152106107167,"sku":"A8850016240059","price":12.19,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_a5c4cef5-e5dd-4149-bacf-6c9a561ccf66.jpg?v=1712390503"},{"product_id":"weiyang-frozen-vegetarian-beef-200g","title":"Weiyang Frozen Vegetarian Beef - 200g","description":"Experience the delicious taste of Weiyang Frozen Vegetarian Beef, a perfect meat substitute for vegetarians and vegans.\u003cbr\u003eThis 200g pack offers a rich, savory flavor and a tender texture that mimics real beef.\u003cbr\u003eIdeal for a variety of dishes, from stir-fries to stews, this vegetarian beef is easy to prepare and versatile.\u003cbr\u003eEnjoy the convenience and health benefits of plant-based protein with Weiyang Frozen Vegetarian Beef.\u003cbr\u003ePerfect for those looking to reduce their meat consumption without sacrificing taste.","brand":"Weiyang","offers":[{"title":"Default Title","offer_id":48801268760863,"sku":"A6922440898013","price":3.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_5426c1c9-355c-49a0-8457-1d6e65b2bb1c.jpg?v=1718326414"},{"product_id":"havista-frozen-thin-tofu-sheets-500g","title":"Havista Frozen Thin Tofu Sheets - 500g","description":"Experience the delicate texture and versatility of Havista Frozen Thin Tofu Sheets, conveniently packaged in a 500g pack.\u003cbr\u003eThese tofu sheets are perfect for a variety of dishes, from soups and salads to stir-fries and wraps.\u003cbr\u003eMade from non-GMO soybeans, they are free from preservatives and artificial colors, ensuring a natural and healthy choice.\u003cbr\u003eEach sheet is carefully crafted to maintain its thinness and flexibility, making it easy to incorporate into your favorite recipes.\u003cbr\u003eEnjoy the authentic taste and quality of Havista Frozen Thin Tofu Sheets, a staple in any kitchen.","brand":"Wugutang","offers":[{"title":"Default Title","offer_id":48801276002591,"sku":"A754351320460","price":7.49,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_85ba6aff-d6eb-4a91-a394-00f25f8bb0da.jpg?v=1718326571"},{"product_id":"wang-xin-zhuang-frozen-old-changsha-stinky-tofu-with-sauce-pack-30pcs-600g","title":"Wang Xin Zhuang Frozen Old Changsha Stinky Tofu with Sauce Pack - 30pcs, 600g","description":"Experience the authentic taste of Changsha with Wang Xin Zhuang Frozen Old Changsha Stinky Tofu. This pack includes 30 pieces of stinky tofu, weighing approximately 600g, along with a special sauce pack.\u003cbr\u003eEnjoy the rich and unique flavor of this traditional Chinese delicacy, perfect for frying and serving with the included sauce.\u003cbr\u003eEach piece of tofu is carefully prepared and frozen to maintain its distinctive taste and texture.\u003cbr\u003eFollow the simple preparation steps to enjoy a delicious and aromatic dish that brings the essence of Changsha street food to your home.\u003cbr\u003ePerfect for a quick and flavorful meal, Wang Xin Zhuang Frozen Old Changsha Stinky Tofu is a must-try for tofu enthusiasts.","brand":"Wang Xinzhuang","offers":[{"title":"Default Title","offer_id":48801280622879,"sku":"A6970897210438","price":11.69,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_6f83a4b0-53ed-41ca-b92d-ce647784f1ee.jpg?v=1718326648"},{"product_id":"yafang-frozen-tofu-300g","title":"Yafang Frozen Tofu - 300g","description":"Enjoy the convenience and versatility of Yafang Frozen Tofu, perfect for hotpot and various dishes.\u003cbr\u003eThis 300g pack of frozen tofu is crafted to absorb flavors beautifully, enhancing your culinary creations.\u003cbr\u003eWith its spongy texture, it soaks up broths and sauces, making it a delightful addition to your meals.\u003cbr\u003eSimply thaw and add to your favorite recipes for a nutritious and delicious protein source.\u003cbr\u003eExperience the quality and taste of Yafang Frozen Tofu, a must-have for any tofu lover.","brand":"Avon","offers":[{"title":"Default Title","offer_id":48801283834143,"sku":"4711634002297","price":4.19,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_b28de71d-8a5a-4db9-811b-b91af966debf.jpg?v=1736928948"},{"product_id":"eb-frozen-seafood-tofu-500g","title":"EB Frozen Seafood Tofu - 500g","description":"Enjoy the delightful taste of EB Frozen Seafood Tofu, a perfect blend of fish meat and tofu in a convenient 500g package.\u003cbr\u003eMade with high-quality threadfin bream fish meat, this seafood tofu offers a silky and savory flavor that is perfect for various dishes.\u003cbr\u003eEach piece is carefully prepared and frozen to maintain its freshness and quality.\u003cbr\u003eIdeal for hot pots, soups, or as a tasty snack, EB Frozen Seafood Tofu brings a delicious seafood experience to your table.\u003cbr\u003eIndulge in the premium quality and taste of EB Frozen Seafood Tofu, a must-have for seafood lovers.","brand":"EB","offers":[{"title":"Default Title","offer_id":48801325482271,"sku":"A9555573001325","price":8.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_b503fa05-ee0d-48e4-a124-1d4d2900bab3.jpg?v=1736583535"},{"product_id":"eb-frozen-cheese-fish-tofu-500g","title":"EB Frozen Cheese Fish Tofu - 500g","description":"Enjoy the delightful combination of fish and cheese with EB Frozen Cheese Fish Tofu, packed in a convenient 500g package.\u003cbr\u003eMade with high-quality threadfin bream fish meat and enriched with cheese, this fish tofu offers a unique and savory taste.\u003cbr\u003ePerfect for hot pots, soups, or as a snack, each piece is carefully crafted to ensure a delicious and satisfying experience.\u003cbr\u003eSimply heat and serve for a quick and tasty meal that the whole family will love.\u003cbr\u003eExperience the premium quality and rich flavor of EB Frozen Cheese Fish Tofu, a must-have for seafood enthusiasts.","brand":"EB","offers":[{"title":"Default Title","offer_id":48801325809951,"sku":"A9555573001349","price":8.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_206eae2b-74dc-46aa-9f46-dd71c0313c87.jpg?v=1736583534"},{"product_id":"searoy-frozen-fish-tofu-1kg","title":"SeAroy Frozen Fish Tofu - 1kg","description":"Enjoy the delicious and versatile SeAroy Frozen Fish Tofu, packed in a convenient 1kg package.\u003cbr\u003eThese fish tofu cubes are perfect for adding to hot pots, soups, and stir-fries, offering a delightful texture and savory flavor.\u003cbr\u003eMade from high-quality fish and tofu, each piece is carefully prepared and frozen to maintain freshness and quality.\u003cbr\u003eEasy to cook and versatile in use, SeAroy Frozen Fish Tofu is a must-have ingredient for a variety of dishes.\u003cbr\u003eExperience the premium quality and taste of SeAroy Frozen Fish Tofu, ideal for enhancing your culinary creations.","brand":"Ah Yat","offers":[{"title":"Default Title","offer_id":48801328202015,"sku":"A9330385000274","price":17.39,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/d4d33780e25e77b8db31f4cc078440cfR3axAPsm9GCQfWT0wyN8pFjF4hubv66R_46b8287d-8063-4d2a-b715-450e19881a4b.jpg?v=1736583525"},{"product_id":"jun-japanese-style-konjac-knots-300g","title":"Jun Japanese Style Konjac Knots - 300g","description":"Enjoy the unique texture and health benefits of Jun Japanese Style Konjac Knots, packed in a convenient 300g package.\u003cbr\u003eThese konjac knots are low in carbohydrates, fat-free, and gluten-free, making them a healthy addition to your diet.\u003cbr\u003ePerfect for adding to soups, salads, or stir-fries, they absorb flavors well and provide a satisfying chew.\u003cbr\u003eEach knot is carefully crafted to ensure the highest quality and optimal taste.\u003cbr\u003eExperience the versatility and nutritional benefits of Jun Japanese Style Konjac Knots in your favorite dishes.","brand":"Jun","offers":[{"title":"Default Title","offer_id":48801332134175,"sku":"6920440711257","price":2.49,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/02f6400e2dad40d534353f3f006b58fe26kW86pfiev3Kte7PqMXxqhAZqa3Pl1Q_c4cbe768-136d-4ce2-af25-220a6f4ad462.jpg?v=1736583518"},{"product_id":"japanese-gunma-konjac-noodles-360g","title":"Japanese Gunma Konjac Noodles - 360g","description":"Experience the unique texture and health benefits of Japanese Gunma Konjac Noodles, available in a convenient 360g package.\u003cbr\u003eThese konjac noodles are made from konjac yam, known for being low in calories and high in dietary fiber.\u003cbr\u003ePerfect for a variety of dishes, from soups and salads to stir-fries, these noodles offer a versatile and nutritious addition to your meals.\u003cbr\u003eEnjoy the authentic taste and quality of konjac noodles from Gunma, Japan, and elevate your culinary creations with this healthy alternative.","brand":"Kabura","offers":[{"title":"Default Title","offer_id":48801332986143,"sku":"4973126000574","price":4.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_27b8680d-2b01-4ff4-bcc3-cb622c0cf287.jpg?v=1747019009"},{"product_id":"sunshine-farm-konjac-knots-340g","title":"Sunshine Farm Konjac Knots - 340g","description":"Enjoy the unique texture and health benefits of Sunshine Farm Konjac Knots, packed in a convenient 340g package.\u003cbr\u003eThese konjac knots are low in calories and high in fiber, making them a perfect addition to a healthy diet.\u003cbr\u003eIdeal for hot pots, salads, or stir-fries, they absorb flavors well and provide a satisfying chew.\u003cbr\u003eEach knot is carefully crafted to ensure the highest quality and freshness.\u003cbr\u003eExperience the versatility and nutritional benefits of Sunshine Farm Konjac Knots in your favorite dishes.","brand":"Sunshine Ranch","offers":[{"title":"Default Title","offer_id":48801337344287,"sku":"9354965000027","price":2.19,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/4887b1e3c3dbad267922b19ef9fb1f11Vt4nIhYxEsTBiuA46qxSj6P7m2j7TRua_48dd5313-bcaf-41f4-8c27-ef6d8980cb71.jpg?v=1736583511"},{"product_id":"ming-fa-fried-dry-bean-curd-180g","title":"Ming Fa Fried Dry Bean Curd - 180g","description":"Enjoy the crispy and savory taste of Ming Fa Fried Dry Bean Curd, a perfect companion for hot pot and various dishes.\u003cbr\u003eMade from high-quality soybeans and soybean oil, this 180g pack offers a fresh and delightful flavor.\u003cbr\u003eIdeal for adding texture and taste to your meals, this fried dry bean curd is a versatile ingredient that can be used in soups, stir-fries, and more.\u003cbr\u003eExperience the authentic taste of Taiwan with Ming Fa Fried Dry Bean Curd, a must-have for your pantry.","brand":"Minfa","offers":[{"title":"Default Title","offer_id":48801337540895,"sku":"4712867770922","price":6.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/daffddc13c01ed7920d907c2ba2db571Xa2vFkwthI8bz7SI8i6mznQXNLOr6Uzx_6d8f9171-8f29-4d8d-bce9-8ef1d9c5b102.jpg?v=1736583511"},{"product_id":"ming-fa-golden-fried-dry-bean-curd-180g","title":"Ming Fa Golden Fried Dry Bean Curd - 180g","description":"Enjoy the crispy and flavorful Ming Fa Golden Fried Dry Bean Curd, a perfect companion for hot pot and various dishes.\u003cbr\u003eMade in Taiwan, this 180g package offers a delightful taste and texture, enhancing your culinary experience.\u003cbr\u003eCarefully prepared to maintain freshness and quality, this fried dry bean curd is ideal for adding a savory crunch to your meals.\u003cbr\u003eWhether used in soups, stir-fries, or as a snack, Ming Fa Golden Fried Dry Bean Curd brings a delicious and versatile option to your kitchen.\u003cbr\u003eExperience the authentic taste and premium quality of Ming Fa products, crafted to perfection.","brand":"Minfa","offers":[{"title":"Default Title","offer_id":48801337606431,"sku":"4712867770915","price":6.99,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/04626c4b1288446f0d2262436729e794JGr7AXWS0DNPpGlNTpkRKoqinsVO6IND_65ed9622-059a-4d67-9682-de96cacf2a95.jpg?v=1736583510"},{"product_id":"ever-green-fresh-regular-tofu-900g","title":"Ever Green Fresh Regular Tofu - 900g","description":"Enjoy the smooth and delicate texture of Ever Green Fresh Regular Tofu, packed in a convenient 900g package.\u003cbr\u003eMade with high-quality ingredients, this tofu is perfect for a variety of dishes including pan-frying, steaming, salads, and miso soup.\u003cbr\u003eIt is a healthy food choice, being low in fat and high in protein, with no preservatives, artificial colors, or genetically modified ingredients.\u003cbr\u003eProduced in Australia with strict quality control, Ever Green Fresh Regular Tofu ensures freshness and premium quality.\u003cbr\u003eIdeal for those seeking a nutritious and versatile ingredient for their culinary creations.","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48896003113247,"sku":"A9323536008687","price":5.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/7b6f763d2400b3beca8d851d4a338fcaxTkxbsDPrZWAPDSgH3ifHiJaKIWgx4W9.jpg?v=1719996833"},{"product_id":"ever-green-fried-tofu-puffs-200g","title":"Ever Green Fried Tofu Puffs - 200g","description":"Enjoy the delicious and versatile Ever Green Fried Tofu Puffs, packed in a convenient 200g package.\u003cbr\u003eThese tofu puffs are perfect for adding to soups, stir-fries, and hot pots, offering a delightful texture and rich flavor.\u003cbr\u003eMade from high-quality soybeans, they are a great source of protein and can be easily incorporated into various dishes.\u003cbr\u003eEach piece is carefully prepared and fried to perfection, ensuring a satisfying bite every time.\u003cbr\u003eStore in the refrigerator to maintain freshness and enjoy within 3 days of opening.","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48896004882719,"sku":"A9323536021259","price":5.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/5751cc1577a746b9b0fc44c3d10e8bb1yzjIev1SiPb4aP1KLsi0A8XX1Kqhv19q.jpg?v=1719996849"},{"product_id":"unigreen-fried-gluten-balls-50g","title":"Ever Green Fried Gluten Balls - 50g","description":"Enjoy the delicious and chewy texture of Unigreen Fried Gluten Balls, packaged in a convenient 50g bag.\u003cbr\u003eThese gluten balls are perfect for adding to soups, stews, or stir-fries, offering a unique and satisfying bite.\u003cbr\u003eMade with high-quality ingredients, they are free from artificial coloring, preservatives, and genetically modified organisms.\u003cbr\u003eHigh in protein, these gluten balls are a nutritious addition to your meals.\u003cbr\u003eExperience the authentic taste and quality of Unigreen Fried Gluten Balls, a versatile ingredient for various dishes.","brand":"Ever Green","offers":[{"title":"Default Title","offer_id":48896009830687,"sku":"A9323536001244","price":4.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_a5ed5962-2b5d-41d5-9d24-7040a03f5ede.jpg?v=1719996879"},{"product_id":"soy-delight-tofu-pudding-300g","title":"Soy Delight Tofu Pudding - 300g","description":"Experience the smooth and creamy texture of Soy Delight Tofu Pudding, a delightful treat made from high-quality soybeans.\u003cbr\u003eThis 300g package offers a delicious and healthy dessert option, perfect for any time of the day.\u003cbr\u003eEnjoy it on its own or with your favorite toppings for a satisfying and nutritious snack.\u003cbr\u003eMade in Australia with no cholesterol, no preservatives, and no artificial colors, this tofu pudding is a wholesome choice for health-conscious individuals.\u003cbr\u003eIndulge in the original flavor of Soy Delight Tofu Pudding, a perfect blend of taste and nutrition.","brand":"Soy Delight","offers":[{"title":"Default Title","offer_id":48896010879263,"sku":"A9323536580138","price":2.79,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_0d8557b0-cb75-440a-bbd7-f68ab8401427.jpg?v=1735370426"},{"product_id":"jun-frozen-fried-bean-curd-3-sheets-45g","title":"Jun Frozen Fried Bean Curd - 3 Sheets, 45g","description":"Enjoy the delicious taste and texture of Jun Frozen Fried Bean Curd, conveniently packed in 3 sheets totaling 45g.\u003cbr\u003eKnown as Abura Age in Japanese, this fried bean curd is perfect for adding to soups, stews, and various dishes.\u003cbr\u003eEach sheet is carefully prepared and frozen to maintain its freshness and quality.\u003cbr\u003eEasy to use and versatile, Jun Frozen Fried Bean Curd is a great addition to your kitchen for quick and tasty meals.\u003cbr\u003eExperience the authentic flavor of Japanese cuisine with this high-quality fried bean curd.","brand":"Jun","offers":[{"title":"Default Title","offer_id":48896157483295,"sku":"A4974168111112","price":2.59,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_66082f36-6c89-4db4-a504-9a3691e6b9ed.jpg?v=1747018960"},{"product_id":"haidilao-kuai-shou-xiao-chu-hot-pot-tofu-skin-rolls-120g","title":"Haidilao Kuai Shou Xiao Chu Hot Pot Tofu Skin Rolls - 120g","description":"Enjoy the delicious and convenient Haidilao Kuai Shou Xiao Chu Hot Pot Tofu Skin Rolls, perfect for adding to your hot pot meals.\u003cbr\u003eEach pack contains 120g of crispy and flavorful tofu skin rolls, made from high-quality ingredients.\u003cbr\u003eThese rolls are easy to prepare and can be quickly added to your hot pot for a delightful texture and taste.\u003cbr\u003eIdeal for hot pot lovers, these tofu skin rolls offer a satisfying and nutritious addition to your meals.\u003cbr\u003eExperience the premium quality and authentic taste of Haidilao's hot pot tofu skin rolls.","brand":"Haidilao","offers":[{"title":"Default Title","offer_id":48896191070495,"sku":"A6974140809271","price":4.39,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_cb2c3c3f-607e-4d59-9551-28ffd798c65a.jpg?v=1736583391"},{"product_id":"qiancheng-hot-pot-fried-tofu-skin-180g","title":"Qiancheng Hot Pot Fried Tofu Skin - 180g","description":"Enjoy the crispy and delicious Qiancheng Hot Pot Fried Tofu Skin, perfect for adding a delightful texture to your hot pot meals.\u003cbr\u003eThis 180g pack is made from high-quality tofu, fried to perfection to provide a satisfying crunch.\u003cbr\u003eIdeal for hot pot, soups, or as a snack, this tofu skin is a versatile addition to your pantry.\u003cbr\u003eExperience the authentic taste and premium quality of Qiancheng Hot Pot Fried Tofu Skin, a must-have for any hot pot enthusiast.","brand":"Qiancheng","offers":[{"title":"Default Title","offer_id":48896196641055,"sku":"A9320479027867","price":7.59,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_8a03f924-fa28-4ced-a4b6-bf48e8a9469c.jpg?v=1736583371"},{"product_id":"qiancheng-hot-pot-crispy-bean-curd-rolls-200g","title":"Qiancheng Hot Pot Crispy Bean Curd Rolls - 200g","description":"Enjoy the delightful crunch of Qiancheng Hot Pot Crispy Bean Curd Rolls, perfect for adding to your hot pot meals.\u003cbr\u003eThese bean curd rolls are made from high-quality ingredients, ensuring a satisfying texture and flavor.\u003cbr\u003eConveniently packaged in a 200g pack, they are easy to prepare and a great addition to any hot pot gathering.\u003cbr\u003eSimply add them to your hot pot broth and let them soak up the delicious flavors.\u003cbr\u003eExperience the premium quality and taste of Qiancheng Hot Pot Crispy Bean Curd Rolls, a must-have for hot pot enthusiasts.","brand":"Qiancheng","offers":[{"title":"Default Title","offer_id":48896197656863,"sku":"9320479029038","price":7.49,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_bb58ebf5-48d9-49e9-8e55-edc011bca685.jpg?v=1736583367"},{"product_id":"searoy-frozen-tofu-pocket-with-fish-roe-500g","title":"SeAroy Frozen Tofu Pocket with Fish Roe - 500g","description":"Enjoy the delightful taste of SeAroy Frozen Tofu Pocket with Fish Roe, conveniently packed in a 500g package.\u003cbr\u003eThese tofu pockets are filled with savory fish roe, offering a unique and delicious flavor combination.\u003cbr\u003ePerfect for a quick and easy meal, these tofu pockets can be enjoyed on their own or added to your favorite dishes.\u003cbr\u003eEach piece is carefully prepared and frozen to ensure maximum freshness and quality.\u003cbr\u003eExperience the premium quality and taste of SeAroy Frozen Tofu Pocket with Fish Roe, a must-have for any seafood lover.","brand":"SeAroy","offers":[{"title":"Default Title","offer_id":49031128285471,"sku":"A9330385002308","price":14.69,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_30fa6976-acb9-4d77-bc5f-91677f0ddf86.jpg?v=1736583322"},{"product_id":"amoy-frozen-bean-curd-shrimp-roll-115g","title":"Amoy Frozen Bean Curd Shrimp Roll - 115g","description":"\u003cp\u003eEnjoy the delicious taste of Amoy Frozen Bean Curd Shrimp Roll. These rolls are made with high-quality shrimp wrapped in a crispy bean curd sheet, offering a delightful texture and flavor. Perfect for a quick and tasty meal.\u003c\/p\u003e\u003ch2\u003eProduct Highlights:\u003c\/h2\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eHigh-Quality Ingredients:\u003c\/strong\u003e Made with premium shrimp and bean curd sheet.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eConvenient:\u003c\/strong\u003e Easy to prepare, just heat and serve.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eCrispy Texture:\u003c\/strong\u003e Enjoy the delightful crunch of the bean curd wrap.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eVersatile:\u003c\/strong\u003e Great as an appetizer or a main dish.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eGenerous Portion:\u003c\/strong\u003e 115g pack, perfect for sharing.\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Amoy","offers":[{"title":"Default Title","offer_id":49099042554143,"sku":"A078024012989","price":5.69,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_0eb94ba7-c1eb-483c-90e2-e33b82b5ad47.jpg?v=1736583294"},{"product_id":"oceanria-frozen-fish-tofu-1kg","title":"OceanRia Frozen Fish Tofu - 1kg","description":"\u003cp\u003eEnjoy the delicious and versatile OceanRia Frozen Fish Tofu. This 1kg pack of fish tofu is perfect for hot pots, soups, and stir-fries, offering a delightful texture and flavor that complements a variety of dishes.\u003c\/p\u003e\u003ch2\u003eProduct Highlights:\u003c\/h2\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eHigh-Quality Ingredients:\u003c\/strong\u003e Made from premium fish and tofu.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eVersatile Use:\u003c\/strong\u003e Ideal for hot pots, soups, and stir-fries.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eConvenient and Ready to Cook:\u003c\/strong\u003e Easy to prepare straight from the freezer.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eGenerous Portion:\u003c\/strong\u003e 1kg pack, perfect for family meals or gatherings.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eFrozen Freshness:\u003c\/strong\u003e Maintains quality and taste.\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"OceanRia","offers":[{"title":"Default Title","offer_id":49099043504415,"sku":"A9557240332114","price":16.39,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_75382a7c-d3ac-4031-b9af-9b97f9238b6c.jpg?v=1736583287"},{"product_id":"oceanria-frozen-cheese-fish-tofu-450g","title":"OceanRia Frozen Cheese Fish Tofu - 450g","description":"\u003cp\u003eEnjoy the delicious and unique taste of OceanRia Frozen Cheese Fish Tofu. This 450g pack offers a delightful combination of fish and cheese, making it a perfect addition to your meals.\u003c\/p\u003e\u003ch2\u003eProduct Highlights:\u003c\/h2\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eUnique Flavor:\u003c\/strong\u003e Combines the rich taste of fish with creamy cheese.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eHigh-Quality Ingredients:\u003c\/strong\u003e Made from premium fish and cheese.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eVersatile Use:\u003c\/strong\u003e Ideal for hot pots, soups, and stir-fries.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eConvenient Packaging:\u003c\/strong\u003e Comes in a 450g pack, perfect for family meals.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eFrozen Freshness:\u003c\/strong\u003e Maintains quality and taste through freezing.\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"OceanRia","offers":[{"title":"Default Title","offer_id":49099043701023,"sku":"A9557240381457","price":10.59,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_59636307-66cc-4198-8141-aafb78aa819d.jpg?v=1736583285"},{"product_id":"yamato-frozen-deep-fried-tofu-pouches-3pcs-45g","title":"Yamato Frozen Deep-Fried Tofu Pouches - 3pcs, 45g","description":"\u003cp\u003eEnjoy the delicious and versatile Yamato Frozen Deep-Fried Tofu Pouches. These 3 pieces of 45g each are perfect for adding to soups, salads, and various dishes, providing a delightful texture and flavor.\u003c\/p\u003e\u003ch2\u003eProduct Highlights:\u003c\/h2\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eAuthentic Taste:\u003c\/strong\u003e Traditional Japanese deep-fried tofu pouches.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eVersatile Use:\u003c\/strong\u003e Ideal for soups, salads, and various dishes.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eConvenient Packaging:\u003c\/strong\u003e Comes in a pack of 3 pieces, 45g each.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eFrozen Freshness:\u003c\/strong\u003e Maintains quality and taste.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eEasy to Prepare:\u003c\/strong\u003e Ready to use straight from the freezer.\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Yamato","offers":[{"title":"Default Title","offer_id":49135752708383,"sku":"A4903127234296","price":3.09,"currency_code":"AUD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/files\/1_f2c31734-9d1a-4184-909d-b62e9792118d.jpg?v=1736928733"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0864\/3602\/0511\/collections\/1_c72ed85b-6aaf-444a-a39b-19dd6444dc48.jpg?v=1725010977","url":"https:\/\/www.umall.com.au\/collections\/tofu-soy-products\/fish-roe.oembed","provider":"Umall - Australia's Largest Online Asian Supermarket","version":"1.0","type":"link"}