← back to Dw Theme Compact Toolbar

snippets/element.badge.liquid

110 lines

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

  A badge component for displaying status indicators, labels, and tags.
  Features customizable styling with support for inverted colors and different badge types
  including sale badges and custom variants.

  @param {string} [label] - Label text
  @param {string} [type] - Badge type (sale, custom, or custom type)
  @param {boolean} [inverted] - Inverted colors
  @param {string} [classlist] - Class list
  @param {string} [style] - Style attribute

  @example
  {% render 'element.badge', label: 'Sale', type: 'sale', inverted: true %}
{% enddoc %}

{% liquid
  assign element = 'div'
  assign classlist = classlist | default: '' | append: ' element-badge' | strip
  assign style = style | default: ''
  assign inverted = inverted | default: false
  assign type = type | default: ''

  if inverted
    assign classlist = classlist | append: ' element-badge--inverted'
  endif

  if type == 'sale'
    assign classlist = classlist | append: ' element-badge--sale'
  elsif type == 'custom'
    assign classlist = classlist | append: ' element-badge--custom'
  elsif type != blank
    assign classlist = classlist | append: ' element-badge--' | append: type
  endif
%}

<{{ element }}
  class="{{ classlist }}"

  {%- if style != blank -%}
    style="{{ style }}"
  {%- endif -%}
>
  {{- label }}
</{{ element }}>

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

{% stylesheet %}
  .element-badge {
    /* Layout & Typography */
    --_radius: var(--element-badge-radius, var(--chip-radius, var(--radius-xs)));
    --_px: var(--element-badge-px, var(--size-3));
    --_py: var(--element-badge-py, var(--size-1));
    --_border-width: var(--element-badge-border-width, var(--size-0-25));
    --_font-family: var(
      --element-badge-font-family,
      var(--element-text-font-family--body),
      var(--element-text-font-family-fallback--body)
    );
    --_font-size: var(--element-badge-font-size, var(--element-text-font-size--body-sm));
    --_letter-spacing: var(--element-badge-letter-spacing, var(--element-text-letter-spacing--body-sm));
    --_line-height: var(--element-badge-line-height, var(--element-text-line-height--body-sm));

    /* Colors */
    --_base-primary: var(--color-secondary);
    --_base-secondary: var(--color-primary);
    --_color-primary: var(--_base-primary);
    --_color-secondary: var(--_base-secondary);
    --_color-background: var(--_color-primary);
    --_color-text: var(--_color-secondary);
    --_color-border: var(--_color-secondary);
    --_shade-inset-box-shadow: var(--element-badge-shade-inset-box-shadow, 12%);
    --_inset-box-shadow: inset 0 0 0 var(--_border-width)
      color-mix(in srgb, var(--_color-border) var(--_shade-inset-box-shadow), transparent);

    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--_radius);
    padding-inline: var(--_px);
    padding-block: var(--_py);
    font-family: var(--_font-family);
    font-size: var(--_font-size);
    letter-spacing: var(--_letter-spacing);
    background-color: var(--_color-background);
    color: var(--_color-text);
    box-shadow: var(--_inset-box-shadow);
    text-transform: uppercase;
    width: fit-content;
    white-space: nowrap;
  }

  .element-badge--inverted {
    --_color-primary: var(--_base-secondary);
    --_color-secondary: var(--_base-primary);

    & > * {
      --color-primary: currentColor;
    }
  }

  .element-badge--sale {
    --_base-primary: var(--color-sale-tag-text);
    --_base-secondary: var(--color-sale-tag);
  }
{% endstylesheet %}