Sha256: c94c3f25bdbccd5b3e93514959b7e24585138dc64c8d4d12707affbd89f32058

Contents?: true

Size: 1.41 KB

Versions: 3

Compression:

Stored size: 1.41 KB

Contents

# frozen_string_literal: true

module Optics
  module Button
    class Component < ApplicationViewComponent
      SIZES = %w[small medium large].freeze
      STYLES = %w[default primary secondary delete].freeze

      accepts :label
      accepts :active, default: false
      accepts :border, default: true
      accepts :disabled, default: false
      accepts :icon, default: false
      accepts :icon_with_label, default: false
      accepts :pill, default: false
      accepts :size, default: 'medium'
      accepts :variant, default: 'default'
      accepts :url

      def call
        build_button do
          content || label
        end
      end

      def build_button(&)
        return link_to(url, class: classes, **@attributes.except(:class), &) if url && !disabled

        tag.button(class: classes, disabled:, **@attributes.except(:class), &)
      end

      def button_class
        return 'btn' if variant == 'default'

        "btn-#{variant}"
      end

      def classes
        class_names(
          @attributes[:class],
          button_class,
          size_class,
          'btn--active': active,
          'btn--disabled': disabled,
          'btn--icon': icon,
          'btn--icon-with-label': icon_with_label,
          'btn--no-border': !border,
          'btn--pill': pill
        ).join(' ')
      end

      def size_class
        return if size == 'medium'

        "btn--#{size}"
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
optics_view_components-0.1.10 app/components/optics/button/component.rb
optics_view_components-0.1.9 app/components/optics/button/component.rb
optics_view_components-0.1.8 app/components/optics/button/component.rb