booties 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a66be60fe90b8f933b1069cd95547a3cf65c2aee
4
- data.tar.gz: d7aa68425b199de2861dd327db7b4df785181f37
3
+ metadata.gz: 26c9342f582bef04df2c91615687875cb6b1cc8e
4
+ data.tar.gz: ce82e3caf2e664fa0a2c3b0c70323948ad547e25
5
5
  SHA512:
6
- metadata.gz: bfc5aaa93a099d58ae25b1cdfe6a595615df279e36cb7d1b1abdace7099aeb56c12d96222d1b1fd92d6b95603f7f343eb51d9dbabd824d4b8628f1c0257aef94
7
- data.tar.gz: 17d92569754f99df5a0e8276a20905ff3d7069bba910a39d889bc35d1d6a882330851eee2209bd419d421e758d5e51d8534e85cb5999c4dc585f959933916ca4
6
+ metadata.gz: 695beda958a1627ba5bab7cf35c8305fce7990895931c6fc13ada1cf050af21043be34ab7a2f055f7ec88cefc99f7b8c75d63bdf27df59441dd01306258b7891
7
+ data.tar.gz: b223bdd46a3ce55f2a40b5b80e85aa46401f4e440756e24565518a1bb21220da81feb198ed95904dfa84201d7fae48b7fdbff2a63e58a2d89ea828bb983aa5d1
@@ -4,7 +4,9 @@ module Booties
4
4
 
5
5
  ##
6
6
  # Renders an ol tag with the "breadcrumb" class and fills it with the
7
- # content of the block. The following:
7
+ # content of the block.
8
+ #
9
+ # Example:
8
10
  #
9
11
  # <% breadcrumbs do %>
10
12
  # <li>Foo</li>
@@ -12,8 +14,6 @@ module Booties
12
14
  # <% end %>
13
15
  # <%= yield :breadcrumb %>
14
16
  #
15
- # will produce:
16
- #
17
17
  # <ol class="breadcrumb">
18
18
  # <li>Foo</li>
19
19
  # <li class="active">Bar</li>
@@ -3,43 +3,28 @@ module Booties
3
3
  include Utils
4
4
 
5
5
  ##
6
- # Renders a span tag with the "badge" class. The content of the tag is
7
- # passed in as +content+. The following:
6
+ # Renders a Bootstrap badge. The text inside the badge may passed in
7
+ # through +content+ or with a block. Additional HTML attributes may be
8
+ # passed in through the +options+ hash.
8
9
  #
9
- # <%= badge 'foo' %>
10
- #
11
- # will produce:
10
+ # Examples:
12
11
  #
12
+ # <%= badge 'foo' %>
13
13
  # <span class="badge">foo</span>
14
14
  #
15
- # Alternatively, you can pass the content in as a block. The following:
16
- #
17
- # <%= badge do %> foo <% end %>
18
- #
19
- # will produce:
20
- #
15
+ # <%= badge do %>
16
+ # foo
17
+ # <% end %>
21
18
  # <span class="badge">foo</span>
22
19
  #
23
- # Any options passed in through +options+ will be passed to #content_tag to
24
- # be added as attributes to the span tag. The following:
25
- #
26
20
  # <%= badge 'foo', id: 'bar' %>
27
- #
28
- # will produce:
29
- #
30
21
  # <span class="badge" id="bar">foo</span>
31
22
  #
32
- # If the +:class+ option is passed in, the contents will be merged with the
33
- # classes required by Bootstrap badges. The following:
34
- #
35
23
  # <%= badge 'foo', class: 'bar' %>
36
- #
37
- # will produce:
38
- #
39
24
  # <span class="badge bar">foo</span>
40
- def badge(content = nil, **options, &block)
41
- content ||= capture &block
42
- classes = merge_classes ['badge'], options.delete(:class)
25
+ def badge(content = nil, class: nil, **options, &block)
26
+ content ||= capture(&block) if block_given?
27
+ classes = merge_classes ['badge'], binding.local_variable_get(:class)
43
28
  content_tag :span, content, class: classes, **options
44
29
  end
45
30
  end
@@ -3,56 +3,33 @@ module Booties
3
3
  include Utils
4
4
 
5
5
  ##
6
- # Renders a span tag with the "label" class and a contextual label class
7
- # derived from +context+. Defaults to "label-default". The content of the
8
- # tag is passed in as +content+. The following:
6
+ # Renders a Bootstrap label. The label text may be passed in through
7
+ # +content+ or as a block. The +context+ keyword may be used to specify the
8
+ # label context; the default context is +:default+. Additional HTML
9
+ # attributes may be passed in through the +options+ hash.
9
10
  #
10
- # <%= flag 'foo' %>
11
- #
12
- # will produce:
11
+ # Examples:
13
12
  #
13
+ # <%= flag 'foo' %>
14
14
  # <span class="label label-default">foo</span>
15
15
  #
16
- # Alternatively, you can pass the content in as a block. The following:
17
- #
18
16
  # <%= flag do %>
19
17
  # foo
20
18
  # <% end %>
21
- #
22
- # will produce:
23
- #
24
19
  # <span class="label label-default">foo</span>
25
20
  #
26
- # You can provide a different context for the label as +context+. The
27
- # following:
28
- #
29
21
  # <%= flag 'foo', context: :primary %>
30
- #
31
- # will produce:
32
- #
33
22
  # <span class="label label-primary">foo</span>
34
23
  #
35
- # Additional options passed in through +options+ will be passed to
36
- # #content_tag to be added as attributes to the span tag. The following:
37
- #
38
24
  # <%= flag 'foo', id: 'bar' %>
39
- #
40
- # will produce:
41
- #
42
25
  # <span class="label label-default" id="bar">foo</span>
43
26
  #
44
- # If the +:class+ option is passed in the contents will be merged with the
45
- # classes required by Bootstrap labels. The following:
46
- #
47
27
  # <%= flag 'foo', class: 'bar' %>
48
- #
49
- # will produce:
50
- #
51
28
  # <span class="label label-default bar">foo</span>
52
- def flag(content = nil, context: :default, **options, &block)
53
- content ||= capture &block
29
+ def flag(content = nil, context: :default, class: nil, **options, &block)
30
+ content ||= capture(&block)
54
31
  classes = merge_classes %W[label label-#{context}],
55
- options.delete(:class)
32
+ binding.local_variable_get(:class)
56
33
  content_tag :span, content, class: classes, **options
57
34
  end
58
35
  end
@@ -8,6 +8,8 @@ module Booties
8
8
  # Booties::Modal will be yielded as a parameter to the block (similar to
9
9
  # the way a FormBuilder works in Rails).
10
10
  #
11
+ # Example:
12
+ #
11
13
  # <%= modal 'foo' do |m| %>
12
14
  # <%= m.header do %>
13
15
  # Nesciunt qui iste vel a.
@@ -27,8 +29,8 @@ module Booties
27
29
  # <% end %>
28
30
  # <% end %>
29
31
  # <% end %>
30
- def modal(id, fade: true, with: Modal, &block)
31
- with.new(self, id: id, fade: fade).render &block
32
+ def modal(id, fade: true, size: nil, with: Modal, **options, &block)
33
+ with.new(self, id: id, fade: fade, size: size).render(**options, &block)
32
34
  end
33
35
  end
34
36
  end
@@ -6,6 +6,8 @@ module Booties
6
6
  # in as a block. An instance of the Booties::Panel will be yielded as a
7
7
  # parameter to the block (similar to the way a FormBuilder works in Rails).
8
8
  #
9
+ # Example:
10
+ #
9
11
  # <%= panel do |p| %>
10
12
  # <%= p.heading do %>
11
13
  # <%= p.title 'Consequatur quibusdam quia vel et sed in.' %>
@@ -21,7 +23,7 @@ module Booties
21
23
  # <% end %>
22
24
  # <% end %>
23
25
  def panel(with: Panel, **options, &block)
24
- with.new(self, **options).render &block
26
+ with.new(self, **options).render(&block)
25
27
  end
26
28
  end
27
29
  end
@@ -0,0 +1,63 @@
1
+ module Booties
2
+ module PopoverHelper
3
+ include Utils
4
+
5
+ ##
6
+ # Generates a popover toggle. The text of the toggle is provided by +text+
7
+ # or else it is captured from +block+.
8
+ #
9
+ # The required parameter +content+ provides the main body of text for the
10
+ # popup. An optional title can be provided with the +title+ parameter. The
11
+ # +placement+ parameter can be used to control the placement of the window;
12
+ # valid placements are :left, :right, :top, and :bottom.
13
+ #
14
+ # The default behavior of the popover is to close when the user clicks the
15
+ # toggle a second time. If the +trigger+ option is passed in with a truthy
16
+ # value, the popover will instead close when the user clicks anywhere
17
+ # outside the toggle.
18
+ #
19
+ # The default output tag is an anchor (<A>), but you can use the +tag+
20
+ # parameter to use a different tag, e.g., :button to output a <BUTTON> tag.
21
+ #
22
+ # Any remaining options are passed through to #content_tag to be included
23
+ # as is.
24
+ #
25
+ # A caveat: Bootstrap popovers are opt-in. You must initialize them
26
+ # yourself. One way to do this is to include the following Javascript
27
+ # snippet on the page:
28
+ #
29
+ # $(function() {
30
+ # $('[data-toggler="popover"]').popover();
31
+ # }
32
+ #
33
+ # Examples:
34
+ #
35
+ # <%= popover 'Link text', content: 'Lorem ipsum dolor sit amet.' %>
36
+ # <a role="button" data-toggle="popover" data-content="Lorem ipsum dolor sit amet.">Link text</a>
37
+ #
38
+ # <%= popover tag: :button, content: 'Lorem ipsum dolor sit amet.', title: 'Lorem ipsum', placement: :top, trigger: 'focus', class: 'btn btn-default' do %>
39
+ # Link text
40
+ # <% end %>
41
+ # <button class="btn btn-default" type="button" data-toggle="popover" data-content="Lorem ipsum dolor sit amet." data-placement="top" data-container="body" data-trigger="focus" title="Lorem ipsum">Link text</button>
42
+ def popover(text = nil, tag: :a, content:, title: nil, placement: nil, trigger: nil, **html_options, &block)
43
+ data = { toggle: 'popover', content: content, }
44
+
45
+ if placement
46
+ validate_placement! placement
47
+ data[:placement] = placement
48
+ end
49
+
50
+ if trigger
51
+ data[:container] = 'body'
52
+ data[:trigger] = 'focus'
53
+ end
54
+
55
+ role_or_type = tag == :button ? :type : :role
56
+ html_options[role_or_type] ||= 'button'
57
+ html_options[:data] ||= {}
58
+ html_options[:data].update data
59
+
60
+ content_tag tag, text, **html_options, title: title, &block
61
+ end
62
+ end
63
+ end
@@ -1,10 +1,18 @@
1
1
  module Booties
2
2
  module TooltipHelper
3
+ include Utils
4
+
3
5
  ##
4
6
  # Wraps the content provided by +block+ with a Bootstrap tooltip. The text
5
- # of the tooltip is passed in through the required +title+ parameter. The
6
- # optional +placement+ parameter can be used to control alignment of the
7
- # tooltip. Valid placements are :top, :bottom, :left, and :right.
7
+ # of the tooltip is passed in through the required +title+ parameter.
8
+ #
9
+ # The optional +placement+ parameter can be used to control alignment of
10
+ # the tooltip. Valid placements are :top, :bottom, :left, and :right.
11
+ #
12
+ # The optional +wrapper_tag+ parameter can be used to specify an
13
+ # alternative container tag for the tooltip. (The default is to use a span
14
+ # tag.)
15
+ #
8
16
  # Additional paramters given in +options+ are passed through to
9
17
  # #content_tag to be placed on the resulting tag.
10
18
  #
@@ -12,37 +20,35 @@ module Booties
12
20
  # yourself. One way to do this is to include the following Javascript
13
21
  # snippet on the page:
14
22
  #
15
- # $(function() { $('[data-toggle="tooltip"]').tooltip() }
23
+ # $(function() {
24
+ # $('[data-toggle="tooltip"]').tooltip();
25
+ # }
16
26
  #
17
27
  # Examples:
18
28
  #
19
29
  # <%= tooltip title: 'This is a tooltip' do %>
20
30
  # This has a tooltip.
21
31
  # <% end %>
22
- #
23
32
  # <span data-toggle="tooltip" title="This is a tooltip">This has a tooltip.</span>
24
33
  #
25
34
  # <%= tooltip title: 'This is a tooltip', placement: :bottom %>
26
35
  # This has a tooltip.
27
36
  # <% end %>
28
- #
29
37
  # <span data-toggle="tooltip" data-placement="bottom" title="This is a tooltip">This has a tooltip.</span>
30
38
  #
31
39
  # <%= tooltip title: 'This is a tooltip', class: 'tooltip' %>
32
40
  # This has a tooltip.
33
41
  # <% end %>
34
- #
35
42
  # <span data-toggle="tooltip" title="This is a tooltip" class="tooltip">This has a tooltip.</span>
36
- def tooltip(title:, placement: nil, **options, &block)
37
- unless [nil, :top, :bottom, :right, :left].include? placement
38
- raise ArgumentError, "invalid placement: #{placement.inspect}," \
39
- ' valid placements are: :top, :bottom, :right, :left'
40
- end
43
+ def tooltip(title:, placement: nil, wrapper_tag: :span, **options, &block)
44
+ data = { toggle: 'tooltip', }
41
45
 
42
- data = { toggle: 'tooltip' }
43
- data[:placement] = placement if placement
46
+ if placement
47
+ validate_placement! placement
48
+ data[:placement] = placement
49
+ end
44
50
 
45
- content_tag :span, data: data, title: title, **options, &block
51
+ content_tag wrapper_tag, data: data, title: title, **options, &block
46
52
  end
47
53
  end
48
54
  end
@@ -2,20 +2,23 @@ require 'forwardable'
2
2
 
3
3
  module Booties
4
4
  class Modal
5
+ include Utils
5
6
  extend Forwardable
6
7
 
8
+ DEFAULT_DISMISSAL = '&times;'.freeze
9
+ MODAL_SIZE = { small: 'modal-sm', large: 'modal-lg' }.freeze
10
+
7
11
  ##
8
12
  # Instantiates a new Modal. Several helper methods like #content_tag will
9
13
  # be delegated to +view_context+. The required keyword +id+ will be used as
10
14
  # the DOM ID of the modal element. By default, the modal will exhibit
11
15
  # fading behavior, but this can be disabled by setting +fade+ to a falsey
12
16
  # value.
13
- #
14
- # TODO: Pass additional arguments as attributes to top-level div.
15
- def initialize(view_context, id:, fade: true)
17
+ def initialize(view_context, id:, fade: true, size: nil)
16
18
  @view_context = view_context
17
19
  @id = id
18
20
  @fade = fade ? 'fade' : nil
21
+ @size = MODAL_SIZE[size]
19
22
  end
20
23
 
21
24
  def_delegators :@view_context, :button_tag, :capture, :content_tag,
@@ -25,9 +28,10 @@ module Booties
25
28
  # Renders the top-level div for the modal dialog. +block+ is passed to
26
29
  # #dialog to fill in the content of the modal. +@id+ is used as the DOM ID
27
30
  # of the modal. +@fade+ is used to include or exclude fading behavior.
28
- def render(&block)
29
- content_tag :div, class: ['modal', @fade], id: @id do
30
- dialog &block
31
+ def render(**options, &block)
32
+ classes = merge_classes ['modal', @fade], options.delete(:class)
33
+ content_tag :div, class: classes, id: @id, **options do
34
+ dialog(&block)
31
35
  end
32
36
  end
33
37
 
@@ -35,8 +39,8 @@ module Booties
35
39
  # Renders the dialog section of the modal. +block+ is passed to #content to
36
40
  # fill in the content of the dialog.
37
41
  def dialog(&block)
38
- content_tag :div, class: 'modal-dialog' do
39
- content &block
42
+ content_tag :div, class: ['modal-dialog', @size] do
43
+ content(&block)
40
44
  end
41
45
  end
42
46
 
@@ -51,17 +55,26 @@ module Booties
51
55
  end
52
56
 
53
57
  ##
54
- # Renders the header section of a modal. +block+ is passed to #title to
55
- # render the title. In addition to the title, a dismissal button will be
56
- # rendered. The content of the dismissal button is localized. It will look
57
- # for +booties.modal.dismiss_html+. If that translation does not exist it
58
- # will look for +booties.modal.dismiss+. If that does not exist either, it
59
- # will default to the HTML times entity +&times;+.
60
- def header(&block)
61
- dismissal = t :'booties.modal.dismiss_html',
62
- default: [:'booties.modal.dismiss', raw('&times;')]
58
+ # Renders the header section of a modal.
59
+ #
60
+ # +block+ will be passed to #title to generate the title portion included
61
+ # within the header.
62
+ #
63
+ # If +close+ is truthy, a dismissal button will be rendered within the
64
+ # header as well. The default is +true+. The default dismissal is a
65
+ # +&times;+ symbol, but this can be customized by adding a translation for
66
+ # +booties.modal.dismiss_html+ or +booties.modal.dismiss+.
67
+
68
+ # TODO: rename +close+ option to +dismissible+?
69
+ def header(close: true, &block)
63
70
  content_tag :div, class: 'modal-header' do
64
- dismiss(dismissal) << title(&block)
71
+ if close
72
+ dismissal = t :'booties.modal.dismiss_html',
73
+ default: [:'booties.modal.dismiss', raw(DEFAULT_DISMISSAL)]
74
+ dismiss(dismissal) << title(&block)
75
+ else
76
+ title(&block)
77
+ end
65
78
  end
66
79
  end
67
80
 
@@ -85,7 +98,7 @@ module Booties
85
98
  #
86
99
  # #title is called automatically from #header.
87
100
  def title(content = nil, &block)
88
- content ||= capture &block
101
+ content ||= capture(&block)
89
102
  content_tag :h4, content, class: 'modal-title'
90
103
  end
91
104
 
@@ -95,7 +108,7 @@ module Booties
95
108
  # +block+. Additional HTML attributes for the button can be passed in
96
109
  # through +options+.
97
110
  def dismiss(content = nil, **options, &block)
98
- content ||= capture &block
111
+ content ||= capture(&block)
99
112
  options[:class] ||= 'close'
100
113
  options.update data: { dismiss: 'modal' }, type: 'button'
101
114
  button_tag content, options
@@ -5,15 +5,32 @@ module Booties
5
5
  include Utils
6
6
  extend Forwardable
7
7
 
8
+ CSS_CLASSES = {
9
+ heading: 'panel-heading'.freeze,
10
+ title: 'panel-title'.freeze,
11
+ body: 'panel-body'.freeze,
12
+ footer: 'panel-footer'.freeze,
13
+ }
14
+
8
15
  ##
9
16
  # Instantiates a new Panel. Several helper methods like #content_tag will
10
- # be delegated to +view_context+. The optional +context+ argument can be
11
- # passed in to specify the panel context. +context+ defaults to +:default+.
17
+ # be delegated to +view_context+.
18
+ #
19
+ # The optional +context+ argument can be passed in to specify the panel
20
+ # context; otherwise, the context +:default+ is used.
21
+ #
22
+ # The default behavior is to use a +div+ tag for to top-level panel
23
+ # container, but you may specify a different tag using the +wrapper_tag+
24
+ # keyword. (There are no guarantees on whether or not other tags will work
25
+ # correctly with Bootstrap panels.
26
+ #
12
27
  # Any additional options will be included as attributes on the top-level
13
- # panel div.
14
- def initialize(view_context, context: :default, **options)
28
+ # panel container.
29
+ def initialize(view_context, context: :default, wrapper_tag: 'div', **options)
15
30
  @view_context = view_context
31
+ @wrapper_tag = wrapper_tag
16
32
  @context = context
33
+ # TODO: pass options to #render instead of constructor
17
34
  @options = options
18
35
  end
19
36
 
@@ -25,43 +42,58 @@ module Booties
25
42
  # object will be passed as a parameter to +block+.
26
43
  def render(&block)
27
44
  options = @options.dup
28
- classes = merge_classes %W[panel panel-#@context],
29
- options.delete(:class)
30
- content_tag :div, class: classes, **options do
45
+ classes = merge_classes %W[panel panel-#@context], options.delete(:class)
46
+ content_tag @wrapper_tag, class: classes, **options do
31
47
  capture self, &block
32
48
  end
33
49
  end
34
50
 
35
51
  ##
36
52
  # Renders the panel heading. The content of the heading can be passed in
37
- # through the +content+ parameter or as a block.
38
- def heading(content = nil, &block)
39
- content ||= capture &block
40
- content_tag :div, content, class: 'panel-heading'
53
+ # through the +content+ parameter or as a block. If +class+ is given, it
54
+ # will be merged with the required panel heading class. Additional keyword
55
+ # arguments will be passed as an options Hash to #content_tag.
56
+ def heading(content = nil, class: nil, **options, &block)
57
+ content ||= capture(&block)
58
+ classes = merge_classes CSS_CLASSES[:heading],
59
+ binding.local_variable_get(:class)
60
+ content_tag :div, content, class: classes, **options
41
61
  end
42
62
 
43
63
  ##
44
64
  # Renders the panel title. The content of the title can be passed in
45
- # through the +content+ paramter or as a block.
46
- def title(content = nil, &block)
47
- content ||= capture &block
48
- content_tag :h3, content, class: 'panel-title'
65
+ # through the +content+ paramter or as a block. If +class+ is given, it
66
+ # will be merged with the required panel title class. Additional keyword
67
+ # arguments will be passed as an options Hash to #content_tag.
68
+ def title(content = nil, class: nil, **options, &block)
69
+ content ||= capture(&block)
70
+ classes = merge_classes CSS_CLASSES[:title],
71
+ binding.local_variable_get(:class)
72
+ content_tag :h3, content, class: classes, **options
49
73
  end
50
74
 
51
75
  ##
52
76
  # Renders the panel body. The content of the body can be passed in through
53
- # the +content+ parameter or as a block.
54
- def body(content = nil, &block)
55
- content ||= capture &block
56
- content_tag :div, content, class: 'panel-body'
77
+ # the +content+ parameter or as a block. If +class+ is given, it will be
78
+ # merged with the required panel body class. Additional keyword arguments
79
+ # will be passed as an options Hash to #content_tag.
80
+ def body(content = nil, class: nil, **options, &block)
81
+ content ||= capture(&block)
82
+ classes = merge_classes CSS_CLASSES[:body],
83
+ binding.local_variable_get(:class)
84
+ content_tag :div, content, class: classes, **options
57
85
  end
58
86
 
59
87
  ##
60
88
  # Renders the panel footer. The content of the footer can be passed in
61
- # through the +content+ parameter or as a block.
62
- def footer(content = nil, &block)
63
- content ||= capture &block
64
- content_tag :div, content, class: 'panel-footer'
89
+ # through the +content+ parameter or as a block. If +class+ is given, it
90
+ # will be merged with the required panel footer class. Additional keyword
91
+ # arguments will be passed as an options Hash to #content_tag.
92
+ def footer(content = nil, class: nil, **options, &block)
93
+ content ||= capture(&block)
94
+ classes = merge_classes CSS_CLASSES[:footer],
95
+ binding.local_variable_get(:class)
96
+ content_tag :div, content, class: classes, **options
65
97
  end
66
98
  end
67
99
  end