coveragebook_components 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/build/coco/app.css +7 -5
  3. data/app/assets/build/coco/app.js +95 -48
  4. data/app/assets/build/coco/book.css +3 -0
  5. data/app/assets/build/coco/book.js +2 -2
  6. data/app/assets/js/helpers/path.js +9 -1
  7. data/app/components/coco/app/blocks/slide_editor/slide_editor.css +4 -0
  8. data/app/components/coco/app/blocks/slide_editor/slide_editor.html.erb +145 -190
  9. data/app/components/coco/app/blocks/slide_editor/slide_editor.js +70 -17
  10. data/app/components/coco/app/blocks/slide_editor/slide_editor.rb +37 -86
  11. data/app/components/coco/app/elements/alert/alert.css +1 -1
  12. data/app/components/coco/app/elements/color_picker_button/color_picker_button.html.erb +17 -16
  13. data/app/components/coco/app/elements/color_picker_button/color_picker_button.js +0 -8
  14. data/app/components/coco/app/elements/color_picker_button/color_picker_button.rb +2 -15
  15. data/app/components/coco/app/elements/image_picker/image_picker.html.erb +4 -4
  16. data/app/components/coco/app/elements/image_picker/image_picker.js +18 -6
  17. data/app/components/coco/app/elements/image_picker/image_picker.rb +2 -11
  18. data/app/components/coco/app/elements/image_picker_button/image_picker_button.html.erb +9 -8
  19. data/app/components/coco/app/elements/image_picker_button/image_picker_button.js +10 -23
  20. data/app/components/coco/app/elements/image_picker_button/image_picker_button.rb +19 -35
  21. data/app/components/coco/app/elements/seamless_textarea/seamless_textarea.html.erb +7 -4
  22. data/app/components/coco/app/elements/seamless_textarea/seamless_textarea.js +9 -3
  23. data/app/components/coco/app/elements/seamless_textarea/seamless_textarea.rb +5 -20
  24. data/app/components/coco/base/image_uploader/image_uploader.html.erb +3 -2
  25. data/app/components/coco/base/image_uploader/image_uploader.rb +2 -12
  26. data/app/components/coco/book/blocks/slides/media_slide/media_slide.css +1 -1
  27. data/lib/coco.rb +1 -1
  28. metadata +2 -6
  29. data/app/assets/build/coco/app.dev.css +0 -3427
  30. data/app/assets/build/coco/app.dev.js +0 -24891
  31. data/app/assets/build/coco/book.dev.css +0 -992
  32. data/app/assets/build/coco/book.dev.js +0 -19840
@@ -6,119 +6,70 @@ module Coco
6
6
  include Coco::BookHelper
7
7
  include Coco::FormatHelper
8
8
 
9
- renders_one :bg_color, ->(name: :bg_color_hex, **input_options) do
10
- add_field(:bg_color, name, input_options)
11
- end
12
-
13
- renders_one :text_color, ->(name: :text_color_hex, **input_options) do
14
- add_field(:text_color, name, input_options)
15
- end
16
-
17
- renders_one :bg_image, ->(name: :bg_image, **input_options) do
18
- add_field(:bg_image, name, input_options)
19
- end
9
+ renders_one :form
20
10
 
21
- renders_one :thumbnail, ->(name: :thumbnail_image, **input_options) do
22
- add_field(:thumbnail, name, input_options)
11
+ renders_one :title, ->(value = nil, **textarea_options) do
12
+ Coco::App::Elements::SeamlessTextarea.new(**textarea_options,
13
+ value: value,
14
+ multiline: false,
15
+ focus: true,
16
+ data: {role: "title-editor"},
17
+ x: {modelable: "value", model: "title"})
23
18
  end
24
19
 
25
- renders_one :title, ->(name: :title, **input_options) do
26
- add_field(:title, name, input_options)
20
+ renders_one :text_1, ->(value = nil, **textarea_options) do
21
+ Coco::App::Elements::SeamlessTextarea.new(**textarea_options,
22
+ value: value,
23
+ multiline: false,
24
+ data: {role: "text-1-editor"},
25
+ x: {modelable: "value", model: "text1"})
27
26
  end
28
27
 
29
- renders_one :text_1, ->(name: :text_1, **input_options) do
30
- add_field(:text_1, name, input_options)
28
+ renders_one :bg_color, ->(value = nil, **input_options) do
29
+ @bg_color_options = {selected: value, **input_options}
31
30
  end
32
31
 
33
- renders_one :layout, ->(name: :layout, **input_options) do
34
- add_field(:layout, name, input_options)
32
+ renders_one :text_color, ->(value = nil, **input_options) do
33
+ @text_color_options = {selected: value, **input_options}
35
34
  end
36
35
 
37
- before_render do
38
- with_layout(value: "basic") unless layout?
36
+ renders_one :bg_image, ->(src = nil, **input_options) do
37
+ @bg_image_options = {src: src, **input_options}
39
38
  end
40
39
 
41
- attr_reader :fields
42
-
43
- def initialize(form: nil, **kwargs)
44
- @form_args = form.to_h
45
- @model = @form_args[:model]
46
- @fields = {}
47
- end
48
-
49
- def form_args(attrs = {})
50
- html_args = @form_args.fetch(:html, {})
51
- attrs[:class] = class_names(html_args[:class], attrs[:class])
52
- html_args.merge!(attrs)
53
- @form_args.merge({html: html_args})
54
- end
40
+ # renders_one :thumbnail, ->(name: :thumbnail_image, **input_options) do
41
+ # add_field(:thumbnail, name, input_options)
42
+ # end
55
43
 
56
44
  def slide_args
57
45
  {
58
- bg_image: bg_image_value,
59
- bg_color_hex: bg_color_value,
60
- text_color_hex: text_color_value,
61
- layout: layout_value,
46
+ bg_image: bg_image_src,
47
+ bg_color_hex: bg_color_css,
48
+ text_color_hex: text_color_css,
62
49
  render_empty: true
63
50
  }
64
51
  end
65
52
 
66
53
  def alpine_props
67
54
  {
68
- bg_color: format_css_hex_color(bg_color_value),
69
- text_color: format_css_hex_color(text_color_value),
70
- title: title_value,
71
- text_1: text_1_value,
72
- layout: layout_value,
73
- bg_image: {
74
- name: ((field?(:bg_image) && bg_image_value.present?) && File.basename(bg_image_value)),
75
- data: (bg_image_value if field?(:bg_image))
76
- }
55
+ bg_color: bg_color_css,
56
+ text_color: text_color_css,
57
+ title: title&.value,
58
+ text_1: text_1&.value,
59
+ bg_image: bg_image_src
77
60
  }
78
61
  end
79
62
 
80
- def method_missing(name, *args, &block)
81
- name.match(/_(value|options|name)/) do |matches|
82
- field_name = name.to_s.gsub(matches[0], "").to_sym
83
- method = matches[1].to_sym
84
- if field?(field_name)
85
- fields[field_name].public_send(method)
86
- end
87
- end
63
+ def bg_color_css
64
+ @bg_color_options[:selected] if @bg_color_options
88
65
  end
89
66
 
90
- def respond_to_missing?(name, include_private = false)
91
- field_name = name.to_s.gsub(/_(value|options|name)/, "")
92
- field?(field_name.to_sym)
67
+ def text_color_css
68
+ @text_color_options[:selected] if @text_color_options
93
69
  end
94
70
 
95
- def field?(name)
96
- fields.key?(name)
97
- end
98
-
99
- private
100
-
101
- def add_field(field_name, name, options = {})
102
- model_value = @model&.public_send(name) if @model&.respond_to?(name)
103
- fields[field_name] = SlideInput.new(name, model_value, options)
104
- end
105
-
106
- SlideInput = Data.define(:name, :model_value, :input_options) do
107
- def value
108
- input_options.fetch(:value, model_value)
109
- end
110
-
111
- def options
112
- input_options.tap do |options|
113
- options[:value] = value
114
- end
115
- end
116
-
117
- def to_json
118
- "\"#{value}\"" if value.present?
119
- end
120
-
121
- alias_method :to_s, :value
71
+ def bg_image_src
72
+ @bg_image_options[:src] if @bg_image_options
122
73
  end
123
74
  end
124
75
  end
@@ -34,7 +34,7 @@
34
34
  }
35
35
  }
36
36
 
37
- &:not(.with-title) .alert-message {
37
+ &.with-title .alert-message {
38
38
  @apply mt-1;
39
39
  }
40
40
 
@@ -1,23 +1,24 @@
1
1
  <%= render component_tag(x: {
2
2
  data: x_data("appColorPickerButton", {selected: selected}),
3
- "@dropdown:mount": "onDropdownMount()"
3
+ "@dropdown:mount": "onDropdownMount"
4
4
  }) do %>
5
- <%= input %>
6
- <%= render button do |btn| %>
7
- <% btn.with_icon do %>
8
- <%= icon %>
9
- <% end %>
5
+ <div x-effect="$dispatch('color-picker:change', {color: selectedColor})">
6
+ <%= render button do |btn| %>
7
+ <% btn.with_icon do %>
8
+ <%= icon %>
9
+ <% end %>
10
10
 
11
- <% btn.with_dropdown do %>
12
- <div
13
- @color-picker:select="selectedColor = $event.detail.selectedColor;"
14
- x-cloak>
15
- <div data-role="color-picker">
16
- <%= picker %>
11
+ <% btn.with_dropdown do %>
12
+ <div
13
+ @color-picker:select="selectedColor = $event.detail.selectedColor;"
14
+ x-cloak>
15
+ <div data-role="color-picker">
16
+ <%= picker %>
17
+ </div>
17
18
  </div>
18
- </div>
19
- <% end %>
19
+ <% end %>
20
20
 
21
- <%= button_text %>
22
- <% end %>
21
+ <%= button_text %>
22
+ <% end %>
23
+ </div>
23
24
  <% end %>
@@ -12,14 +12,6 @@ export default CocoComponent("appColorPickerButton", ({ selected }) => {
12
12
  );
13
13
  },
14
14
 
15
- get selectedColorHex() {
16
- return this.selectedColor && this.selectedColor.replace("#", "");
17
- },
18
-
19
- set selectedColorHex(value) {
20
- this.selectedColor == "#" + value.replace("#", "");
21
- },
22
-
23
15
  onDropdownMount() {
24
16
  this.getPicker().setSelectedColor(this.selectedColor);
25
17
  },
@@ -26,7 +26,7 @@ module Coco
26
26
  end
27
27
 
28
28
  renders_one :icon, ->(&block) do
29
- tag.span class: "picker-icon", ":style": "{color: selectedColor}", &block
29
+ tag.span class: "picker-icon", style: "color: #{@selected}", ":style": "{color: selectedColor}", &block
30
30
  end
31
31
 
32
32
  before_render do
@@ -40,26 +40,13 @@ module Coco
40
40
 
41
41
  attr_reader :selected
42
42
 
43
- def initialize(selected: nil, input_name: nil, form_builder: nil, **kwargs)
43
+ def initialize(selected: nil, **kwargs)
44
44
  @selected = selected
45
45
 
46
46
  @size = kwargs.fetch(:size, :default)&.to_sym
47
47
  if @size.in?(Coco::App::Elements::Button::SIZE_ALIASES.keys) && !kwargs.key?(:resize)
48
48
  @size, @resize = Coco::App::Elements::Button::SIZE_ALIASES.fetch(@size)
49
49
  end
50
-
51
- @form_builder = form_builder
52
- @input_name = input_name
53
- end
54
-
55
- def input
56
- if @input_name
57
- if @form_builder
58
- @form_builder.hidden_field(@input_name, value: @selected, "x-model": "selectedColorHex")
59
- else
60
- hidden_field_tag(@input_name, @selected, "x-model": "selectedColorHex")
61
- end
62
- end
63
50
  end
64
51
 
65
52
  def button_text
@@ -1,4 +1,4 @@
1
- <%= render component_tag(x: {data: x_data("appImagePicker", alpine_props), ":class": "hasImage && 'has-image'"}) do %>
1
+ <%= render component_tag(x: {data: x_data("appImagePicker", {src: src}), ":class": "hasImage && 'has-image'"}) do %>
2
2
  <div class="picker-file-name" x-show="hasImage">
3
3
  <label x-text="name"></label>
4
4
  </div>
@@ -6,7 +6,7 @@
6
6
  <%= render Coco::ImageUploader.new(
7
7
  **uploader_args,
8
8
  click: false) do %>
9
- <div class="picker-blank-state" x-show="!fileData">
9
+ <div class="picker-blank-state" x-show="!$parent.src">
10
10
  <% if blank_state_text? %>
11
11
  <div class="picker-placeholder-text">
12
12
  <%= blank_state_text %>
@@ -18,8 +18,8 @@
18
18
  <% end %>
19
19
  </div>
20
20
  </div>
21
- <div x-show="fileData" x-cloak>
22
- <img :src="fileData" class="picker-thumbnail">
21
+ <div x-show="$parent.src" x-cloak>
22
+ <img :src="$parent.src" class="picker-thumbnail">
23
23
  </div>
24
24
  <% end %>
25
25
  </div>
@@ -1,17 +1,23 @@
1
1
  import { CocoComponent } from "@js/coco";
2
2
  import { getComponent } from "@helpers/alpine";
3
+ import { basename } from "@helpers/path";
3
4
 
4
- export default CocoComponent("appImagePicker", ({ image }) => {
5
+ export default CocoComponent("appImagePicker", ({ src }) => {
5
6
  return {
6
7
  use: [],
7
- image: null,
8
+
9
+ image: {
10
+ name: basename(src),
11
+ file: null,
12
+ data: src,
13
+ },
8
14
 
9
15
  get name() {
10
- return this.image && this.image.name;
16
+ return this.image.name;
11
17
  },
12
18
 
13
19
  get src() {
14
- return this.image && this.image.data;
20
+ return this.image.data;
15
21
  },
16
22
 
17
23
  get hasImage() {
@@ -23,8 +29,14 @@ export default CocoComponent("appImagePicker", ({ image }) => {
23
29
  },
24
30
 
25
31
  setImage(file, silent = false) {
26
- this.image = file;
32
+ this.image = {
33
+ file: file.file,
34
+ name: file.name,
35
+ data: file.data,
36
+ };
37
+
27
38
  this.uploader.setFile(file);
39
+
28
40
  if (silent === false) {
29
41
  this.$dispatch("image-picker:select", { image: this.image });
30
42
  }
@@ -32,7 +44,7 @@ export default CocoComponent("appImagePicker", ({ image }) => {
32
44
 
33
45
  clearImage(silent = false) {
34
46
  this.uploader.clear();
35
- this.image = null;
47
+ this.image = { name: null, data: null, file: null };
36
48
  if (silent === false) {
37
49
  this.$dispatch("image-picker:clear");
38
50
  }
@@ -15,18 +15,9 @@ module Coco
15
15
 
16
16
  attr_reader :uploader_args, :src
17
17
 
18
- def initialize(input_name: nil, src: nil, accept: "image/*", form_builder: nil, **kwargs)
18
+ def initialize(src: nil, accept: "image/*", **kwargs)
19
19
  @src = src
20
- @uploader_args = {name: input_name, accept: accept, form_builder: form_builder}
21
- end
22
-
23
- def alpine_props
24
- {
25
- image: {
26
- name: (src.present? && File.basename(src)),
27
- data: src
28
- }
29
- }
20
+ @uploader_args = {accept: accept}
30
21
  end
31
22
  end
32
23
  end
@@ -1,20 +1,21 @@
1
1
  <%= render component_tag(x: {
2
- data: x_data("appImagePickerButton", alpine_props),
3
- "@dropdown:mount": "onDropdownMount"
4
- }) do %>
5
- <%= input %>
2
+ data: x_data("appImagePickerButton", {src: src}),
3
+ "@dropdown:mount": "onDropdownMount",
4
+ effect: "$dispatch('image-picker:change', {image: selectedImage})"
5
+ }) do %>
6
6
  <%= render button do |btn| %>
7
- <% btn.with_dropdown do %>
7
+
8
+ <% btn.with_dropdown do %>
8
9
  <div
9
- @image-picker:select="setSelectedImage($event.detail.image)"
10
- @image-picker:clear="clearSelectedImage"
10
+ @image-picker:select="$parent.setSelectedImage($event.detail.image)"
11
+ @image-picker:clear="$parent.clearSelectedImage"
11
12
  x-cloak>
12
13
  <div data-role="image-picker">
13
14
  <%= picker %>
14
15
  </div>
15
16
  </div>
16
17
  <% end %>
17
-
18
+
18
19
  <%= button_text %>
19
20
  <% end %>
20
21
  <% end %>
@@ -1,24 +1,13 @@
1
1
  import { CocoComponent } from "@js/coco";
2
2
  import { getData } from "@helpers/alpine";
3
+ import { basename } from "@helpers/path";
3
4
 
4
- export default CocoComponent("appImagePickerButton", ({ image }) => {
5
+ export default CocoComponent("appImagePickerButton", ({ src }) => {
5
6
  return {
6
- selectedImage: image,
7
-
8
- dropdown: null,
9
-
10
- init() {
11
- this.$watch("selectedImage", (file) => {
12
- const dataTransfer = new DataTransfer();
13
- if (file && file.file instanceof File) {
14
- dataTransfer.items.add(file.file);
15
- }
16
- this.$refs.fileInput.files = dataTransfer.files;
17
-
18
- if (this.dropdown) {
19
- this.dropdown.hide();
20
- }
21
- });
7
+ selectedImage: {
8
+ name: basename(src),
9
+ file: null,
10
+ data: src,
22
11
  },
23
12
 
24
13
  getPicker() {
@@ -37,21 +26,19 @@ export default CocoComponent("appImagePickerButton", ({ image }) => {
37
26
  reader.addEventListener("load", () => {
38
27
  this.selectedImage = {
39
28
  name: file.name,
40
- file: file,
29
+ file,
41
30
  data: reader.result,
42
31
  };
43
- });
44
32
 
45
- // reader.addEventListener("error", () => {
46
- // this.errors.push(`Error reading file: ${file.name}`);
47
- // });
33
+ this.dropdown.hide();
34
+ });
48
35
 
49
36
  reader.readAsDataURL(file);
50
37
  },
51
38
 
52
39
  clearSelectedImage() {
53
40
  this.dropdown.hide();
54
- this.selectedImage = null;
41
+ this.selectedImage = { name: null, data: null, file: null };
55
42
  },
56
43
 
57
44
  setSelectedImage(image) {
@@ -29,13 +29,10 @@ module Coco
29
29
  with_picker(src: @src) unless picker?
30
30
  end
31
31
 
32
- attr_reader :src, :input_name
32
+ attr_reader :src
33
33
 
34
- def initialize(src: nil, input_name: nil, form_builder: nil, direct_upload: false, **kwargs)
34
+ def initialize(src: nil, **kwargs)
35
35
  @src = src
36
- @form_builder = form_builder
37
- @input_name = input_name
38
- @direct_upload = direct_upload
39
36
 
40
37
  @size = kwargs.fetch(:size, :default)&.to_sym
41
38
  if @size.in?(Coco::App::Elements::Button::SIZE_ALIASES.keys) && !kwargs.key?(:resize)
@@ -43,38 +40,25 @@ module Coco
43
40
  end
44
41
  end
45
42
 
46
- def direct_upload?
47
- @direct_upload
48
- end
49
-
50
- def alpine_props
51
- {
52
- image: {
53
- name: (src.present? && File.basename(src)),
54
- data: src
55
- }
56
- }
57
- end
43
+ # def input
44
+ # if input_name
45
+ # kwargs = {
46
+ # class: "picker-file-input",
47
+ # "x-ref": "fileInput",
48
+ # direct_upload: @direct_upload
49
+ # }
58
50
 
59
- def input
60
- if input_name
61
- kwargs = {
62
- class: "picker-file-input",
63
- "x-ref": "fileInput",
64
- direct_upload: @direct_upload
65
- }
51
+ # if direct_upload? && !helpers.respond_to?(:rails_direct_uploads_url)
52
+ # kwargs[:data] = {direct_upload_url: @direct_upload}
53
+ # end
66
54
 
67
- if direct_upload? && !helpers.respond_to?(:rails_direct_uploads_url)
68
- kwargs[:data] = {direct_upload_url: @direct_upload}
69
- end
70
-
71
- if @form_builder
72
- @form_builder.file_field(input_name, **kwargs)
73
- else
74
- file_field_tag(input_name, **kwargs)
75
- end
76
- end
77
- end
55
+ # if @form_builder
56
+ # @form_builder.file_field(input_name, **kwargs)
57
+ # else
58
+ # file_field_tag(input_name, **kwargs)
59
+ # end
60
+ # end
61
+ # end
78
62
 
79
63
  def button_text
80
64
  text || content
@@ -1,12 +1,15 @@
1
- <%= render component_tag(x: {data: "appSeamlessTextarea"}) do %>
2
- <%= text_area(
1
+ <%= render component_tag(x: {data: "appSeamlessTextarea", options: "options"}) do %>
2
+ <%= text_area_tag(nil, value,
3
+ id: nil,
4
+ placeholder: placeholder,
3
5
  spellcheck: false,
4
6
  rows: 1,
5
7
  **x_attrs({
6
8
  "@keydown.enter.prevent": (true unless multiline?),
7
9
  "@input": "onResize",
8
10
  ref: "textarea",
9
- "model.debounce": "value"
10
- })
11
+ "model.fill.debounce": "value"
12
+ }),
13
+ **@textarea_args
11
14
  ) %>
12
15
  <% end %>
@@ -9,12 +9,18 @@ export default CocoComponent("appSeamlessTextarea", () => {
9
9
  observer: null,
10
10
  value: null,
11
11
 
12
- get singleLine() {
13
- return this.assertData("multiline", "false");
14
- },
12
+ options: ["multiline", "focus"],
15
13
 
16
14
  init() {
17
15
  this.value = this.$refs.textarea.value;
16
+ this.$nextTick(() => {
17
+ this.onResize();
18
+
19
+ if (this.$options.focus) {
20
+ this.$refs.textarea.focus();
21
+ this.$refs.textarea.selectionStart = this.$refs.textarea.value.length;
22
+ }
23
+ });
18
24
  },
19
25
 
20
26
  onResize() {
@@ -3,22 +3,17 @@ module Coco
3
3
  module Elements
4
4
  class SeamlessTextarea < Coco::Component
5
5
  include TagHelper
6
- include Concerns::WrapsComponent
7
6
  include Concerns::AcceptsOptions
8
7
 
9
- wraps_component :textarea
10
-
11
8
  accepts_option :multiline, from: [true, false]
9
+ accepts_option :focus, from: [true, false]
12
10
 
13
- attr_reader :name, :id
11
+ attr_reader :placeholder
14
12
 
15
- def initialize(name:, value: nil, id: nil, placeholder: nil, textarea: nil, form_builder: nil, **kwargs)
16
- @name = name
17
- @value = value
18
- @form_builder = form_builder
13
+ def initialize(textarea: nil, value: nil, placeholder: nil, **kwargs)
19
14
  @textarea_args = textarea.to_h
20
- @textarea_args[:id] = id
21
- @textarea_args[:placeholder] = placeholder
15
+ @value = value
16
+ @placeholder = placeholder
22
17
  end
23
18
 
24
19
  def multiline?
@@ -28,16 +23,6 @@ module Coco
28
23
  def value
29
24
  (@value.presence || content.presence || "").strip_heredoc.strip
30
25
  end
31
-
32
- def text_area(**html_args)
33
- args = @textarea_args.merge(html_args.compact)
34
-
35
- if @form_builder
36
- @form_builder.text_area(name, value: value, **args)
37
- else
38
- text_area_tag(name, value, **args)
39
- end
40
- end
41
26
  end
42
27
  end
43
28
  end
@@ -7,11 +7,12 @@
7
7
  "@drop.stop.prevent": "active = false; handleDrop($event)",
8
8
  ":data-active": "active && droppable"
9
9
  }) do %>
10
- <%= file_field accept: accept,
10
+ <%= file_field_tag(nil,
11
+ accept: accept,
11
12
  class: "uploader-input",
12
13
  "x-ref": "input",
13
14
  "@click.stop": "",
14
- "@change": "handleFiles($el.files)" %>
15
+ "@change": "handleFiles($el.files)") %>
15
16
  <%= content %>
16
17
  <% end %>
17
18
 
@@ -5,20 +5,10 @@ module Coco
5
5
  accepts_option :click, from: [true, false], default: true
6
6
  accepts_option :drop, from: [true, false], default: true
7
7
 
8
- attr_reader :name, :accept, :form_builder
8
+ attr_reader :name, :accept
9
9
 
10
- def initialize(name: nil, accept: "image/*", form_builder: nil, **kwargs)
11
- @name = name || random_id
10
+ def initialize(accept: "image/*", **kwargs)
12
11
  @accept = accept
13
- @form_builder = form_builder
14
- end
15
-
16
- def file_field(**kwargs)
17
- if form_builder
18
- form_builder.file_field(@name, **kwargs)
19
- else
20
- file_field_tag(@name, **kwargs)
21
- end
22
12
  end
23
13
 
24
14
  def clickable?
@@ -1,7 +1,7 @@
1
1
  @layer components {
2
2
  [data-coco][data-component="book-media-slide"] {
3
3
  img {
4
- @apply w-full rounded-md;
4
+ @apply w-full h-full object-contain rounded-md;
5
5
  }
6
6
  }
7
7
  }
data/lib/coco.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Coco
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end