Ten Thousand Feet, run by Lorenzo Boero e Paola Bombelli, is an independent creative studio founded in Milan in 2023. It is a space for work and research in visual communication, with a strong focus on print processes, the physical experience of design and contemporary practices. It also serves as a hub for exchange, hosting events dedicated to publishing, photography and visual arts.

SERVICES

Visual Identity Systems, Art Direction, Editorial Design, Packaging, Web Design, Exhibition Design, Type Design

© Ten Thousand Feet

Privacy Policy

Imprint

Hautlence Times

Catalogue Design

A catalogue conceived as a newspaper, designed by us for Hautlence. CD Doobop Studio ph @ Leonardo Malè

Doo-bop Studio

Visual Identity

Visual Identity

SHOP THE STORY

Curated vintage in Milan, 2026

Visual Identity

Design Space, LA

A hybrid experience between the physical and the digital, bringing together a cutting-edge selection of galleries, designers and artists run by Basic.space. AD Nuovagroup. 2025

Website Design

AgX

A highly specialised film developing, photo-printing and scanning lab. 2025

Visual Identity

BLU

A space offered as a platform and habitat to an international network for: artist residencies, exhibitions, public programs. 2025

Exhibition Design

IL NOSTRO TEMPO. CinéFondationCartier

An exhibition with the cinematographic works of 12 artists and directors. 2025

Exhibition Design

Torre Velasca by BBPR. MAXXI Archive

An exhibition with archive materials recounting the first Italian-style skyscraper. 2024

Visual Identity

Ceriani Szostak

Design studio based in Amsterdam focused on excellence and beauty. 2024

Visual Identity
Editorial Design

Viola Spettri

Atelier, workspace of contemporary artists and cultural hub open to the public, focusing on contemporary art and experimentation. 2024

Visual Identity

Mini Spazio

A local space for design, art, urban culture. 2024

Visual Identity

TEQA

Teqa is a box for multiple ideas and concepts coming together to form collective projects. 2024

<?php
$projects = get_posts(array(
  'post_type' => 'project',
  'posts_per_page' => -1
));

foreach ($projects as $index => $project): 
  $media_files = get_field('images', $project->ID);

  $label_1 = get_field('label_1', $project->ID); 
  $label_2 = get_field('label_2', $project->ID); 
  $label_3 = get_field('label_3', $project->ID); 
  $title   = get_field('title', $project->ID); 
  $details = get_field('details', $project->ID);

  if ($media_files): ?>
    <div class="slick-slider-container" id="slider-<?php echo $index; ?>">
      <div class="slick-slider">
        <?php foreach ($media_files as $i => $file): ?>
          <?php if (strpos($file['mime_type'], 'image') !== false): ?>
            <div class="slick-slide">
              <?php
              // Attributi personalizzati per le immagini
              $img_attrs = array(
                'class' => 'lazy-media',
                'decoding' => 'async',
              );

              // Se è la prima immagine del primo progetto → eager + fetchpriority high
              if ($index === 0 && $i === 0) {
                $img_attrs['loading'] = 'eager';
                $img_attrs['fetchpriority'] = 'high';
              } else {
                $img_attrs['loading'] = 'lazy';
              }

              echo wp_get_attachment_image(
                $file['ID'],
                'large', // usa dimensione ottimizzata di WP (puoi cambiare se serve)
                false,
                $img_attrs
              );
              ?>
            </div>
          <?php elseif (strpos($file['mime_type'], 'video') !== false): ?>
            <div class="slick-slide">
              <?php $preload = ($index === 0) ? 'metadata' : 'none'; ?>
              <video 
                preload="<?php echo $preload; ?>" 
                muted 
                playsinline 
                loop 
                class="lazy-media">
                <source src="<?php echo esc_url($file['url']); ?>" type="<?php echo esc_attr($file['mime_type']); ?>">
                Your browser does not support the video tag.
              </video>
            </div>
          <?php endif; ?>
        <?php endforeach; ?>
      </div>
      
      <div class="project-details">
        <div class="project-labels">
          <h6><?php echo esc_html($label_1); ?></h6>
          <h6><?php echo esc_html($label_2); ?></h6>
          <h6><?php echo esc_html($label_3); ?></h6>
        </div>
        <div class="project-title-caption">
          <p><?php echo esc_html($title); ?></p>
        </div>
        <div class="project-details-text">
          <p><?php echo esc_html($details); ?></p>
        </div>
      </div>
    </div>
  <?php endif; ?>
<?php endforeach; ?>
html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
}

body {
  display: flex;
  flex-direction: column;
  overflow-y: scroll;
  scroll-snap-type: y mandatory;
  scroll-behavior: smooth;
}

.slick-slider-container {
  position: relative;
  height: 100dvh;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.slick-slider {
  height: 100%;
  width: 100%;
}

.slick-slide {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

/* --- Blur-up effect --- */
.slick-slide img,
.slick-slide video {
  width: auto;
  height: 100dvh;
  object-fit: cover;
  filter: blur(20px);
  opacity: 0;
  transition: filter 0.5s ease, opacity 0.5s ease;
}

.slick-slide img.loaded,
.slick-slide video.loaded {
  filter: blur(0);
  opacity: 1;
}

.project-details {
  position: absolute;
  bottom: 0px;
  left: 0px;
  z-index: 15;
  padding-left: 13px;
  padding-bottom: 10px;
  mix-blend-mode: difference;
}

.project-labels {
  display: flex;
  gap: 38px;
  margin-bottom: 1px;
  mix-blend-mode: difference;
}

.project-labels h7 {
  margin: 0;
}

.project-title-caption p {
  margin: 0;
  font-size: 16px;
  text-transform: uppercase;
  mix-blend-mode: difference;
}

.project-details-text p {
  margin: 0;
  mix-blend-mode: difference;
}

#project-button {
  mix-blend-mode: overlay;
}

/* Preloader bianco a schermo intero */
#preloader {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #ffffff;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: opacity 1s ease-out;
  opacity: 1;
}

body.loaded #preloader {
  opacity: 0;
  pointer-events: none;
}




@media (max-width: 767px) {
  .slick-slider {
    height: 100dvh;
    width: 100%;
  }
  
  .slick-slide img,
  .slick-slide video {
    width: 100;
    height: 100dvh;
  }

  .project-details {
    bottom: 48px;
    z-index: 15;
    padding-left: 10px;
  }

  .project-labels {
    display: flex;
    gap: 20px;
  }

  .project-labels h6 {
    margin: 0;
    font-size: 8px;
  }

  .project-title-caption p {
    margin: 0;
    font-size: 16px;
    text-transform: uppercase;
  }

  .project-details-text p {
    margin: 0;
  }
}


jQuery(document).ready(function($) {
  // Inizializzazione slick
  $('.slick-slider').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    arrows: false,
    autoplay: false,
    dots: false,
    variableWidth: true,
    infinite: true,
    swipe: false,
    touchThreshold: 10,
    accessibility: false,
    centerMode: $(window).width() <= 767
  });

  // Blur-up effect: quando media pronti
  $('img.lazy-media').each(function(){
    if (this.complete) {
      $(this).addClass('loaded');
    } else {
      $(this).on('load', function(){ $(this).addClass('loaded'); });
    }
  });

  $('video.lazy-media').each(function(){
    $(this).on('loadeddata', function(){
      $(this).addClass('loaded');
    });
  });

  // Gestione video: solo la slide attiva riproduce il video
  $('.slick-slider').on('afterChange', function(event, slick, currentSlide){
    $(slick.$slides).find('video').each(function(){ this.pause(); });
    $(slick.$slides[currentSlide]).find('video').each(function(){ this.play(); });
  });

  // Cursor feedback (prev/next)
  if ($(window).width() > 0) {
    $(document).on('mousemove', function(e) {
      const windowWidth = $(window).width();
      const cursorPosition = e.pageX;
      $('body').css('cursor', cursorPosition < windowWidth / 2 ? 'w-resize' : 'e-resize');
    });

    $(document).on('click', function(e) {
      const windowWidth = $(window).width();
      const cursorPosition = e.pageX;
      if ($(e.target).closest('.slick-slider-container').length) {
        const $activeSlider = $('.slick-slider:visible');
        if ($activeSlider.length) {
          cursorPosition < windowWidth / 2
            ? $activeSlider.slick('slickPrev')
            : $activeSlider.slick('slickNext');
        }
      }
    });
  }
});

// Preloader globale primo progetto
const firstProjectMedia = document.querySelectorAll("#slider-0 img.lazy-media, #slider-0 video.lazy-media");
let loadedCount = 0;
const totalFirstProject = firstProjectMedia.length;

function checkLoaded() {
  loadedCount++;
  if (loadedCount >= totalFirstProject) {
    document.body.classList.add("loaded"); // preloader scompare
  }
}

firstProjectMedia.forEach(media => {
  if (media.tagName.toLowerCase() === "img") {
    if (media.complete) checkLoaded();
    else {
      media.onload = checkLoaded;
      media.onerror = checkLoaded;
    }
  } else if (media.tagName.toLowerCase() === "video") {
    media.addEventListener("canplay", function() {
      media.classList.add("loaded"); // togli blur quando primo frame pronto
      checkLoaded();
    }, { once: true });
    media.onerror = checkLoaded;
  }
});

// Timeout di sicurezza 8s
setTimeout(() => document.body.classList.add("loaded"), 8000);
<div id="preloader"></div>

<?php
$projects = get_posts(array(
  'post_type' => 'project',
  'posts_per_page' => -1
));

foreach ($projects as $index => $project): 
  $media_files = get_field('images', $project->ID);

  $label_1 = get_field('label_1', $project->ID); 
  $label_2 = get_field('label_2', $project->ID); 
  $label_3 = get_field('label_3', $project->ID); 
  $title   = get_field('title', $project->ID); 
  $details = get_field('details', $project->ID);

  if ($media_files): ?>
    <div class="slick-slider-container" id="slider-<?php echo $index; ?>">
      <div class="slick-slider">
        <?php foreach ($media_files as $i => $file): ?>
          <?php if (strpos($file['mime_type'], 'image') !== false): ?>
            <div class="slick-slide">
              <img 
                src="<?php echo esc_url($file['url']); ?>" 
                alt="<?php echo esc_attr($file['alt']); ?>"
                <?php echo $i === 0 ? 'loading="eager"' : 'loading="lazy"'; ?> 
                class="lazy-media">
            </div>
          <?php elseif (strpos($file['mime_type'], 'video') !== false): ?>
    <div class="slick-slide">
        <?php $preload = ($index === 0) ? 'metadata' : 'none'; ?>
        <video 
          preload="<?php echo $preload; ?>" 
          muted 
          playsinline 
          loop 
          class="lazy-media">
            <source src="<?php echo esc_url($file['url']); ?>" type="<?php echo esc_attr($file['mime_type']); ?>">
            Your browser does not support the video tag.
        </video>
    </div>
<?php endif; ?>

        <?php endforeach; ?>
      </div>
      
      <div class="project-details">
        <div class="project-labels">
          <h6><?php echo esc_html($label_1); ?></h6>
          <h6><?php echo esc_html($label_2); ?></h6>
          <h6><?php echo esc_html($label_3); ?></h6>
        </div>
        <div class="project-title-caption">
          <p><?php echo esc_html($title); ?></p>
        </div>
        <div class="project-details-text">
          <p><?php echo esc_html($details); ?></p>
        </div>
      </div>
    </div>
  <?php endif; ?>
<?php endforeach; ?>
html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
}

body {
  display: flex;
  flex-direction: column;
  overflow-y: scroll;
  scroll-snap-type: y mandatory;
  scroll-behavior: smooth;
}

.slick-slider-container {
  position: relative;
  height: 100dvh;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.slick-slider {
  height: 100%;
  width: 100%;
}

.slick-slide {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

/* --- Blur-up effect --- */
.slick-slide img,
.slick-slide video {
  width: auto;
  height: 100dvh;
  object-fit: cover;
  filter: blur(20px);
  opacity: 0;
  transition: filter 0.5s ease, opacity 0.5s ease;
}

.slick-slide img.loaded,
.slick-slide video.loaded {
  filter: blur(0);
  opacity: 1;
}

.project-details {
  position: absolute;
  bottom: 0px;
  left: 0px;
  z-index: 15;
  padding-left: 13px;
  padding-bottom: 10px;
  mix-blend-mode: difference;
}

.project-labels {
  display: flex;
  gap: 38px;
  margin-bottom: 1px;
  mix-blend-mode: difference;
}

.project-labels h7 {
  margin: 0;
}

.project-title-caption p {
  margin: 0;
  font-size: 16px;
  text-transform: uppercase;
  mix-blend-mode: difference;
}

.project-details-text p {
  margin: 0;
  mix-blend-mode: difference;
}

#project-button {
  mix-blend-mode: overlay;
}

/* Preloader bianco a schermo intero */
#preloader {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #ffffff;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: opacity 1s ease-out;
  opacity: 1;
}

body.loaded #preloader {
  opacity: 0;
  pointer-events: none;
}




@media (max-width: 767px) {
  .slick-slider {
    height: 100dvh;
    width: 100%;
  }
  
  .slick-slide img,
  .slick-slide video {
    width: auto;
    height: 100dvh;
  }

  .project-details {
    bottom: 48px;
    z-index: 15;
    padding-left: 10px;
  }

  .project-labels {
    display: flex;
    gap: 20px;
  }

  .project-labels h6 {
    margin: 0;
    font-size: 8px;
  }

  .project-title-caption p {
    margin: 0;
    font-size: 16px;
    text-transform: uppercase;
  }

  .project-details-text p {
    margin: 0;
  }
}


jQuery(document).ready(function($) {
  // Inizializzazione slick
  $('.slick-slider').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    arrows: false,
    autoplay: false,
    dots: false,
    variableWidth: true,
    infinite: true,
    swipe: false,
    touchThreshold: 10,
    accessibility: false,
    centerMode: $(window).width() <= 767
  });

  // Blur-up effect: quando media pronti
  $('img.lazy-media').each(function(){
    if (this.complete) {
      $(this).addClass('loaded');
    } else {
      $(this).on('load', function(){ $(this).addClass('loaded'); });
    }
  });

  $('video.lazy-media').each(function(){
    $(this).on('loadeddata', function(){
      $(this).addClass('loaded');
    });
  });

  // Gestione video: solo la slide attiva riproduce il video
  $('.slick-slider').on('afterChange', function(event, slick, currentSlide){
    $(slick.$slides).find('video').each(function(){ this.pause(); });
    $(slick.$slides[currentSlide]).find('video').each(function(){ this.play(); });
  });

  // Cursor feedback (prev/next)
  if ($(window).width() > 0) {
    $(document).on('mousemove', function(e) {
      const windowWidth = $(window).width();
      const cursorPosition = e.pageX;
      $('body').css('cursor', cursorPosition < windowWidth / 2 ? 'w-resize' : 'e-resize');
    });

    $(document).on('click', function(e) {
      const windowWidth = $(window).width();
      const cursorPosition = e.pageX;
      if ($(e.target).closest('.slick-slider-container').length) {
        const $activeSlider = $('.slick-slider:visible');
        if ($activeSlider.length) {
          cursorPosition < windowWidth / 2
            ? $activeSlider.slick('slickPrev')
            : $activeSlider.slick('slickNext');
        }
      }
    });
  }
});

// Preloader globale primo progetto
const firstProjectMedia = document.querySelectorAll("#slider-0 img.lazy-media, #slider-0 video.lazy-media");
let loadedCount = 0;
const totalFirstProject = firstProjectMedia.length;

function checkLoaded() {
  loadedCount++;
  if (loadedCount >= totalFirstProject) {
    document.body.classList.add("loaded"); // preloader scompare
  }
}

firstProjectMedia.forEach(media => {
  if (media.tagName.toLowerCase() === "img") {
    if (media.complete) checkLoaded();
    else {
      media.onload = checkLoaded;
      media.onerror = checkLoaded;
    }
  } else if (media.tagName.toLowerCase() === "video") {
    media.addEventListener("canplay", function() {
      media.classList.add("loaded"); // togli blur quando primo frame pronto
      checkLoaded();
    }, { once: true });
    media.onerror = checkLoaded;
  }
});

// Timeout di sicurezza 8s
setTimeout(() => document.body.classList.add("loaded"), 8000);
<?php
$projects = get_posts(array(
  'post_type' => 'project',
  'posts_per_page' => -1
));



foreach ($projects as $index => $project): 
  $media_files = get_field('images', $project->ID); // Recupera il campo ACF

  $label_1 = get_field('label_1', $project->ID); 
  $label_2 = get_field('label_2', $project->ID); 
  $label_3 = get_field('label_3', $project->ID); 
  $title = get_field('title', $project->ID); 
  $details = get_field('details', $project->ID);

  if ($media_files): ?>
    <div class="slick-slider-container" id="slider-<?php echo $index; ?>">
      <div class="slick-slider">
        <?php foreach ($media_files as $file): ?>
          <?php if (strpos($file['mime_type'], 'image') !== false): ?>
            <div class="slick-slide">
              <img src="<?php echo esc_url($file['url']); ?>" alt="<?php echo esc_attr($file['alt']); ?>">
            </div>
          <?php elseif (strpos($file['mime_type'], 'video') !== false): ?>
            <div class="slick-slide">
              <video autoplay muted loop playsinline>
                <source src="<?php echo esc_url($file['url']); ?>" type="<?php echo esc_attr($file['mime_type']); ?>">
                Your browser does not support the video tag.
              </video>
            </div>
          <?php endif; ?>
        <?php endforeach; ?>
      </div>
      
      <div class="project-details">
        <div class="project-labels">
          <h6><?php echo esc_html($label_1); ?></h6>
          <h6><?php echo esc_html($label_2); ?></h6>
          <h6><?php echo esc_html($label_3); ?></h6>
        </div>
        <div class="project-title-caption">
          <p><?php echo esc_html($title); ?></p>
        </div>
        <div class="project-details-text">
          <p><?php echo esc_html($details); ?></p>
        </div>
      </div>
    </div>
  <?php endif; ?>
<?php endforeach; ?>


html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
}

body {
  display: flex;
  flex-direction: column;
  overflow-y: scroll;
  scroll-snap-type: y mandatory;
  scroll-behavior: smooth;
}




.slick-slider-container {
  position: relative;
  height: 100dvh;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.slick-slider {
  height: 100%;
  width: 100%;
}

.slick-slide {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

.slick-slide img,
.slick-slide video {
  width: auto;
  height: 100dvh;


}

.project-details {
  position: absolute;
  bottom: 0px;
  left: 0px;
  z-index: 15;
  padding-left: 13px;
  padding-bottom: 10px;
  mix-blend-mode: difference;
}


.project-labels {
  display: flex;
  gap: 38px;
  margin-bottom: 1px;
  mix-blend-mode: difference;

}

.project-labels h7 {
  margin: 0;

}

.project-title-caption p {
  margin: 0;
  font-size: 16;
  text-transform: uppercase;
  mix-blend-mode: difference;

}

.project-details-text p {
  margin: 0;
  mix-blend-mode: difference;


}

#project-button {
  mix-blend-mode: overlay;
}





@media (max-width: 767px) {
  
  .slick-slider {
  height: 100dvh;
  width: 100%;
  /* display: flex;
    align-items: center; */
}
  
    .slick-slide img,
  .slick-slide video {
    width: auto;
    height: 100dvh;
  }
  

  .project-details {
    bottom: 48px;
    z-index: 15;
    padding-left: 10px;
  }

  .project-labels {
    display: flex;
    gap: 20px;
   

  }

  .project-labels h6 {
    margin: 0;
    font-size: 8px;
  }

  .project-title-caption p {
    margin: 0;
    font-size: 16;
    text-transform: uppercase;
  }

  .project-details-text p {
    margin: 0;

  }

}

jQuery(document).ready(function($) {
  $('.slick-slider').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    arrows: false,
    autoplay: false,
    dots: false,
    variableWidth: true,

    infinite: true,
    swipe: false,
    touchThreshold: 10,
    accessibility: false,
    centerMode: $(window).width() <= 767

  });

  if ($(window).width() > 0) {
    $(document).on('mousemove', function(e) {
      const windowWidth = $(window).width();
      const cursorPosition = e.pageX;

      if (cursorPosition < windowWidth / 2) {
        $('body').css('cursor', 'w-resize');
      } else {
        $('body').css('cursor', 'e-resize');
      }
    });

    $(document).on('click', function(e) {
      const windowWidth = $(window).width();
      const cursorPosition = e.pageX;

     
      if ($(e.target).closest('.slick-slider-container').length) {
        
        const $activeSlider = $('.slick-slider:visible');

        if ($activeSlider.length) {
          if (cursorPosition < windowWidth / 2) {
           
            $activeSlider.slick('slickPrev');
          } else {
           
            $activeSlider.slick('slickNext');
          }
        }
      }
    });
  }
  
  
});