Accessories

Your everyday grooming accessories designed to make horse life easier. 💜
From wash bags to grooming tools and handy essentials, our accessories are practical, stylish and made for everyday use around the stable.

Loading products...
501 RESULTS

Swash It.

Wow! Spray, Wipe, And Suddenly They Look Like They’ve Had A Full Pamper. Amazing Products. Love Horse Queened

Jordan C. - Sydney
★★★★★
38% Off
Purple Grooming Mitt - Horse QueenedRug & Tack Cleaner Duo | Queened Wash + Buff Queened - Horse Queened

Purple Grooming Mitt

Keeps hands clean while grooming
Soft, flexible, and gentle on coats
Perfect for applying oils + sprays evenly
Purple
$7.95
Purple Mixing Set - Horse QueenedPurple Mixing Set - Horse Queened

Purple Mixing Set

Makes applying Sock It, clays, and washes easier
Designed to suit everyday horse care routines
Keeps mixing tidy and controlled
Bowl + Spatula Set
$4.95
Purple Aluminium 500ml Refill Bottle - Horse QueenedPurple Aluminium 500ml Refill Bottle - Horse Queened

Purple Aluminium 500ml Refill Bottle

Lightweight, durable, and purple (so you never lose it)
Perfect for topping up your favourites
Eco-friendly reusable option
500ml
$22.95

Swash It.

Wow! Spray, Wipe, And Suddenly They Look Like They’ve Had A Full Pamper. Amazing Products. Love Horse Queened

Jordan C. - Sydney
★★★★★
New

Chaos Cloth

Keep one in your kit. One in your float.
Perfect for applying finishing products
Quick, easy clean-ups. No fuss
Purple
$5.00
Purple Chaos Caddy - Horse QueenedPurple Chaos Caddy - Horse Queened

Purple Chaos Caddy

Made for chaos, cleans up nicely
Stands upright, easy access
Corrals your care and grooming chaos
Purple
$79.95
The Royal Brush - Horse Queened
$3.95
The Stable Sidekick – Mesh Tote - Horse QueenedThe Stable Sidekick – Mesh Tote - Horse Queened

The Stable Sidekick – Mesh Tote

Bright purple so it never gets lost at the float
Lightweight, durable, everyday use
Perfect for grooming gear + show days
Purple
$24.95
New

Chaos Scrubber – Textured Exfoliating Wash Cloth for Horses

Supports a deeper clean
Soft and flexible design. Saves your back
Helps lift dirt and grime
Purple
$8.95
New

The Purple Pail- 12L Show Bucket

Limited run — only 100 made
Built for real horse life
Show up in style
Purple
$49.95
1 of 1

UNLEASH YOUR HORSE'S BEST SHINE

Transform every grooming session into a spa-like experience, so your horse enjoys a healthy, glossy coat every day.

Premium Care Proven Results

Trusted by riders for stronger hooves and softer coats, this is the quality care your horse truly deserves.

/* Product zoom: mouse-follow + touch toggle Works with: product-zoom-element[data-magnify], .product-zoom--wrapper, .product-zoom--enlarged */ (() => { const ZOOM_ATTR = 'data-magnify'; const roots = Array.from(document.querySelectorAll(`product-zoom-element[${ZOOM_ATTR}]`)); if (!roots.length) return; roots.forEach(root => { // ensure root is focusable for keyboard access if (!root.hasAttribute('tabindex')) root.setAttribute('tabindex', '0'); const wrapper = root.querySelector('.product-zoom--wrapper'); const enlarged = root.querySelector('.product-zoom--enlarged'); if (!wrapper) return; const rawZoom = parseFloat(root.getAttribute('data-magnify')) || 1.7; let effectiveZoom = rawZoom; // may be increased if high-res image is larger let isZoomed = false; // compute effective zoom based on the natural size of the enlarged image (if available) function updateEffectiveZoom() { try { if (enlarged && enlarged.naturalWidth && root.offsetWidth) { const imageRatio = enlarged.naturalWidth / root.offsetWidth; // we want at least rawZoom but if enlarged image is bigger, allow larger zoom effectiveZoom = Math.max(rawZoom, imageRatio); } else { effectiveZoom = rawZoom; } } catch (err) { effectiveZoom = rawZoom; } } if (enlarged) { if (enlarged.complete) updateEffectiveZoom(); else enlarged.addEventListener('load', updateEffectiveZoom, { once: true }); // also update on window resize (image/container geometry changes) window.addEventListener('resize', () => { updateEffectiveZoom(); }); } // Utility: set transform-origin and scale for enlarged image function setOriginAndScale(clientX, clientY) { const rect = root.getBoundingClientRect(); // clamp values 0..100 const x = Math.min(100, Math.max(0, ((clientX - rect.left) / rect.width) * 100)); const y = Math.min(100, Math.max(0, ((clientY - rect.top) / rect.height) * 100)); if (enlarged) { enlarged.style.transformOrigin = `${x}% ${y}%`; enlarged.style.transform = `scale(${effectiveZoom})`; } // slight parallax: move wrapper transform-origin to follow cursor (subtle) wrapper.style.transformOrigin = `${x}% ${y}%`; } // Activate zoom (add class, set scale) function activateZoom(clientX, clientY) { updateEffectiveZoom(); root.classList.add('is-zoomed'); isZoomed = true; if (typeof clientX === 'number' && typeof clientY === 'number') { setOriginAndScale(clientX, clientY); } else { // center if no coordinates provided if (enlarged) { enlarged.style.transformOrigin = `50% 50%`; enlarged.style.transform = `scale(${effectiveZoom})`; } wrapper.style.transformOrigin = `50% 50%`; } } // Deactivate zoom (reset transforms) function deactivateZoom() { root.classList.remove('is-zoomed'); isZoomed = false; if (enlarged) { enlarged.style.transform = 'scale(1)'; enlarged.style.transformOrigin = '50% 50%'; } wrapper.style.transform = 'scale(1)'; wrapper.style.transformOrigin = '50% 50%'; } // Mouse handlers function onMouseMove(e) { if (!isZoomed) activateZoom(e.clientX, e.clientY); else setOriginAndScale(e.clientX, e.clientY); } function onMouseEnter(e) { // activate but don't force a jump — set origin from event activateZoom(e.clientX, e.clientY); } function onMouseLeave() { deactivateZoom(); } // Touch handlers (simple toggle on first tap; move origin while zoomed) let lastTouchEnd = 0; function onTouchStart(e) { if (e.touches.length > 1) { // ignore pinch for now — allow browser default return; } const t = e.touches[0]; // toggle on tap if (!isZoomed) { activateZoom(t.clientX, t.clientY); } else { // if already zoomed, just update origin (user may pan) setOriginAndScale(t.clientX, t.clientY); } } function onTouchMove(e) { if (!isZoomed || e.touches.length === 0) return; const t = e.touches[0]; setOriginAndScale(t.clientX, t.clientY); } function onTouchEnd(e) { // if touchend with no subsequent touches, keep zoom active; second tap will close. // implement a quick double-tap-to-close const now = Date.now(); if (now - lastTouchEnd < 300) { // double-tap detected -> close deactivateZoom(); } lastTouchEnd = now; } // Keyboard (Enter/Space toggles) function onKeyDown(e) { if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar') { e.preventDefault(); if (!isZoomed) activateZoom(root.getBoundingClientRect().left + root.offsetWidth / 2, root.getBoundingClientRect().top + root.offsetHeight / 2); else deactivateZoom(); } else if (e.key === 'Escape' && isZoomed) { deactivateZoom(); } } // Bind events root.addEventListener('mousemove', onMouseMove); root.addEventListener('mouseenter', onMouseEnter); root.addEventListener('mouseleave', onMouseLeave); // touch: use passive listeners where safe root.addEventListener('touchstart', onTouchStart, { passive: true }); root.addEventListener('touchmove', onTouchMove, { passive: true }); root.addEventListener('touchend', onTouchEnd, { passive: true }); root.addEventListener('keydown', onKeyDown); // Clean up in case element is removed (optional) // If you dynamically remove elements, consider removing listeners to avoid leaks. }); })();