Sha256: 13ce3e39cc827d823456cb7548520edd8ccd542aeda54cf77b9fa3699f973cf2

Contents?: true

Size: 1.27 KB

Versions: 4

Compression:

Stored size: 1.27 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

      renders_one :leading_icon, lambda { |name:, size: 'normal'|
        Optics::Icon::Component.new(name:, size:)
      }

      accepts :label
      accepts :border, default: true
      accepts :icon, default: false
      accepts :size, default: 'medium'
      accepts :variant, default: 'default'
      accepts :url

      def call
        build_button do
          capture do
            concat leading_icon
            concat label
          end
        end
      end

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

        tag.button(class: classes, **@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--icon': icon,
          'btn--no-border': !border
        ).join(' ')
      end

      def size_class
        return if size == 'medium'

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

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
optics_view_components-0.1.7 app/components/optics/button/component.rb
optics_view_components-0.1.6 app/components/optics/button/component.rb
optics_view_components-0.1.5 app/components/optics/button/component.rb
optics_view_components-0.1.4 app/components/optics/button/component.rb