Class: Vident::ClassListBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/vident/class_list_builder.rb

Constant Summary collapse

CLASSNAME_SEPARATOR =
" "

Instance Method Summary collapse

Constructor Details

#initialize(tailwind_merger: nil, component_name: nil, root_element_attributes_classes: nil, root_element_classes: nil, root_element_html_class: nil, html_class: nil, additional_classes: nil) ⇒ ClassListBuilder

If the HTML “class” option is provided, it is taken in order of precedence of source. The order of precedence is: lowest | root_element_classes => whatever is returned .…… | root_element_attributes => the ‘html_options` value .…… | root_element(class: …) => the `class` value of the arguments passed to the root element highest | render MyComponent.new(html_options: { class: … }) => the `html_options` value The “classes” prop on the component on the other hand is used to add additional classes to the component. eg: render MyComponent.new(classes: “my-additional-class another-class”)



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/vident/class_list_builder.rb', line 17

def initialize(tailwind_merger: nil, component_name: nil, root_element_attributes_classes: nil, root_element_classes: nil, root_element_html_class: nil, html_class: nil, additional_classes: nil)
  @class_list = component_name ? [component_name] : []
  @class_list.concat(Array.wrap(root_element_classes)) if root_element_classes && !root_element_attributes_classes && !root_element_html_class && !html_class
  @class_list.concat(Array.wrap(root_element_attributes_classes)) if root_element_attributes_classes && !root_element_html_class && !html_class
  @class_list.concat(Array.wrap(root_element_html_class)) if root_element_html_class && !html_class
  @class_list.concat(Array.wrap(html_class)) if html_class
  @class_list.concat(Array.wrap(additional_classes)) if additional_classes
  @class_list.compact!

  @tailwind_merger = tailwind_merger

  if @tailwind_merger && !defined?(::TailwindMerge::Merger)
    raise LoadError, "TailwindMerge gem is required when using tailwind_merger:. Add 'gem \"tailwind_merge\"' to your Gemfile."
  end
end

Instance Method Details

#build(extra_classes = nil, stimulus_class_names: []) ⇒ String?

Main method to build a final class list from multiple sources

Parameters:

  • class_lists (Array<String, Array, StimulusClass, nil>)

    Multiple class sources to merge

  • stimulus_class_names (Array<Symbol, String>) (defaults to: [])

    Optional names of stimulus classes to include

Returns:

  • (String, nil)

    Final space-separated class string or nil if no classes



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/vident/class_list_builder.rb', line 37

def build(extra_classes = nil, stimulus_class_names: [])
  class_list = @class_list + Array.wrap(extra_classes).compact
  flattened_classes = flatten_and_normalize_classes(class_list, stimulus_class_names)
  return nil if flattened_classes.empty?

  deduplicated_classes = dedupe_classes(flattened_classes)
  return nil if deduplicated_classes.blank?

  class_string = deduplicated_classes.join(CLASSNAME_SEPARATOR)

  if @tailwind_merger
    dedupe_with_tailwind(class_string)
  else
    class_string
  end
end