← back to Dw Theme Boost Fix

snippets/layout.section.liquid

173 lines

{% doc %}
  Copyright © 2025 Archetype Themes LP. All rights reserved.

  A layout component that renders a section with configurable styling and content.
  Provides consistent section structure with support for color schemes, padding controls,
  full width options, and content positioning. The component maintains theme-wide section
  styling while allowing customization through props.

  @param {string} slot - The content to be rendered inside the section
  @param {string} [style] - Custom styles to be applied to the section
  @param {string} [classlist] - Additional classes to add to the section
  @param {string} [color_scheme] - Color scheme to apply to the section
  @param {boolean} [full_width] - Whether the section should be full width
  @param {string} [padding] - Controls section padding, options: 'top', 'bottom', 'both', 'none'

  @example
  {% render 'layout.section',
    slot: section.settings.content,
    style: custom_style,
    classlist: 'my-custom-class',
    color_scheme: section.settings.color_scheme,
    full_width: false,
    padding: 'none'
  %}
{% enddoc %}

{%- liquid
  assign slot = slot | default: ''
  assign style = style | default: ''
  assign classlist = classlist | default: ''
  assign color_scheme = color_scheme | default: section.settings.color_scheme | default: 'none'
  assign full_width = full_width | default: section.settings.full_width, allow_false: true | default: false, allow_false: true
  assign padding = padding | default: section.settings.padding | default: 'both'

  if padding == 'top'
    assign classlist = classlist | append: ' layout-section--padding-top' | strip
  endif

  if padding == 'bottom'
    assign classlist = classlist | append: ' layout-section--padding-bottom' | strip
  endif

  if padding == 'none'
    assign classlist = classlist | append: ' layout-section--padding-none' | strip
  endif

  if full_width
    assign classlist = classlist | append: ' layout-section--full-width' | strip
  endif

  if color_scheme != 'none'
    assign classlist = classlist | append: ' color-scheme-' | append: color_scheme | strip
  endif
-%}

<div class="layout-section {{ classlist }}" style="{{ style }}">
  {% render 'utility.color-scheme-texture', color_scheme: color_scheme %}

  <div class="layout-section__content">
    {{ slot }}
  </div>
</div>

{% render 'style.primitive-tokens' %}
{% render 'style.normalize' %}

{% stylesheet %}
  :root {
    --layout-section-max-inline-size: var(--page-width, 1500px);

    --layout-section-padding-inline: var(--size-4);
    --layout-section-padding-inline--xs: initial;
    --layout-section-padding-inline--sm: initial;
    --layout-section-padding-inline--md: initial;
    --layout-section-padding-inline--lg: initial;
    --layout-section-padding-inline--xl: initial;

    --layout-section-padding-block: var(--size-8);
    --layout-section-padding-block--xs: initial;
    --layout-section-padding-block--sm: initial;
    --layout-section-padding-block--md: initial;
    --layout-section-padding-block--lg: initial;
    --layout-section-padding-block--xl: initial;

    --layout-section-color: initial;
    --layout-section-background: initial;
  }

  .layout-section {
    --_max-inline-size: var(--layout-section-max-inline-size);

    --_padding-inline--xs: var(--layout-section-padding-inline--xs, var(--layout-section-padding-inline));
    --_padding-inline--sm: var(--layout-section-padding-inline--sm, var(--_padding-inline--xs));
    --_padding-inline--md: var(--layout-section-padding-inline--md, var(--_padding-inline--sm));
    --_padding-inline--lg: var(--layout-section-padding-inline--lg, var(--_padding-inline--md));
    --_padding-inline--xl: var(--layout-section-padding-inline--xl, var(--_padding-inline--lg));
    --_padding-inline: var(--_padding-inline--xs);

    --_padding-block--xs: var(--layout-section-padding-block--xs, var(--layout-section-padding-block));
    --_padding-block--sm: var(--layout-section-padding-block--sm, var(--_padding-block--xs));
    --_padding-block--md: var(--layout-section-padding-block--md, var(--_padding-block--sm));
    --_padding-block--lg: var(--layout-section-padding-block--lg, var(--_padding-block--md));
    --_padding-block--xl: var(--layout-section-padding-block--xl, var(--_padding-block--lg));
    --_padding-block: var(--_padding-block--xs);

    --_color: var(--layout-section-color, var(--color-primary, #000));
    --_background: var(--layout-section-background, var(--color-secondary, #fff));

    display: flex;
    width: 100%;
    position: relative;
    justify-content: center;
    background: var(--_background);
    color: var(--_color);
    padding-inline: var(--_padding-inline);
    padding-block: var(--_padding-block);

    & > .layout-section__content {
      display: block;
      max-inline-size: var(--_max-inline-size);
      z-index: 1;
      width: 100%;
      flex-grow: 1;
    }

    &.layout-section--full-width > .layout-section__content {
      max-inline-size: 100%;
    }

    &.layout-section--padding-none {
      padding-block: 0;
    }

    &.layout-section--padding-top {
      padding-block-end: 0;
    }

    &.layout-section--padding-bottom {
      padding-block-start: 0;
    }
  }
{% endstylesheet %}

{% style %}
  @media ({% render 'utility.breakpoint', size: 'sm' %}) {
    .layout-section {
      --_padding-inline: var(--_padding-inline--sm);
      --_padding-block: var(--_padding-block--sm);
    }
  }

  @media ({% render 'utility.breakpoint', size: 'md' %}) {
    .layout-section {
      --_padding-inline: var(--_padding-inline--md);
      --_padding-block: var(--_padding-block--md);
    }
  }

  @media ({% render 'utility.breakpoint', size: 'lg' %}) {
    .layout-section {
      --_padding-inline: var(--_padding-inline--lg);
      --_padding-block: var(--_padding-block--lg);
    }
  }

  @media ({% render 'utility.breakpoint', size: 'xl' %}) {
    .layout-section {
      --_padding-inline: var(--_padding-inline--xl);
      --_padding-block: var(--_padding-block--xl);
    }
  }
{% endstyle %}