Free U.S. Shipping Over $49
- Best Sellers
Bags
-
-
Best Sellers
-
Backpacks
-
Travel Bags
-
Laptop Bags
-
-
Collapsible Bags
-
Bag Bundles
-
Sale
Camera
-
All Camera
-
Best Sellers
-
Camera New Arrivals
-
Camera Slings
-
Camera Accessories
Shop Peter McKinnon Collection Luma Camera CollectionDesigned with Peter McKinnonLuggage
-
All Luggage
-
Carry-On Luggage
-
Check-In Luggage
Shop All Luggage Shop Carry-On Luggage-
Shop All
-
Jacket
-
Pant
-
T-Shirt
-
Jogger
Accessories
-
All Accessories
-
Best Sellers
-
Travel Accessories
-
Camera Accessories
-
Everyday Accessories
-
Garment Bags
Shop All Accessories Shop Packing Cubes- Log in
- Best Sellers
-
Bags
Best Sellers
Backpacks
Travel Bags
Laptop Bags
Collapsible Bags
Bag Bundles
Sale
Shop Best SellersShop BackpackBest For Daily Use -
Camera
All Camera
Best Sellers
Camera New Arrivals
Camera Slings
Camera Accessories
Shop Peter McKinnon CollectionLuma Camera CollectionDesigned with Peter McKinnonCamera Accessories -
Luggage
All Luggage
Carry-On Luggage
Check-In Luggage
Shop All LuggageShop Carry-On LuggageShop Check-in Luggage -
Apparel
Shop All
Jacket
Pant
T-Shirt
Jogger
Outset JacketJacket to Pillow in SecondsOutset T-ShirtBuy 3 or More, Save 15% -
Accessories
All Accessories
Best Sellers
Travel Accessories
Camera Accessories
Everyday Accessories
Garment Bags
Shop All AccessoriesShop Packing CubesShop Toiletry Bag
account Log in icon-search Searchicon-cartCart
Design and function that
meets the demands of
modern photography.A slim camera bag packed with features and access to meet the demands of all photographers.
Explore 18L
Designed for
photographers
on the move.EXPLORE 12L
Small, but mighty.
EXPLORE 9L
Designed in collaboration with Peter McKinnon, meet the Luma Camera Collection. With Nomatic's same dedication to functional features, quality materials, and meticulous construction, these bags are built to serve photographers of all levels. The Luma Camera Collection's design and function meets the demands of modern photography.
Explore the FULL Collection
LUMA Camera Pack 18L
Learn More
Luma Camera Sling 12L
Learn More
LUMA Camera Pack 18L
Learn More
LUMA Camera Bundle
Learn More
★★★★★
One of the
Best BagsThis is one of the best bags I've ever purchased! Thanks Peter McKinnon and Nomatic. Fantastic design! Protects my camera gear well. Holds a laptop. Space for passport, etc. Best of all, its quite small! I just took it on trip to Antigua!
-Jon R.
Verified Buyer★★★★★
Awesome
Camera BagLUMA Camera Bag 18L is great to fill my camera gear with sufficient volume. Nice design and light weight. Happy to use it for trips.
-Abdul K.
Verified Buyer★★★★★
Very nicely
madeI purchased this bad from Kickstarter. I have a Sony A1 and it’s a terrific bag for a casual day of shooting. Well made, easy to use. Perfect size for this purpose. The magnetic top is a big plus. Very happy
-Susan B.
Verified BuyerThe McKinnon Camera family of bags and photo accessories.
Explore Our Camera Collection
Explore More Mckinnon Camera Family
-
Luma Camera Collection
'); $n.before($o); } }); } addSlider($nodes){ const $t = this; $t.wait('[data-nm009-class="nm009-upsell-slider-container"]', ($n)=>{ if(!$t.hasNode('[data-nm009-class="nm009-upsell-slider"]')){ const $o = $t.j('
'); const $ceil = Math.ceil(($nodes.length - 2) / 2); for(let $c = 0; $c < $ceil; $c++){ const $li = $t.j('
'); $nodes.each(($i, $l)=>{ if($i < ($nodes.length - 2)){ if($c === (Math.floor($i / 2))){ const $clone = $t.j($l).children('.upcart-upsell-item-card').clone(true); $clone.attr('data-nm009-slide-clone-index', $i); $t.j($l).attr('data-nm009-slide-index', $i); if($clone.find('select').length > 0){ $clone.find('select').on('change', function($e){ $e.preventDefault(); const $form = $t.j(this).closest('form'); const $href = $form.prev().find('a').attr('href'); const $query = ($href.indexOf('?') !== -1) ? $href.split('?') : [$href]; const $pathname = $query[0].split('/'); const $handle = $pathname[$pathname.length - 1]; $t.debug($handle + ' ' + $t.j(this).val()); $t.j.ajax({ url: '/products/' + $handle + '/.js', type: 'GET', dataType: 'json', success: ($r)=>{ $t.each($r.variants, ($variant, $vc)=>{ if($variant.id === parseInt($form.find('select').val())){ const $img = ($variant.featured_image !== null && typeof($variant.featured_image.src) === 'string') ? $variant.featured_image.src : $r.images[0]; $t.debug('img ' + $img); $form.prev().find('.upcart-upsell-item-price').html('$' + ($variant.price * .01).toFixed(2)); $form.closest('.upcart-upsell-item-card').find('.upcart-upsell-item-image').attr('src', $img); } }); }, error: ($x, $s, $e)=>{ console.log($x); console.log($s); console.log($e); } }); }); $clone.find('input[type="submit"]').on('click', function($e){ $e.preventDefault(); $t.debug($t.j(this).closest('form').find('select').val()); const $d = { items: [ {id: parseInt($t.j(this).closest('form').find('select').val()), quantity: 1} ] }; $t.cart.add($d, ()=>{ $t.debug('added upsell product'); window.upcartRegisterAddToCart(); }); }); $clone.find('input[type="submit"]').attr('type', 'button'); } else{ $clone.find('input[type="submit"]').on('click', function($e){ $e.preventDefault(); $t.j('[data-nm009-slide-index="' + $i + '"]').find('input[type="submit"]').eq(0).trigger('click'); }); $clone.find('input[type="submit"]').attr('type', 'button'); } $li.append($clone); } } }); $o.append($li); } $n.append($o); $t.slider.init('[data-nm009-class="nm009-upsell-slider"]', $t.sliderID, {addWrap: true, attrs: [ {name: 'display',value: 1}, {name: 'move-slide', value: 1}, {name: 'current-slide',value: 1}, {name: 'display-mobile',value: 1}, {name: 'current-slide-mobile',value: 1}, {name: 'move-slide-mobile',value: 1}, {name: 'controls',value: 1}, {name: 'pagination',value: 0}, {name: 'touch',value: 1} ]}) } }); } } class $cookiesClass{ constructor(){} set($n, $v, $exd){ const $d = new Date(); $d.setTime($d.getTime() + ($exd * 24 * 60 * 60 * 1000)); const $exp = 'expires=' + $d.toUTCString(); document.cookie = $n + '=' + $v + ';' + $exp + ';path=/'; } get($nm){ const $n = $nm + '='; const $decode = decodeURIComponent(document.cookie); const $ca = $decode.split(';'); for(const $ck of $ca){ if($ck.indexOf($n) !== -1){ const $s = $ck.split('='); return $s[1]; } } return ''; } check($n){ const $ck = this.get($n); return ($ck !== '') ? true : false; } } class $sliderClass{ constructor($j = jQuery, $hasNode = ()=>{}, $each = ()=>{}){ this.j = $j; this.hasNode = $hasNode; this.each = $each; }; init($selector, $id = 'sliderID', $params = {addWrap: true, attrs: []}){ const $t = this; $t.j($selector).attr('data-slider-id', $id); if($params.addWrap){ const $o = $t.j('
'); $t.j($selector).before($o); $o.append($t.j($selector)); } else{ $t.j($selector).parent().attr('data-slider-wrap', $id); } $t.tagSliderItems($selector); $t.updateAttrs($id, $params.attrs); $t.addStyle($id); } tagSliderItems($selector){ const $t = this; $t.j($selector).children().each(($i, $l)=>{ $t.j($l).attr('data-slider-item', $i); }); } updateAttrs($id, $attrs){ const $t = this; if($attrs.length > 0){ $t.each($attrs, ($p, $c)=>{ $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-' + $p.name, $p.value); $t.updateAttr($id, $p); }); } } updateAttr($id, $param){ const $t = this; switch($param.name){ case 'controls': if($param.value === 1){ $t.addControls($id); } break; case 'pagination': if($param.value === 1){ $t.addPagination($id); } break; case 'touch': if($param.value === 1){ $t.addTouchEvents($id); } break; default: break; } } addControls($id){ const $t = this; const $wrap = $t.j('[data-slider-wrap="' + $id + '"]'); const $next = $t.j(''); const $prev = $t.j(''); $next.on('click', function($e){ $e.preventDefault(); $t.next($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.next($id, true); } }); $prev.on('click', function($e){ $e.preventDefault(); $t.prev($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.prev($id, true); } }); $wrap.after($next); $wrap.after($prev); } next($id, $mobile = false){ const $t = this; const $m = ($mobile) ? '-mobile' : ''; const $current = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m); const $active = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-move-slide' + $m); const $tabs = Math.ceil($t.j('[data-slider-id="' + $id + '"]').children('[data-slider-item]').length / parseInt($active)); const $display = parseInt($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-display' + $m)); const $end = ($display > 1) ? $tabs - $display : $tabs; const $next = (parseInt($current) + 1 <= $end) ? parseInt($current) + 1 : 1; $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m, $next); $t.updatePagination($id, $next, $mobile); } prev($id, $mobile = false){ const $t = this; const $m = ($mobile) ? '-mobile' : ''; const $current = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m); const $active = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-move-slide' + $m); const $tabs = Math.ceil($t.j('[data-slider-id="' + $id + '"]').children('[data-slider-item]').length / parseInt($active)); const $display = parseInt($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-display' + $m)); const $end = ($display > 1 && $tabs > 1) ? $tabs - $display : $tabs; const $next = (parseInt($current) - 1 >= 1) ? parseInt($current) - 1 : $end; $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m, $next); $t.updatePagination($id, $next, $mobile); } addPagination($id){ const $t = this; const $current = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide') || 1; const $mCurrent = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile') || 1; const $wrap = $t.j('[data-slider-wrap="' + $id + '"]'); const $page = $t.j('
'); $t.j('[data-slider-id="' + $id + '"]').children('[data-slider-item]').each(($i, $l)=>{ let $a = ($i + 1 === parseInt($current)) ? ' class="pagination-item-active"' : ''; if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $a = ($i + 1 === parseInt($mCurrent)) ? ' class="pagination-item-active pagination-item-mobile-active"' : $a; $a = ($i + 1 === parseInt($current) && $i + 1 === parseInt($mCurrent)) ? ' class="pagination-item-active pagination-item-mobile-active"' : $a; } const $li = $t.j('
'); $li.on('click', function($e){ $e.preventDefault(); $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide', $t.j(this).attr('data-slider-pagination-item')); $t.updatePagination($id, $t.j(this).attr('data-slider-pagination-item')); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile', $t.j(this).attr('data-slider-pagination-item')); $t.updatePagination($id, $t.j(this).attr('data-slider-pagination-item', true)); } }); $page.append($li); }); $wrap.append($page); } updatePagination($id, $next, $mobile = false){ const $t = this; if($mobile){ $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item]').removeClass('pagination-item-mobile-active'); $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item="' + $next + '"]').addClass('pagination-item-mobile-active'); } else{ $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item]').removeClass('pagination-item-active'); $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item="' + $next + '"]').addClass('pagination-item-active'); } } addTouchEvents($id){ const $t = this; const $n = document.querySelector('[data-slider-id="' + $id + '"]'); let $xTouch = null; $n.addEventListener('touchstart', function($e){ $xTouch = $e.touches[0].clientX; }); $n.addEventListener('touchmove', function($e){ if(!$xTouch){return;} let $xUp = $e.touches[0].clientX; let $xDif = $xTouch - $xUp; if($xDif > 0){ $t.next($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.next($id, true); } } else{ $t.prev($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.prev($id, true); } } $xTouch = null; }); } addStyle($id){ const $t = this; let $l = ''; const $i = $t.j('[data-slider-id="' + $id + '"] > [data-slider-item]').length; for(let $c = 0; $c < $i; $c++){ const $off = $c * -100; $l = $l + '[data-slider-current-slide="' + ($c + 1) + '"]{' + 'transform: translateX(' + $off + '%);' + '}'; } if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $l = $l + '@media all and (max-width: 767px) { '; for(let $c = 0; $c < $i; $c++){ const $off = $c * -100; $l = $l + '[data-slider-current-slide-mobile="' + ($c + 1) + '"]{' + 'transform: translateX(' + $off + '%);' + '}'; } $l = $l + '} '; } if($t.hasNode('[data-slider-css="' + $id + '"]')){ const $s = $t.j('[data-slider-css="' + $id + '"]'); $s.html(''); $s.html($l); } else{ const $s = $t.j('
'); $s.html($l); $t.j('body').append($s); } } } class $shopifyCartClass{ constructor($j){ this.cartcount = 0; this.j = $j; } add($data, $callBack){ const $t = this; if($data.items.length > 0){ $t.get(($r)=>{ $t.cartcount = $r.item_count; console.log($t.cartcount); $t.j.ajax({ url: '/cart/add.js', type: 'POST', data: $data, dataType: 'json', success: ()=>{ $t.get(($rq)=>{ if($t.cartcount < $rq.item_count){ $callBack($rq); } }); }, error: ($x, $s, $e)=>{ console.log($x); console.log($s); console.log($e); } }); }); } } get($callBack){ const $t = this; $t.j.ajax({ url: '/cart.js', type: 'GET', dataType: 'json', success: ($rq)=>{ $callBack($rq); }, error: ($x, $s, $e)=>{ console.log($x); console.log($s); console.log($e); } }); } } const $djar_nm009_v1 = new $djar_nm009_v1_class(); $djar_nm009_v1.run();});