coveragebook_components 0.5.0 → 0.5.1

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 (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