Sha256: 4cdf98eb8d41716f423a97db182099bb71ff27f13af3052bc60231aa717ea857

Contents?: true

Size: 1.54 KB

Versions: 19

Compression:

Stored size: 1.54 KB

Contents

module Lookbook
  class BaseComponent < ViewComponent::Base
    include Lookbook::Engine.routes.url_helpers
    include Lookbook::UiElementsHelper
    include Lookbook::ClassNamesHelper if Engine.runtime_context.rails_older_than?("6.1.0")

    def initialize(alpine_data: [], **html_attrs)
      @alpine_data ||= alpine_data
      @html_attrs = html_attrs
      @html_attrs[:class] = {"#{@html_attrs[:class]}": true} if @html_attrs[:class].is_a? String
    end

    def render_component_tag(tag = :div, **attrs, &block)
      merged_classes = class_names(attrs[:class], @html_attrs[:class])
      merged_attrs = @html_attrs.except(:class).deep_merge(attrs.except(:class))

      lookbook_tag tag, name: component_name,
        **merged_attrs,
        "x-data": prepare_alpine_data(merged_attrs[:"x-data"]),
        class: merged_classes, &block
    end

    def component_name
      self.class.name.chomp("::Component").delete_prefix("Lookbook::").underscore.tr("/", "_").tr("_", "-")
    end

    protected

    attr_reader :alpine_data

    def alpine_component
      nil
    end

    def alpine_encode(data)
      if data.is_a? String
        "'#{json_escape data}'"
      else
        json_escape data.to_json.tr("\"", "'")
      end
    end

    def prepare_alpine_data(x_data = nil)
      alpine_component_name = x_data || @html_attrs&.dig(:"x-data") || alpine_component
      if alpine_component_name.present?
        args = Array.wrap(alpine_data).compact
        args.any? ? "#{alpine_component_name}(#{args.join(",")})" : alpine_component_name
      end
    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
lookbook-2.0.5 app/components/lookbook/base_component.rb
lookbook-2.0.4 app/components/lookbook/base_component.rb
lookbook-2.0.3 app/components/lookbook/base_component.rb
lookbook-2.0.2 app/components/lookbook/base_component.rb
lookbook-2.0.1 app/components/lookbook/base_component.rb
lookbook-2.0.0 app/components/lookbook/base_component.rb
lookbook-2.0.0.rc.3 app/components/lookbook/base_component.rb
lookbook-2.0.0.rc.2 app/components/lookbook/base_component.rb
lookbook-2.0.0.rc.1 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.9 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.8 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.7 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.6 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.5 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.4 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.3 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.2 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.1 app/components/lookbook/base_component.rb
lookbook-2.0.0.beta.0 app/components/lookbook/base_component.rb