Free delivery on orders over $50 ● Roasted fresh every week ● Free delivery on orders over $50 ● Roasted fresh every week
Free delivery on orders over $50 ● Roasted fresh every week ● Free delivery on orders over $50 ● Roasted fresh every week
Free delivery on orders over $50 ● Roasted fresh every week ● Free delivery on orders over $50 ● Roasted fresh every week
Free delivery on orders over $50 ● Roasted fresh every week ● Free delivery on orders over $50 ● Roasted fresh every week
Free delivery on orders over $50 ● Roasted fresh every week ● Free delivery on orders over $50 ● Roasted fresh every week
Free delivery on orders over $50 ● Roasted fresh every week ● Free delivery on orders over $50 ● Roasted fresh every week
/
0 ? -0.25 : 0.25;
const oldScale = zoomScale;
zoomScale = Math.max(1, Math.min(zoomMaxScale, zoomScale + delta));
if (oldScale === 1 && zoomScale > 1) {
const r = $el.getBoundingClientRect();
const cx = $event.clientX - (r.left + r.width/2);
const cy = $event.clientY - (r.top + r.height/2);
zoomPanX = -cx * (zoomScale-1)/zoomScale;
zoomPanY = -cy * (zoomScale-1)/zoomScale;
} else if (zoomScale > 1) {
zoomPanX = zoomPanX * (zoomScale / oldScale);
zoomPanY = zoomPanY * (zoomScale / oldScale);
}
if (zoomScale <= 1) { resetZoom(); } else { clampPan(); }
"
class="relative w-full h-full flex items-center justify-center p-4 [touch-action:none]"
:class="zoomScale > 1 ? (zoomPanning ? 'cursor-grabbing' : 'cursor-grab') : (modalTotal > 1 ? (modalDragging ? 'cursor-grabbing' : 'cursor-grab') : '')"
@mousedown="modalDragStart($event)"
@mousemove="modalDragMove($event)"
@mouseup="modalDragEnd($event)"
@mouseleave="modalDragEnd($event)"
@touchstart="modalDragStart($event)"
@touchmove="modalDragMove($event)"
@touchend="modalDragEnd($event)"
:style="modalDragOffset ? `transform: translateX(${modalDragOffset}px); transition: none;` : 'transition: transform 0.2s ease-out;'">
measureZoomCeiling($el))"
@click.stop
@dblclick.stop.prevent="if (lastInputWasTouch) return; zoomAnimating = true; if (zoomScale > 1) { resetZoom(); } else { const r = $el.getBoundingClientRect(); const cx = $event.clientX - (r.left + r.width/2); const cy = $event.clientY - (r.top + r.height/2); zoomScale = Math.min(2.5, zoomMaxScale); zoomPanX = -cx * (zoomScale-1)/zoomScale; zoomPanY = -cy * (zoomScale-1)/zoomScale; clampPan(); } setTimeout(() => { zoomAnimating = false; }, 300);"
draggable="false"
:style="modalActive === largeIdx
? 'position:relative;transform: scale(' + zoomScale + ') translate(' + (zoomPanX / zoomScale) + 'px, ' + (zoomPanY / zoomScale) + 'px); transform-origin: center center; will-change: transform; transition: ' + (zoomAnimating ? 'transform 0.3s ease-out' : (zoomScale > 1 ? 'none' : 'transform 0.2s ease-out')) + ';'
: ''" />
Yemen Haraz, Natural 250 g
Demo ProductDried fruit, cardamom and dark chocolate
From the terraced mountains of Haraz, dried whole in the sun the way Yemeni coffee has been for centuries. Complex, winey and deeply sweet.
| Category | Specialty Coffee |
|---|---|
| SKU | DEMO-86D8A35F |
No reviews yet. Be the first to review this product!
Login to write a review
Related Products
$29
Free delivery on orders over $50 ● Free delivery on orders over $50 ● Free delivery on orders over $50
Free delivery on orders over $50 ● Free delivery on orders over $50 ● Free delivery on orders over $50
Free delivery on orders over $50 ● Free delivery on orders over $50 ● Free delivery on orders over $50
Join the club
Special offers and a first look at new roasts, in your inbox.
بُن