bootstrap-email 1.0.0.alpha1.2 → 1.0.0.alpha4

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/core/bootstrap-email.scss +2 -0
  4. data/core/bootstrap-head.scss +89 -16
  5. data/core/scss/_selectors_for_utils.scss +24 -0
  6. data/core/scss/_utilities.scss +24 -4
  7. data/core/scss/components/_grid.scss +25 -17
  8. data/core/scss/components/_stack.scss +39 -0
  9. data/core/scss/utilities/_sizing.scss +21 -2
  10. data/core/scss/utilities/_typography.scss +4 -10
  11. data/core/scss/utilities/_valign.scss +5 -0
  12. data/core/templates/body.html +9 -0
  13. data/core/templates/{container.html.erb → container.html} +4 -4
  14. data/core/templates/div.html +3 -0
  15. data/core/templates/table-left.html +9 -0
  16. data/core/templates/table-to-tbody.html +5 -0
  17. data/core/templates/table-to-tr.html +7 -0
  18. data/core/templates/table.html +9 -0
  19. data/core/templates/td.html +3 -0
  20. data/core/templates/tr.html +5 -0
  21. data/lib/{bootstrap_email.rb → bootstrap-email.rb} +6 -3
  22. data/lib/bootstrap-email/bootstrap_email_cli.rb +6 -7
  23. data/lib/bootstrap-email/compiler.rb +50 -65
  24. data/lib/bootstrap-email/config.rb +50 -0
  25. data/lib/bootstrap-email/{components → converters}/alert.rb +1 -1
  26. data/lib/bootstrap-email/converters/align.rb +22 -0
  27. data/lib/bootstrap-email/{components → converters}/badge.rb +1 -1
  28. data/lib/bootstrap-email/converters/base.rb +63 -0
  29. data/lib/bootstrap-email/converters/block.rb +13 -0
  30. data/lib/bootstrap-email/converters/body.rb +10 -0
  31. data/lib/bootstrap-email/{components → converters}/button.rb +1 -1
  32. data/lib/bootstrap-email/{components → converters}/card.rb +3 -3
  33. data/lib/bootstrap-email/{components → converters}/color.rb +1 -1
  34. data/lib/bootstrap-email/{components → converters}/container.rb +1 -1
  35. data/lib/bootstrap-email/converters/force_encoding.rb +14 -0
  36. data/lib/bootstrap-email/converters/grid.rb +14 -0
  37. data/lib/bootstrap-email/converters/head_style.rb +33 -0
  38. data/lib/bootstrap-email/{components → converters}/hr.rb +2 -2
  39. data/lib/bootstrap-email/{components → converters}/margin.rb +3 -3
  40. data/lib/bootstrap-email/converters/padding.rb +16 -0
  41. data/lib/bootstrap-email/converters/paragraph.rb +13 -0
  42. data/lib/bootstrap-email/converters/preview_text.rb +18 -0
  43. data/lib/bootstrap-email/{components → converters}/spacer.rb +1 -1
  44. data/lib/bootstrap-email/{components → converters}/spacing.rb +5 -6
  45. data/lib/bootstrap-email/converters/stack.rb +30 -0
  46. data/lib/bootstrap-email/{components → converters}/table.rb +1 -1
  47. data/lib/bootstrap-email/converters/version_comment.rb +15 -0
  48. data/lib/bootstrap-email/erb.rb +9 -0
  49. data/lib/bootstrap-email/rails/action_mailer.rb +7 -2
  50. data/lib/bootstrap-email/sass_cache.rb +43 -26
  51. data/lib/bootstrap-email/setup.rb +27 -0
  52. metadata +44 -32
  53. data/core/templates/body.html.erb +0 -9
  54. data/core/templates/col.html.erb +0 -3
  55. data/core/templates/div.html.erb +0 -3
  56. data/core/templates/row.html.erb +0 -7
  57. data/core/templates/table-left.html.erb +0 -9
  58. data/core/templates/table.html.erb +0 -9
  59. data/lib/bootstrap-email/components/align.rb +0 -21
  60. data/lib/bootstrap-email/components/base.rb +0 -26
  61. data/lib/bootstrap-email/components/body.rb +0 -22
  62. data/lib/bootstrap-email/components/grid.rb +0 -14
  63. data/lib/bootstrap-email/components/padding.rb +0 -16
  64. data/lib/bootstrap-email/components/paragraph.rb +0 -24
  65. data/lib/bootstrap-email/initialize.rb +0 -1
@@ -0,0 +1,10 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class Body < Base
4
+ def build
5
+ body = doc.at_css('body')
6
+ body.inner_html = template('body', classes: "#{body['class']} body", contents: body.inner_html)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Button < Base
4
4
  def build
5
5
  each_node('.btn') do |node|
@@ -1,12 +1,12 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Card < Base
4
4
  def build
5
5
  each_node('.card') do |node|
6
- node.replace(template('table', classes: node['class'], contents: node.delete('class') && node.inner_html))
6
+ node.replace(template('table', classes: node['class'], contents: node.inner_html))
7
7
  end
8
8
  each_node('.card-body') do |node|
9
- node.replace(template('table', classes: node['class'], contents: node.delete('class') && node.inner_html))
9
+ node.replace(template('table', classes: node['class'], contents: node.inner_html))
10
10
  end
11
11
  end
12
12
  end
@@ -1,5 +1,5 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Color < Base
4
4
  def build
5
5
  each_node('*[class*=bg-]') do |node|
@@ -1,5 +1,5 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Container < Base
4
4
  def build
5
5
  each_node('.container') do |node|
@@ -0,0 +1,14 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class ForceEncoding < Base
4
+ def self.replace(html)
5
+ # force utf-8 character encoded in iOS Mail: https://github.com/bootstrap-email/bootstrap-email/issues/50
6
+ # this needs to be done after the document has been outputted to a ascii string so it doesn't get converted
7
+ html.sub(
8
+ '<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">',
9
+ '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
10
+ )
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class Grid < Base
4
+ def build
5
+ each_node('.row') do |node|
6
+ node.replace(template('div', classes: node['class'], contents: template('table-to-tr', contents: node.inner_html)))
7
+ end
8
+ each_node('*[class*=col]') do |node|
9
+ node.replace(template('td', classes: node['class'], contents: node.inner_html))
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class HeadStyle < Base
4
+ def build
5
+ doc.at_css('head').add_child(bootstrap_email_head)
6
+ end
7
+
8
+ private
9
+
10
+ def bootstrap_email_head
11
+ html_string = <<-INLINE
12
+ <style type="text/css">
13
+ #{purged_css_from_head}
14
+ </style>
15
+ INLINE
16
+ html_string
17
+ end
18
+
19
+ def purged_css_from_head
20
+ default, custom = BootstrapEmail::SassCache.compile('bootstrap-head').split('/*! allow_purge_after */')
21
+ # get each CSS declaration
22
+ custom.scan(/\w*\.[\w\-]*[\s\S\n]+?(?=})}{1}/).each do |group|
23
+ # get the first class for each comma separated CSS declaration
24
+ exist = group.scan(/(\.[\w\-]*).*?((,+?)|{+?)/).map(&:first).uniq.any? do |selector|
25
+ !doc.at_css(selector).nil?
26
+ end
27
+ custom.sub!(group, '') unless exist
28
+ end
29
+ (default + custom).gsub(/\n\s*\n+/, "\n")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,9 +1,9 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Hr < Base
4
4
  def build
5
5
  each_node('hr') do |node|
6
- default_margin = node['class'].to_s.match?(/m[tby]{1}-(lg-)?\d+/) ? '' : 'my-5'
6
+ default_margin = margin?(node) ? '' : 'my-5'
7
7
  node.replace(template('table', classes: "#{default_margin} hr #{node['class']}", contents: ''))
8
8
  end
9
9
  end
@@ -1,11 +1,11 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Margin < Base
4
4
  def build
5
- each_node('*[class*=my-], *[class*=mt-], *[class*=mb-]') do |node|
5
+ each_node("*[class^='my-'], *[class^='mt-'], *[class^='mb-'], *[class*=' my-'], *[class*=' mt-'], *[class*=' mb-']") do |node|
6
6
  top_class = node['class'][/m[ty]{1}-(lg-)?(\d+)/]
7
7
  bottom_class = node['class'][/m[by]{1}-(lg-)?(\d+)/]
8
- node['class'] = node['class'].gsub(/(m[tby]{1}-(lg-)?\d+)/, '')
8
+ node['class'] = node['class'].gsub(/(m[tby]{1}-(lg-)?\d+)/, '').strip
9
9
  html = ''
10
10
  if top_class
11
11
  html += template('div', classes: "s-#{top_class.gsub(/m[ty]{1}-/, '')}", contents: nil)
@@ -0,0 +1,16 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class Padding < Base
4
+ def build
5
+ each_node("*[class^=p-], *[class^=pt-], *[class^=pr-], *[class^=pb-], *[class^=pl-], *[class^=px-], *[class^=py-], *[class*=' p-'], *[class*=' pt-'], *[class*=' pr-'], *[class*=' pb-'], *[class*=' pl-'], *[class*=' px-'], *[class*=' py-']") do |node|
6
+ next if ['table', 'td', 'a'].include?(node.name)
7
+
8
+ padding_regex = /(p[trblxy]?-(lg-)?\d+)/
9
+ classes = node['class'].gsub(padding_regex).to_a.join(' ')
10
+ node['class'] = node['class'].gsub(padding_regex, '').strip
11
+ node.replace(template('table', classes: classes, contents: node.to_html))
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class Paragraph < Base
4
+ def build
5
+ each_node('p') do |node|
6
+ next if margin?(node)
7
+
8
+ add_class(node, 'mb-4')
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class PreviewText < Base
4
+ def build
5
+ preview_node = doc.at_css('preview')
6
+ return if preview_node.nil?
7
+
8
+ # apply spacing after the text max of 100 characters so it doesn't show body text
9
+ preview_node.inner_html += '&nbsp;' * [(100 - preview_node.content.length.to_i), 0].max
10
+ node = template('div', classes: 'preview', contents: preview_node.content)
11
+ preview_node.remove
12
+
13
+ body = doc.at_css('body')
14
+ body.prepend_child(node)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,5 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Spacer < Base
4
4
  def build
5
5
  each_node('*[class*=s-]') do |node|
@@ -1,15 +1,14 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Spacing < Base
4
4
  def build
5
5
  each_node('*[class*=space-y-]') do |node|
6
6
  spacer = node['class'].scan(/space-y-((lg-)?\d+)/)[0][0]
7
7
  # get all direct children except the first
8
- node.xpath('./*[position()>1] | ./tbody/tr/td/*[position()>1]').each do |child|
9
- html = ''
10
- html += template('div', classes: "s-#{spacer}", contents: nil)
11
- html += child.to_html
12
- child.replace(html)
8
+ node.xpath('./*[position() < last()] | ./tbody/tr/td/*[position() < last()]').each do |child|
9
+ next if margin_bottom?(child)
10
+
11
+ add_class(child, "mb-#{spacer}")
13
12
  end
14
13
  end
15
14
  end
@@ -0,0 +1,30 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class Stack < Base
4
+ def build
5
+ stack_row
6
+ stack_col
7
+ end
8
+
9
+ def stack_row
10
+ each_node('.stack-row') do |node|
11
+ html = ''
12
+ node.xpath('./*').each do |child|
13
+ html += template('td', classes: 'stack-cell', contents: child.to_html)
14
+ end
15
+ node.replace(template('table-to-tr', classes: node['class'], contents: html))
16
+ end
17
+ end
18
+
19
+ def stack_col
20
+ each_node('.stack-col') do |node|
21
+ html = ''
22
+ node.xpath('./*').each do |child|
23
+ html += template('tr', classes: 'stack-cell', contents: child.to_html)
24
+ end
25
+ node.replace(template('table-to-tbody', classes: node['class'], contents: html))
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  module BootstrapEmail
2
- module Component
2
+ module Converter
3
3
  class Table < Base
4
4
  def build
5
5
  each_node('table') do |node|
@@ -0,0 +1,15 @@
1
+ module BootstrapEmail
2
+ module Converter
3
+ class VersionComment < Base
4
+ def build
5
+ doc.at_css('head').prepend_child(bootstrap_email_comment)
6
+ end
7
+
8
+ private
9
+
10
+ def bootstrap_email_comment
11
+ "\n <!-- Compiled with Bootstrap Email version: #{BootstrapEmail::VERSION} -->"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module BootstrapEmail
2
+ class Erb
3
+ def self.template(path, locals_hash = {})
4
+ namespace = OpenStruct.new(locals_hash)
5
+ template_html = File.read(path)
6
+ ERB.new(template_html).result(namespace.instance_eval { binding })
7
+ end
8
+ end
9
+ end
@@ -2,9 +2,14 @@ ActiveSupport.on_load(:action_mailer, {yield: true}) do |action_mailer|
2
2
  action_mailer.class_eval do # To support Rails less than 6
3
3
  # sit in the middle and compile the html
4
4
  def bootstrap_mail(*args, &block)
5
- bootstrap = BootstrapEmail::Compiler.new(mail(*args, &block), type: :rails)
6
- bootstrap.perform_full_compile
5
+ mail_message = mail(*args, &block)
6
+ # if you override the #mail method in you ApplicationMailer you may intentionally return something other than a mail message
7
+ if mail_message
8
+ bootstrap = BootstrapEmail::Compiler.new(mail_message, type: :rails)
9
+ bootstrap.perform_full_compile
10
+ end
7
11
  end
12
+ alias bootstrap_email bootstrap_mail
8
13
  alias make_bootstrap_mail bootstrap_mail
9
14
  end
10
15
  end
@@ -1,38 +1,45 @@
1
1
  module BootstrapEmail
2
2
  class SassCache
3
- CACHE_DIR = File.expand_path('../../.sass-cache', __dir__)
4
3
  SASS_DIR = File.expand_path('../../core', __dir__)
5
4
 
6
- def self.compile(name, config_path: nil, style: :compressed)
7
- path = "#{SASS_DIR}/#{name}"
8
- config_file = nil
5
+ def self.compile(type, style: :compressed)
6
+ new(type, style).compile
7
+ end
9
8
 
10
- lookup_locations = ["#{name}.config.scss", "app/assets/stylesheets/#{name}.config.scss"]
11
- locations = lookup_locations.select { |location| File.exist?(File.expand_path(location, Dir.pwd)) }
9
+ attr_accessor :type, :style, :file_path, :config_file, :checksum
12
10
 
13
- if config_path && File.exist?(config_path)
14
- # check if custom config was passed in
15
- config_file = File.read(config_path)
16
- elsif locations.any?
17
- config_file = File.read(File.expand_path(locations.first, Dir.pwd))
18
- end
11
+ def initialize(type, style)
12
+ self.type = type
13
+ self.style = style
14
+ self.file_path = "#{SASS_DIR}/#{type}"
15
+ self.config_file = load_config
16
+ self.checksum = checksum_files
17
+ end
19
18
 
20
- check = checksum(config_file&.gsub("//= @import #{name};", "@import '#{path}';"))
21
- cache_path = "#{CACHE_DIR}/#{check}/#{name}.css"
22
- if cached?(cache_path)
23
- File.read(cache_path)
24
- else
25
- file = config_file.nil? ? File.read("#{path}.scss") : config_file
26
- SassC::Engine.new(file, style: style).render.tap do |css|
27
- Dir.mkdir(CACHE_DIR) unless File.directory?(CACHE_DIR)
28
- Dir.mkdir("#{CACHE_DIR}/#{check}") unless File.directory?("#{CACHE_DIR}/#{check}")
29
- File.write(cache_path, css)
30
- puts "New css file cached for #{name}"
31
- end
19
+ def cache_dir
20
+ BootstrapEmail.config.sass_cache_location
21
+ end
22
+
23
+ def compile
24
+ cache_path = "#{cache_dir}/#{checksum}/#{type}.css"
25
+ unless cached?(cache_path)
26
+ compile_and_cache_scss(cache_path)
32
27
  end
28
+ File.read(cache_path)
33
29
  end
34
30
 
35
- def self.checksum(config_file)
31
+ private
32
+
33
+ def load_config
34
+ path = BootstrapEmail.config.sass_location_for(type: type)
35
+ replace_config(File.read(path)) if path
36
+ end
37
+
38
+ def replace_config(config_file)
39
+ config_file.gsub("//= @import #{type};", "@import '#{file_path}';")
40
+ end
41
+
42
+ def checksum_files
36
43
  checksums = config_file.nil? ? [] : [Digest::SHA1.hexdigest(config_file)]
37
44
  Dir.glob('../../core/**/*.scss', base: __dir__).each do |path|
38
45
  checksums << Digest::SHA1.file(File.expand_path(path, __dir__)).hexdigest
@@ -40,8 +47,18 @@ module BootstrapEmail
40
47
  Digest::SHA1.hexdigest(checksums.join)
41
48
  end
42
49
 
43
- def self.cached?(cache_path)
50
+ def cached?(cache_path)
44
51
  File.file?(cache_path)
45
52
  end
53
+
54
+ def compile_and_cache_scss(cache_path)
55
+ file = config_file || File.read("#{file_path}.scss")
56
+ css = SassC::Engine.new(file, style: style).render
57
+ FileUtils.mkdir_p("#{cache_dir}/#{checksum}") unless File.directory?("#{cache_dir}/#{checksum}")
58
+ File.write(cache_path, css)
59
+ if BootstrapEmail.config.sass_log_enabled?
60
+ puts "New css file cached for #{type}"
61
+ end
62
+ end
46
63
  end
47
64
  end
@@ -0,0 +1,27 @@
1
+ module BootstrapEmail
2
+ class << self
3
+ def config
4
+ @config ||= BootstrapEmail::Config.new
5
+ @config
6
+ end
7
+
8
+ def load_options(options)
9
+ @config ||= BootstrapEmail::Config.new
10
+ @config.load_options(options)
11
+ @config
12
+ end
13
+
14
+ def configure(&proc)
15
+ @config ||= BootstrapEmail::Config.new
16
+ yield @config
17
+ end
18
+
19
+ def reset_config!
20
+ remove_instance_variable :@config if defined?(@config)
21
+ end
22
+
23
+ def clear_sass_cache!
24
+ FileUtils.rm_rf(BootstrapEmail.config.sass_cache_location)
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap-email
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha1.2
4
+ version: 1.0.0.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Yamartino
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-26 00:00:00.000000000 Z
11
+ date: 2021-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.14'
33
+ version: '1.7'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.14'
40
+ version: '1.7'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sassc
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.4'
47
+ version: '2.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.4'
54
+ version: '2.0'
55
55
  description:
56
56
  email: stu@stuyam.com
57
57
  executables:
@@ -80,6 +80,7 @@ files:
80
80
  - core/scss/components/_hr.scss
81
81
  - core/scss/components/_image.scss
82
82
  - core/scss/components/_preview.scss
83
+ - core/scss/components/_stack.scss
83
84
  - core/scss/components/_table.scss
84
85
  - core/scss/utilities/_background.scss
85
86
  - core/scss/utilities/_border-radius.scss
@@ -90,38 +91,49 @@ files:
90
91
  - core/scss/utilities/_spacing.scss
91
92
  - core/scss/utilities/_text-decoration.scss
92
93
  - core/scss/utilities/_typography.scss
93
- - core/templates/body.html.erb
94
- - core/templates/col.html.erb
95
- - core/templates/container.html.erb
96
- - core/templates/div.html.erb
97
- - core/templates/row.html.erb
98
- - core/templates/table-left.html.erb
99
- - core/templates/table.html.erb
94
+ - core/scss/utilities/_valign.scss
95
+ - core/templates/body.html
96
+ - core/templates/container.html
97
+ - core/templates/div.html
98
+ - core/templates/table-left.html
99
+ - core/templates/table-to-tbody.html
100
+ - core/templates/table-to-tr.html
101
+ - core/templates/table.html
102
+ - core/templates/td.html
103
+ - core/templates/tr.html
104
+ - lib/bootstrap-email.rb
100
105
  - lib/bootstrap-email/bootstrap_email_cli.rb
101
106
  - lib/bootstrap-email/compiler.rb
102
- - lib/bootstrap-email/components/alert.rb
103
- - lib/bootstrap-email/components/align.rb
104
- - lib/bootstrap-email/components/badge.rb
105
- - lib/bootstrap-email/components/base.rb
106
- - lib/bootstrap-email/components/body.rb
107
- - lib/bootstrap-email/components/button.rb
108
- - lib/bootstrap-email/components/card.rb
109
- - lib/bootstrap-email/components/color.rb
110
- - lib/bootstrap-email/components/container.rb
111
- - lib/bootstrap-email/components/grid.rb
112
- - lib/bootstrap-email/components/hr.rb
113
- - lib/bootstrap-email/components/margin.rb
114
- - lib/bootstrap-email/components/padding.rb
115
- - lib/bootstrap-email/components/paragraph.rb
116
- - lib/bootstrap-email/components/spacer.rb
117
- - lib/bootstrap-email/components/spacing.rb
118
- - lib/bootstrap-email/components/table.rb
119
- - lib/bootstrap-email/initialize.rb
107
+ - lib/bootstrap-email/config.rb
108
+ - lib/bootstrap-email/converters/alert.rb
109
+ - lib/bootstrap-email/converters/align.rb
110
+ - lib/bootstrap-email/converters/badge.rb
111
+ - lib/bootstrap-email/converters/base.rb
112
+ - lib/bootstrap-email/converters/block.rb
113
+ - lib/bootstrap-email/converters/body.rb
114
+ - lib/bootstrap-email/converters/button.rb
115
+ - lib/bootstrap-email/converters/card.rb
116
+ - lib/bootstrap-email/converters/color.rb
117
+ - lib/bootstrap-email/converters/container.rb
118
+ - lib/bootstrap-email/converters/force_encoding.rb
119
+ - lib/bootstrap-email/converters/grid.rb
120
+ - lib/bootstrap-email/converters/head_style.rb
121
+ - lib/bootstrap-email/converters/hr.rb
122
+ - lib/bootstrap-email/converters/margin.rb
123
+ - lib/bootstrap-email/converters/padding.rb
124
+ - lib/bootstrap-email/converters/paragraph.rb
125
+ - lib/bootstrap-email/converters/preview_text.rb
126
+ - lib/bootstrap-email/converters/spacer.rb
127
+ - lib/bootstrap-email/converters/spacing.rb
128
+ - lib/bootstrap-email/converters/stack.rb
129
+ - lib/bootstrap-email/converters/table.rb
130
+ - lib/bootstrap-email/converters/version_comment.rb
131
+ - lib/bootstrap-email/erb.rb
120
132
  - lib/bootstrap-email/rails/action_mailer.rb
121
133
  - lib/bootstrap-email/rails/engine.rb
122
134
  - lib/bootstrap-email/sass_cache.rb
135
+ - lib/bootstrap-email/setup.rb
123
136
  - lib/bootstrap-email/version.rb
124
- - lib/bootstrap_email.rb
125
137
  homepage: https://bootstrapemail.com
126
138
  licenses:
127
139
  - MIT