ultimate_turbo_modal 1.1.2 → 1.2.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
  SHA256:
3
- metadata.gz: af46e6d6c899d0fcf8054272b157d5e0f286e183e9c0b15c4e3b883df629d4f4
4
- data.tar.gz: 91a99b9b60ea2892b2c030027d073218b4d751dd155a0bb84420bc6e60db628e
3
+ metadata.gz: a456aa7e0fdb49a0b9ae53817f965df422145433f6d981811cbb0172126422dd
4
+ data.tar.gz: 4fdb91772d698e7d1987024acb165f1ef8380446d600c5146b834025cb84c497
5
5
  SHA512:
6
- metadata.gz: ccff10a4c4fee7a554c58632d9850507be533877333b0b8caadf2966fbc5244719f828fdb4507674668129c6bfebee1e7cb3e7a7fae5fc1b8238eae8fb5ea637
7
- data.tar.gz: d636a2425ce101e4339cec01573e6a29aea861f36328bf4e6a8cd3513ccfe9a5979b4fa424fa69320a809ff94f80f4e28d3f39bbc7f6f6d6426217191fe9ea4c
6
+ metadata.gz: 63ae9236655b7d2d300507413808a5771ca205dc12d08eecc48a3f256ddf24525f8b2b401a432a4df035d6fbd929c738e0a74c5bd1036a1f16b62b786ce756bb
7
+ data.tar.gz: d5fc098465cdba81f1981e49cce9721e049db78d02a448e734ea60f0c41b6119311a15e1ac922c7d0667d274431cb86bacaf9d3310c2ee51979f695cee3135ac
data/.rubocop.yml CHANGED
@@ -1,3 +1,6 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.2
3
+
1
4
  require:
2
5
  - standard
3
6
  inherit_gem:
data/CHANGELOG.md CHANGED
@@ -1,4 +1,13 @@
1
- ## [1.1.2] - 2023-11-01
1
+ ## [1.2.0] - 2023-11-05
2
+
3
+ - Dark mode support
4
+ - Added header divider (configurable)
5
+ - Added footer section with divider (configurable)
6
+ - Tailwind flavor now uses data attributes to style elements
7
+ - Updated look and feel
8
+ - Simplified code a bit
9
+
10
+ ## [1.1.3] - 2023-11-01
2
11
 
3
12
  - Added configuration block
4
13
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ultimate_turbo_modal (1.1.2)
4
+ ultimate_turbo_modal (1.2.0)
5
5
  phlex-rails (>= 1.0, < 2.0)
6
6
  rails (>= 7)
7
7
  stimulus-rails
data/README.md CHANGED
@@ -67,6 +67,9 @@ UltimateTurboModal.configure do |config|
67
67
  config.padding = true
68
68
  config.advance = true
69
69
  config.close_button = true
70
+ config.header = true
71
+ config.header_divider = true
72
+ config.footer_divider = true
70
73
  end
71
74
  ```
72
75
 
@@ -153,6 +156,23 @@ When opening the modal, the URL in the URL bar will change to the URL of the vie
153
156
 
154
157
  If a URL is specified as a String, the browser history will advance, and the URL shown in the URL bad will be replaced by the URL specified.
155
158
 
159
+ ### `title`, default: `nil`
160
+
161
+ Title to display in the modal header.
162
+
163
+ ### `header`, default: `true`
164
+
165
+ Whether to display a modal header.
166
+
167
+ ### `header_divider`, default: `true`
168
+
169
+ Whether to display a divider below the header.
170
+
171
+ ### `footer_divider`, default: `true`
172
+
173
+ Whether to display a divider above the footer. The divider will not appear if no footer was specified.
174
+
175
+
156
176
 
157
177
  ### Example usage with options
158
178
 
@@ -192,6 +212,11 @@ addEventListener("turbo:before-frame-render", (event) => {
192
212
  })
193
213
  ```
194
214
 
215
+ &nbsp;
216
+ &nbsp;
217
+ ## Thanks
218
+
219
+ Thanks to [@joeldrapper](https://github.com/KonnorRogers) and [@konnorrogers](https://github.com/KonnorRogers) for all the help!
195
220
 
196
221
  &nbsp;
197
222
  &nbsp;
@@ -2,18 +2,27 @@ class UltimateTurboModal::Base < Phlex::HTML
2
2
  # @param padding [Boolean] Whether to add padding around the modal content
3
3
  # @param close_button [Boolean] Whether to show a close button.
4
4
  # @param advance [Boolean] Whether to update the browser history when opening and closing the modal
5
- # @param advance_url [String] Override the URL to use when advancing the history
5
+ # @param header_divider [Boolean] Whether to show a divider between the header and the main content
6
+ # @param footer_divider [Boolean] Whether to show a divider between the main content and the footer
7
+ # @param title [String] The title of the modal
6
8
  # @param request [ActionDispatch::Request] The current Rails request object
7
9
  def initialize(
8
10
  padding: UltimateTurboModal.configuration.padding,
9
11
  close_button: UltimateTurboModal.configuration.close_button,
10
12
  advance: UltimateTurboModal.configuration.advance,
11
- request: nil
13
+ header: UltimateTurboModal.configuration.header,
14
+ header_divider: UltimateTurboModal.configuration.header_divider,
15
+ footer_divider: UltimateTurboModal.configuration.footer_divider,
16
+ title: nil, request: nil
12
17
  )
13
18
  @padding = padding
14
19
  @close_button = close_button
15
20
  @advance = !!advance
16
21
  @advance_url = advance if advance.present? && advance.is_a?(String)
22
+ @title = title
23
+ @header = header
24
+ @header_divider = header_divider
25
+ @footer_divider = footer_divider
17
26
  @request = request
18
27
 
19
28
  unless self.class.include?(Turbo::FramesHelper)
@@ -25,55 +34,53 @@ class UltimateTurboModal::Base < Phlex::HTML
25
34
  end
26
35
  end
27
36
 
28
- def template(&)
37
+ def template(&block)
29
38
  if turbo_frame?
30
- turbo_frame_tag("modal") { modal(&) }
39
+ turbo_frame_tag("modal") do
40
+ modal(&block)
41
+ end
31
42
  elsif turbo_stream?
32
43
  Turbo::StreamsHelper.turbo_stream_action_tag("update", target: "modal") do
33
- template { modal(&) }
44
+ modal(&block)
34
45
  end
35
46
  else
36
- modal(&)
47
+ render block
37
48
  end
38
49
  end
39
50
 
51
+ def footer(&block)
52
+ @footer = block
53
+ end
54
+
40
55
  private
41
56
 
42
- attr_accessor :request
57
+ attr_accessor :request, :title
43
58
 
44
- def padding?
45
- !!@padding
46
- end
59
+ def padding? = !!@padding
47
60
 
48
- def advance?
49
- !!@advance
50
- end
61
+ def close_button? = !!@close_button
51
62
 
52
- def close_button?
53
- !!@close_button
54
- end
63
+ def title? = !!@title
55
64
 
56
- def turbo_stream?
57
- !!request&.format&.turbo_stream?
58
- end
65
+ def header? = !!@header
59
66
 
60
- def turbo_frame?
61
- !!request&.headers&.key?("Turbo-Frame")
62
- end
67
+ def footer? = @footer.present?
63
68
 
64
- def turbo?
65
- turbo_stream? || turbo_frame?
66
- end
69
+ def header_divider? = !!@header_divider && title?
67
70
 
68
- def advance_url
69
- return nil unless advance?
70
- @advance_url || request.original_url
71
- end
71
+ def footer_divider? = !!@footer_divider && footer?
72
72
 
73
- def include_if_defined(mod_str)
74
- if defined?(mod.constantize) && !self.class.included_modules.include?(mod.constantize)
75
- self.class.include mod.constantize
76
- end
73
+ def turbo_stream? = !!request&.format&.turbo_stream?
74
+
75
+ def turbo_frame? = !!request&.headers&.key?("Turbo-Frame")
76
+
77
+ def turbo? = turbo_stream? || turbo_frame?
78
+
79
+ def advance? = !!@advance && !!@advance_url
80
+
81
+ def advance_url
82
+ return nil unless !!@advance
83
+ @advance_url || request&.original_url
77
84
  end
78
85
 
79
86
  def respond_to_missing?(method, include_private = false)
@@ -12,27 +12,30 @@ module UltimateTurboModal
12
12
  :advance, :advance=, :padding, :padding=, to: :configuration
13
13
 
14
14
  class Configuration
15
- attr_reader :flavor, :close_button, :advance, :padding
15
+ attr_reader :flavor, :close_button, :advance, :padding, :header, :header_divider, :footer_divider
16
16
 
17
17
  def initialize
18
18
  @flavor = :tailwind
19
19
  @close_button = true
20
20
  @advance = true
21
21
  @padding = true
22
+ @header = true
23
+ @header_divider = true
24
+ @footer_divider = true
22
25
  end
23
26
 
24
27
  def flavor=(flavor)
25
- raise ArgumentError.new("Flavor must be a symbol.") unless flavor.is_a?(Symbol) || flavor.is_a?(String)
28
+ raise ArgumentError.new("Value must be a symbol.") unless flavor.is_a?(Symbol) || flavor.is_a?(String)
26
29
  @flavor = flavor.to_sym
27
30
  end
28
31
 
29
32
  def close_button=(close_button)
30
- raise ArgumentError.new("Close button must be a boolean.") unless [true, false].include?(close_button)
33
+ raise ArgumentError.new("Value must be a boolean.") unless [true, false].include?(close_button)
31
34
  @close_button = close_button
32
35
  end
33
36
 
34
37
  def advance=(advance)
35
- raise ArgumentError.new("Advance must be a boolean.") unless [true, false].include?(advance)
38
+ raise ArgumentError.new("Value must be a boolean.") unless [true, false].include?(advance)
36
39
  @advance = advance
37
40
  end
38
41
 
@@ -40,9 +43,24 @@ module UltimateTurboModal
40
43
  if [true, false].include?(padding) || padding.is_a?(String)
41
44
  @padding = padding
42
45
  else
43
- raise ArgumentError.new("Padding must be a boolean or a String.")
46
+ raise ArgumentError.new("Value must be a boolean or a String.")
44
47
  end
45
48
  end
49
+
50
+ def header=(header)
51
+ raise ArgumentError.new("Value must be a boolean.") unless [true, false].include?(header)
52
+ @header = header
53
+ end
54
+
55
+ def header_divider=(header_divider)
56
+ raise ArgumentError.new("Value must be a boolean.") unless [true, false].include?(header_divider)
57
+ @header_divider = header_divider
58
+ end
59
+
60
+ def footer_divider=(footer_divider)
61
+ raise ArgumentError.new("Value must be a boolean.") unless [true, false].include?(footer_divider)
62
+ @footer_divider = footer_divider
63
+ end
46
64
  end
47
65
  end
48
66
 
@@ -1,27 +1,33 @@
1
1
  module UltimateTurboModal::Flavors
2
2
  class Tailwind < UltimateTurboModal::Base
3
+
3
4
  private
4
5
 
5
6
  def modal(&)
7
+ outer_divs do
8
+ div_content do
9
+ div_header
10
+ div_main(&)
11
+ div_footer if footer?
12
+ end
13
+ end
14
+ end
15
+
16
+ def outer_divs(&)
6
17
  div_dialog do
7
18
  div_overlay
8
19
  div_outer do
9
- div_inner do
10
- div_border do
11
- button_close if close_button?
12
- yield
13
- end
14
- end
20
+ div_inner(&)
15
21
  end
16
22
  end
17
23
  end
18
24
 
19
25
  def div_dialog(&)
20
26
  div(id: "modal-container",
21
- class: "relative z-10",
27
+ class: "relative group",
22
28
  role: "dialog",
23
29
  aria: {
24
- labeled_by: "modal-title",
30
+ labeled_by: "modal-title-h",
25
31
  modal: true
26
32
  },
27
33
  data: {
@@ -29,71 +35,91 @@ module UltimateTurboModal::Flavors
29
35
  modal_target: "container",
30
36
  modal_advance_url_value: advance_url,
31
37
  action: "turbo:submit-end->modal#submitEnd keyup@window->modal#closeWithKeyboard click@window->modal#outsideModalClicked click->modal#outsideModalClicked",
32
- transition_enter: "ease-out duration-300",
38
+ transition_enter: "ease-out duration-100",
33
39
  transition_enter_start: "opacity-0",
34
40
  transition_enter_end: "opacity-100",
35
- transition_leave: "ease-in duration-200",
41
+ transition_leave: "ease-in duration-50",
36
42
  transition_leave_start: "opacity-100",
37
- transition_leave_end: "opacity-0"
43
+ transition_leave_end: "opacity-0",
44
+ padding: padding?.to_s,
45
+ title: title?.to_s,
46
+ header: header?.to_s,
47
+ close_button: close_button?.to_s,
48
+ header_divider: header_divider?.to_s,
49
+ footer_divider: footer_divider?.to_s
38
50
  }, &)
39
51
  end
40
52
 
41
- def div_overlay(&)
53
+ def div_overlay
42
54
  div(id: "modal-overlay",
43
- class: "fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",
44
- data: {
45
- modal_target: "overlay",
46
- action: "click->modal#outsideModalClicked"
47
- })
55
+ class: "fixed inset-0 bg-gray-900 bg-opacity-50 transition-opacity dark:bg-opacity-80 z-40")
48
56
  end
49
57
 
50
58
  def div_outer(&)
51
59
  div(id: "modal-outer",
52
- class: "fixed inset-0 z-10 overflow-y-auto sm:max-w-[80%] md:max-w-3xl sm:mx-auto m-4",
53
- data: {
54
- modal_target: "modal"
55
- }, &)
60
+ class: "fixed inset-0 z-50 overflow-y-auto sm:max-w-[80%] md:max-w-3xl sm:mx-auto m-4", &)
56
61
  end
57
62
 
58
63
  def div_inner(&)
59
64
  div(id: "modal-inner",
60
- class: "flex min-h-full items-center justify-center p-1 sm:p-4",
61
- data: {
62
- modal_target: "innerModal"
63
- }, &)
65
+ class: "flex min-h-full items-center justify-center p-1 sm:p-4", &)
66
+ end
67
+
68
+ def div_content(&)
69
+ div(id: "modal-content",
70
+ class: "relative transform overflow-hidden rounded-lg bg-white text-left shadow transition-all
71
+ sm:my-8 sm:max-w-3xl dark:bg-gray-800 dark:text-white",
72
+ data: {modal_target: "content"}, &)
73
+ end
74
+
75
+ def div_main(&)
76
+ div(id: "modal-main", class: "group-data-[padding=true]:p-4 group-data-[padding=true]:pt-2", &)
64
77
  end
65
78
 
66
- def div_border(&)
67
- klass = "relative transform overflow-hidden rounded-lg bg-white text-left shadow-xl transition-all sm:my-8 sm:max-w-3xl"
68
- klass = "#{klass} p-2 sm:p-4 md:p-6" if @padding == true
69
- klass = "#{klass} #{@padding}" if @padding.is_a?(String)
70
- div(id: "modal-border", class: klass, &)
79
+ def div_header(&)
80
+ div(id: "modal-header", class: "flex justify-between items-center w-full py-4 rounded-t dark:border-gray-600 group-data-[header-divider=true]:border-b group-data-[header=false]:absolute") do
81
+ div_title
82
+ button_close
83
+ end
71
84
  end
72
85
 
73
- def button_close(&)
74
- div(class: "absolute top-3 right-3") do
75
- button(type: "button",
76
- aria: {label: "close"},
77
- class: "ml-auto inline-flex items-center rounded bg-transparent p-1 text-sm text-gray-400 bg-white bg-opacity-20 hover:bg-gray-100 hover:bg-opacity-70 hover:text-gray-900",
78
- data: {
79
- action: "modal#hideModal"
80
- }) { icon_close }
86
+ def div_title
87
+ div(id: "modal-title", class: "pl-4") do
88
+ h3(id: "modal-title-h", class: "group-data-[title=false]:hidden text-lg font-semibold text-gray-900 dark:text-white") { @title }
81
89
  end
82
90
  end
83
91
 
92
+ def div_footer
93
+ div(id: "modal-footer", class: "flex p-4 rounded-b dark:border-gray-600 group-data-[footer-divider=true]:border-t") do
94
+ render @footer
95
+ end
96
+ end
97
+
98
+ def button_close
99
+ div(id: "modal-close", class: "mr-4") do
100
+ close_button_tag do
101
+ icon_close
102
+ span(class: "sr-only") { "Close modal" }
103
+ end
104
+ end
105
+ end
106
+
107
+ def close_button_tag(&)
108
+ button(type: "button",
109
+ aria: {label: "close"},
110
+ class: "text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm
111
+ p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white",
112
+ data: {
113
+ action: "modal#hideModal"
114
+ }, &)
115
+ end
116
+
84
117
  def icon_close
85
- svg(
86
- xmlns: "http://www.w3.org/2000/svg",
87
- fill: "none",
88
- viewbox: "0 0 24 24",
89
- stroke_width: "1.5",
90
- stroke: "currentColor",
91
- class: "w-5 h-5"
92
- ) do |s|
118
+ svg(class: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20") do |s|
93
119
  s.path(
94
- stroke_linecap: "round",
95
- stroke_linejoin: "round",
96
- d: "M6 18L18 6M6 6l12 12"
120
+ fill_rule: "evenodd",
121
+ d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",
122
+ clip_rule: "evenodd"
97
123
  )
98
124
  end
99
125
  end
@@ -1,17 +1,23 @@
1
1
  module UltimateTurboModal::Flavors
2
2
  class Vanilla < UltimateTurboModal::Base
3
+
3
4
  private
4
5
 
5
6
  def modal(&)
7
+ outer_divs do
8
+ div_content do
9
+ div_header
10
+ div_main(&)
11
+ div_footer if footer?
12
+ end
13
+ end
14
+ end
15
+
16
+ def outer_divs(&)
6
17
  div_dialog do
7
18
  div_overlay
8
- div_outer_container do
9
- div_inner_container do
10
- div_border do
11
- button_close if close_button?
12
- yield
13
- end
14
- end
19
+ div_outer do
20
+ div_inner(&)
15
21
  end
16
22
  end
17
23
  end
@@ -21,7 +27,7 @@ module UltimateTurboModal::Flavors
21
27
  class: "modal-container",
22
28
  role: "dialog",
23
29
  aria: {
24
- labeled_by: "modal-title",
30
+ labeled_by: "modal-title-h",
25
31
  modal: true
26
32
  },
27
33
  data: {
@@ -29,69 +35,84 @@ module UltimateTurboModal::Flavors
29
35
  modal_target: "container",
30
36
  modal_advance_url_value: advance_url,
31
37
  action: "turbo:submit-end->modal#submitEnd keyup@window->modal#closeWithKeyboard click@window->modal#outsideModalClicked click->modal#outsideModalClicked",
32
- transition_enter: "ease-out duration-300",
38
+ transition_enter: "ease-out duration-100",
33
39
  transition_enter_start: "opacity-0",
34
40
  transition_enter_end: "opacity-100",
35
- transition_leave: "ease-in duration-200",
41
+ transition_leave: "ease-in duration-50",
36
42
  transition_leave_start: "opacity-100",
37
- transition_leave_end: "opacity-0"
43
+ transition_leave_end: "opacity-0",
44
+ padding: padding?.to_s,
45
+ title: title?.to_s,
46
+ header: header?.to_s,
47
+ close_button: close_button?.to_s,
48
+ header_divider: header_divider?.to_s,
49
+ footer_divider: footer_divider?.to_s
38
50
  }, &)
39
51
  end
40
52
 
41
- def div_overlay(&)
42
- div(id: "modal-overlay",
43
- class: "modal-overlay",
44
- data: {
45
- modal_target: "overlay",
46
- action: "click->modal#outsideModalClicked"
47
- })
53
+ def div_overlay
54
+ div(id: "modal-overlay", class: "modal-overlay")
48
55
  end
49
56
 
50
- def div_outer_container(&)
51
- div(id: "modal-outer",
52
- class: "modal-outer",
53
- data: {
54
- modal_target: "modal"
55
- }, &)
57
+ def div_outer(&)
58
+ div(id: "modal-outer", class: "modal-outer", &)
56
59
  end
57
60
 
58
- def div_inner_container(&)
59
- div(id: "modal-inner",
60
- class: "modal-inner",
61
- data: {
62
- modal_target: "innerModal"
63
- }, &)
61
+ def div_inner(&)
62
+ div(id: "modal-inner", class: "modal-inner", &)
63
+ end
64
+
65
+ def div_content(&)
66
+ div(id: "modal-content", class: "modal-content", data: {modal_target: "content"}, &)
67
+ end
68
+
69
+ def div_main(&)
70
+ div(id: "modal-main", class: "modal-main", &)
64
71
  end
65
72
 
66
- def div_border(&)
67
- klass = "modal-border"
68
- klass = "#{klass} modal-padding" if @padding == true
69
- klass = "#{klass} #{@padding}" if @padding.is_a?(String)
70
- div(id: "modal-border", class: klass, &)
73
+ def div_header(&)
74
+ div(id: "modal-header", class: "modal-header") do
75
+ div_title
76
+ button_close
77
+ end
71
78
  end
72
79
 
73
- def button_close(&)
74
- div(class: "modal-close") do
75
- button(type: "button",
76
- aria: {label: "close"},
77
- data: {
78
- action: "modal#hideModal"
79
- }) { icon_close }
80
+ def div_title
81
+ div(id: "modal-title", class: "modal-title") do
82
+ h3(id: "modal-title-h", class: "modal-title-h") { @title }
80
83
  end
81
84
  end
82
85
 
86
+ def div_footer
87
+ div(id: "modal-footer", class: "modal-footer") do
88
+ render @footer
89
+ end
90
+ end
91
+
92
+ def button_close
93
+ div(id: "modal-close", class: "modal-close") do
94
+ close_button_tag do
95
+ icon_close
96
+ span(class: "sr-only") { "Close modal" }
97
+ end
98
+ end
99
+ end
100
+
101
+ def close_button_tag(&)
102
+ button(type: "button",
103
+ aria: {label: "close"},
104
+ class: "modal-close-button",
105
+ data: {
106
+ action: "modal#hideModal"
107
+ }, &)
108
+ end
109
+
83
110
  def icon_close
84
- svg(
85
- xmlns: "http://www.w3.org/2000/svg",
86
- fill: "none",
87
- viewbox: "0 0 24 24",
88
- stroke_width: "1.5",
89
- stroke: "currentColor",
90
- ) do |s|
111
+ svg(class: "modal-close-icon", fill: "currentColor", viewBox: "0 0 20 20") do |s|
91
112
  s.path(
92
- stroke_linecap: "round",
93
- stroke_linejoin: "round",
94
- d: "M6 18L18 6M6 6l12 12"
113
+ fill_rule: "evenodd",
114
+ d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",
115
+ clip_rule: "evenodd"
95
116
  )
96
117
  end
97
118
  end
@@ -1,9 +1,7 @@
1
1
  module UltimateTurboModal::Helpers
2
2
  module ViewHelper
3
- def modal(**)
4
- render UltimateTurboModal.new(request:, **) do
5
- yield
6
- end
3
+ def modal(**, &)
4
+ render(UltimateTurboModal.new(request:, **), &)
7
5
  end
8
6
  end
9
7
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UltimateTurboModal
4
- VERSION = "1.1.2"
4
+ VERSION = "1.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ultimate_turbo_modal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl Mercier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-02 00:00:00.000000000 Z
11
+ date: 2023-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: phlex-rails