Class: DaisyUI::Base

Inherits:
Phlex::HTML
  • Object
show all
Defined in:
lib/daisy_ui/base.rb

Overview

Base class for all DaisyUI components.

## Architecture Overview

Components accept three types of arguments:

  1. Modifiers - Positional symbol arguments that map to DaisyUI CSS classes Example: Dropdown.new(:top, :hover) → “dropdown-top dropdown-hover”

  2. Options - Keyword arguments for the component (as:, id:) Example: Dropdown.new(as: :div, id: “my-dropdown”)

  3. Attributes - Additional keyword arguments for HTML attributes (data:, aria:, class:) Example: Dropdown.new(data: “dropdown”, class: “my-custom-class”)

## Key Methods

  • ‘classes` - Builds the final CSS class string by combining base class, modifiers, responsive classes, and user-provided classes. DESTRUCTIVELY removes :class from options.

  • ‘attributes` - Returns the hash of HTML attributes to splat into the element. By default includes all remaining options (after :class was removed) plus :id. Override in subclasses if different behavior is needed.

## Typical Usage Pattern

In a component’s view_template:

def view_template(&)
  div(class: classes, **attributes, &)
end

This renders: <div class=“[generated classes]” id=“…” data-…=“…” …>

Constant Summary collapse

BOOLS =
[true, false].freeze
COLOR_MODIFIERS =

Shared color modifiers used across multiple components Maps color names to their DaisyUI background/text class combinations

{
  # "sm:bg-primary sm:text-primary-content"
  # "@sm:bg-primary @sm:text-primary-content"
  # "md:bg-primary md:text-primary-content"
  # "@md:bg-primary @md:text-primary-content"
  # "lg:bg-primary lg:text-primary-content"
  # "@lg:bg-primary @lg:text-primary-content"
  primary: "bg-primary text-primary-content",
  # "sm:bg-secondary sm:text-secondary-content"
  # "@sm:bg-secondary @sm:text-secondary-content"
  # "md:bg-secondary md:text-secondary-content"
  # "@md:bg-secondary @md:text-secondary-content"
  # "lg:bg-secondary lg:text-secondary-content"
  # "@lg:bg-secondary @lg:text-secondary-content"
  secondary: "bg-secondary text-secondary-content",
  # "sm:bg-accent sm:text-accent-content"
  # "@sm:bg-accent @sm:text-accent-content"
  # "md:bg-accent md:text-accent-content"
  # "@md:bg-accent @md:text-accent-content"
  # "lg:bg-accent lg:text-accent-content"
  # "@lg:bg-accent @lg:text-accent-content"
  accent: "bg-accent text-accent-content",
  # "sm:bg-neutral sm:text-neutral-content"
  # "@sm:bg-neutral @sm:text-neutral-content"
  # "md:bg-neutral md:text-neutral-content"
  # "@md:bg-neutral @md:text-neutral-content"
  # "lg:bg-neutral lg:text-neutral-content"
  # "@lg:bg-neutral @lg:text-neutral-content"
  neutral: "bg-neutral text-neutral-content",
  # "sm:bg-base-100 sm:text-base-content"
  # "@sm:bg-base-100 @sm:text-base-content"
  # "md:bg-base-100 md:text-base-content"
  # "@md:bg-base-100 @md:text-base-content"
  # "lg:bg-base-100 lg:text-base-content"
  # "@lg:bg-base-100 @lg:text-base-content"
  base_100: "bg-base-100 text-base-content",
  # "sm:bg-base-200 sm:text-base-content"
  # "@sm:bg-base-200 @sm:text-base-content"
  # "md:bg-base-200 md:text-base-content"
  # "@md:bg-base-200 @md:text-base-content"
  # "lg:bg-base-200 lg:text-base-content"
  # "@lg:bg-base-200 @lg:text-base-content"
  base_200: "bg-base-200 text-base-content",
  # "sm:bg-base-300 sm:text-base-content"
  # "@sm:bg-base-300 @sm:text-base-content"
  # "md:bg-base-300 md:text-base-content"
  # "@md:bg-base-300 @md:text-base-content"
  # "lg:bg-base-300 lg:text-base-content"
  # "@lg:bg-base-300 @lg:text-base-content"
  base_300: "bg-base-300 text-base-content",
  # "sm:bg-info sm:text-info-content"
  # "@sm:bg-info @sm:text-info-content"
  # "md:bg-info md:text-info-content"
  # "@md:bg-info @md:text-info-content"
  # "lg:bg-info lg:text-info-content"
  # "@lg:bg-info @lg:text-info-content"
  info: "bg-info text-info-content",
  # "sm:bg-success sm:text-success-content"
  # "@sm:bg-success @sm:text-success-content"
  # "md:bg-success md:text-success-content"
  # "@md:bg-success @md:text-success-content"
  # "lg:bg-success lg:text-success-content"
  # "@lg:bg-success @lg:text-success-content"
  success: "bg-success text-success-content",
  # "sm:bg-warning sm:text-warning-content"
  # "@sm:bg-warning @sm:text-warning-content"
  # "md:bg-warning md:text-warning-content"
  # "@md:bg-warning @md:text-warning-content"
  # "lg:bg-warning lg:text-warning-content"
  # "@lg:bg-warning @lg:text-warning-content"
  warning: "bg-warning text-warning-content",
  # "sm:bg-error sm:text-error-content"
  # "@sm:bg-error @sm:text-error-content"
  # "md:bg-error md:text-error-content"
  # "@md:bg-error @md:text-error-content"
  # "lg:bg-error lg:text-error-content"
  # "@lg:bg-error @lg:text-error-content"
  error: "bg-error text-error-content"
}.freeze

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*modifiers, as: :div, id: nil, **options) ⇒ Base

Returns a new instance of Base.



152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/daisy_ui/base.rb', line 152

def initialize(*modifiers, as: :div, id: nil, **options)
  # Extract boolean modifiers from options (e.g., primary: true, secondary: false)
  boolean_modifiers = extract_boolean_modifiers(options)

  @modifiers = modifiers + boolean_modifiers
  @as = as
  @id = id
  # Store all keyword arguments (class, data, aria, etc.)
  # This will be processed by `classes` and `attributes` methods
  @options = options
  super()
end

Class Attribute Details

.component_classObject



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/daisy_ui/base.rb', line 125

def component_class
  return @component_class if instance_variable_defined?(:@component_class)

  @component_class = begin
    # Convert "DaisyUI::Button" -> "button"
    class_name = name.split("::").last # demodulize
    class_name.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
      .gsub(/([a-z\d])([A-Z])/, '\1_\2')
      .tr("_", "-")
      .downcase
  end
end

.modifiersObject

Returns the value of attribute modifiers.



123
124
125
# File 'lib/daisy_ui/base.rb', line 123

def modifiers
  @modifiers
end

Class Method Details

.inherited(subclass) ⇒ Object



138
139
140
141
142
143
144
145
# File 'lib/daisy_ui/base.rb', line 138

def inherited(subclass)
  super
  subclass.modifiers = (modifiers || {}).dup
  # Inherit component_class if it was explicitly set
  return unless instance_variable_defined?(:@component_class)

  subclass.component_class = @component_class
end

.register_modifiers(mods) ⇒ Object



147
148
149
# File 'lib/daisy_ui/base.rb', line 147

def register_modifiers(mods)
  self.modifiers = (modifiers || {}).merge(mods)
end