{"product_id":"no-drill-under-sink-organizer-2-tier-pull-out","title":"No-Drill Under Sink Organizer, 2-Tier Pull-Out Shelf","description":"\u003cp\u003e\u003cstrong\u003eTurn the space around the pipes into two shelves.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eThe cabinet under the sink is usually one crowded floor. This 2-tier organizer stands on the cabinet base and gives you a second level, with a bottom tray that slides out so you can reach the back without emptying everything. \u003cstrong\u003eNo drilling, no adhesive\u003c\/strong\u003e: it simply stands in the cabinet and lifts out when you move.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eFreestanding:\u003c\/strong\u003e nothing to screw in, nothing to stick, nothing to patch on move-out day.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003ePull-out bottom tray:\u003c\/strong\u003e slide it forward to grab what's at the back.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eExtras for small things:\u003c\/strong\u003e 5 side hooks and 3 hanging cups for brushes, gloves and sponges.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSize (each):\u003c\/strong\u003e about 15 in long × 8 in wide × 13 in high (38 × 21 × 33 cm). Space between the two tiers: about 10.2 in (26 cm).\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSteel tube frame\u003c\/strong\u003e with plastic trays. Assembles without tools.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBefore you order:\u003c\/strong\u003e measure the inside of your cabinet and the space on each side of the pipes. Each organizer needs about 15 in of depth, 8 in of width and 13 in of height. Bottles taller than about 10 in won't fit on the bottom tray. See our \u003ca href=\"\/pages\/size-fit-guide\"\u003eSize \u0026amp; Fit Guide\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003ePair it with:\u003c\/strong\u003e the \u003ca href=\"\/products\/non-slip-lazy-susan-turntable-cabinet\"\u003eNon-Slip Lazy Susan Turntable\u003c\/a\u003e for deep cabinets. Orders with 2 or more items save 10% automatically at checkout.\u003c\/p\u003e\n\u003cp\u003eFree shipping to the contiguous US. Unused items can be returned within 30 days of delivery. See our \u003ca href=\"\/policies\/refund-policy\"\u003eReturns \u0026amp; Refunds\u003c\/a\u003e policy.\u003c\/p\u003e\n\n\u003c!-- hh-galixo v1: buy box (payment icons, add-ons, delivery, trust). Remove this whole block to undo. --\u003e\n\u003cdiv class=\"hb\" data-handle=\"no-drill-under-sink-organizer-2-tier-pull-out\" hidden\u003e\n\u003cdiv class=\"hb-pay\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.hb{--g:#1f3d34;--line:#e3e3e3;font-size:15px;color:#2b2b2b}\n.product-form__quantity{display:none !important}\n.hh-tiers{background:#eef2ee;border:1px solid #d6e0d9;border-radius:14px;padding:12px 12px 6px}\n.hh-tier{background:#fff !important;border-radius:10px}\n.hh-tier.is-on{box-shadow:0 0 0 1px var(--g,#1f3d34)}\n.hh-tier input{width:20px !important;height:20px !important}\n.hh-tiers__note{padding:0 2px 6px}\n.hb-pay{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;margin:12px 0 0}\n.hb-pay svg{width:38px;height:24px}\n.hb-add{margin:16px 0 0;border-radius:12px;background:#f2f2f0;padding:12px}\n.hb-add-h{font-weight:700;font-size:17px;color:#1d1d1d;margin:0}\n.hb-add-p{font-size:14px;color:#555;margin:3px 0 6px;line-height:1.45}\n.hb-item{display:flex;align-items:center;gap:10px;background:#fff;border-radius:8px;padding:9px 10px;margin-top:7px;cursor:pointer}\n.hb-item input{width:20px;height:20px;accent-color:var(--g);flex:0 0 20px;margin:0}\n.hb-item img{width:54px;height:54px;object-fit:cover;border-radius:6px;flex:0 0 54px}\n.hb-item-t{flex:1;min-width:0;font-size:14px;line-height:1.35}\n.hb-item-t small{display:block;color:#6b6b6b;font-size:12.5px}\n.hb-item-p{text-align:right;white-space:nowrap;font-weight:700}\n.hb-item-p span{display:block;font-weight:400;font-size:12.5px;color:#c0392b}\n.hb-item-p s{color:#8a8a8a;margin-left:4px}\n.hb-ship{text-align:center;margin:16px 0 0;font-size:15px;line-height:1.5}\n.hb-ship b{color:var(--g)}\n.hb-trust{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:14px 0 18px;text-align:center;font-weight:700;font-size:13.5px;color:var(--g)}\n.hb-trust svg{display:block;margin:0 auto 5px;width:32px;height:32px}\n.hb-err{color:#c0392b;text-align:center;font-size:14px;margin-top:6px}\n.hb-ck{text-align:center;margin:0 0 16px;font-size:14px}\n.hb-ck a{color:var(--g);font-weight:600}\n\u003c\/style\u003e\n\u003cscript\u003e\n(() =\u003e {\n  const cs = document.currentScript;\n  const start = () =\u003e {\n  const root =(cs \u0026\u0026 cs.parentElement.querySelector('.hb')) || document.querySelector('.hb');\n  if (!root || root.dataset.ready) return;\n  root.dataset.ready = 1;\n  \/\/ what to offer under each product (handle -\u003e handles)\n  const PAIR = {\n    'non-slip-lazy-susan-turntable-cabinet': ['no-drill-under-sink-organizer-2-tier-pull-out', 'stackable-telescopic-closet-shelf-retractable-expandable-wardrobe-divider-board-adjustable-layered-partition-cabinet-organizer'],\n    'no-drill-under-sink-organizer-2-tier-pull-out': ['non-slip-lazy-susan-turntable-cabinet'],\n    'renter-starter-kit-door-storage-boxes-sponge-holder-drawer-dividers-labels': ['no-drill-under-sink-organizer-2-tier-pull-out', 'non-slip-lazy-susan-turntable-cabinet', 'stackable-telescopic-closet-shelf-retractable-expandable-wardrobe-divider-board-adjustable-layered-partition-cabinet-organizer'],\n    'stackable-telescopic-closet-shelf-retractable-expandable-wardrobe-divider-board-adjustable-layered-partition-cabinet-organizer': ['non-slip-lazy-susan-turntable-cabinet']\n  };\n  \/\/ which variant to offer as the add-on when it should not be the first available one\n  const PREF = { 'stackable-telescopic-closet-shelf-retractable-expandable-wardrobe-divider-board-adjustable-layered-partition-cabinet-organizer': 'White · M' };\n  \/\/ [min, max] business days to the door; only where the supplier's window is known\n  const SHIP = { 'no-drill-under-sink-organizer-2-tier-pull-out': [3, 7, 'Ships from a US warehouse'] };\n  \/\/ must match the store's automatic discounts: Buy 2+ items 10%, Buy 3+ items 15%\n  const pctFor = n =\u003e n \u003e= 3 ? 15 : n \u003e= 2 ? 10 : 0;\n\n  const money = c =\u003e '$' + (c \/ 100).toFixed(2);\n  const info = document.querySelector('.product__info-container');\n  const form = info \u0026\u0026 info.querySelector('form[action*=\"\/cart\/add\"][data-type=\"add-to-cart-form\"]');\n  if (!info || !form) return;\n  const blockOf = el =\u003e { while (el \u0026\u0026 el.parentElement !== info) el = el.parentElement; return el; };\n  const buyBlock = blockOf(form);\n  const qtyInput = () =\u003e info.querySelector('.product-form__quantity input[name=\"quantity\"]') || document.querySelector('input[name=\"quantity\"]');\n  const mainQty = () =\u003e Math.max(1, parseInt((qtyInput() || {}).value, 10) || 1);\n\n  \/\/ Galixo order: variant picker -\u003e tiers -\u003e button -\u003e payment -\u003e add-ons -\u003e delivery -\u003e trust\n  const tiers = info.querySelector('.hh-tiers');\n  if (tiers) buyBlock.before(blockOf(tiers) === tiers ? tiers : blockOf(tiers));\n  \/\/ options with a single value (e.g. \"Ships From: United States\") are not a choice; hide them\n  info.querySelectorAll('variant-selects .product-form__input, variant-radios .product-form__input').forEach(f =\u003e {\n    if (f.querySelectorAll('input[type=\"radio\"], option').length === 1) f.style.display = 'none';\n  });\n  const eta = info.querySelector('.hh-eta');\n  if (eta) eta.style.display = 'none';\n  buyBlock.after(root);\n  root.hidden = false;\n  const pay = root.querySelector('.hb-pay'), footerPay = document.querySelector('.list-payment');\n  if (!pay.querySelector('svg') \u0026\u0026 footerPay) pay.innerHTML = [...footerPay.querySelectorAll('svg')].map(s =\u003e s.outerHTML).join('');\n  if (!pay.querySelector('svg')) pay.remove();\n\n  const ship = SHIP[root.dataset.handle];\n  const addBiz = n =\u003e { const d = new Date(); while (n \u003e 0) { d.setDate(d.getDate() + 1); if (d.getDay() % 6) n--; } return d; };\n  const fmt = d =\u003e d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n  const icon = d =\u003e '\u003csvg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e' + d + '\u003c\/svg\u003e';\n  root.insertAdjacentHTML('beforeend',\n    '\u003cdiv class=\"hb-add\" hidden\u003e\u003c\/div\u003e' +\n    '\u003cdiv class=\"hb-ship\"\u003e' + (ship\n      ? 'Estimated delivery: \u003cb\u003e' + fmt(addBiz(ship[0])) + ' – ' + fmt(addBiz(ship[1])) + '\u003c\/b\u003e\u003cbr\u003e' + ship[2] + ', free shipping.'\n      : '\u003cb\u003eFree shipping\u003c\/b\u003e to the contiguous US.\u003cbr\u003eYour estimated delivery date is shown at checkout.') + '\u003c\/div\u003e' +\n    '\u003cdiv class=\"hb-trust\"\u003e' +\n    '\u003cdiv\u003e' + icon('\u003cpath d=\"M3 7h11v8H3zM14 10h4l3 3v2h-7\"\/\u003e\u003ccircle cx=\"7\" cy=\"17\" r=\"1.6\"\/\u003e\u003ccircle cx=\"17\" cy=\"17\" r=\"1.6\"\/\u003e') + 'Free US Shipping\u003c\/div\u003e' +\n    '\u003cdiv\u003e' + icon('\u003cpath d=\"M4 12a8 8 0 1 0 2.4-5.7\"\/\u003e\u003cpath d=\"M4 4v4h4\"\/\u003e') + '30-Day Returns\u003c\/div\u003e' +\n    '\u003cdiv\u003e' + icon('\u003ccircle cx=\"12\" cy=\"12\" r=\"8.5\"\/\u003e\u003cpath d=\"M6 6l12 12\"\/\u003e\u003cpath d=\"M10 9.5v5M14 9.5v5\"\/\u003e') + 'No Drilling\u003c\/div\u003e' +\n    '\u003c\/div\u003e' +\n    '\u003cp class=\"hb-ck\"\u003e\u003ca href=\"\/pages\/move-in-checklist\"\u003eJust moved in? Get the free move-in kitchen checklist \u0026rarr;\u003c\/a\u003e\u003c\/p\u003e');\n\n  const handles = PAIR[root.dataset.handle] || [];\n  let extras = [];\n  const add = root.querySelector('.hb-add');\n  const picks = () =\u003e [...add.querySelectorAll('input:checked')].map(c =\u003e extras[+c.dataset.x]);\n  const paint = () =\u003e {\n    const n = mainQty() + picks().length;\n    add.querySelectorAll('.hb-item').forEach(el =\u003e {\n      const e = extras[+el.dataset.x], on = el.querySelector('input').checked;\n      const pct = pctFor(on ? n : n + 1);\n      el.querySelector('.hb-item-p').innerHTML = (pct ? '\u003cspan\u003e-' + pct + '%\u003cs\u003e' + money(e.v.price) + '\u003c\/s\u003e\u003c\/span\u003e' : '') +\n        money(e.v.price - Math.floor(e.v.price * pct \/ 100));\n    });\n  };\n  Promise.all(handles.map(h =\u003e fetch('\/products\/' + h + '.js').then(r =\u003e r.ok ? r.json() : null).catch(() =\u003e null))).then(list =\u003e {\n    extras = list.filter(Boolean).map(a =\u003e {\n      const pi = a.options.findIndex(o =\u003e \/pack|quantity|bundle\/i.test(o.name));\n      const single = x =\u003e pi \u003c 0 || \/^(single|1\\b)\/i.test(x.options[pi]);\n      const v = (PREF[a.handle] \u0026\u0026 a.variants.find(x =\u003e x.available \u0026\u0026 x.title.includes(PREF[a.handle]))) || a.variants.find(x =\u003e x.available \u0026\u0026 single(x)) || a.variants.find(x =\u003e x.available);\n      return v \u0026\u0026 { a, v };\n    }).filter(Boolean);\n    if (!extras.length) return;\n    const img = s =\u003e s ? s + (s.includes('?') ? '\u0026' : '?') + 'width=120' : '';\n    add.innerHTML = '\u003cp class=\"hb-add-h\"\u003eComplete the cabinet\u003c\/p\u003e' +\n      '\u003cp class=\"hb-add-p\"\u003eTick to add it with this order. 2 items save 10%, 3 or more save 15%, applied automatically at checkout.\u003c\/p\u003e' +\n      extras.map((e, i) =\u003e '\u003clabel class=\"hb-item\" data-x=\"' + i + '\"\u003e\u003cinput type=\"checkbox\" data-x=\"' + i + '\"\u003e' +\n        (e.a.featured_image ? '\u003cimg src=\"' + img(e.a.featured_image) + '\" alt=\"\" loading=\"lazy\"\u003e' : '') +\n        '\u003cspan class=\"hb-item-t\"\u003e' + e.a.title + (e.a.variants.length \u003e 1 ? '\u003csmall\u003e' + e.v.title.split(' \/ ')[0] + '\u003c\/small\u003e' : '') + '\u003c\/span\u003e' +\n        '\u003cspan class=\"hb-item-p\"\u003e\u003c\/span\u003e\u003c\/label\u003e').join('');\n    add.hidden = false;\n    add.addEventListener('change', paint);\n    document.addEventListener('change', e =\u003e { if (e.target.name === 'hh-tier' || e.target.name === 'quantity') setTimeout(paint, 50); });\n    paint();\n  });\n\n  \/\/ with add-ons ticked, add everything in one request; otherwise the theme's own add to cart runs untouched\n  document.addEventListener('submit', async e =\u003e {\n    if (e.target !== form || !picks().length) return;\n    e.preventDefault(); e.stopImmediatePropagation();\n    const btn = form.querySelector('[type=\"submit\"]'); if (btn) btn.setAttribute('aria-disabled', 'true');\n    const items = [{ id: +form.querySelector('input[name=\"id\"]').value, quantity: mainQty() }, ...picks().map(x =\u003e ({ id: x.v.id, quantity: 1 }))];\n    const r = await fetch('\/cart\/add.js', { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ items }) });\n    if (r.ok) { location.href = '\/cart'; return; }\n    if (btn) btn.removeAttribute('aria-disabled');\n    let err = root.querySelector('.hb-err'); if (!err) { err = document.createElement('p'); err.className = 'hb-err'; add.after(err); }\n    err.textContent = ((await r.json().catch(() =\u003e ({}))).description) || 'Could not add to cart. Please try again.';\n  }, true);\n  };\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start); else start();\n})();\n\u003c\/script\u003e\n\u003c!-- \/hh-galixo v1 --\u003e\n","brand":"Holeless Home","offers":[{"title":"1 Organizer \/ United States \/ 2-Tier","offer_id":58912027672840,"sku":"14:-2;200007763:201336106;200034261:201572813;5:200004166","price":39.95,"currency_code":"USD","in_stock":true},{"title":"Set of 2 \/ United States \/ 2-Tier","offer_id":58912027640072,"sku":"14:-1;200007763:201336106;200034261:201572813;5:200004166","price":69.95,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1060\/7329\/3064\/files\/Sbed291e218e349a2bfd50583e0fd68a7h.webp?v=1790651518","url":"https:\/\/holelesshome.com\/products\/no-drill-under-sink-organizer-2-tier-pull-out","provider":"Holeless Home","version":"1.0","type":"link"}