News
Every Pace Counts - 8 Minute Breathwork Practice
Get moving this year with our Every Pace Counts workout series! Our final workout is an 8 minute breathwork practice to incorporate to your overall wellness routine.
Shop The Story
{"id":7440685924487,
"handle":"huia-womens-athleisure-shoes-vintage-blue-sea-ice",
"title":"Huia - Vintage Blue \/ Sea Ice",
"available":true,
"tags":["2024-gift-guide","arch:standard","athleisure","athleisurelandtextile","athletic shoes","athlux","best:everday_wear","best:gym_trainers","best:travel","cat:shoes","color:blue","Everyday Wear","fit:narrow","fit:standard","free shipping","gender:women","Gym\/Trainers","hooea","hui","huia","material:textile","RGroup_20492","size:true","slip on shoes","sneakers","split_color","style:20492","Travel","vegan","vegan friendly","water-friendly","weight lifting","woman’s runers","women","women's","women’s","womns"],
"type":"Women’s Slip-On Athletic Shoes",
"options_with_values": [{"name":"Color","position":1,"values":["Vintage Blue \/ Sea Ice"]},{"name":"Size","position":2,"values":["5","6","6.5","7","7.5","8","8.5","9","9.5","10","11"]}],
"price":17000,
"price_min":17000,
"price_max":17000,
"compare_at_price":null,"featured_image": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_001_W_Huia_VintageBlueSeaIce_1.png?v=1762447752",
"featured_image_aspect_ratio": 1.0,
"featured_image_width": 2000,
"featured_image_height": 2000,
"featured_image_id": 34216750481543,
"featured_image_alt": "Vintage Blue \/ Sea Ice",
"hover_image": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_101_W_Huia_VintageBlue_5f939a35-bd9a-47ca-babb-79c325ec131b.jpg?v=1743633484",
"hover_image_alt": "Vintage Blue \/ Sea Ice",
"images": [{
"id": 34216750481543,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_001_W_Huia_VintageBlueSeaIce_1.png?v=1762447752",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750514311,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_101_W_Huia_VintageBlue_5f939a35-bd9a-47ca-babb-79c325ec131b.jpg?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750547079,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_201_04fbfee1-3d37-422d-b30c-7cc440e2bfa2.jpg?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750579847,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_201_2a32bb56-ab13-4a07-acb9-14af360d318e.jpg?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750612615,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_002_W_Huia_VintageBlueSeaIce.png?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750645383,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_102_W_Huia_VintageBlue_a9004cc6-9813-49e5-b740-3caff33c402a.jpg?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2001
},{
"id": 34216750678151,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_103_W_Huia_VintageBlue_0d6c957d-8d0f-4fd4-84fa-30602f1e6da0.jpg?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750710919,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_202_12d4ea6e-2409-40ef-a2db-be9a721d8ecc.jpg?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
},{
"id": 34216750743687,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_VNZC_005_W_Huia_VintageBlueSeaIce.png?v=1743633484",
"alt": "Vintage Blue \/ Sea Ice",
"width": 2000,
"height": 2000
}],
"plp_image_order_positions": "",
"sku": "20492-VNZC-5"
}
{ $dispatch('product-item:images-changed', { product: product, source: 'swatch-container' }) })"
@pointercancel="intendedSwatchIndex = null; intendedSwatchEl = null"
x-data="{
wrapper: $el,
selectedSibling:product.siblings[0],
intendedSwatchIndex: null,
intendedSwatchEl: null,
swatchGap: 8,
scrollable: product.siblings.filter(s => !!s.available).length > 9.5,
canPrev: false,
canNext: true,
_edgeReady: false,
imageLimit: 0,
limitImages(nextProduct) {
const images = Array.isArray(nextProduct && nextProduct.images) ? nextProduct.images : [];
const limitedImages = this.imageLimit > 0 ? images.slice(0, this.imageLimit) : images;
const hoverImage = limitedImages[1] || null;
return Object.assign({}, nextProduct, {
images: limitedImages,
hover_image: hoverImage ? hoverImage.src : null,
hover_image_alt: hoverImage ? hoverImage.alt : null
});
},
selectProduct(nextProduct) {
const productRoot = $el.closest('.product-item');
const productData = productRoot && productRoot._x_dataStack && productRoot._x_dataStack[0];
if (productData && typeof productData.setProduct === 'function') {
productData.setProduct(nextProduct);
} else {
$data.product = this.limitImages(nextProduct);
}
},
getSwatchImageSrc(sibling) {
return sibling.images[0].src;
},
buildSwatchSrcset(src) {
if (!src) return '';
const widths = ['48', '96', '192'];
const separator = src.includes('?') ? '&' : '?';
return widths.map(w => `${src}${separator}width=${w} ${w}w`).join(', ');
},
isSwatchPriority(index) {
return window.innerWidth >= 1024 ? index < 3 : index < 2;
},
swatchBg(sibling) {
// swatch_bg precomputed at hydration. Nullish (not ||): null = no colors set
// (fall back to theme default), empty string = invalid combo, no fallback.
return sibling.swatch_bg ?? '#000000';
},
centerSwatch(el) {
if ($data.wrapper.scrollWidth <= $data.wrapper.clientWidth) return false
const wrapperRect = $data.wrapper.getBoundingClientRect()
const elRect = el.getBoundingClientRect()
const centerPoint = wrapperRect.x + (wrapperRect.width / 2)
const behavior = window.innerWidth < 1024 ? 'auto' : 'smooth'
$data.wrapper.scrollTo({
left: $data.wrapper.scrollLeft + (elRect.x - centerPoint + (elRect.width / 2)),
behavior
})
},
selectSwatchFromTap(siblingIndex, el) {
const idx = (this.intendedSwatchIndex !== null && this.intendedSwatchIndex !== undefined)
? this.intendedSwatchIndex
: siblingIndex
const targetEl = this.intendedSwatchEl || el
this.intendedSwatchIndex = null
this.intendedSwatchEl = null
const next = product.siblings[idx]
if (next) product = next
this.centerSwatch(targetEl)
},
scroll(direction = 'forward') {
const swatch = $data.wrapper.querySelector('.product-item__swatch')
const unit = swatch ? swatch.offsetWidth + $data.swatchGap : $data.wrapper.clientWidth * 0.3
let amount = 2 * unit
$data.wrapper.scrollTo({
left: direction == 'forward' ? $data.wrapper.scrollLeft + amount : $data.wrapper.scrollLeft - amount,
behavior:'smooth'
})
},
// Lazily wire the prev/next edge detection on first desktop hover/focus —
// the arrows are a desktop affordance, so no observer is built at load and
// none is ever built on mobile. canPrev/canNext default to the at-start state.
initSwatchEdges() {
if (this._edgeReady || window.innerWidth <= 1023) return
this._edgeReady = true
const root = this.wrapper
const swatches = root.querySelectorAll('.product-item__swatch')
if (swatches.length < 2) return
const first = swatches[0], last = swatches[swatches.length - 1]
const io = new IntersectionObserver((entries) => {
const d = window.Alpine && window.Alpine.$data ? window.Alpine.$data(root) : null
if (!d) return
entries.forEach((e) => {
if (e.target === first) d.canPrev = !e.isIntersecting
if (e.target === last) d.canNext = !e.isIntersecting
})
}, { root, threshold: 0.99 })
io.observe(first)
io.observe(last)
root._swatchEdgeIO = io
}
}"
@pointerenter="initSwatchEdges()"
@focusin="initSwatchEdges()"
>
{"id":6671993634951,
"handle":"mio-li-mens-athletic-shoes-pavement-vintage-indigo",
"title":"Mio Lī - Pavement \/ Vintage Indigo",
"available":true,
"tags":["2024-gift-guide","arch:standard","as seen on tv","athletic shoes","best selling","best:everday_wear","best:gym_trainers","best:travel","cat:shoes","color:grey","commerical","crossfit","drop-in heel®","enhance gip","enhanced traction outsole","Everyday Wear","fit:narrow","fit:standard","foldable heal","free shipping","gender:men","Gym\/Trainers","labor day","landtextile","likes:exercising","likes:hiking","likes:urban-exploring","material:textile","mens","mens runnners","mi oli","mia lli","milo le","milo li","milo’s","mio ii","Mio Li","mio lie","mio lii","mio lio","mio loi","mio lu","miola","mioli","miolio","miso li","mo li","molí","on tv","prime","RGroup_10440","shoes","size:true","sneakers","split_color","style:10440","tennis shoes","tennis shors","tennis shos","Travel","tv","tv ad","Walking","weight lifting"],
"type":"Men’s Everyday Athletic Shoes",
"options_with_values": [{"name":"Color","position":1,"values":["Pavement \/ Vintage Indigo"]},{"name":"Size","position":2,"values":["7","8","8.5","9","9.5","10","10.5","11","11.5","12","13","14","15"]}],
"price":18000,
"price_min":18000,
"price_max":18000,
"compare_at_price":null,"featured_image": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_001_M_MioLi_PaveVin.png?v=1762444846",
"featured_image_aspect_ratio": 1.0,
"featured_image_width": 2000,
"featured_image_height": 2000,
"featured_image_id": 34216747073671,
"featured_image_alt": "Pavement \/ Vintage Indigo",
"hover_image": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_202_690ade22-bcd6-4659-aae8-1929689b276f.jpg?v=1743633483",
"hover_image_alt": "Pavement \/ Vintage Indigo",
"images": [{
"id": 34216747073671,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_001_M_MioLi_PaveVin.png?v=1762444846",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747106439,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_202_690ade22-bcd6-4659-aae8-1929689b276f.jpg?v=1743633483",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747139207,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_201_35308c76-5516-46f7-996b-f29cfc29c58c.jpg?v=1743633483",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747204743,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_301_e34480b7-4df0-4641-b092-a90eb3885871.jpg?v=1743633483",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747270279,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_202_6fd80a5e-3cc9-4c86-971d-bc677d7947a7.jpg?v=1743633484",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747335815,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_002_M_MioLi_PaveVin.png?v=1743633484",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747401351,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_003_M_MioLi_PaveVin.png?v=1743633484",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747499655,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_004_M_MioLi_PaveVin.png?v=1743633484",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
},{
"id": 34216747565191,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_PVVI_005_M_MioLi_PaveVin.png?v=1743633484",
"alt": "Pavement \/ Vintage Indigo",
"width": 2000,
"height": 2000
}],
"plp_image_order_positions": "",
"sku": "10440-PVVI-7"
}
{ $dispatch('product-item:images-changed', { product: product, source: 'swatch-container' }) })"
@pointercancel="intendedSwatchIndex = null; intendedSwatchEl = null"
x-data="{
wrapper: $el,
selectedSibling:product.siblings[0],
intendedSwatchIndex: null,
intendedSwatchEl: null,
swatchGap: 8,
scrollable: product.siblings.filter(s => !!s.available).length > 9.5,
canPrev: false,
canNext: true,
_edgeReady: false,
imageLimit: 0,
limitImages(nextProduct) {
const images = Array.isArray(nextProduct && nextProduct.images) ? nextProduct.images : [];
const limitedImages = this.imageLimit > 0 ? images.slice(0, this.imageLimit) : images;
const hoverImage = limitedImages[1] || null;
return Object.assign({}, nextProduct, {
images: limitedImages,
hover_image: hoverImage ? hoverImage.src : null,
hover_image_alt: hoverImage ? hoverImage.alt : null
});
},
selectProduct(nextProduct) {
const productRoot = $el.closest('.product-item');
const productData = productRoot && productRoot._x_dataStack && productRoot._x_dataStack[0];
if (productData && typeof productData.setProduct === 'function') {
productData.setProduct(nextProduct);
} else {
$data.product = this.limitImages(nextProduct);
}
},
getSwatchImageSrc(sibling) {
return sibling.images[0].src;
},
buildSwatchSrcset(src) {
if (!src) return '';
const widths = ['48', '96', '192'];
const separator = src.includes('?') ? '&' : '?';
return widths.map(w => `${src}${separator}width=${w} ${w}w`).join(', ');
},
isSwatchPriority(index) {
return window.innerWidth >= 1024 ? index < 3 : index < 2;
},
swatchBg(sibling) {
// swatch_bg precomputed at hydration. Nullish (not ||): null = no colors set
// (fall back to theme default), empty string = invalid combo, no fallback.
return sibling.swatch_bg ?? '#000000';
},
centerSwatch(el) {
if ($data.wrapper.scrollWidth <= $data.wrapper.clientWidth) return false
const wrapperRect = $data.wrapper.getBoundingClientRect()
const elRect = el.getBoundingClientRect()
const centerPoint = wrapperRect.x + (wrapperRect.width / 2)
const behavior = window.innerWidth < 1024 ? 'auto' : 'smooth'
$data.wrapper.scrollTo({
left: $data.wrapper.scrollLeft + (elRect.x - centerPoint + (elRect.width / 2)),
behavior
})
},
selectSwatchFromTap(siblingIndex, el) {
const idx = (this.intendedSwatchIndex !== null && this.intendedSwatchIndex !== undefined)
? this.intendedSwatchIndex
: siblingIndex
const targetEl = this.intendedSwatchEl || el
this.intendedSwatchIndex = null
this.intendedSwatchEl = null
const next = product.siblings[idx]
if (next) product = next
this.centerSwatch(targetEl)
},
scroll(direction = 'forward') {
const swatch = $data.wrapper.querySelector('.product-item__swatch')
const unit = swatch ? swatch.offsetWidth + $data.swatchGap : $data.wrapper.clientWidth * 0.3
let amount = 2 * unit
$data.wrapper.scrollTo({
left: direction == 'forward' ? $data.wrapper.scrollLeft + amount : $data.wrapper.scrollLeft - amount,
behavior:'smooth'
})
},
// Lazily wire the prev/next edge detection on first desktop hover/focus —
// the arrows are a desktop affordance, so no observer is built at load and
// none is ever built on mobile. canPrev/canNext default to the at-start state.
initSwatchEdges() {
if (this._edgeReady || window.innerWidth <= 1023) return
this._edgeReady = true
const root = this.wrapper
const swatches = root.querySelectorAll('.product-item__swatch')
if (swatches.length < 2) return
const first = swatches[0], last = swatches[swatches.length - 1]
const io = new IntersectionObserver((entries) => {
const d = window.Alpine && window.Alpine.$data ? window.Alpine.$data(root) : null
if (!d) return
entries.forEach((e) => {
if (e.target === first) d.canPrev = !e.isIntersecting
if (e.target === last) d.canNext = !e.isIntersecting
})
}, { root, threshold: 0.99 })
io.observe(first)
io.observe(last)
root._swatchEdgeIO = io
}
}"
@pointerenter="initSwatchEdges()"
@focusin="initSwatchEdges()"
>
{"id":6820092346503,
"handle":"huia-womens-athleisure-shoes-black",
"title":"Huia - Black",
"available":true,
"tags":["arch:standard","as seen on tv","athleisure","athleisurelandtextile","athletic shoes","athlux","best sellers","best selling","best:everday_wear","best:gym_trainers","best:travel","cat:shoes","color:Black","commercial","crossfit","Everyday Wear","fit:narrow","fit:standard","free shipping","gender:women","Gym\/Trainers","hooea","Huai","huea","huia","ladies slipon runners","material:textile","on tv","prime","RGroup_20492","seen on tv","size:true","slip on shoes","sneakers","solar powered","solar poweted","split_color","style:20492","textile","trainer sneakers","Travel","tv","tv ad","vegan","vegan friendly","Walking","water-friendly","weight lifting","woman’s runers","women hikers","women's","womns"],
"type":"Women’s Slip-On Athletic Shoes",
"options_with_values": [{"name":"Color","position":1,"values":["Black"]},{"name":"Size","position":2,"values":["5","6","6.5","7","7.5","8","8.5","9","9.5","10","11"]}],
"price":17000,
"price_min":17000,
"price_max":17000,
"compare_at_price":null,"featured_image": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_001_W_Huia_BlkBlk_1_b958164b-c147-4ad7-a147-0eb964574c81.png?v=1762445869",
"featured_image_aspect_ratio": 1.0,
"featured_image_width": 2000,
"featured_image_height": 2000,
"featured_image_id": 34216745336967,
"featured_image_alt": "Black",
"hover_image": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_101_W_HUIA_BlackBlack.jpg?v=1743633484",
"hover_image_alt": "Black",
"images": [{
"id": 34216745336967,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_001_W_Huia_BlkBlk_1_b958164b-c147-4ad7-a147-0eb964574c81.png?v=1762445869",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745369735,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_101_W_HUIA_BlackBlack.jpg?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745402503,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_201_5e4f5ee7-bcdf-4b00-894f-72c54f66407a.jpg?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745435271,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_201_0ea20181-038b-4df8-b271-30d23939e77a.jpg?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745468039,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_002_W_Huia_BlkBlk.png?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745500807,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_102_W_HUIA_BlackBlack.jpg?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745533575,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_202_57fae105-72d7-4a8b-bc2c-93d3a390f3a6.jpg?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745566343,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_202_1df440eb-7cff-40c3-8f7a-91b734274f47.jpg?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
},{
"id": 34216745599111,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/20492_4040_005_W_Huia_BlkBlk.png?v=1743633484",
"alt": "Black",
"width": 2000,
"height": 2000
}],
"plp_image_order_positions": "",
"sku": "20492-4040-5"
}
{ $dispatch('product-item:images-changed', { product: product, source: 'swatch-container' }) })"
@pointercancel="intendedSwatchIndex = null; intendedSwatchEl = null"
x-data="{
wrapper: $el,
selectedSibling:product.siblings[0],
intendedSwatchIndex: null,
intendedSwatchEl: null,
swatchGap: 8,
scrollable: product.siblings.filter(s => !!s.available).length > 9.5,
canPrev: false,
canNext: true,
_edgeReady: false,
imageLimit: 0,
limitImages(nextProduct) {
const images = Array.isArray(nextProduct && nextProduct.images) ? nextProduct.images : [];
const limitedImages = this.imageLimit > 0 ? images.slice(0, this.imageLimit) : images;
const hoverImage = limitedImages[1] || null;
return Object.assign({}, nextProduct, {
images: limitedImages,
hover_image: hoverImage ? hoverImage.src : null,
hover_image_alt: hoverImage ? hoverImage.alt : null
});
},
selectProduct(nextProduct) {
const productRoot = $el.closest('.product-item');
const productData = productRoot && productRoot._x_dataStack && productRoot._x_dataStack[0];
if (productData && typeof productData.setProduct === 'function') {
productData.setProduct(nextProduct);
} else {
$data.product = this.limitImages(nextProduct);
}
},
getSwatchImageSrc(sibling) {
return sibling.images[0].src;
},
buildSwatchSrcset(src) {
if (!src) return '';
const widths = ['48', '96', '192'];
const separator = src.includes('?') ? '&' : '?';
return widths.map(w => `${src}${separator}width=${w} ${w}w`).join(', ');
},
isSwatchPriority(index) {
return window.innerWidth >= 1024 ? index < 3 : index < 2;
},
swatchBg(sibling) {
// swatch_bg precomputed at hydration. Nullish (not ||): null = no colors set
// (fall back to theme default), empty string = invalid combo, no fallback.
return sibling.swatch_bg ?? '#000000';
},
centerSwatch(el) {
if ($data.wrapper.scrollWidth <= $data.wrapper.clientWidth) return false
const wrapperRect = $data.wrapper.getBoundingClientRect()
const elRect = el.getBoundingClientRect()
const centerPoint = wrapperRect.x + (wrapperRect.width / 2)
const behavior = window.innerWidth < 1024 ? 'auto' : 'smooth'
$data.wrapper.scrollTo({
left: $data.wrapper.scrollLeft + (elRect.x - centerPoint + (elRect.width / 2)),
behavior
})
},
selectSwatchFromTap(siblingIndex, el) {
const idx = (this.intendedSwatchIndex !== null && this.intendedSwatchIndex !== undefined)
? this.intendedSwatchIndex
: siblingIndex
const targetEl = this.intendedSwatchEl || el
this.intendedSwatchIndex = null
this.intendedSwatchEl = null
const next = product.siblings[idx]
if (next) product = next
this.centerSwatch(targetEl)
},
scroll(direction = 'forward') {
const swatch = $data.wrapper.querySelector('.product-item__swatch')
const unit = swatch ? swatch.offsetWidth + $data.swatchGap : $data.wrapper.clientWidth * 0.3
let amount = 2 * unit
$data.wrapper.scrollTo({
left: direction == 'forward' ? $data.wrapper.scrollLeft + amount : $data.wrapper.scrollLeft - amount,
behavior:'smooth'
})
},
// Lazily wire the prev/next edge detection on first desktop hover/focus —
// the arrows are a desktop affordance, so no observer is built at load and
// none is ever built on mobile. canPrev/canNext default to the at-start state.
initSwatchEdges() {
if (this._edgeReady || window.innerWidth <= 1023) return
this._edgeReady = true
const root = this.wrapper
const swatches = root.querySelectorAll('.product-item__swatch')
if (swatches.length < 2) return
const first = swatches[0], last = swatches[swatches.length - 1]
const io = new IntersectionObserver((entries) => {
const d = window.Alpine && window.Alpine.$data ? window.Alpine.$data(root) : null
if (!d) return
entries.forEach((e) => {
if (e.target === first) d.canPrev = !e.isIntersecting
if (e.target === last) d.canNext = !e.isIntersecting
})
}, { root, threshold: 0.99 })
io.observe(first)
io.observe(last)
root._swatchEdgeIO = io
}
}"
@pointerenter="initSwatchEdges()"
@focusin="initSwatchEdges()"
>
{"id":5156386832519,
"handle":"mio-li-mens-athletic-shoes-mist-grey-poi",
"title":"Mio Lī - Mist Grey \/ Poi",
"available":true,
"tags":["arch:standard","as seen on tv","athletic shoes","best sellers","best selling","best:everday_wear","best:gym_trainers","best:travel","cat:shoes","collection:chief-home-officer","collection:day-tripper","collection:HGG-Slider-M","color:grey","color:Mist Grey \/ Poi","commerical","crossfit","drop-in heel®","enhance gip","enhanced traction outsole","Everyday Wear","EXP_REC_MEN","fit:narrow","fit:standard","foldable heal","free shipping","gender:men","Gym\/Trainers","labor day","land","material:textile","mens","mens runnners","mi lo","mi oli","mia lli","milo le","milo li","milo’s","Mio Li","mio lii","mio lio","mio loi","mio lu","miola","miolio","miso li","mist gray","mo li","molí","moo li","on tv","prime","RGroup_10440","shoes","size:true","sneakers","split_color","style:10440","tennis shoes","tennis shors","tennis shos","textile","Travel","tv","tv ad","Walking","weight lifting","YGroup_10440"],
"type":"Men’s Everyday Athletic Shoes",
"options_with_values": [{"name":"Color","position":1,"values":["Mist Grey \/ Poi"]},{"name":"Size","position":2,"values":["7","8","8.5","9","9.5","10","10.5","11","11.5","12","13","14","15"]}],
"price":18000,
"price_min":18000,
"price_max":18000,
"compare_at_price":null,"featured_image": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_001_M_MioLi_MisgPoi_1b7bfb81-4921-4ac5-a5ec-fad5280e721f.png?v=1759439624",
"featured_image_aspect_ratio": 1.0,
"featured_image_width": 2000,
"featured_image_height": 2000,
"featured_image_id": 34216744353927,
"featured_image_alt": "Mist Grey \/ Poi",
"hover_image": "\/\/olukai.ca\/cdn\/shop\/files\/MioLi_7_daa59ca5-d6a2-4137-b237-4aba7aec25f9.jpg?v=1743633483",
"hover_image_alt": "Mist Grey \/ Poi",
"images": [{
"id": 34216744353927,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_001_M_MioLi_MisgPoi_1b7bfb81-4921-4ac5-a5ec-fad5280e721f.png?v=1759439624",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744452231,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/MioLi_7_daa59ca5-d6a2-4137-b237-4aba7aec25f9.jpg?v=1743633483",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744517767,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_202_33ac0c5c-03a1-42ed-8fab-b717c676f02c.jpg?v=1743633483",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744648839,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_004_M_MioLi_MisgPoi_png_75d96e68-7bd4-4bcb-87fb-4ee85ec5045b.png?v=1743633483",
"alt": "Mist Grey \/ Poi",
"width": 750,
"height": 750
},{
"id": 34216744714375,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/MioLi_4_5a9ad7f8-2b9e-4fb0-9f97-c45df3957829.jpg?v=1743633483",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744779911,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_103_M_MIOLI_MistGreyPoi_c12348d9-31cb-4011-8697-5141a6c3417e.jpg?v=1743633483",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744845447,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/MioLi_2_a37e8702-933e-4404-8d49-28ce643967ce.jpg?v=1743633483",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744910983,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_201_848937e5-ff32-4739-bb54-a74983182f72.jpg?v=1743633484",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
},{
"id": 34216744976519,
"src": "\/\/olukai.ca\/cdn\/shop\/files\/10440_DW25_005_M_MioLi_MisgPoi.png?v=1743633484",
"alt": "Mist Grey \/ Poi",
"width": 2000,
"height": 2000
}],
"plp_image_order_positions": "",
"sku": "10440-DW25-7"
}
{ $dispatch('product-item:images-changed', { product: product, source: 'swatch-container' }) })"
@pointercancel="intendedSwatchIndex = null; intendedSwatchEl = null"
x-data="{
wrapper: $el,
selectedSibling:product.siblings[0],
intendedSwatchIndex: null,
intendedSwatchEl: null,
swatchGap: 8,
scrollable: product.siblings.filter(s => !!s.available).length > 9.5,
canPrev: false,
canNext: true,
_edgeReady: false,
imageLimit: 0,
limitImages(nextProduct) {
const images = Array.isArray(nextProduct && nextProduct.images) ? nextProduct.images : [];
const limitedImages = this.imageLimit > 0 ? images.slice(0, this.imageLimit) : images;
const hoverImage = limitedImages[1] || null;
return Object.assign({}, nextProduct, {
images: limitedImages,
hover_image: hoverImage ? hoverImage.src : null,
hover_image_alt: hoverImage ? hoverImage.alt : null
});
},
selectProduct(nextProduct) {
const productRoot = $el.closest('.product-item');
const productData = productRoot && productRoot._x_dataStack && productRoot._x_dataStack[0];
if (productData && typeof productData.setProduct === 'function') {
productData.setProduct(nextProduct);
} else {
$data.product = this.limitImages(nextProduct);
}
},
getSwatchImageSrc(sibling) {
return sibling.images[0].src;
},
buildSwatchSrcset(src) {
if (!src) return '';
const widths = ['48', '96', '192'];
const separator = src.includes('?') ? '&' : '?';
return widths.map(w => `${src}${separator}width=${w} ${w}w`).join(', ');
},
isSwatchPriority(index) {
return window.innerWidth >= 1024 ? index < 3 : index < 2;
},
swatchBg(sibling) {
// swatch_bg precomputed at hydration. Nullish (not ||): null = no colors set
// (fall back to theme default), empty string = invalid combo, no fallback.
return sibling.swatch_bg ?? '#000000';
},
centerSwatch(el) {
if ($data.wrapper.scrollWidth <= $data.wrapper.clientWidth) return false
const wrapperRect = $data.wrapper.getBoundingClientRect()
const elRect = el.getBoundingClientRect()
const centerPoint = wrapperRect.x + (wrapperRect.width / 2)
const behavior = window.innerWidth < 1024 ? 'auto' : 'smooth'
$data.wrapper.scrollTo({
left: $data.wrapper.scrollLeft + (elRect.x - centerPoint + (elRect.width / 2)),
behavior
})
},
selectSwatchFromTap(siblingIndex, el) {
const idx = (this.intendedSwatchIndex !== null && this.intendedSwatchIndex !== undefined)
? this.intendedSwatchIndex
: siblingIndex
const targetEl = this.intendedSwatchEl || el
this.intendedSwatchIndex = null
this.intendedSwatchEl = null
const next = product.siblings[idx]
if (next) product = next
this.centerSwatch(targetEl)
},
scroll(direction = 'forward') {
const swatch = $data.wrapper.querySelector('.product-item__swatch')
const unit = swatch ? swatch.offsetWidth + $data.swatchGap : $data.wrapper.clientWidth * 0.3
let amount = 2 * unit
$data.wrapper.scrollTo({
left: direction == 'forward' ? $data.wrapper.scrollLeft + amount : $data.wrapper.scrollLeft - amount,
behavior:'smooth'
})
},
// Lazily wire the prev/next edge detection on first desktop hover/focus —
// the arrows are a desktop affordance, so no observer is built at load and
// none is ever built on mobile. canPrev/canNext default to the at-start state.
initSwatchEdges() {
if (this._edgeReady || window.innerWidth <= 1023) return
this._edgeReady = true
const root = this.wrapper
const swatches = root.querySelectorAll('.product-item__swatch')
if (swatches.length < 2) return
const first = swatches[0], last = swatches[swatches.length - 1]
const io = new IntersectionObserver((entries) => {
const d = window.Alpine && window.Alpine.$data ? window.Alpine.$data(root) : null
if (!d) return
entries.forEach((e) => {
if (e.target === first) d.canPrev = !e.isIntersecting
if (e.target === last) d.canNext = !e.isIntersecting
})
}, { root, threshold: 0.99 })
io.observe(first)
io.observe(last)
root._swatchEdgeIO = io
}
}"
@pointerenter="initSwatchEdges()"
@focusin="initSwatchEdges()"
>
{ $dispatch('product-item:images-changed', { product: product, source: 'swatch-container' }) })"
@pointercancel="intendedSwatchIndex = null; intendedSwatchEl = null"
x-data="{
wrapper: $el,
selectedSibling:product.siblings[0],
intendedSwatchIndex: null,
intendedSwatchEl: null,
swatchGap: 8,
scrollable: product.siblings.filter(s => !!s.available).length > 9.5,
canPrev: false,
canNext: true,
_edgeReady: false,
imageLimit: 0,
limitImages(nextProduct) {
const images = Array.isArray(nextProduct && nextProduct.images) ? nextProduct.images : [];
const limitedImages = this.imageLimit > 0 ? images.slice(0, this.imageLimit) : images;
const hoverImage = limitedImages[1] || null;
return Object.assign({}, nextProduct, {
images: limitedImages,
hover_image: hoverImage ? hoverImage.src : null,
hover_image_alt: hoverImage ? hoverImage.alt : null
});
},
selectProduct(nextProduct) {
const productRoot = $el.closest('.product-item');
const productData = productRoot && productRoot._x_dataStack && productRoot._x_dataStack[0];
if (productData && typeof productData.setProduct === 'function') {
productData.setProduct(nextProduct);
} else {
$data.product = this.limitImages(nextProduct);
}
},
getSwatchImageSrc(sibling) {
return sibling.images[0].src;
},
buildSwatchSrcset(src) {
if (!src) return '';
const widths = ['48', '96', '192'];
const separator = src.includes('?') ? '&' : '?';
return widths.map(w => `${src}${separator}width=${w} ${w}w`).join(', ');
},
isSwatchPriority(index) {
return window.innerWidth >= 1024 ? index < 3 : index < 2;
},
swatchBg(sibling) {
// swatch_bg precomputed at hydration. Nullish (not ||): null = no colors set
// (fall back to theme default), empty string = invalid combo, no fallback.
return sibling.swatch_bg ?? '#000000';
},
centerSwatch(el) {
if ($data.wrapper.scrollWidth <= $data.wrapper.clientWidth) return false
const wrapperRect = $data.wrapper.getBoundingClientRect()
const elRect = el.getBoundingClientRect()
const centerPoint = wrapperRect.x + (wrapperRect.width / 2)
const behavior = window.innerWidth < 1024 ? 'auto' : 'smooth'
$data.wrapper.scrollTo({
left: $data.wrapper.scrollLeft + (elRect.x - centerPoint + (elRect.width / 2)),
behavior
})
},
selectSwatchFromTap(siblingIndex, el) {
const idx = (this.intendedSwatchIndex !== null && this.intendedSwatchIndex !== undefined)
? this.intendedSwatchIndex
: siblingIndex
const targetEl = this.intendedSwatchEl || el
this.intendedSwatchIndex = null
this.intendedSwatchEl = null
const next = product.siblings[idx]
if (next) product = next
this.centerSwatch(targetEl)
},
scroll(direction = 'forward') {
const swatch = $data.wrapper.querySelector('.product-item__swatch')
const unit = swatch ? swatch.offsetWidth + $data.swatchGap : $data.wrapper.clientWidth * 0.3
let amount = 2 * unit
$data.wrapper.scrollTo({
left: direction == 'forward' ? $data.wrapper.scrollLeft + amount : $data.wrapper.scrollLeft - amount,
behavior:'smooth'
})
},
// Lazily wire the prev/next edge detection on first desktop hover/focus —
// the arrows are a desktop affordance, so no observer is built at load and
// none is ever built on mobile. canPrev/canNext default to the at-start state.
initSwatchEdges() {
if (this._edgeReady || window.innerWidth <= 1023) return
this._edgeReady = true
const root = this.wrapper
const swatches = root.querySelectorAll('.product-item__swatch')
if (swatches.length < 2) return
const first = swatches[0], last = swatches[swatches.length - 1]
const io = new IntersectionObserver((entries) => {
const d = window.Alpine && window.Alpine.$data ? window.Alpine.$data(root) : null
if (!d) return
entries.forEach((e) => {
if (e.target === first) d.canPrev = !e.isIntersecting
if (e.target === last) d.canNext = !e.isIntersecting
})
}, { root, threshold: 0.99 })
io.observe(first)
io.observe(last)
root._swatchEdgeIO = io
}
}"
@pointerenter="initSwatchEdges()"
@focusin="initSwatchEdges()"
>
Explore Similar Stories
{ $dispatch('product-item:images-changed', { product: product, source: 'swatch-container' }) })"
@pointercancel="intendedSwatchIndex = null; intendedSwatchEl = null"
x-data="{
wrapper: $el,
selectedSibling:product.siblings[0],
intendedSwatchIndex: null,
intendedSwatchEl: null,
swatchGap: 8,
scrollable: product.siblings.filter(s => !!s.available).length > 9.5,
canPrev: false,
canNext: true,
_edgeReady: false,
imageLimit: 0,
limitImages(nextProduct) {
const images = Array.isArray(nextProduct && nextProduct.images) ? nextProduct.images : [];
const limitedImages = this.imageLimit > 0 ? images.slice(0, this.imageLimit) : images;
const hoverImage = limitedImages[1] || null;
return Object.assign({}, nextProduct, {
images: limitedImages,
hover_image: hoverImage ? hoverImage.src : null,
hover_image_alt: hoverImage ? hoverImage.alt : null
});
},
selectProduct(nextProduct) {
const productRoot = $el.closest('.product-item');
const productData = productRoot && productRoot._x_dataStack && productRoot._x_dataStack[0];
if (productData && typeof productData.setProduct === 'function') {
productData.setProduct(nextProduct);
} else {
$data.product = this.limitImages(nextProduct);
}
},
getSwatchImageSrc(sibling) {
return sibling.images[0].src;
},
buildSwatchSrcset(src) {
if (!src) return '';
const widths = ['48', '96', '192'];
const separator = src.includes('?') ? '&' : '?';
return widths.map(w => `${src}${separator}width=${w} ${w}w`).join(', ');
},
isSwatchPriority(index) {
return window.innerWidth >= 1024 ? index < 3 : index < 2;
},
swatchBg(sibling) {
// swatch_bg precomputed at hydration. Nullish (not ||): null = no colors set
// (fall back to theme default), empty string = invalid combo, no fallback.
return sibling.swatch_bg ?? '#000000';
},
centerSwatch(el) {
if ($data.wrapper.scrollWidth <= $data.wrapper.clientWidth) return false
const wrapperRect = $data.wrapper.getBoundingClientRect()
const elRect = el.getBoundingClientRect()
const centerPoint = wrapperRect.x + (wrapperRect.width / 2)
const behavior = window.innerWidth < 1024 ? 'auto' : 'smooth'
$data.wrapper.scrollTo({
left: $data.wrapper.scrollLeft + (elRect.x - centerPoint + (elRect.width / 2)),
behavior
})
},
selectSwatchFromTap(siblingIndex, el) {
const idx = (this.intendedSwatchIndex !== null && this.intendedSwatchIndex !== undefined)
? this.intendedSwatchIndex
: siblingIndex
const targetEl = this.intendedSwatchEl || el
this.intendedSwatchIndex = null
this.intendedSwatchEl = null
const next = product.siblings[idx]
if (next) product = next
this.centerSwatch(targetEl)
},
scroll(direction = 'forward') {
const swatch = $data.wrapper.querySelector('.product-item__swatch')
const unit = swatch ? swatch.offsetWidth + $data.swatchGap : $data.wrapper.clientWidth * 0.3
let amount = 2 * unit
$data.wrapper.scrollTo({
left: direction == 'forward' ? $data.wrapper.scrollLeft + amount : $data.wrapper.scrollLeft - amount,
behavior:'smooth'
})
},
// Lazily wire the prev/next edge detection on first desktop hover/focus —
// the arrows are a desktop affordance, so no observer is built at load and
// none is ever built on mobile. canPrev/canNext default to the at-start state.
initSwatchEdges() {
if (this._edgeReady || window.innerWidth <= 1023) return
this._edgeReady = true
const root = this.wrapper
const swatches = root.querySelectorAll('.product-item__swatch')
if (swatches.length < 2) return
const first = swatches[0], last = swatches[swatches.length - 1]
const io = new IntersectionObserver((entries) => {
const d = window.Alpine && window.Alpine.$data ? window.Alpine.$data(root) : null
if (!d) return
entries.forEach((e) => {
if (e.target === first) d.canPrev = !e.isIntersecting
if (e.target === last) d.canNext = !e.isIntersecting
})
}, { root, threshold: 0.99 })
io.observe(first)
io.observe(last)
root._swatchEdgeIO = io
}
}"
@pointerenter="initSwatchEdges()"
@focusin="initSwatchEdges()"
>