coveragebook_components 0.5.0 → 0.5.2
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/app/assets/build/coco/app.css +28 -28
- data/app/assets/build/coco/app.js +8113 -974
- data/app/assets/build/coco/book.css +3 -0
- data/app/assets/build/coco/book.js +37 -4
- data/app/assets/js/base/polyfills/request-submit.js +39 -0
- data/app/assets/js/base/setup.js +2 -0
- data/app/assets/js/helpers/path.js +9 -1
- data/app/assets/js/helpers/screenshot.js +20 -4
- data/app/components/coco/app/blocks/slide_editor/slide_editor.css +8 -11
- data/app/components/coco/app/blocks/slide_editor/slide_editor.html.erb +155 -196
- data/app/components/coco/app/blocks/slide_editor/slide_editor.js +92 -70
- data/app/components/coco/app/blocks/slide_editor/slide_editor.rb +36 -85
- data/app/components/coco/app/elements/alert/alert.css +1 -1
- data/app/components/coco/app/elements/button/button.css +11 -11
- data/app/components/coco/app/elements/color_picker_button/color_picker_button.html.erb +17 -16
- data/app/components/coco/app/elements/color_picker_button/color_picker_button.js +0 -8
- data/app/components/coco/app/elements/color_picker_button/color_picker_button.rb +2 -15
- data/app/components/coco/app/elements/image_picker/image_picker.html.erb +4 -4
- data/app/components/coco/app/elements/image_picker/image_picker.js +18 -6
- data/app/components/coco/app/elements/image_picker/image_picker.rb +2 -11
- data/app/components/coco/app/elements/image_picker_button/image_picker_button.html.erb +9 -8
- data/app/components/coco/app/elements/image_picker_button/image_picker_button.js +10 -23
- data/app/components/coco/app/elements/image_picker_button/image_picker_button.rb +19 -35
- data/app/components/coco/app/elements/seamless_textarea/seamless_textarea.html.erb +7 -4
- data/app/components/coco/app/elements/seamless_textarea/seamless_textarea.js +9 -3
- data/app/components/coco/app/elements/seamless_textarea/seamless_textarea.rb +5 -20
- data/app/components/coco/base/button/button.css +3 -3
- data/app/components/coco/base/button/button.js +1 -3
- data/app/components/coco/base/image_uploader/image_uploader.html.erb +3 -2
- data/app/components/coco/base/image_uploader/image_uploader.rb +2 -12
- data/app/components/coco/book/blocks/slides/media_slide/media_slide.css +1 -1
- data/app/components/coco/component.rb +1 -0
- data/app/components/coco/concerns/has_name.rb +1 -1
- data/app/components/coco/concerns/translatable.rb +18 -0
- data/config/credentials/production.key +1 -0
- data/config/credentials/production.yml.enc +1 -0
- data/config/icons.json +886 -0
- data/config/locales/coco.en.yml +22 -0
- data/config/tailwind.app.config.cjs +21 -0
- data/config/tailwind.base.config.cjs +79 -0
- data/config/tailwind.book.config.cjs +20 -0
- data/config/tokens.cjs +229 -0
- data/config/utils.cjs +16 -0
- data/lib/coco.rb +1 -1
- metadata +13 -6
- data/app/assets/build/coco/app.dev.css +0 -3427
- data/app/assets/build/coco/app.dev.js +0 -24891
- data/app/assets/build/coco/book.dev.css +0 -992
- data/app/assets/build/coco/book.dev.js +0 -19840
@@ -893,8 +893,11 @@ select {
|
|
893
893
|
font-size: var(--text-font-size);
|
894
894
|
}
|
895
895
|
[data-coco][data-component="book-media-slide"] img {
|
896
|
+
height: 100%;
|
896
897
|
width: 100%;
|
897
898
|
border-radius: 0.375rem;
|
899
|
+
-o-object-fit: contain;
|
900
|
+
object-fit: contain;
|
898
901
|
}
|
899
902
|
.static {
|
900
903
|
position: static;
|
@@ -11636,6 +11636,40 @@ ${t4.join("\n")}`);
|
|
11636
11636
|
// ../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js
|
11637
11637
|
addEventListener("turbo:before-fetch-request", encodeMethodIntoRequestBody);
|
11638
11638
|
|
11639
|
+
// base/polyfills/request-submit.js
|
11640
|
+
(function(prototype) {
|
11641
|
+
if (typeof prototype.requestSubmit == "function")
|
11642
|
+
return;
|
11643
|
+
prototype.requestSubmit = function(submitter) {
|
11644
|
+
if (submitter) {
|
11645
|
+
validateSubmitter(submitter, this);
|
11646
|
+
submitter.click();
|
11647
|
+
} else {
|
11648
|
+
submitter = document.createElement("input");
|
11649
|
+
submitter.type = "submit";
|
11650
|
+
submitter.hidden = true;
|
11651
|
+
this.appendChild(submitter);
|
11652
|
+
submitter.click();
|
11653
|
+
this.removeChild(submitter);
|
11654
|
+
}
|
11655
|
+
};
|
11656
|
+
function validateSubmitter(submitter, form) {
|
11657
|
+
submitter instanceof HTMLElement || raise(TypeError, "parameter 1 is not of type 'HTMLElement'");
|
11658
|
+
submitter.type == "submit" || raise(TypeError, "The specified element is not a submit button");
|
11659
|
+
submitter.form == form || raise(
|
11660
|
+
DOMException,
|
11661
|
+
"The specified element is not owned by this form element",
|
11662
|
+
"NotFoundError"
|
11663
|
+
);
|
11664
|
+
}
|
11665
|
+
function raise(errorConstructor, message, name) {
|
11666
|
+
throw new errorConstructor(
|
11667
|
+
"Failed to execute 'requestSubmit' on 'HTMLFormElement': " + message + ".",
|
11668
|
+
name
|
11669
|
+
);
|
11670
|
+
}
|
11671
|
+
})(HTMLFormElement.prototype);
|
11672
|
+
|
11639
11673
|
// ../../../node_modules/alpinejs/dist/module.esm.js
|
11640
11674
|
var flushPending = false;
|
11641
11675
|
var flushing = false;
|
@@ -19579,10 +19613,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
|
|
19579
19613
|
this.collapsed = false;
|
19580
19614
|
return;
|
19581
19615
|
}
|
19582
|
-
this.setTooltipText();
|
19583
19616
|
this.$root.setAttribute("data-collapsed", collapsed ? "true" : "false");
|
19584
19617
|
});
|
19585
|
-
this.$watch("$options.state", () => this.setTooltipText());
|
19586
19618
|
},
|
19587
19619
|
setTooltipText() {
|
19588
19620
|
if (this.disabled) {
|
@@ -19685,6 +19717,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
|
|
19685
19717
|
root: {
|
19686
19718
|
"x-options": "options",
|
19687
19719
|
"x-tooltip": "tooltipText",
|
19720
|
+
"x-effect": "setTooltipText",
|
19688
19721
|
"@confirmation:confirm": "approveAndRun",
|
19689
19722
|
"@confirmation:cancel": "cancelConfirmation",
|
19690
19723
|
"@dropdown:show": "setState('active')",
|
@@ -19802,14 +19835,14 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
|
|
19802
19835
|
};
|
19803
19836
|
});
|
19804
19837
|
|
19805
|
-
// import-glob:/
|
19838
|
+
// import-glob:/Users/mark/Projects/coveragebook/coco/app/assets/js/base|@baseComponents/**/*.js
|
19806
19839
|
var modules = [button_exports, dropdown_exports, icon_exports, image_uploader_exports];
|
19807
19840
|
var __default = modules;
|
19808
19841
|
|
19809
19842
|
// base/components.js
|
19810
19843
|
var components_default = registerComponents(__default);
|
19811
19844
|
|
19812
|
-
// import-glob:/
|
19845
|
+
// import-glob:/Users/mark/Projects/coveragebook/coco/app/assets/js/book|@bookComponents/**/*.js
|
19813
19846
|
var modules2 = [];
|
19814
19847
|
var __default2 = modules2;
|
19815
19848
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
(function (prototype) {
|
2
|
+
if (typeof prototype.requestSubmit == "function") return;
|
3
|
+
|
4
|
+
prototype.requestSubmit = function (submitter) {
|
5
|
+
if (submitter) {
|
6
|
+
validateSubmitter(submitter, this);
|
7
|
+
submitter.click();
|
8
|
+
} else {
|
9
|
+
submitter = document.createElement("input");
|
10
|
+
submitter.type = "submit";
|
11
|
+
submitter.hidden = true;
|
12
|
+
this.appendChild(submitter);
|
13
|
+
submitter.click();
|
14
|
+
this.removeChild(submitter);
|
15
|
+
}
|
16
|
+
};
|
17
|
+
|
18
|
+
function validateSubmitter(submitter, form) {
|
19
|
+
submitter instanceof HTMLElement ||
|
20
|
+
raise(TypeError, "parameter 1 is not of type 'HTMLElement'");
|
21
|
+
submitter.type == "submit" ||
|
22
|
+
raise(TypeError, "The specified element is not a submit button");
|
23
|
+
submitter.form == form ||
|
24
|
+
raise(
|
25
|
+
DOMException,
|
26
|
+
"The specified element is not owned by this form element",
|
27
|
+
"NotFoundError"
|
28
|
+
);
|
29
|
+
}
|
30
|
+
|
31
|
+
function raise(errorConstructor, message, name) {
|
32
|
+
throw new errorConstructor(
|
33
|
+
"Failed to execute 'requestSubmit' on 'HTMLFormElement': " +
|
34
|
+
message +
|
35
|
+
".",
|
36
|
+
name
|
37
|
+
);
|
38
|
+
}
|
39
|
+
})(HTMLFormElement.prototype);
|
data/app/assets/js/base/setup.js
CHANGED
@@ -2,4 +2,12 @@ function stripExtension(filename) {
|
|
2
2
|
return filename.substring(0, filename.lastIndexOf(".")) || filename;
|
3
3
|
}
|
4
4
|
|
5
|
-
|
5
|
+
function dirname(path) {
|
6
|
+
return path ? path.match(/.*\//) : path;
|
7
|
+
}
|
8
|
+
|
9
|
+
function basename(path) {
|
10
|
+
return path ? path.replace(/.*\//, "") : path;
|
11
|
+
}
|
12
|
+
|
13
|
+
export { stripExtension, dirname, basename };
|
@@ -1,8 +1,13 @@
|
|
1
|
-
import
|
1
|
+
import html2canvas from "html2canvas";
|
2
2
|
import { stripExtension } from "./path";
|
3
3
|
import { isObject } from "./lang";
|
4
4
|
import { blobToFile } from "./file";
|
5
5
|
|
6
|
+
const screenshotDefaultOptions = {
|
7
|
+
useCORS: true,
|
8
|
+
logging: false,
|
9
|
+
};
|
10
|
+
|
6
11
|
function generateScreenshotFilename(name = null, ext = null) {
|
7
12
|
name = [stripExtension(name || "screenshot"), new Date().getTime()].join("-");
|
8
13
|
return ext ? `${name}.${ext}` : name;
|
@@ -16,11 +21,22 @@ async function captureElementScreenshot(el, filename, opts = {}) {
|
|
16
21
|
opts = filename;
|
17
22
|
}
|
18
23
|
|
19
|
-
|
24
|
+
const screenshotFilename = generateScreenshotFilename(filename, "jpg");
|
25
|
+
const screenshotOptions = {
|
26
|
+
...screenshotDefaultOptions,
|
27
|
+
...opts,
|
28
|
+
};
|
20
29
|
|
21
|
-
const
|
30
|
+
const canvas = await html2canvas(el, screenshotOptions);
|
31
|
+
const imageBlob = await new Promise((resolve, reject) => {
|
32
|
+
canvas.toBlob((result) => {
|
33
|
+
return result
|
34
|
+
? resolve(result)
|
35
|
+
: reject(new Error("Screenshot could not be created"));
|
36
|
+
});
|
37
|
+
});
|
22
38
|
|
23
|
-
return blobToFile(imageBlob,
|
39
|
+
return blobToFile(imageBlob, screenshotFilename, "image/jpg");
|
24
40
|
}
|
25
41
|
|
26
42
|
export { captureElementScreenshot };
|
@@ -8,8 +8,12 @@
|
|
8
8
|
@apply mb-4 xl:mb-6;
|
9
9
|
}
|
10
10
|
|
11
|
+
.editor-form form {
|
12
|
+
@apply hidden;
|
13
|
+
}
|
14
|
+
|
11
15
|
.editor-slide {
|
12
|
-
@apply shadow-
|
16
|
+
@apply shadow-md;
|
13
17
|
|
14
18
|
textarea {
|
15
19
|
@apply flex-none w-full;
|
@@ -20,16 +24,12 @@
|
|
20
24
|
@apply cursor-not-allowed;
|
21
25
|
}
|
22
26
|
|
23
|
-
.editor-thumbnail-
|
24
|
-
@apply hidden pointer-events-none;
|
25
|
-
}
|
26
|
-
|
27
|
-
.editor-screenshot-wrapper {
|
27
|
+
.editor-thumbnail-wrapper {
|
28
28
|
@apply w-0 overflow-hidden relative;
|
29
29
|
}
|
30
30
|
|
31
|
-
.editor-
|
32
|
-
@apply absolute w-[
|
31
|
+
.editor-thumbnail {
|
32
|
+
@apply absolute w-[500px] top-0 z-[-1000] pointer-events-none;
|
33
33
|
}
|
34
34
|
|
35
35
|
.editor-icon-bg-color {
|
@@ -37,9 +37,6 @@
|
|
37
37
|
stroke-width: 2px;
|
38
38
|
}
|
39
39
|
|
40
|
-
.editor-icon-text-color {
|
41
|
-
}
|
42
|
-
|
43
40
|
[data-component="app-seamless-textarea"] {
|
44
41
|
textarea {
|
45
42
|
@apply outline outline-1 outline-transparent outline-offset-0;
|
@@ -1,222 +1,169 @@
|
|
1
1
|
<%= render component_tag(x: {
|
2
2
|
data: x_data("appSlideEditor", alpine_props),
|
3
|
-
":class": "{ready}"
|
4
|
-
"@direct-upload:error": "directUploadError",
|
3
|
+
":class": "{ready}"
|
5
4
|
}) do %>
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
<% toolbar.with_section do |section| %>
|
19
|
-
<% if bg_color? %>
|
20
|
-
<% section.with_color_picker_button(
|
21
|
-
input_name: bg_color_name,
|
22
|
-
selected: bg_color_value,
|
23
|
-
form_builder: f,
|
24
|
-
wrapper: {
|
25
|
-
data: {
|
26
|
-
role: "bg-color-picker"
|
27
|
-
},
|
28
|
-
x: {
|
29
|
-
modelable: "selectedColor",
|
30
|
-
model: "bgColor"
|
31
|
-
}
|
5
|
+
<div class="editor-toolbar">
|
6
|
+
<%= coco_toolbar do |toolbar| %>
|
7
|
+
<% toolbar.with_section do |section| %>
|
8
|
+
<% if bg_color? %>
|
9
|
+
<% section.with_color_picker_button(
|
10
|
+
**@bg_color_options.to_h,
|
11
|
+
wrapper: {
|
12
|
+
data: {
|
13
|
+
role: "bg-color-picker"
|
14
|
+
},
|
15
|
+
x: {
|
16
|
+
"@color-picker:change": "bgColor = $event.detail.color"
|
32
17
|
}
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
18
|
+
}
|
19
|
+
) do |button| %>
|
20
|
+
<% button.with_picker %>
|
21
|
+
<% button.with_text { tt("bg_color_picker.label") } %>
|
22
|
+
<% button.with_icon do %>
|
23
|
+
<svg viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="editor-icon-bg-color">
|
24
|
+
<path d="M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z"></path>
|
25
|
+
</svg>
|
41
26
|
<% end %>
|
42
27
|
<% end %>
|
43
|
-
|
44
|
-
<% if bg_image? %>
|
45
|
-
<% section.with_image_picker_button(
|
46
|
-
icon: :image_plus,
|
47
|
-
input_name: bg_image_name,
|
48
|
-
src: bg_image_value,
|
49
|
-
direct_upload: bg_image_options[:direct_upload],
|
50
|
-
form_builder: f,
|
51
|
-
wrapper: {
|
52
|
-
data: {
|
53
|
-
role: "bg-image-picker"
|
54
|
-
},
|
55
|
-
x: {
|
56
|
-
modelable: "selectedImage",
|
57
|
-
model: "bgImage"
|
58
|
-
}
|
59
|
-
}
|
60
|
-
) do |button| %>
|
61
|
-
<% button.with_picker do |picker| %>
|
62
|
-
<% picker.with_blank_state_text do %>
|
63
|
-
Drag a jpg, png or gif onto the slide area...or...
|
64
|
-
<% end %>
|
65
|
-
<% end %>
|
28
|
+
<% end %>
|
66
29
|
|
67
|
-
|
30
|
+
<% if bg_image? %>
|
31
|
+
<% section.with_image_picker_button(
|
32
|
+
icon: :image_plus,
|
33
|
+
src: bg_image_src,
|
34
|
+
wrapper: {
|
35
|
+
data: {
|
36
|
+
role: "bg-image-picker"
|
37
|
+
},
|
38
|
+
x: {
|
39
|
+
"@image-picker:change": "bgImage = $event.detail.image"
|
40
|
+
}
|
41
|
+
}
|
42
|
+
) do |button| %>
|
43
|
+
<% button.with_picker do |picker| %>
|
44
|
+
<% picker.with_blank_state_text { tt("bg_image_picker.blank_state") } %>
|
68
45
|
<% end %>
|
46
|
+
|
47
|
+
<%= tt("bg_image_picker.label") %>
|
69
48
|
<% end %>
|
49
|
+
<% end %>
|
70
50
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
x: {
|
81
|
-
modelable: "selectedColor",
|
82
|
-
model: "textColor"
|
83
|
-
}
|
51
|
+
<% if text_color? %>
|
52
|
+
<% section.with_color_picker_button(
|
53
|
+
**@text_color_options.to_h,
|
54
|
+
wrapper: {
|
55
|
+
data: {
|
56
|
+
role: "text-color-picker"
|
57
|
+
},
|
58
|
+
x: {
|
59
|
+
"@color-picker:change": "textColor = $event.detail.color"
|
84
60
|
}
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
61
|
+
}
|
62
|
+
) do |button| %>
|
63
|
+
<% button.with_picker %>
|
64
|
+
<% button.with_text { tt("text_color_picker.label") } %>
|
65
|
+
<% button.with_icon do %>
|
66
|
+
<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
67
|
+
<path d="M4.99994 13.3333L9.99994 3.33334L14.9999 13.3333" stroke="#111827" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
|
68
|
+
<path d="M6.66656 10H13.3332" stroke="#111827" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
|
69
|
+
<rect x="2.25" y="15.25" width="15.5" height="2.5" rx="1.25" fill="currentColor" stroke="#111827" stroke-width="0.5"/>
|
70
|
+
</svg>
|
95
71
|
<% end %>
|
96
72
|
<% end %>
|
97
73
|
<% end %>
|
74
|
+
<% end %>
|
98
75
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
76
|
+
<% toolbar.with_section do |section| %>
|
77
|
+
<% section.with_button(
|
78
|
+
icon: :undo_2,
|
79
|
+
click: "history.undo",
|
80
|
+
tooltip: tt("undo_button.tooltip"),
|
81
|
+
theme: :text_secondary,
|
82
|
+
disabled: true,
|
83
|
+
x: { "effect": "disabled = saving || !history.undoable" },
|
84
|
+
data: {
|
85
|
+
role: "undo"
|
86
|
+
}
|
87
|
+
) %>
|
111
88
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
<% end %>
|
89
|
+
<% section.with_button(
|
90
|
+
icon: :redo_2,
|
91
|
+
click: "history.redo",
|
92
|
+
tooltip: tt("redo_button.tooltip"),
|
93
|
+
theme: :text_secondary,
|
94
|
+
disabled: true,
|
95
|
+
x: { "effect": "disabled = saving || !history.redoable" },
|
96
|
+
data: {
|
97
|
+
role: "redo"
|
98
|
+
}
|
99
|
+
) %>
|
100
|
+
|
101
|
+
<% section.with_button(
|
102
|
+
theme: :positive,
|
103
|
+
icon: :check,
|
104
|
+
collapsible: false,
|
105
|
+
type: "submit",
|
106
|
+
disabled: true,
|
107
|
+
data: {
|
108
|
+
role: "save"
|
109
|
+
},
|
110
|
+
x: {
|
111
|
+
"@click.stop.prevent": "if(!loading) save()",
|
112
|
+
"effect": "loading = saving; disabled = !history.undoable",
|
113
|
+
":class": "{'editor-saving': saving}"
|
114
|
+
}
|
115
|
+
) do |button| %>
|
116
|
+
<% button.with_state(:loading, text: tt("save_button.saving_label")) %>
|
117
|
+
<%= tt("save_button.label") %>
|
142
118
|
<% end %>
|
143
|
-
<% end %>
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
name: title_name,
|
168
|
-
multiline: false,
|
169
|
-
form_builder: f,
|
170
|
-
**title_options,
|
171
|
-
wrapper: {
|
172
|
-
data: {
|
173
|
-
role: "title-editor"
|
174
|
-
},
|
175
|
-
x: {
|
176
|
-
modelable: "value",
|
177
|
-
model: "title"
|
178
|
-
}
|
179
|
-
}
|
180
|
-
) %>
|
181
|
-
<% end %>
|
119
|
+
<% end %>
|
120
|
+
<% end %>
|
121
|
+
</div>
|
122
|
+
|
123
|
+
<%# Editable slide %>
|
124
|
+
<div
|
125
|
+
class="editor-slide"
|
126
|
+
x-ref="slide"
|
127
|
+
@dragenter.stop.prevent="dragging = true"
|
128
|
+
@dragover.stop.prevent="dragging = true"
|
129
|
+
@dragleave.stop.prevent="dragging = false"
|
130
|
+
@drop.stop.prevent="handleImageDrop($event)">
|
131
|
+
<%= coco_editable_slide(
|
132
|
+
**slide_args,
|
133
|
+
data: {
|
134
|
+
role: "slide"
|
135
|
+
},
|
136
|
+
x: {
|
137
|
+
bind: "slide"
|
138
|
+
}
|
139
|
+
) do |slide| %>
|
140
|
+
<% if title? %>
|
141
|
+
<% slide.with_title do %>
|
142
|
+
<%= title %>
|
182
143
|
<% end %>
|
144
|
+
<% end %>
|
183
145
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
name: text_1_name,
|
188
|
-
multiline: true,
|
189
|
-
form_builder: f,
|
190
|
-
**text_1_options,
|
191
|
-
wrapper: {
|
192
|
-
data: {
|
193
|
-
role: "text-1-editor"
|
194
|
-
},
|
195
|
-
x: {
|
196
|
-
modelable: "value",
|
197
|
-
model: "text1"
|
198
|
-
}
|
199
|
-
}
|
200
|
-
) %>
|
201
|
-
<% end %>
|
146
|
+
<% if text_1? %>
|
147
|
+
<% slide.with_text_1 do %>
|
148
|
+
<%= text_1 %>
|
202
149
|
<% end %>
|
203
150
|
<% end %>
|
204
|
-
</div>
|
205
|
-
|
206
|
-
<% if content %>
|
207
|
-
<%# Any additional fields required %>
|
208
|
-
<div class="editor-additional-content">
|
209
|
-
<%= content %>
|
210
|
-
</div>
|
211
151
|
<% end %>
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
<% if thumbnail? %>
|
152
|
+
</div>
|
153
|
+
|
154
|
+
<% if generate_thumbnail? %>
|
216
155
|
<%# Slide used for thumbnail generation %>
|
217
|
-
<div class="editor-
|
218
|
-
<div x-ref="
|
219
|
-
<%= coco_editable_slide(
|
156
|
+
<div class="editor-thumbnail-wrapper">
|
157
|
+
<div x-ref="thumbnail" class="editor-thumbnail">
|
158
|
+
<%= coco_editable_slide(
|
159
|
+
**slide_args,
|
160
|
+
data: {
|
161
|
+
role: "slide-thumbnail"
|
162
|
+
},
|
163
|
+
x: {
|
164
|
+
bind: "slide"
|
165
|
+
}
|
166
|
+
) do |slide| %>
|
220
167
|
<% if title? %>
|
221
168
|
<% slide.with_title do %>
|
222
169
|
<span x-text="title"></span>
|
@@ -232,4 +179,16 @@
|
|
232
179
|
</div>
|
233
180
|
</div>
|
234
181
|
<% end %>
|
182
|
+
|
183
|
+
<% if content %>
|
184
|
+
<div
|
185
|
+
class="editor-form"
|
186
|
+
x-ref="form"
|
187
|
+
@turbo:submit-end="submitSuccess"
|
188
|
+
@turbo:fetch-request-error="submitError"
|
189
|
+
@direct-upload:error="directUploadError"
|
190
|
+
@direct-uploads:end="save">
|
191
|
+
<%= content %>
|
192
|
+
</div>
|
193
|
+
<% end %>
|
235
194
|
<% end %>
|