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