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')) + ';'
: ''" />
Khawlani Arabic Coffee Beans 500 g
Demo ProductYemeni Khawlani beans, roasted light for the dallah
Beans from the Khawlan mountains, roasted light and left whole so you can grind them fresh before every pot. Soft, nutty and naturally sweet.
| Category | Arabic Coffee |
|---|---|
| SKU | DEMO-D4CDA123 |
No reviews yet. Be the first to review this product!
Login to write a review
Related Products
$19
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.
بُن