BC Text CollectionsBC Text Collections
Collection ListText and Image
← Back to Sections

BC Text Collections

A modern, grid-based section for displaying your product collections or custom links with eye-catching visuals and hover effects. Perfect for category navigation, featured collections, or any grid of clickable items that need to make a strong visual impact.

Key Features:

  • Display collections or custom links in a responsive 2-column grid (stacks to 1 column on mobile)
  • Smart image hierarchy: uses custom images, collection images, or product images as fallbacks
  • Interactive hover effects with customizable arrow icons and background color changes
  • Responsive typography with clamp() scaling for perfect readability on all devices
  • Flexible content options: link to Shopify collections or any custom URLs
  • Rich text support for headings with full formatting control
  • Complete color customization: use Dawn's color schemes or apply custom branding
  • Individual image opacity controls and lazy loading options
  • Desktop-only hover arrows (hidden on mobile for better touch experience)
  • Comprehensive spacing controls with separate desktop, tablet, and mobile padding settings

Perfect for: Collection showcases, category navigation, featured product groups, brand story sections, or any clickable grid layout that combines images with descriptive text.

{%- style -%}
  .section-{{ section.id }} {
    {% if section.settings.use_custom_colors %}
      background-color: {{ section.settings.background_color }};
      color: {{ section.settings.text_color }};
    {% else %}
      color: rgb(var(--color-foreground));
    {% endif %}
    padding-top: {{ section.settings.padding_top_desktop }}px;
    padding-bottom: {{ section.settings.padding_bottom_desktop }}px;
    padding-left: {{ section.settings.horizontal_padding_desktop }}px;
    padding-right: {{ section.settings.horizontal_padding_desktop }}px;
    {% if section.settings.top_border_thickness > 0 %}
      border-top: {{ section.settings.top_border_thickness }}px solid {{ section.settings.border_color }};
    {% endif %}
    {% if section.settings.bottom_border_thickness > 0 %}
      border-bottom: {{ section.settings.bottom_border_thickness }}px solid {{ section.settings.border_color }};
    {% endif %}
  }

  .section-{{ section.id }} .bc-main-container {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: 60px;
  }

  .section-{{ section.id }} .bc-heading * {
    font-size: {{ section.settings.heading_size }}rem;
    font-size: clamp({{ section.settings.heading_size | times: section.settings.heading_mobile_scale_ratio }}rem, {{ section.settings.heading_size | times: 0.7 }}rem + 2vw, {{ section.settings.heading_size }}rem) !important;
    line-height: {{ section.settings.heading_line_height }};
    max-width: {{ section.settings.heading_max_width }}ch;
    text-align: center;
    margin: 0;
  }

  .section-{{ section.id }} .bc-collections-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    min-width: 90vw;
    gap: 0;
  }

  .section-{{ section.id }} .bc-collection-cell {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: 50px;
    width: 100%;
    min-width: 30vw;
    padding: 15px;
    border-bottom: 1px solid {{ section.settings.cell_border_color }};
    transition: background-color 0.2s ease;
    text-decoration: none;
    color: inherit;
    position: relative;
  }

  .section-{{ section.id }} .bc-collection-cell:hover,
  .section-{{ section.id }} .bc-collection-cell.bc-active {
    background-color: #eee9e4;
  }

  .section-{{ section.id }} .bc-image-wrapper {
    width: 100px;
    height: 100px;
    overflow: hidden;
    position: relative;
    flex-shrink: 0;
  }

  .section-{{ section.id }} .bc-collection-image {
    position: absolute;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: right center;
    right: 0;
    top: 0;
    opacity: {{ section.settings.image_opacity }}%;
  }

  .section-{{ section.id }} .bc-collection-text {
    font-size: {{ section.settings.text_size }}rem;
    font-size: clamp({{ section.settings.text_size | times: section.settings.text_mobile_scale_ratio }}rem, {{ section.settings.text_size | times: 0.8 }}rem + 1vw, {{ section.settings.text_size }}rem) !important;
    line-height: {{ section.settings.text_line_height }};
    max-width: {{ section.settings.text_max_width }}ch;
    transition: font-style 0.15s ease;
    margin: 0;
  }

  .section-{{ section.id }} .bc-collection-text * {
    font-size: inherit !important;
    line-height: inherit;
    max-width: inherit;
    margin: 0;
  }

  .section-{{ section.id }} .bc-collection-cell:hover .bc-collection-text *,
  .section-{{ section.id }} .bc-collection-cell.bc-active .bc-collection-text * {
    font-style: italic;
  }

  .section-{{ section.id }} .bc-arrow-icon {
    display: none;
    position: absolute;
    right: 30px;
    color: {{ section.settings.icon_color }};
  }

  .section-{{ section.id }} .bc-collection-cell:hover .bc-arrow-icon,
  .section-{{ section.id }} .bc-collection-cell.bc-active .bc-arrow-icon {
    display: block;
  }

  .section-{{ section.id }} .bc-arrow-icon svg {
    width: 50px;
    height: 50px;
    display: block;
  }

  .section-{{ section.id }} .bc-arrow-icon img {
    width: 50px;
    height: 50px;
    object-fit: contain;
    display: block;
  }

  @media screen and (max-width: 991px) {
    .section-{{ section.id }} {
      padding-top: {{ section.settings.padding_top_tablet }}px;
      padding-bottom: {{ section.settings.padding_bottom_tablet }}px;
      padding-left: {{ section.settings.horizontal_padding_tablet }}px;
      padding-right: {{ section.settings.horizontal_padding_tablet }}px;
    }

    .section-{{ section.id }} .bc-collection-cell {
      gap: 20px;
    }

    .section-{{ section.id }} .bc-image-wrapper {
      width: 70px;
      height: 90px;
    }

    .section-{{ section.id }} .bc-arrow-icon {
      display: none !important;
    }
  }

  @media screen and (max-width: 767px) {
    .section-{{ section.id }} {
      padding-left: {{ section.settings.horizontal_padding_mobile }}px;
      padding-right: {{ section.settings.horizontal_padding_mobile }}px;
    }

    .section-{{ section.id }} .bc-collections-grid {
      grid-template-columns: 1fr;
    }
  }

  @media screen and (max-width: 479px) {
    .section-{{ section.id }} .bc-collection-cell {
      gap: 12px;
      padding: 10px 5px;
    }

    .section-{{ section.id }} .bc-image-wrapper {
      height: 80px;
    }
  }
{%- endstyle -%}

<div class="section-{{ section.id }}{% unless section.settings.use_custom_colors %} color-{{ section.settings.color_scheme }}{% endunless %}">
  {% comment %}  Designed and Developed by Bungalow Creative. Get sections like these at The Section Studio https://bungalowcreative.co/pages/the-section-studio {% endcomment %}
  <div class="bc-main-container">
    {% if section.settings.heading != blank %}
      <div class="bc-heading">{{ section.settings.heading }}</div>
    {% endif %}

    <div class="bc-collections-grid">
      {% for block in section.blocks %}
        {% comment %} Determine the URL and title based on whether it's a collection or custom link {% endcomment %}
        {% if block.settings.custom_url != blank %}
          {% assign block_url = block.settings.custom_url %}
          {% assign block_title = block.settings.custom_title | default: 'Link' %}
        {% elsif block.settings.collection != blank %}
          {% assign collection = collections[block.settings.collection] %}
          {% assign block_url = collection.url %}
          {% assign block_title = collection.title %}
        {% else %}
          {% assign block_url = '#' %}
          {% assign block_title = 'No link or collection set' %}
        {% endif %}

        {% comment %} Only render the block if we have a valid URL {% endcomment %}
        {% if block_url != '#' %}
          <a
            href="{{ block_url }}"
            class="bc-collection-cell {% if block.settings.highlight_block %}bc-active{% endif %}"
            {{ block.shopify_attributes }}
          >
            {% comment %} Image logic - priority: custom_image > collection image > collection first product image > placeholder {% endcomment %}
            {% if block.settings.custom_image != blank %}
              <div class="bc-image-wrapper">
                <img
                  src="{{ block.settings.custom_image | img_url: '300x200', crop: 'center' }}"
                  loading="{{ block.settings.image_loading }}"
                  alt="{{ block.settings.custom_image_alt | default: block_title }}"
                  class="bc-collection-image"
                >
              </div>
            {% elsif block.settings.collection != blank and collections[block.settings.collection].image %}
              <div class="bc-image-wrapper">
                <img
                  src="{{ collections[block.settings.collection].image | img_url: '300x200', crop: 'center' }}"
                  loading="{{ block.settings.image_loading }}"
                  alt="{{ block_title }}"
                  class="bc-collection-image"
                >
              </div>
            {% elsif block.settings.collection != blank
              and collections[block.settings.collection].products.first.featured_image
            %}
              <div class="bc-image-wrapper">
                <img
                  src="{{ collections[block.settings.collection].products.first.featured_image | img_url: '300x200', crop: 'center' }}"
                  loading="{{ block.settings.image_loading }}"
                  alt="{{ block_title }}"
                  class="bc-collection-image"
                >
              </div>
            {% else %}
              <div class="bc-image-wrapper">
                <img
                  src="{{ 'collection-placeholder.svg' | asset_url }}"
                  loading="{{ block.settings.image_loading }}"
                  alt="{{ block_title }}"
                  class="bc-collection-image"
                >
              </div>
            {% endif %}

            <div class="bc-collection-text {% if block.settings.highlight_block %}bc-active{% endif %}">
              {{ block_title }}
            </div>

            <div class="bc-arrow-icon" style="color: {{ section.settings.icon_color }};">
              {% if section.settings.icon_image != blank %}
                <img
                  src="{{ section.settings.icon_image | img_url: 'original' }}"
                  alt="{{ section.settings.icon_image_alt | default: 'Arrow icon' }}"
                  loading="lazy"
                >
              {% else %}
                {{ section.settings.icon_svg }}
              {% endif %}
            </div>
          </a>
        {% endif %}
      {% endfor %}
    </div>
  </div>
</div>

{% schema %}
{
  "name": "BC Text Collections",
  "settings": [
    {
      "type": "header",
      "content": "Colors"
    },
    {
      "type": "color_scheme",
      "id": "color_scheme",
      "label": "Color Scheme",
      "default": "scheme-1"
    },
    {
      "type": "checkbox",
      "id": "use_custom_colors",
      "label": "Use custom colors instead of a Dawn color scheme",
      "default": false
    },
    {
      "type": "color",
      "id": "background_color",
      "label": "Background Color",
      "default": "#ffffff"
    },
    {
      "type": "color",
      "id": "text_color",
      "label": "Text Color",
      "default": "#000000"
    },
    {
      "type": "color",
      "id": "border_color",
      "label": "Border Color",
      "default": "#000000"
    },
    {
      "type": "color",
      "id": "icon_color",
      "label": "Hover Icon Color",
      "default": "#000000"
    },
    {
      "type": "color",
      "id": "cell_border_color",
      "label": "Cell Border Color",
      "default": "#ebebeb"
    },
    {
      "type": "header",
      "content": "Section Settings"
    },
    {
      "type": "range",
      "id": "padding_top_desktop",
      "label": "Top Padding (Desktop)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 100
    },
    {
      "type": "range",
      "id": "padding_bottom_desktop",
      "label": "Bottom Padding (Desktop)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 100
    },
    {
      "type": "range",
      "id": "horizontal_padding_desktop",
      "label": "Horizontal Padding (Desktop)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 50
    },
    {
      "type": "range",
      "id": "padding_top_tablet",
      "label": "Top Padding (Tablet)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 80
    },
    {
      "type": "range",
      "id": "padding_bottom_tablet",
      "label": "Bottom Padding (Tablet)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 80
    },
    {
      "type": "range",
      "id": "horizontal_padding_tablet",
      "label": "Horizontal Padding (Tablet)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 40
    },
    {
      "type": "range",
      "id": "horizontal_padding_mobile",
      "label": "Horizontal Padding (Mobile)",
      "min": 0,
      "max": 150,
      "step": 5,
      "unit": "px",
      "default": 10
    },
    {
      "type": "range",
      "id": "top_border_thickness",
      "label": "Top Border Thickness",
      "min": 0,
      "max": 20,
      "step": 1,
      "unit": "px",
      "default": 0
    },
    {
      "type": "range",
      "id": "bottom_border_thickness",
      "label": "Bottom Border Thickness",
      "min": 0,
      "max": 20,
      "step": 1,
      "unit": "px",
      "default": 0
    },
    {
      "type": "header",
      "content": "Text Section"
    },
    {
      "type": "richtext",
      "id": "heading",
      "label": "Heading",
      "default": "<h2>Your Heading Goes Here</h2>"
    },
    {
      "type": "range",
      "id": "heading_size",
      "label": "Heading Font Size",
      "min": 0.5,
      "max": 8,
      "step": 0.1,
      "default": 5,
      "unit": "rem",
      "info": "Font size in rem units (good for accessibility)"
    },
    {
      "type": "range",
      "id": "text_size",
      "label": "Text Font Size",
      "min": 0.5,
      "max": 8,
      "step": 0.1,
      "default": 3,
      "unit": "rem",
      "info": "Font size in rem units (good for accessibility)"
    },
    {
      "type": "range",
      "id": "heading_line_height",
      "label": "Heading Line Height",
      "min": 1,
      "max": 2,
      "step": 0.1,
      "default": 1.2
    },
    {
      "type": "range",
      "id": "text_line_height",
      "label": "Text Line Height",
      "min": 1,
      "max": 2,
      "step": 0.1,
      "default": 1.2
    },
    {
      "type": "range",
      "id": "heading_max_width",
      "label": "Heading Max Width",
      "min": 10,
      "max": 100,
      "step": 1,
      "default": 50,
      "unit": "ch"
    },
    {
      "type": "range",
      "id": "text_max_width",
      "label": "Text Max Width",
      "min": 10,
      "max": 100,
      "step": 1,
      "default": 50,
      "unit": "ch"
    },
    {
      "type": "range",
      "id": "heading_mobile_scale_ratio",
      "label": "Heading Mobile Scale Ratio",
      "min": 0.5,
      "max": 1,
      "step": 0.1,
      "default": 0.7,
      "unit": "×",
      "info": "Controls how much heading shrinks on smaller screens"
    },
    {
      "type": "range",
      "id": "heading_tablet_scale_ratio",
      "label": "Heading Tablet Scale Ratio",
      "min": 0.5,
      "max": 1,
      "step": 0.1,
      "default": 0.9,
      "unit": "×",
      "info": "Controls how much heading shrinks on tablet screens"
    },
    {
      "type": "range",
      "id": "text_mobile_scale_ratio",
      "label": "Text Mobile Scale Ratio",
      "min": 0.5,
      "max": 1,
      "step": 0.1,
      "default": 1,
      "unit": "×",
      "info": "Controls how much text shrinks on smaller screens"
    },
    {
      "type": "range",
      "id": "text_tablet_scale_ratio",
      "label": "Text Tablet Scale Ratio",
      "min": 0.5,
      "max": 1,
      "step": 0.1,
      "default": 1,
      "unit": "×",
      "info": "Controls how much text shrinks on tablet screens"
    },
    {
      "type": "header",
      "content": "Media Section"
    },
    {
      "type": "image_picker",
      "id": "icon_image",
      "label": "Hover Icon Image (Optional)",
      "info": "Upload an image to use as the hover icon. This takes precedence over SVG code if both are provided."
    },
    {
      "type": "text",
      "id": "icon_image_alt",
      "label": "Hover Icon Image Alt Text",
      "placeholder": "e.g. Arrow icon"
    },
    {
      "type": "textarea",
      "id": "icon_svg",
      "label": "Hover Icon SVG Code",
      "info": "Paste the inline SVG code here for the hover icon. You can copy icons directly from https://lucide.dev/icons using the 'Copy SVG' button. Make sure the SVG uses 'stroke=\"currentColor\"' or 'fill=\"currentColor\"' so the color setting works.",
      "default": "<svg width=\"50\" height=\"50\" viewBox=\"0 0 50 50\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 10 L40 10 L40 40\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"/><path d=\"M10 40 L40 10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"/></svg>"
    },
    {
      "type": "range",
      "id": "image_opacity",
      "label": "Image Opacity",
      "min": 10,
      "max": 100,
      "step": 5,
      "unit": "%",
      "default": 100
    },
    {
      "type": "select",
      "id": "image_loading",
      "label": "Image Loading",
      "options": [
        {
          "value": "lazy",
          "label": "Lazy"
        },
        {
          "value": "eager",
          "label": "Eager"
        }
      ],
      "default": "lazy"
    }
  ],
  "blocks": [
    {
      "type": "collection",
      "name": "Collection/Link",
      "settings": [
        {
          "type": "header",
          "content": "Link Type"
        },
        {
          "type": "paragraph",
          "content": "Choose either a collection OR enter a custom URL and title. If both are provided, the custom URL will take priority."
        },
        {
          "type": "collection",
          "id": "collection",
          "label": "Collection"
        },
        {
          "type": "url",
          "id": "custom_url",
          "label": "Custom URL",
          "info": "Enter a custom URL (e.g., /pages/about, https://example.com). This will override the collection setting."
        },
        {
          "type": "text",
          "id": "custom_title",
          "label": "Custom Title",
          "info": "Title to display when using custom URL. Required if using custom URL."
        },
        {
          "type": "header",
          "content": "Image & Style"
        },
        {
          "type": "image_picker",
          "id": "custom_image",
          "label": "Custom Image",
          "info": "If provided, this will replace the collection image"
        },
        {
          "type": "text",
          "id": "custom_image_alt",
          "label": "Custom Image Alt Text",
          "placeholder": "Describe the custom image"
        },
        {
          "type": "checkbox",
          "id": "highlight_block",
          "label": "Highlight this block",
          "default": false,
          "info": "Enable to show this block as active/highlighted by default"
        }
      ]
    }
  ],
  "presets": [
    {
      "name": "BC Text Collections",
      "blocks": [
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        }
      ]
    }
  ]
}
{% endschema %}