← Go back

Shopify Contact Map – Dual-Column Contact & Location Display

Shopify Contact Map – Dual-Column Contact & Location Display

Add a professional contact section to your Shopify store with a dual-column layout featuring contact details and an embedded map. Customizable icons, styling, and responsive design for a seamless user experience.

Preview Password = 1 *When you first time enter them back again then click agian Preview to show*
Liquid Code
                    <!-- 
========================================
Section Name: Contact Map
Tech Stack: Liquid, HTML, CSS, JavaScript
What This Section Does: 
- Displays contact information and an embedded map in a customizable two-column layout.
- Features multiple contact item types with icons for phone, address, email, and business hours.
- Includes lazy loading for the map to improve page performance.
- Fully responsive design with configurable colors, spacing, and border radius options.

Promotion: 
Make it easy for customers to find and contact you with this professional dual-column section. Showcase your location and contact details in one elegant display. Get it now at [PrebuiltTemplates](https://prebuilttemplates.com/).
========================================
-->
<!-- HTML Structure -->
<section class="dual-contact-section" style="background-color: {{ section.settings.bg_color }}; padding: {{ section.settings.pad_top }}px 0 {{ section.settings.pad_bot }}px;">
  <div class="dual-contact-container page-width">
    <!-- Two Column Layout Grid -->
    <div class="dual-contact-grid">
      <!-- Left Column: Contact Information -->
      <div class="contact-info-column" style="background-color: {{ section.settings.info_bg_color }}; color: {{ section.settings.info_text_color }};">
        {% if section.settings.show_heading %}
          <h2 class="contact-section-heading" style="color: {{ section.settings.heading_color }};">
            {{ section.settings.heading_text | default: 'Lorem ipsum dolor' }}
          </h2>
        {% endif %}
        
        {% if section.blocks.size > 0 %}
          <div class="contact-info-list">
            {% for block in section.blocks %}
              {% case block.type %}
                {% when 'contact_item' %}
                  <div class="contact-info-item" style="margin-bottom: {{ block.settings.item_spacing }}px;" {{ block.shopify_attributes }}>
                    <div class="contact-icon" style="background-color: {{ block.settings.icon_bg_color }}; color: {{ block.settings.icon_color }};">
                      {% case block.settings.icon_type %}
                        {% when 'phone' %}
                          <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M6.62 10.79C8.06 13.62 10.38 15.94 13.21 17.38L15.41 15.18C15.69 14.9 16.08 14.82 16.43 14.93C17.55 15.3 18.75 15.5 20 15.5C20.55 15.5 21 15.95 21 16.5V20C21 20.55 20.55 21 20 21C10.61 21 3 13.39 3 4C3 3.45 3.45 3 4 3H7.5C8.05 3 8.5 3.45 8.5 4C8.5 5.25 8.7 6.45 9.07 7.57C9.18 7.92 9.1 8.31 8.82 8.59L6.62 10.79Z" fill="currentColor"/>
                          </svg>
                        {% when 'address' %}
                          <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M12 2C8.13 2 5 5.13 5 9C5 14.25 12 22 12 22C12 22 19 14.25 19 9C19 5.13 15.87 2 12 2ZM12 11.5C10.62 11.5 9.5 10.38 9.5 9C9.5 7.62 10.62 6.5 12 6.5C13.38 6.5 14.5 7.62 14.5 9C14.5 10.38 13.38 11.5 12 11.5Z" fill="currentColor"/>
                          </svg>
                        {% when 'email' %}
                          <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M20 4H4C2.9 4 2.01 4.9 2.01 6L2 18C2 19.1 2.9 20 4 20H20C21.1 20 22 19.1 22 18V6C22 4.9 21.1 4 20 4ZM20 8L12 13L4 8V6L12 11L20 6V8Z" fill="currentColor"/>
                          </svg>
                        {% when 'clock' %}
                          <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M11.99 2C6.47 2 2 6.48 2 12C2 17.52 6.47 22 11.99 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 11.99 2ZM12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20ZM12.5 7H11V13L16.25 16.15L17 14.92L12.5 12.25V7Z" fill="currentColor"/>
                          </svg>
                      {% endcase %}
                    </div>
                    <div class="contact-details">
                      <h3 class="contact-label" style="color: {{ block.settings.label_color }}; font-size: {{ block.settings.label_size }}px;">{{ block.settings.label }}</h3>
                      <div class="contact-value" style="color: {{ block.settings.text_color }}; font-size: {{ block.settings.text_size }}px;">
                        {{ block.settings.text_value }}
                      </div>
                    </div>
                  </div>
              {% endcase %}
            {% endfor %}
          </div>
        {% else %}
          <!-- Default contact items if no blocks are added -->
          <div class="contact-info-list">
            <div class="contact-info-item">
              <div class="contact-icon">
                <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                  <path d="M6.62 10.79C8.06 13.62 10.38 15.94 13.21 17.38L15.41 15.18C15.69 14.9 16.08 14.82 16.43 14.93C17.55 15.3 18.75 15.5 20 15.5C20.55 15.5 21 15.95 21 16.5V20C21 20.55 20.55 21 20 21C10.61 21 3 13.39 3 4C3 3.45 3.45 3 4 3H7.5C8.05 3 8.5 3.45 8.5 4C8.5 5.25 8.7 6.45 9.07 7.57C9.18 7.92 9.1 8.31 8.82 8.59L6.62 10.79Z" fill="currentColor"/>
                </svg>
              </div>
              <div class="contact-details">
                <h3 class="contact-label">HOTLINE</h3>
                <div class="contact-value">Lorem ipsum dolor</div>
              </div>
            </div>
            <div class="contact-info-item">
              <div class="contact-icon">
                <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                  <path d="M12 2C8.13 2 5 5.13 5 9C5 14.25 12 22 12 22C12 22 19 14.25 19 9C19 5.13 15.87 2 12 2ZM12 11.5C10.62 11.5 9.5 10.38 9.5 9C9.5 7.62 10.62 6.5 12 6.5C13.38 6.5 14.5 7.62 14.5 9C14.5 10.38 13.38 11.5 12 11.5Z" fill="currentColor"/>
                </svg>
              </div>
              <div class="contact-details">
                <h3 class="contact-label">ADDRESS</h3>
                <div class="contact-value">Lorem ipsum dolor sit amet</div>
              </div>
            </div>
            <div class="contact-info-item">
              <div class="contact-icon">
                <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                  <path d="M20 4H4C2.9 4 2.01 4.9 2.01 6L2 18C2 19.1 2.9 20 4 20H20C21.1 20 22 19.1 22 18V6C22 4.9 21.1 4 20 4ZM20 8L12 13L4 8V6L12 11L20 6V8Z" fill="currentColor"/>
                </svg>
              </div>
              <div class="contact-details">
                <h3 class="contact-label">EMAIL</h3>
                <div class="contact-value">Lorem ipsum dolor</div>
              </div>
            </div>
          </div>
        {% endif %}
      </div>
      
      <!-- Right Column: Map -->
      <div class="map-column" style="min-height: {{ section.settings.map_height }}px; background-color: {{ section.settings.map_bg_color }};">
        {% if section.settings.map_embed_code != blank %}
          <div class="map-embed-wrapper">
            {{ section.settings.map_embed_code }}
          </div>
        {% else %}
          <div class="map-placeholder">
            <p>{{ section.settings.map_placeholder_text | default: 'Map placeholder' }}</p>
          </div>
        {% endif %}
      </div>
    </div>
  </div>
</section>

<!-- CSS Styles -->
<style>
.dual-contact-section {
  overflow: hidden;
  position: relative;
}

.dual-contact-section .dual-contact-container {
  max-width: {{ section.settings.container_width }}px;
  margin: 0 auto;
}

.dual-contact-section .dual-contact-grid {
  display: grid;
  grid-template-columns: {{ section.settings.column_ratio }}% calc(100% - {{ section.settings.column_ratio }}%);
  gap: 0;
}

.dual-contact-section .contact-info-column {
  padding: {{ section.settings.info_pad_top }}px {{ section.settings.info_pad_sides }}px {{ section.settings.info_pad_bottom }}px;
  position: relative;
  {% if section.settings.enable_info_box_shadow %}
    box-shadow: 0 4px 20px rgba(0,0,0,{{ section.settings.info_shadow_opacity }});
  {% endif %}
  {% if section.settings.info_border_radius > 0 %}
    border-radius: {{ section.settings.info_border_radius }}px 0 0 {{ section.settings.info_border_radius }}px;
  {% endif %}
}

.dual-contact-section .contact-section-heading {
  font-size: {{ section.settings.heading_size }}px;
  font-weight: {{ section.settings.heading_weight }};
  margin-bottom: {{ section.settings.heading_spacing }}px;
  {% if section.settings.heading_transform == 'uppercase' %}
    text-transform: uppercase;
  {% endif %}
}

.dual-contact-section .contact-info-list {
  display: flex;
  flex-direction: column;
  gap: {{ section.settings.list_spacing }}px;
}

.dual-contact-section .contact-info-item {
  display: flex;
  align-items: flex-start;
  gap: {{ section.settings.icon_spacing }}px;
}

.dual-contact-section .contact-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: {{ section.settings.icon_size }}px;
  height: {{ section.settings.icon_size }}px;
  border-radius: 50%;
  flex-shrink: 0;
}

.dual-contact-section .contact-details {
  display: flex;
  flex-direction: column;
}

.dual-contact-section .contact-label {
  margin: 0 0 8px 0;
  letter-spacing: 1px;
}

.dual-contact-section .contact-value {
  line-height: 1.5;
}

.dual-contact-section .map-column {
  position: relative;
  {% if section.settings.map_border_radius > 0 %}
    border-radius: 0 {{ section.settings.map_border_radius }}px {{ section.settings.map_border_radius }}px 0;
    overflow: hidden;
  {% endif %}
}

.dual-contact-section .map-embed-wrapper {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.dual-contact-section .map-embed-wrapper iframe {
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}

.dual-contact-section .map-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  color: #FFFFFF;
  text-align: center;
  opacity: 0.6;
}

/* Responsive styles */
@media (max-width: 768px) {
  .dual-contact-section .dual-contact-grid {
    grid-template-columns: 1fr;
  }
  
  .dual-contact-section .contact-info-column {
    padding: 40px 20px;
    {% if section.settings.info_border_radius > 0 %}
      border-radius: {{ section.settings.info_border_radius }}px {{ section.settings.info_border_radius }}px 0 0;
    {% endif %}
  }
  
  .dual-contact-section .map-column {
    {% if section.settings.map_border_radius > 0 %}
      border-radius: 0 0 {{ section.settings.map_border_radius }}px {{ section.settings.map_border_radius }}px;
    {% endif %}
  }
}

@media (max-width: 480px) {
  .dual-contact-section .contact-section-heading {
    font-size: {{ section.settings.heading_size | minus: 4 }}px;
  }
  
  .dual-contact-section .contact-info-item {
    gap: {{ section.settings.icon_spacing | minus: 5 }}px;
  }
  
  .dual-contact-section .contact-icon {
    width: {{ section.settings.icon_size | minus: 8 }}px;
    height: {{ section.settings.icon_size | minus: 8 }}px;
  }
}
</style>

<!-- JavaScript -->
<script>
document.addEventListener('DOMContentLoaded', function() {
  // Lazy load map when in viewport
  if ('IntersectionObserver' in window) {
    const mapColumn = document.querySelector('.map-column');
    if (mapColumn) {
      const observer = new IntersectionObserver((entries) => {
        entries.forEach(entry => {
          if (entry.isIntersecting) {
            // If map is in view, load any deferred iframes
            const iframes = entry.target.querySelectorAll('iframe[data-src]');
            iframes.forEach(iframe => {
              if (iframe.dataset.src) {
                iframe.src = iframe.dataset.src;
                iframe.removeAttribute('data-src');
              }
            });
            
            observer.unobserve(entry.target);
          }
        });
      }, {
        rootMargin: '0px',
        threshold: 0.1
      });
      
      observer.observe(mapColumn);
    }
  }
});
</script>

{% schema %}
{
  "name": "Contact Map",
  "settings": [
    {
      "type": "range",
      "id": "pad_top",
      "label": "Padding Top",
      "min": 0,
      "max": 200,
      "step": 5,
      "default": 0
    },
    {
      "type": "range",
      "id": "pad_bot",
      "label": "Padding Bottom",
      "min": 0,
      "max": 200,
      "step": 5,
      "default": 0
    },
    {
      "type": "color",
      "id": "bg_color",
      "label": "Background Color",
      "default": "#FFFFFF"
    },
    {
      "type": "header",
      "content": "Layout Settings"
    },
    {
      "type": "range",
      "id": "container_width",
      "label": "Container Width",
      "min": 800,
      "max": 1600,
      "step": 50,
      "default": 1200
    },
    {
      "type": "range",
      "id": "column_ratio",
      "label": "Info Column Width %",
      "min": 30,
      "max": 70,
      "step": 5,
      "default": 50,
      "info": "Percentage of total width"
    },
    {
      "type": "header",
      "content": "Info Column Settings"
    },
    {
      "type": "color",
      "id": "info_bg_color",
      "label": "Background Color",
      "default": "#1E1E1E"
    },
    {
      "type": "color",
      "id": "info_text_color",
      "label": "Text Color",
      "default": "#FFFFFF"
    },
    {
      "type": "range",
      "id": "info_pad_top",
      "label": "Padding Top",
      "min": 20,
      "max": 100,
      "step": 5,
      "default": 60
    },
    {
      "type": "range",
      "id": "info_pad_bottom",
      "label": "Padding Bottom",
      "min": 20,
      "max": 100,
      "step": 5,
      "default": 60
    },
    {
      "type": "range",
      "id": "info_pad_sides",
      "label": "Padding Sides",
      "min": 20,
      "max": 100,
      "step": 5,
      "default": 40
    },
    {
      "type": "range",
      "id": "info_border_radius",
      "label": "Border Radius",
      "min": 0,
      "max": 30,
      "step": 1,
      "default": 0
    },
    {
      "type": "checkbox",
      "id": "enable_info_box_shadow",
      "label": "Enable Box Shadow",
      "default": false
    },
    {
      "type": "range",
      "id": "info_shadow_opacity",
      "label": "Shadow Opacity",
      "min": 0.1,
      "max": 0.5,
      "step": 0.1,
      "default": 0.1
    },
    {
      "type": "header",
      "content": "Heading Settings"
    },
    {
      "type": "checkbox",
      "id": "show_heading",
      "label": "Show Heading",
      "default": false
    },
    {
      "type": "text",
      "id": "heading_text",
      "label": "Heading Text",
      "default": "Contact Us"
    },
    {
      "type": "color",
      "id": "heading_color",
      "label": "Heading Color",
      "default": "#FFFFFF"
    },
    {
      "type": "range",
      "id": "heading_size",
      "label": "Heading Size",
      "min": 18,
      "max": 48,
      "step": 1,
      "default": 28
    },
    {
      "type": "select",
      "id": "heading_weight",
      "label": "Heading Weight",
      "options": [
        {
          "value": "400",
          "label": "Regular"
        },
        {
          "value": "500",
          "label": "Medium"
        },
        {
          "value": "600",
          "label": "Semi-Bold"
        },
        {
          "value": "700",
          "label": "Bold"
        }
      ],
      "default": "600"
    },
    {
      "type": "select",
      "id": "heading_transform",
      "label": "Text Transform",
      "options": [
        {
          "value": "none",
          "label": "None"
        },
        {
          "value": "uppercase",
          "label": "Uppercase"
        }
      ],
      "default": "none"
    },
    {
      "type": "range",
      "id": "heading_spacing",
      "label": "Heading Bottom Margin",
      "min": 10,
      "max": 60,
      "step": 5,
      "default": 30
    },
    {
      "type": "header",
      "content": "Icon Settings"
    },
    {
      "type": "range",
      "id": "icon_size",
      "label": "Icon Circle Size",
      "min": 36,
      "max": 72,
      "step": 4,
      "default": 48
    },
    {
      "type": "range",
      "id": "icon_spacing",
      "label": "Icon Spacing",
      "min": 10,
      "max": 30,
      "step": 2,
      "default": 20
    },
    {
      "type": "range",
      "id": "list_spacing",
      "label": "Item Spacing",
      "min": 15,
      "max": 50,
      "step": 5,
      "default": 30
    },
    {
      "type": "header",
      "content": "Map Settings"
    },
    {
      "type": "html",
      "id": "map_embed_code",
      "label": "Map Embed Code",
      "info": "Paste Google Maps embed code here"
    },
    {
      "type": "range",
      "id": "map_height",
      "label": "Map Height (Mobile)",
      "min": 200,
      "max": 500,
      "step": 10,
      "default": 300,
      "info": "Map is full height on desktop"
    },
    {
      "type": "color",
      "id": "map_bg_color",
      "label": "Map Background",
      "default": "#000000"
    },
    {
      "type": "range",
      "id": "map_border_radius",
      "label": "Border Radius",
      "min": 0,
      "max": 30,
      "step": 1,
      "default": 0
    },
    {
      "type": "text",
      "id": "map_placeholder_text",
      "label": "Placeholder Text",
      "default": "Custom Code"
    }
  ],
  "blocks": [
    {
      "type": "contact_item",
      "name": "Contact Item",
      "limit": 6,
      "settings": [
        {
          "type": "select",
          "id": "icon_type",
          "label": "Icon Type",
          "options": [
            {
              "value": "phone",
              "label": "Phone"
            },
            {
              "value": "address",
              "label": "Address"
            },
            {
              "value": "email",
              "label": "Email"
            },
            {
              "value": "clock",
              "label": "Clock/Hours"
            }
          ],
          "default": "phone"
        },
        {
          "type": "text",
          "id": "label",
          "label": "Label",
          "default": "HOTLINE"
        },
        {
          "type": "range",
          "id": "label_size",
          "label": "Label Font Size",
          "min": 12,
          "max": 24,
          "step": 1,
          "default": 14
        },
        {
          "type": "color",
          "id": "label_color",
          "label": "Label Color",
          "default": "#FFFFFF"
        },
        {
          "type": "text",
          "id": "text_value",
          "label": "Text Content",
          "default": "Lorem ipsum dolor sit amet"
        },
        {
          "type": "range",
          "id": "text_size",
          "label": "Text Font Size",
          "min": 12,
          "max": 24,
          "step": 1,
          "default": 16
        },
        {
          "type": "color",
          "id": "text_color",
          "label": "Text Color",
          "default": "#F5F5F5"
        },
        {
          "type": "color",
          "id": "icon_bg_color",
          "label": "Icon Background",
          "default": "rgba(255, 255, 255, 0.1)"
        },
        {
          "type": "color",
          "id": "icon_color",
          "label": "Icon Color",
          "default": "#FFFFFF"
        },
        {
          "type": "range",
          "id": "item_spacing",
          "label": "Bottom Margin",
          "min": 0,
          "max": 50,
          "step": 5,
          "default": 0,
          "info": "Override global spacing"
        }
      ]
    }
  ],
  "presets": [
    {
      "name": "Contact Map",
      "blocks": [
        {
          "type": "contact_item",
          "settings": {
            "icon_type": "phone",
            "label": "HOTLINE",
            "text_value": "Lorem ipsum dolor"
          }
        },
        {
          "type": "contact_item",
          "settings": {
            "icon_type": "address",
            "label": "ADDRESS",
            "text_value": "Lorem ipsum dolor sit amet"
          }
        },
        {
          "type": "contact_item",
          "settings": {
            "icon_type": "email",
            "label": "EMAIL",
            "text_value": "Lorem ipsum dolor"
          }
        }
      ]
    }
  ]
}
{% endschema %}