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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/core/bootstrap-email.scss +2 -0
- data/core/bootstrap-head.scss +89 -16
- data/core/scss/_selectors_for_utils.scss +24 -0
- data/core/scss/_utilities.scss +24 -4
- data/core/scss/components/_grid.scss +25 -17
- data/core/scss/components/_stack.scss +39 -0
- data/core/scss/utilities/_sizing.scss +21 -2
- data/core/scss/utilities/_typography.scss +4 -10
- data/core/scss/utilities/_valign.scss +5 -0
- data/core/templates/body.html +9 -0
- data/core/templates/{container.html.erb → container.html} +4 -4
- data/core/templates/div.html +3 -0
- data/core/templates/table-left.html +9 -0
- data/core/templates/table-to-tbody.html +5 -0
- data/core/templates/table-to-tr.html +7 -0
- data/core/templates/table.html +9 -0
- data/core/templates/td.html +3 -0
- data/core/templates/tr.html +5 -0
- data/lib/{bootstrap_email.rb → bootstrap-email.rb} +6 -3
- data/lib/bootstrap-email/bootstrap_email_cli.rb +6 -7
- data/lib/bootstrap-email/compiler.rb +50 -65
- data/lib/bootstrap-email/config.rb +50 -0
- data/lib/bootstrap-email/{components → converters}/alert.rb +1 -1
- data/lib/bootstrap-email/converters/align.rb +22 -0
- data/lib/bootstrap-email/{components → converters}/badge.rb +1 -1
- data/lib/bootstrap-email/converters/base.rb +63 -0
- data/lib/bootstrap-email/converters/block.rb +13 -0
- data/lib/bootstrap-email/converters/body.rb +10 -0
- data/lib/bootstrap-email/{components → converters}/button.rb +1 -1
- data/lib/bootstrap-email/{components → converters}/card.rb +3 -3
- data/lib/bootstrap-email/{components → converters}/color.rb +1 -1
- data/lib/bootstrap-email/{components → converters}/container.rb +1 -1
- data/lib/bootstrap-email/converters/force_encoding.rb +14 -0
- data/lib/bootstrap-email/converters/grid.rb +14 -0
- data/lib/bootstrap-email/converters/head_style.rb +33 -0
- data/lib/bootstrap-email/{components → converters}/hr.rb +2 -2
- data/lib/bootstrap-email/{components → converters}/margin.rb +3 -3
- data/lib/bootstrap-email/converters/padding.rb +16 -0
- data/lib/bootstrap-email/converters/paragraph.rb +13 -0
- data/lib/bootstrap-email/converters/preview_text.rb +18 -0
- data/lib/bootstrap-email/{components → converters}/spacer.rb +1 -1
- data/lib/bootstrap-email/{components → converters}/spacing.rb +5 -6
- data/lib/bootstrap-email/converters/stack.rb +30 -0
- data/lib/bootstrap-email/{components → converters}/table.rb +1 -1
- data/lib/bootstrap-email/converters/version_comment.rb +15 -0
- data/lib/bootstrap-email/erb.rb +9 -0
- data/lib/bootstrap-email/rails/action_mailer.rb +7 -2
- data/lib/bootstrap-email/sass_cache.rb +43 -26
- data/lib/bootstrap-email/setup.rb +27 -0
- metadata +44 -32
- data/core/templates/body.html.erb +0 -9
- data/core/templates/col.html.erb +0 -3
- data/core/templates/div.html.erb +0 -3
- data/core/templates/row.html.erb +0 -7
- data/core/templates/table-left.html.erb +0 -9
- data/core/templates/table.html.erb +0 -9
- data/lib/bootstrap-email/components/align.rb +0 -21
- data/lib/bootstrap-email/components/base.rb +0 -26
- data/lib/bootstrap-email/components/body.rb +0 -22
- data/lib/bootstrap-email/components/grid.rb +0 -14
- data/lib/bootstrap-email/components/padding.rb +0 -16
- data/lib/bootstrap-email/components/paragraph.rb +0 -24
- data/lib/bootstrap-email/initialize.rb +0 -1
@@ -1,12 +1,12 @@
|
|
1
1
|
module BootstrapEmail
|
2
|
-
module
|
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.
|
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.
|
9
|
+
node.replace(template('table', classes: node['class'], contents: node.inner_html))
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -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
|
2
|
+
module Converter
|
3
3
|
class Hr < Base
|
4
4
|
def build
|
5
5
|
each_node('hr') do |node|
|
6
|
-
default_margin =
|
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
|
2
|
+
module Converter
|
3
3
|
class Margin < Base
|
4
4
|
def build
|
5
|
-
each_node('*[class*=my-], *[class*=mt-], *[class*=mb-]
|
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,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 += ' ' * [(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,15 +1,14 @@
|
|
1
1
|
module BootstrapEmail
|
2
|
-
module
|
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()
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
@@ -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
|
@@ -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
|
-
|
6
|
-
|
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(
|
7
|
-
|
8
|
-
|
5
|
+
def self.compile(type, style: :compressed)
|
6
|
+
new(type, style).compile
|
7
|
+
end
|
9
8
|
|
10
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
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
|
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.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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/
|
94
|
-
- core/templates/
|
95
|
-
- core/templates/container.html
|
96
|
-
- core/templates/div.html
|
97
|
-
- core/templates/
|
98
|
-
- core/templates/table-
|
99
|
-
- core/templates/table.html
|
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/
|
103
|
-
- lib/bootstrap-email/
|
104
|
-
- lib/bootstrap-email/
|
105
|
-
- lib/bootstrap-email/
|
106
|
-
- lib/bootstrap-email/
|
107
|
-
- lib/bootstrap-email/
|
108
|
-
- lib/bootstrap-email/
|
109
|
-
- lib/bootstrap-email/
|
110
|
-
- lib/bootstrap-email/
|
111
|
-
- lib/bootstrap-email/
|
112
|
-
- lib/bootstrap-email/
|
113
|
-
- lib/bootstrap-email/
|
114
|
-
- lib/bootstrap-email/
|
115
|
-
- lib/bootstrap-email/
|
116
|
-
- lib/bootstrap-email/
|
117
|
-
- lib/bootstrap-email/
|
118
|
-
- lib/bootstrap-email/
|
119
|
-
- lib/bootstrap-email/
|
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
|