Sha256: 9879ede612c8fb0f13acf4d8cadf6d785032cfd25b5134800f2b7a2ca169cfd6

Contents?: true

Size: 1.93 KB

Versions: 28

Compression:

Stored size: 1.93 KB

Contents

# frozen_string_literal: true

module Ariadne
  module ViewComponent
    module StyleVariants
      module ClassMethods
        # Returns the name of the default style set based on the class name:
        #  MyComponent::Component => my_component
        #  Namespaced::MyComponent => my_component
        def default_style_name
          @default_style_name ||= name.split("::")[-2].underscore.presence || "component"
        end
      end

      extend ActiveSupport::Concern

      class_methods do
        def accepts_styles_for(*names, **defaults, &block)
          names ||= []
          names << default_style_name

          names.each do |name|
            style_accessors[name] = {}
          end

          method_name = :styles
          ivar_name = :"@styles"

          attr_reader(method_name)

          mod = Module.new do
            define_method(:initialize) do |**options|
              value = options.delete(method_name)&.to_h || {}

              super(**options)
              instance_exec(value, &block) if block
              instance_variable_set(ivar_name, value)
            end
          end

          prepend(mod)
        end

        # use `accepts_styles` to allow end users to merge their own styles with Ariadne's provided ones
        def accepts_styles(*names, **defaults, &block)
          accepts_styles_for(*names, **defaults, &block)
        end

        def style_accessors
          @style_accessors ||=
            if superclass.respond_to?(:style_accessors)
              superclass.style_accessors.deep_dup
            else
              {}
            end
        end
      end

      # merge Araidne style variants with user provided overrides
      def merged_styles(name = self.class.default_style_name, **variants)
        default_styles = self.class.style_config.compile(name.to_sym, **variants)
        Ariadne::ViewComponents.tailwind_merger.merge([default_styles, styles.fetch(name, "")])
      end
    end
  end
end

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
ariadne_view_components-0.0.93.2 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.93.1 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.93 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.92 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.91 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.90 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.89.1 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.89 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.88 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.87 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.9 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.8 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.7 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.6 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.5 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.4 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.3 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.2 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86.1 app/lib/ariadne/view_component/style_variants.rb
ariadne_view_components-0.0.86 app/lib/ariadne/view_component/style_variants.rb