emjay 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/emjay/components/body/mj_accordion.rb +0 -3
  3. data/lib/emjay/components/body/mj_accordion_element.rb +0 -3
  4. data/lib/emjay/components/body/mj_accordion_text.rb +0 -3
  5. data/lib/emjay/components/body/mj_accordion_title.rb +0 -3
  6. data/lib/emjay/components/body/mj_body.rb +0 -3
  7. data/lib/emjay/components/body/mj_button.rb +0 -3
  8. data/lib/emjay/components/body/mj_carousel.rb +0 -3
  9. data/lib/emjay/components/body/mj_carousel_image.rb +0 -3
  10. data/lib/emjay/components/body/mj_column.rb +1 -4
  11. data/lib/emjay/components/body/mj_divider.rb +0 -3
  12. data/lib/emjay/components/body/mj_group.rb +0 -3
  13. data/lib/emjay/components/body/mj_hero.rb +0 -3
  14. data/lib/emjay/components/body/mj_image.rb +0 -3
  15. data/lib/emjay/components/body/mj_navbar.rb +0 -3
  16. data/lib/emjay/components/body/mj_navbar_link.rb +0 -3
  17. data/lib/emjay/components/body/mj_raw.rb +0 -3
  18. data/lib/emjay/components/body/mj_section.rb +0 -3
  19. data/lib/emjay/components/body/mj_social.rb +0 -3
  20. data/lib/emjay/components/body/mj_social_element.rb +0 -3
  21. data/lib/emjay/components/body/mj_spacer.rb +0 -3
  22. data/lib/emjay/components/body/mj_table.rb +0 -3
  23. data/lib/emjay/components/body/mj_text.rb +0 -3
  24. data/lib/emjay/components/body/mj_wrapper.rb +0 -2
  25. data/lib/emjay/components/head/mj_attributes.rb +0 -3
  26. data/lib/emjay/components/head/mj_breakpoint.rb +0 -3
  27. data/lib/emjay/components/head/mj_font.rb +0 -3
  28. data/lib/emjay/components/head/mj_head.rb +0 -3
  29. data/lib/emjay/components/head/mj_html_attributes.rb +0 -3
  30. data/lib/emjay/components/head/mj_preview.rb +0 -3
  31. data/lib/emjay/components/head/mj_style.rb +0 -3
  32. data/lib/emjay/components/head/mj_title.rb +0 -3
  33. data/lib/emjay/railtie.rb +12 -2
  34. data/lib/emjay/registry.rb +66 -6
  35. data/lib/emjay/renderer.rb +4 -2
  36. data/lib/emjay/version.rb +1 -1
  37. data/lib/emjay.rb +1 -34
  38. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b7e892dd10debedb98375075acbc595f229f28a1cf7976a90444748f123236b8
4
- data.tar.gz: adfb7062c1f9ca6d7a7926f9add058896e1d71078a795a64f0638cc036ad387e
3
+ metadata.gz: 44b1f5f2d6b785a000c044f8910beb812ab3b851fa5aa9a9950bdafc14842cd3
4
+ data.tar.gz: ff1959f81bd0468820a03c87a64396a63a14fcc4b90cc11465021519e704bd70
5
5
  SHA512:
6
- metadata.gz: b337e7f6f0ebeece8666fed2347bd0f00a5e1b814312b25d9ec81c31021749f7e81d576e4c318f38cc2c81fcc8560bb9914a9a146cf77d5a8729ada51510f046
7
- data.tar.gz: 5b3b358d75521a337ef0ee78af3b1d7929dd8cdcec194d2762332619f067558e9a04289686364d8627e50cf4963ec6bd192de72c1d78bd17c371388b972e56cd
6
+ metadata.gz: 2b137f248b18a2d4128e58626158b70e607d74e600f2096df7c0d920cfd9b4411c04912dc1e5a8e244aec4e201718edc62396c6ecb65bf53185c28e8e56204d6
7
+ data.tar.gz: ba4fceec3711cb71600ecc8eaee52865a873a34aabbf952ac40487903024bb266062689b95cf12b285fab4072eb6b52dcc4fc38156b7eb12b60ebec154353922
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -94,6 +93,4 @@ module Emjay
94
93
  end
95
94
  end
96
95
  end
97
-
98
- Registry.register(Components::MjAccordion)
99
96
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/conditional_tag"
6
5
 
7
6
  module Emjay
@@ -122,6 +121,4 @@ module Emjay
122
121
  end
123
122
  end
124
123
  end
125
-
126
- Registry.register(Components::MjAccordionElement)
127
124
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -118,6 +117,4 @@ module Emjay
118
117
  end
119
118
  end
120
119
  end
121
-
122
- Registry.register(Components::MjAccordionText)
123
120
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/conditional_tag"
6
5
 
7
6
  module Emjay
@@ -166,6 +165,4 @@ module Emjay
166
165
  end
167
166
  end
168
167
  end
169
-
170
- Registry.register(Components::MjAccordionTitle)
171
168
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -65,6 +64,4 @@ module Emjay
65
64
  end
66
65
  end
67
66
  end
68
-
69
- Registry.register(Components::MjBody)
70
67
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
 
7
6
  module Emjay
@@ -193,6 +192,4 @@ module Emjay
193
192
  end
194
193
  end
195
194
  end
196
-
197
- Registry.register(Components::MjButton)
198
195
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/conditional_tag"
6
5
  require_relative "../../helpers/gen_random_hex_string"
7
6
 
@@ -405,6 +404,4 @@ module Emjay
405
404
  end
406
405
  end
407
406
  end
408
-
409
- Registry.register(Components::MjCarousel)
410
407
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/suffix_css_classes"
6
5
 
7
6
  module Emjay
@@ -183,6 +182,4 @@ module Emjay
183
182
  end
184
183
  end
185
184
  end
186
-
187
- Registry.register(Components::MjCarouselImage)
188
185
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
 
7
6
  module Emjay
@@ -250,7 +249,7 @@ module Emjay
250
249
  if unit == "px"
251
250
  floor_width = reduced.floor
252
251
  fractional = reduced - floor_width
253
- extra = [0, [sibling, (sibling * fractional).round].min].max
252
+ extra = (sibling * fractional).round.clamp(0, sibling)
254
253
  {parsed_width: floor_width + ((index < extra) ? 1 : 0), unit: unit}
255
254
  else
256
255
  {parsed_width: reduced, unit: unit}
@@ -425,6 +424,4 @@ module Emjay
425
424
  end
426
425
  end
427
426
  end
428
-
429
- Registry.register(Components::MjColumn)
430
427
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
 
7
6
  module Emjay
@@ -115,6 +114,4 @@ module Emjay
115
114
  end
116
115
  end
117
116
  end
118
-
119
- Registry.register(Components::MjDivider)
120
117
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
 
7
6
  module Emjay
@@ -191,6 +190,4 @@ module Emjay
191
190
  end
192
191
  end
193
192
  end
194
-
195
- Registry.register(Components::MjGroup)
196
193
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
 
7
6
  module Emjay
@@ -377,6 +376,4 @@ module Emjay
377
376
  end
378
377
  end
379
378
  end
380
-
381
- Registry.register(Components::MjHero)
382
379
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
  require_relative "../../helpers/make_lower_breakpoint"
7
6
 
@@ -183,6 +182,4 @@ module Emjay
183
182
  end
184
183
  end
185
184
  end
186
-
187
- Registry.register(Components::MjImage)
188
185
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/conditional_tag"
6
5
  require_relative "../../helpers/make_lower_breakpoint"
7
6
  require_relative "../../helpers/gen_random_hex_string"
@@ -182,6 +181,4 @@ module Emjay
182
181
  end
183
182
  end
184
183
  end
185
-
186
- Registry.register(Components::MjNavbar)
187
184
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/conditional_tag"
6
5
  require_relative "../../helpers/suffix_css_classes"
7
6
 
@@ -124,6 +123,4 @@ module Emjay
124
123
  end
125
124
  end
126
125
  end
127
-
128
- Registry.register(Components::MjNavbarLink)
129
126
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -29,6 +28,4 @@ module Emjay
29
28
  end
30
29
  end
31
30
  end
32
-
33
- Registry.register(Components::MjRaw)
34
31
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/suffix_css_classes"
6
5
 
7
6
  module Emjay
@@ -440,6 +439,4 @@ module Emjay
440
439
  end
441
440
  end
442
441
  end
443
-
444
- Registry.register(Components::MjSection)
445
442
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -169,6 +168,4 @@ module Emjay
169
168
  end
170
169
  end
171
170
  end
172
-
173
- Registry.register(Components::MjSocial)
174
171
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -270,6 +269,4 @@ module Emjay
270
269
  end
271
270
  end
272
271
  end
273
-
274
- Registry.register(Components::MjSocialElement)
275
272
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -52,6 +51,4 @@ module Emjay
52
51
  end
53
52
  end
54
53
  end
55
-
56
- Registry.register(Components::MjSpacer)
57
54
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/width_parser"
6
5
 
7
6
  module Emjay
@@ -108,6 +107,4 @@ module Emjay
108
107
  end
109
108
  end
110
109
  end
111
-
112
- Registry.register(Components::MjTable)
113
110
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../body_component"
4
- require_relative "../../registry"
5
4
  require_relative "../../helpers/conditional_tag"
6
5
 
7
6
  module Emjay
@@ -95,6 +94,4 @@ module Emjay
95
94
  end
96
95
  end
97
96
  end
98
-
99
- Registry.register(Components::MjText)
100
97
  end
@@ -51,6 +51,4 @@ module Emjay
51
51
  end
52
52
  end
53
53
  end
54
-
55
- Registry.register(Components::MjWrapper)
56
54
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -33,6 +32,4 @@ module Emjay
33
32
  end
34
33
  end
35
34
  end
36
-
37
- Registry.register(Components::MjAttributes)
38
35
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -23,6 +22,4 @@ module Emjay
23
22
  end
24
23
  end
25
24
  end
26
-
27
- Registry.register(Components::MjBreakpoint)
28
25
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -19,6 +18,4 @@ module Emjay
19
18
  end
20
19
  end
21
20
  end
22
-
23
- Registry.register(Components::MjFont)
24
21
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -15,6 +14,4 @@ module Emjay
15
14
  end
16
15
  end
17
16
  end
18
-
19
- Registry.register(Components::MjHead)
20
17
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -28,6 +27,4 @@ module Emjay
28
27
  end
29
28
  end
30
29
  end
31
-
32
- Registry.register(Components::MjHtmlAttributes)
33
30
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -19,6 +18,4 @@ module Emjay
19
18
  end
20
19
  end
21
20
  end
22
-
23
- Registry.register(Components::MjPreview)
24
21
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -29,6 +28,4 @@ module Emjay
29
28
  end
30
29
  end
31
30
  end
32
-
33
- Registry.register(Components::MjStyle)
34
31
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../head_component"
4
- require_relative "../../registry"
5
4
 
6
5
  module Emjay
7
6
  module Components
@@ -19,6 +18,4 @@ module Emjay
19
18
  end
20
19
  end
21
20
  end
22
-
23
- Registry.register(Components::MjTitle)
24
21
  end
data/lib/emjay/railtie.rb CHANGED
@@ -2,11 +2,21 @@
2
2
 
3
3
  module Emjay
4
4
  class Railtie < Rails::Railtie
5
- initializer "emjay.register_template_handler_and_interceptor" do
6
- ActiveSupport.on_load(:action_mailer) do
5
+ # Register the template handler on :action_view load, not :action_mailer.
6
+ # ActionView's FileSystemResolver builds its PathParser regex from the
7
+ # registered extensions on first template lookup; if ActionView loads
8
+ # before ActionMailer (e.g. a controller renders a view first), the
9
+ # regex is cached without :mjml and .html.mjml templates stay invisible
10
+ # for the rest of the process.
11
+ initializer "emjay.register_template_handler" do
12
+ ActiveSupport.on_load(:action_view) do
7
13
  require "emjay/rails/template_handler"
8
14
  ActionView::Template.register_template_handler(:mjml, Emjay::Rails::TemplateHandler)
15
+ end
16
+ end
9
17
 
18
+ initializer "emjay.register_mail_interceptor" do
19
+ ActiveSupport.on_load(:action_mailer) do
10
20
  require "emjay/rails/mail_interceptor"
11
21
  interceptor = Emjay::Rails::MailInterceptor
12
22
  ActionMailer::Base.register_interceptor(interceptor)
@@ -1,19 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Emjay
4
+ # Lazy autoloader for MJML components. Scans `lib/emjay/components/**/*.rb`
5
+ # once at load time, then derives both the MJML tag name and the Ruby class
6
+ # from each filename:
7
+ #
8
+ # components/body/mj_button.rb → tag "mj-button" → Emjay::Components::MjButton
9
+ #
10
+ # Files are `require`d and constants resolved on first `find`.
4
11
  module Registry
5
- @components = {}
12
+ class UnknownComponent < StandardError; end
6
13
 
7
- def self.register(component_class)
8
- @components[component_class.component_name] = component_class
9
- end
14
+ COMPONENTS_ROOT = File.expand_path("components", __dir__)
15
+
16
+ PATHS = Dir.glob("{head,body}/*.rb", base: COMPONENTS_ROOT).sort.each_with_object({}) do |rel, h|
17
+ basename = File.basename(rel, ".rb") # e.g. "mj_html_attributes"
18
+ tag = basename.tr("_", "-") # → "mj-html-attributes"
19
+ h[tag] = File.join(COMPONENTS_ROOT, rel)
20
+ end.freeze
21
+
22
+ @loaded = {}
23
+ @mutex = Mutex.new
10
24
 
11
25
  def self.find(tag_name)
12
- @components[tag_name]
26
+ @loaded[tag_name] ||= load_component(tag_name)
13
27
  end
14
28
 
15
29
  def self.components
16
- @components
30
+ @components ||= LazyComponents.new
31
+ end
32
+
33
+ # Kept for backwards compatibility with callers that eagerly register.
34
+ def self.register(component_class)
35
+ @loaded[component_class.component_name] = component_class
36
+ end
37
+
38
+ def self.load_component(tag_name)
39
+ path = PATHS[tag_name] or return nil
40
+ @mutex.synchronize do
41
+ return @loaded[tag_name] if @loaded[tag_name]
42
+ require path
43
+ const_name = File.basename(path, ".rb").split("_").map(&:capitalize).join
44
+ Emjay::Components.const_get(const_name)
45
+ end
46
+ end
47
+
48
+ # The renderer treats `Registry.components` as a hash keyed by tag name.
49
+ # This proxy resolves each lookup through `Registry.find` so components
50
+ # only load when actually referenced.
51
+ class LazyComponents
52
+ include Enumerable
53
+
54
+ def [](tag_name)
55
+ component = Registry.find(tag_name)
56
+ # We only reach here on render paths (never during parsing, which uses
57
+ # Registry.find directly and tolerates nil). If a tag looks like MJML
58
+ # but resolves to nothing, it's almost certainly a typo like
59
+ # `<mj-nonesuch>` — surface it instead of silently rendering blank.
60
+ if component.nil? && tag_name.to_s.start_with?("mj-")
61
+ raise UnknownComponent, "Unknown MJML component #{tag_name.inspect}"
62
+ end
63
+ component
64
+ end
65
+
66
+ def each
67
+ PATHS.each_key { |tag| yield tag, Registry.find(tag) }
68
+ end
69
+
70
+ def keys
71
+ PATHS.keys
72
+ end
73
+
74
+ def values
75
+ PATHS.each_key.map { |tag| Registry.find(tag) }
76
+ end
17
77
  end
18
78
  end
19
79
  end
@@ -185,9 +185,11 @@ module Emjay
185
185
 
186
186
  children = element.children.select(&:element?).map { |child| nokogiri_to_hash(child) }
187
187
 
188
- # For ending-tag components, content is the inner HTML
188
+ # For ending-tag components, content is the inner HTML. Only MJML tags
189
+ # can be components — plain HTML (e.g. <a>, <b> nested in mj-text) never
190
+ # is, so don't waste a Registry lookup on it.
189
191
  tag_name = element.name
190
- component_class = Registry.find(tag_name)
192
+ component_class = tag_name.start_with?("mj-") ? Registry.find(tag_name) : nil
191
193
  content = if component_class&.ending_tag?
192
194
  inner = element.inner_html.strip
193
195
  # Restore escaped bare < characters (from template syntax in mj-raw etc.)
data/lib/emjay/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Emjay
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/emjay.rb CHANGED
@@ -22,40 +22,7 @@ require_relative "emjay/helpers/styles"
22
22
  require_relative "emjay/helpers/make_lower_breakpoint"
23
23
  require_relative "emjay/helpers/gen_random_hex_string"
24
24
 
25
- # Head components
26
- require_relative "emjay/components/head/mj_head"
27
- require_relative "emjay/components/head/mj_attributes"
28
- require_relative "emjay/components/head/mj_style"
29
- require_relative "emjay/components/head/mj_font"
30
- require_relative "emjay/components/head/mj_title"
31
- require_relative "emjay/components/head/mj_preview"
32
- require_relative "emjay/components/head/mj_breakpoint"
33
- require_relative "emjay/components/head/mj_html_attributes"
34
-
35
- # Body components
36
- require_relative "emjay/components/body/mj_body"
37
- require_relative "emjay/components/body/mj_section"
38
- require_relative "emjay/components/body/mj_column"
39
- require_relative "emjay/components/body/mj_text"
40
- require_relative "emjay/components/body/mj_wrapper"
41
- require_relative "emjay/components/body/mj_group"
42
- require_relative "emjay/components/body/mj_image"
43
- require_relative "emjay/components/body/mj_button"
44
- require_relative "emjay/components/body/mj_divider"
45
- require_relative "emjay/components/body/mj_spacer"
46
- require_relative "emjay/components/body/mj_table"
47
- require_relative "emjay/components/body/mj_raw"
48
- require_relative "emjay/components/body/mj_hero"
49
- require_relative "emjay/components/body/mj_social"
50
- require_relative "emjay/components/body/mj_social_element"
51
- require_relative "emjay/components/body/mj_navbar"
52
- require_relative "emjay/components/body/mj_navbar_link"
53
- require_relative "emjay/components/body/mj_accordion"
54
- require_relative "emjay/components/body/mj_accordion_element"
55
- require_relative "emjay/components/body/mj_accordion_title"
56
- require_relative "emjay/components/body/mj_accordion_text"
57
- require_relative "emjay/components/body/mj_carousel"
58
- require_relative "emjay/components/body/mj_carousel_image"
25
+ # Components are autoloaded on demand via Emjay::Registry — see registry.rb.
59
26
 
60
27
  module Emjay
61
28
  def self.to_html(mjml_string, options = {})
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emjay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik Tarkhanov
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-08-19 00:00:00.000000000 Z
10
+ date: 2026-08-27 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: nokogiri