coveragebook_components 0.5.7 → 0.6.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: 659228f5bee7137d83a98ee0c7b1391a492a7c2a90533ec428d4be4771eac5be
4
- data.tar.gz: cd05d30bfb21b8bbe169615f5d061cac481de84ce6dc9f2080d8a5c40be77f96
3
+ metadata.gz: 324d5f797b12a43ba287186f0bb292881a0b2d7fa3cebf348c66394b1ab56543
4
+ data.tar.gz: 8d890765e161085db340052746adbe5def80174e6b3c410829d7add5a40d29e3
5
5
  SHA512:
6
- metadata.gz: f13bcbb0021c35bfa9b5eca89471a718e8b17e0cadf78572266da7567865ebd2ee1501188976ce45fb788598cc54f5c7f7a36ea6855bd8f41abce29d73451bf2
7
- data.tar.gz: b84c1b8db37c0584d6e922325bdc65c883b2f8d764b95bbe457ceaaab82f08b880955be4088432688bf812ab8e20510d5e24e071a6bb2b1e6af570131958893d
6
+ metadata.gz: c8c4c8539446948b4b2da346ff121fd7420d755ff7a0c992a68b9c26c40d905c6531c476603ba250edfc5b3d2f97da27bf3a587cb82184a4f01966368fb89661
7
+ data.tar.gz: 9c954db0e3d53181459c812fdd0248f99f2fda517fead437da41be871ea6f2f38598b46d65ee742da0e2557a709bb6d867f61ba0a4c9f2aaa9de09c9b1dfa50e
@@ -1104,6 +1104,8 @@ select{
1104
1104
  margin-bottom: 1.5rem}}
1105
1105
  [data-coco][data-component="app-slide-editor"] .editor-form form{
1106
1106
  display: none}
1107
+ [data-coco][data-component="app-slide-editor"] .slide-media{
1108
+ position: relative}
1107
1109
  [data-coco][data-component="app-slide-editor"] .editor-slide{
1108
1110
  --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
1109
1111
  --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
@@ -1111,6 +1113,97 @@ select{
1111
1113
  [data-coco][data-component="app-slide-editor"] .editor-slide textarea{
1112
1114
  width: 100%;
1113
1115
  flex: none}
1116
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader{
1117
+ position: relative;
1118
+ height: 100%;
1119
+ width: 100%}
1120
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-foreground-image{
1121
+ position: relative;
1122
+ height: 100%;
1123
+ width: 100%;
1124
+ transition-property: outline-color;
1125
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1126
+ transition-duration: 100ms}
1127
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-foreground-image:hover{
1128
+ outline-style: solid;
1129
+ outline-width: 1px;
1130
+ outline-offset: 0px;
1131
+ outline-color: transparent}
1132
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-foreground-image img{
1133
+ height: 100%;
1134
+ width: 100%;
1135
+ -o-object-fit: contain;
1136
+ object-fit: contain}
1137
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder{
1138
+ inset: 0px;
1139
+ display: flex;
1140
+ flex-direction: column;
1141
+ align-items: center;
1142
+ justify-content: center;
1143
+ text-align: center}
1144
+ @supports (aspect-ratio: 1 / 1){
1145
+
1146
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder{
1147
+ aspect-ratio: 4/3}}
1148
+ @supports not (aspect-ratio: 1 / 1){
1149
+
1150
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder::before{
1151
+ content: "";
1152
+ float: left;
1153
+ padding-top: calc(100% / (4/3))}
1154
+
1155
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder::after{
1156
+ clear: left;
1157
+ content: "";
1158
+ display: block}}
1159
+ @container (min-width: 700px){
1160
+
1161
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder{
1162
+ position: absolute}
1163
+
1164
+ @supports (aspect-ratio: 1 / 1){
1165
+
1166
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder{
1167
+ aspect-ratio: auto}}
1168
+
1169
+ @supports not (aspect-ratio: 1 / 1){
1170
+
1171
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder::before{
1172
+ content: "";
1173
+ float: left;
1174
+ padding-top: calc(100% / (auto))}
1175
+
1176
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder::after{
1177
+ clear: left;
1178
+ content: "";
1179
+ display: block}}}
1180
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder{
1181
+ outline-style: solid;
1182
+ outline-width: 1px;
1183
+ outline-offset: 0px;
1184
+ outline-color: transparent;
1185
+ background-color: rgba(255, 255, 255, 0.1)}
1186
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder .coco-icon{
1187
+ color: currentColor;
1188
+ width: 3em;
1189
+ height: 3em;
1190
+ margin-bottom: 0.6em}
1191
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder .coco-icon,
1192
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-placeholder .editor-image-upload-placeholder-text{
1193
+ opacity: 0.5}
1194
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader .editor-image-upload-toolbar{
1195
+ position: absolute;
1196
+ left: 50%;
1197
+ top: 0px;
1198
+ --tw-translate-x: -50%;
1199
+ --tw-translate-y: -50%;
1200
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1201
+ opacity: 0;
1202
+ transition-property: opacity;
1203
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1204
+ transition-duration: 100ms}
1205
+ [data-coco][data-component="app-slide-editor"] .editor-foreground-image-uploader:hover .editor-image-upload-toolbar{
1206
+ opacity: 1}
1114
1207
  [data-coco][data-component="app-slide-editor"] .coco-button.editor-saving{
1115
1208
  cursor: not-allowed}
1116
1209
  [data-coco][data-component="app-slide-editor"] .editor-thumbnail-wrapper{
@@ -1122,7 +1215,13 @@ select{
1122
1215
  position: absolute;
1123
1216
  top: 0px;
1124
1217
  z-index: -1000;
1125
- width: 500px}
1218
+ width: 780px}
1219
+ [data-coco][data-component="app-slide-editor"] .editor-thumbnail-image{
1220
+ height: 100%;
1221
+ width: 100%;
1222
+ background-size: contain;
1223
+ background-position: center;
1224
+ background-repeat: no-repeat}
1126
1225
  [data-coco][data-component="app-slide-editor"] .editor-icon-bg-color{
1127
1226
  fill: currentColor;
1128
1227
  stroke: #111827;
@@ -1131,19 +1230,36 @@ select{
1131
1230
  outline-style: solid;
1132
1231
  outline-width: 1px;
1133
1232
  outline-offset: 0px;
1134
- outline-color: transparent}
1233
+ outline-color: transparent;
1234
+ transition-property: outline-color;
1235
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1236
+ transition-duration: 100ms}
1135
1237
  [data-coco][data-component="app-slide-editor"] [data-component="app-seamless-textarea"] textarea::-moz-placeholder{
1136
1238
  font-style: italic}
1137
1239
  [data-coco][data-component="app-slide-editor"] [data-component="app-seamless-textarea"] textarea::placeholder{
1138
1240
  font-style: italic}
1241
+ [data-coco][data-component="app-slide-editor"] .slide-bg-light .editor-foreground-image,
1242
+ [data-coco][data-component="app-slide-editor"] .slide-bg-light .editor-image-upload-placeholder {
1243
+ outline-color: rgba(0, 0, 0, 0.3) !important;
1244
+ }
1245
+ [data-coco][data-component="app-slide-editor"] .slide-bg-light .editor-image-upload-placeholder{
1246
+ --tw-text-opacity: 1;
1247
+ color: rgb(17 24 39 / var(--tw-text-opacity))}
1139
1248
  [data-coco][data-component="app-slide-editor"] .slide-bg-light [data-component="app-seamless-textarea"] textarea:hover,
1140
- [data-coco][data-component="app-slide-editor"] .slide-bg-light [data-component="app-seamless-textarea"] textarea:focus {
1141
- outline-color: rgba(0, 0, 0, 0.3);
1142
- }
1249
+ [data-coco][data-component="app-slide-editor"] .slide-bg-light [data-component="app-seamless-textarea"] textarea:focus {
1250
+ outline-color: rgba(0, 0, 0, 0.3);
1251
+ }
1252
+ [data-coco][data-component="app-slide-editor"] .slide-bg-dark .editor-foreground-image,
1253
+ [data-coco][data-component="app-slide-editor"] .slide-bg-dark .editor-image-upload-placeholder {
1254
+ outline-color: rgba(255, 255, 255, 0.3) !important;
1255
+ }
1256
+ [data-coco][data-component="app-slide-editor"] .slide-bg-dark .editor-image-upload-placeholder{
1257
+ --tw-text-opacity: 1;
1258
+ color: rgb(255 255 255 / var(--tw-text-opacity))}
1143
1259
  [data-coco][data-component="app-slide-editor"] .slide-bg-dark [data-component="app-seamless-textarea"] textarea:hover,
1144
- [data-coco][data-component="app-slide-editor"] .slide-bg-dark [data-component="app-seamless-textarea"] textarea:focus {
1145
- outline-color: rgba(255, 255, 255, 0.3);
1146
- }
1260
+ [data-coco][data-component="app-slide-editor"] .slide-bg-dark [data-component="app-seamless-textarea"] textarea:focus {
1261
+ outline-color: rgba(255, 255, 255, 0.3);
1262
+ }
1147
1263
  [data-coco][data-component="app-alert"]{
1148
1264
  overflow: hidden;
1149
1265
  border-radius: 0.75rem;
@@ -3210,7 +3326,7 @@ select{
3210
3326
  [data-coco][data-component="book-editable-slide"] [data-slide-region],
3211
3327
  [data-coco][data-component="book-editable-slide"] .slide-header,
3212
3328
  [data-coco][data-component="book-editable-slide"] .slide-text,
3213
- [data-coco][data-component="book-editable-slide"] .slide-image{
3329
+ [data-coco][data-component="book-editable-slide"] .slide-media{
3214
3330
  display: none}
3215
3331
  [data-coco][data-component="book-editable-slide"] .slide-group{
3216
3332
  display: contents}
@@ -3225,7 +3341,9 @@ select{
3225
3341
  line-height: 1.5;
3226
3342
  font-size: var(--text-font-size)}
3227
3343
  [data-coco][data-component="book-editable-slide"] .slide-media{
3228
- width: 100%}
3344
+ width: 100%;
3345
+ color: currentColor;
3346
+ font-size: var(--text-font-size)}
3229
3347
  [data-coco][data-component="book-editable-slide"] .slide-media img{
3230
3348
  height: 100%;
3231
3349
  width: 100%;
@@ -3292,6 +3410,14 @@ select{
3292
3410
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-title"] .slide-text {
3293
3411
  line-height: 1.4;
3294
3412
  }
3413
+ [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] .slide-container{
3414
+ padding-top: 1.5rem;
3415
+ padding-bottom: 1.5rem}
3416
+ @container (min-width: 700px){
3417
+
3418
+ [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] .slide-container{
3419
+ padding-top: var(--slide-padding-sm);
3420
+ padding-bottom: var(--slide-padding-sm)}}
3295
3421
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] .slide-container{
3296
3422
  display: flex;
3297
3423
  align-items: center}
@@ -3326,13 +3452,11 @@ select{
3326
3452
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] [data-slide-region="content-1"] .slide-text{
3327
3453
  display: block}
3328
3454
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-container{
3329
- padding-top: 1.5rem;
3330
- padding-bottom: 1.5rem}
3455
+ padding: 1.5rem}
3331
3456
  @container (min-width: 700px){
3332
3457
 
3333
3458
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-container{
3334
- padding-top: var(--slide-padding-sm);
3335
- padding-bottom: var(--slide-padding-sm)}}
3459
+ padding: var(--slide-padding-sm)}}
3336
3460
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-layout,
3337
3461
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-content{
3338
3462
  height: 100%}
@@ -3392,21 +3516,15 @@ select{
3392
3516
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"],
3393
3517
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-2"]{
3394
3518
  display: block}
3395
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"] .slide-text,
3396
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"] .slide-media,
3397
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-2"] .slide-text,
3398
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-2"] .slide-media,
3399
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"] .slide-text,
3400
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"] .slide-media,
3401
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-2"] .slide-text,
3402
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-2"] .slide-media{
3403
- display: block}
3404
3519
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"], [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"]{
3405
3520
  margin-bottom: var(--slide-padding-sm)}
3406
3521
  @container (min-width: 700px){
3407
3522
 
3408
3523
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"], [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"]{
3409
- margin-bottom: 0px}
3524
+ margin-bottom: 0px}}
3525
+ [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] .slide-text{
3526
+ display: block}
3527
+ @container (min-width: 700px){
3410
3528
 
3411
3529
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-layout{
3412
3530
  height: 100%}}
@@ -3417,7 +3535,10 @@ select{
3417
3535
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-content{
3418
3536
  display: flex;
3419
3537
  height: 100%;
3420
- align-items: center}
3538
+ align-items: center}}
3539
+ [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-media{
3540
+ display: block}
3541
+ @container (min-width: 700px){
3421
3542
 
3422
3543
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-media{
3423
3544
  position: absolute;
@@ -14604,7 +14604,7 @@
14604
14604
  var package_default = {
14605
14605
  name: "coveragebook-components",
14606
14606
  type: "module",
14607
- version: "0.5.7",
14607
+ version: "0.6.0",
14608
14608
  main: "index.js",
14609
14609
  repository: "git@github.com:coveragebook/coco.git",
14610
14610
  author: "Mark Perkins <mark@coveragebook.com>",
@@ -29276,7 +29276,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29276
29276
  confirmed: true,
29277
29277
  lastState: null,
29278
29278
  stateTooltips: data2.tooltips || {},
29279
- tooltipText: null
29279
+ tooltipText: null,
29280
+ dropdown: null
29280
29281
  }, data2.props || {}), {
29281
29282
  init() {
29282
29283
  this.lastState = this.state;
@@ -29316,6 +29317,17 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29316
29317
  set disabled(value) {
29317
29318
  this.$options.disabled = value;
29318
29319
  },
29320
+ /* dropdown */
29321
+ hideDropdown() {
29322
+ if (this.dropdown) {
29323
+ this.dropdown.hide();
29324
+ }
29325
+ },
29326
+ showDropdown() {
29327
+ if (this.dropdown) {
29328
+ this.dropdown.show();
29329
+ }
29330
+ },
29319
29331
  /* confirmation */
29320
29332
  checkConfirmation(event) {
29321
29333
  if (!this.confirmed) {
@@ -29665,11 +29677,20 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29665
29677
  layout: data2.layout,
29666
29678
  title: data2.title,
29667
29679
  text1: data2.text1,
29680
+ text2: data2.text2,
29668
29681
  bgColor: data2.bgColor,
29669
29682
  textColor: data2.textColor,
29670
29683
  bgImage: {
29671
29684
  name: data2.bgImage,
29672
29685
  data: data2.bgImage
29686
+ },
29687
+ image1: {
29688
+ name: data2.image1,
29689
+ data: data2.image1
29690
+ },
29691
+ image2: {
29692
+ name: data2.image2,
29693
+ data: data2.image2
29673
29694
  }
29674
29695
  };
29675
29696
  return __spreadProps(__spreadValues({
@@ -29684,6 +29705,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29684
29705
  get bgImagePicker() {
29685
29706
  return getData(this.$root.querySelector("[data-role='bg-image-picker']"));
29686
29707
  },
29708
+ get layoutPicker() {
29709
+ return getData(this.$root.querySelector("[data-role='layout-picker']"));
29710
+ },
29687
29711
  init() {
29688
29712
  this.$watch("errors", (errors) => {
29689
29713
  errors.forEach((error2) => console.error(error2.message));
@@ -29712,6 +29736,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29712
29736
  );
29713
29737
  Array.from(inputs).forEach((el) => getData(el).onResize());
29714
29738
  },
29739
+ setLayout(layout) {
29740
+ this.layout = layout;
29741
+ },
29715
29742
  handleImageDrop(event) {
29716
29743
  this.dragging = false;
29717
29744
  if (this.bgImagePicker) {
@@ -29782,6 +29809,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29782
29809
  get hasBgImage() {
29783
29810
  return !!(this.bgImage && this.bgImage.data);
29784
29811
  },
29812
+ get hasImage1() {
29813
+ return !!(this.image1 && this.image1.data);
29814
+ },
29815
+ get hasImage2() {
29816
+ return !!(this.image2 && this.image2.data);
29817
+ },
29785
29818
  get bgColorHex() {
29786
29819
  return this.bgColor.replace("#", "");
29787
29820
  },
@@ -29818,16 +29851,22 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
29818
29851
  "slide-bg-dark": this.isDarkBg,
29819
29852
  "slide-bg-light": !this.isDarkBg
29820
29853
  };
29821
- }
29854
+ },
29855
+ [":data-layout"]: "layout"
29822
29856
  },
29823
29857
  input: {
29824
- layout: { "x-model.fill": "layout" },
29858
+ layout: { "x-model.fill": "layout.replace(/-/g,'_')" },
29825
29859
  title: { "x-model.fill": "title" },
29826
29860
  text1: { "x-model.fill": "text1" },
29861
+ text2: { "x-model.fill": "text2" },
29827
29862
  bgColor: { "x-model.fill": "bgColorHex" },
29828
29863
  textColor: { "x-model.fill": "textColorHex" },
29829
29864
  bgImage: { "x-effect": "syncFileInput($el, bgImage.file)" },
29830
29865
  bgImagePurge: { ":checked": "!hasBgImage" },
29866
+ image1: { "x-effect": "syncFileInput($el, image1.file)" },
29867
+ image1Purge: { ":checked": "!hasImage1" },
29868
+ image2: { "x-effect": "syncFileInput($el, image2.file)" },
29869
+ image2Purge: { ":checked": "!hasImage2" },
29831
29870
  thumbnailImage: { "x-effect": "syncFileInput($el, thumbnailFile)" }
29832
29871
  }
29833
29872
  });
@@ -31883,7 +31922,11 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
31883
31922
  this.$root.querySelector("[data-role='layout-picker']").firstElementChild
31884
31923
  );
31885
31924
  },
31886
- onDropdownMount() {
31925
+ getButton() {
31926
+ return getData(this.$root.querySelector(".layout-picker-trigger"));
31927
+ },
31928
+ init() {
31929
+ this.$watch("selectedLayout", () => this.getButton().hideDropdown());
31887
31930
  }
31888
31931
  };
31889
31932
  });
@@ -842,7 +842,7 @@ select {
842
842
  [data-coco][data-component="book-editable-slide"] [data-slide-region],
843
843
  [data-coco][data-component="book-editable-slide"] .slide-header,
844
844
  [data-coco][data-component="book-editable-slide"] .slide-text,
845
- [data-coco][data-component="book-editable-slide"] .slide-image {
845
+ [data-coco][data-component="book-editable-slide"] .slide-media {
846
846
  display: none;
847
847
  }
848
848
  [data-coco][data-component="book-editable-slide"] .slide-group {
@@ -862,6 +862,8 @@ select {
862
862
  }
863
863
  [data-coco][data-component="book-editable-slide"] .slide-media {
864
864
  width: 100%;
865
+ color: currentColor;
866
+ font-size: var(--text-font-size);
865
867
  }
866
868
  [data-coco][data-component="book-editable-slide"] .slide-media img {
867
869
  height: 100%;
@@ -940,6 +942,17 @@ select {
940
942
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-title"] .slide-text {
941
943
  line-height: 1.4;
942
944
  }
945
+ [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] .slide-container {
946
+ padding-top: 1.5rem;
947
+ padding-bottom: 1.5rem;
948
+ }
949
+ @container (min-width: 700px) {
950
+
951
+ [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] .slide-container {
952
+ padding-top: var(--slide-padding-sm);
953
+ padding-bottom: var(--slide-padding-sm);
954
+ }
955
+ }
943
956
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-text"] .slide-container {
944
957
  display: flex;
945
958
  align-items: center;
@@ -985,14 +998,12 @@ select {
985
998
  display: block;
986
999
  }
987
1000
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-container {
988
- padding-top: 1.5rem;
989
- padding-bottom: 1.5rem;
1001
+ padding: 1.5rem;
990
1002
  }
991
1003
  @container (min-width: 700px) {
992
1004
 
993
1005
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-container {
994
- padding-top: var(--slide-padding-sm);
995
- padding-bottom: var(--slide-padding-sm);
1006
+ padding: var(--slide-padding-sm);
996
1007
  }
997
1008
  }
998
1009
  [data-coco][data-component="book-editable-slide"][data-layout="one-col-media"] .slide-layout,
@@ -1070,16 +1081,6 @@ select {
1070
1081
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-2"] {
1071
1082
  display: block;
1072
1083
  }
1073
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"] .slide-text,
1074
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"] .slide-media,
1075
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-2"] .slide-text,
1076
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-2"] .slide-media,
1077
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"] .slide-text,
1078
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"] .slide-media,
1079
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-2"] .slide-text,
1080
- [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-2"] .slide-media {
1081
- display: block;
1082
- }
1083
1084
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"], [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"] {
1084
1085
  margin-bottom: var(--slide-padding-sm);
1085
1086
  }
@@ -1088,6 +1089,11 @@ select {
1088
1089
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] [data-slide-region="content-1"], [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] [data-slide-region="content-1"] {
1089
1090
  margin-bottom: 0px;
1090
1091
  }
1092
+ }
1093
+ [data-coco][data-component="book-editable-slide"][data-layout="two-col-text"] .slide-text {
1094
+ display: block;
1095
+ }
1096
+ @container (min-width: 700px) {
1091
1097
 
1092
1098
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-layout {
1093
1099
  height: 100%;
@@ -1103,6 +1109,11 @@ select {
1103
1109
  height: 100%;
1104
1110
  align-items: center;
1105
1111
  }
1112
+ }
1113
+ [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-media {
1114
+ display: block;
1115
+ }
1116
+ @container (min-width: 700px) {
1106
1117
 
1107
1118
  [data-coco][data-component="book-editable-slide"][data-layout="two-col-media"] .slide-media {
1108
1119
  position: absolute;
@@ -14962,7 +14962,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
14962
14962
  confirmed: true,
14963
14963
  lastState: null,
14964
14964
  stateTooltips: data2.tooltips || {},
14965
- tooltipText: null
14965
+ tooltipText: null,
14966
+ dropdown: null
14966
14967
  }, data2.props || {}), {
14967
14968
  init() {
14968
14969
  this.lastState = this.state;
@@ -15002,6 +15003,17 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15002
15003
  set disabled(value) {
15003
15004
  this.$options.disabled = value;
15004
15005
  },
15006
+ /* dropdown */
15007
+ hideDropdown() {
15008
+ if (this.dropdown) {
15009
+ this.dropdown.hide();
15010
+ }
15011
+ },
15012
+ showDropdown() {
15013
+ if (this.dropdown) {
15014
+ this.dropdown.show();
15015
+ }
15016
+ },
15005
15017
  /* confirmation */
15006
15018
  checkConfirmation(event) {
15007
15019
  if (!this.confirmed) {
@@ -12,6 +12,10 @@
12
12
  @apply hidden;
13
13
  }
14
14
 
15
+ .slide-media {
16
+ @apply relative;
17
+ }
18
+
15
19
  .editor-slide {
16
20
  @apply shadow-md;
17
21
 
@@ -20,6 +24,48 @@
20
24
  }
21
25
  }
22
26
 
27
+ .editor-foreground-image-uploader {
28
+ @apply h-full w-full relative;
29
+
30
+ .editor-foreground-image {
31
+ @apply h-full w-full relative transition-[outline-color] duration-100;
32
+
33
+ &:hover {
34
+ @apply outline outline-1 outline-transparent outline-offset-0;
35
+ }
36
+
37
+ img {
38
+ @apply w-full h-full object-contain;
39
+ }
40
+ }
41
+
42
+ .editor-image-upload-placeholder {
43
+ @apply inset-0 flex flex-col items-center justify-center text-center aspect-[4/3] @slide-fluid:aspect-auto @slide-fluid:absolute;
44
+ @apply outline outline-1 outline-transparent outline-offset-0;
45
+ background-color: rgba(255, 255, 255, 0.1);
46
+
47
+ .coco-icon {
48
+ @apply text-current;
49
+ width: 3em;
50
+ height: 3em;
51
+ margin-bottom: 0.6em;
52
+ }
53
+
54
+ .coco-icon,
55
+ .editor-image-upload-placeholder-text {
56
+ @apply opacity-50;
57
+ }
58
+ }
59
+
60
+ .editor-image-upload-toolbar {
61
+ @apply absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 opacity-0 transition-opacity duration-100;
62
+ }
63
+
64
+ &:hover .editor-image-upload-toolbar {
65
+ @apply opacity-100;
66
+ }
67
+ }
68
+
23
69
  .coco-button.editor-saving {
24
70
  @apply cursor-not-allowed;
25
71
  }
@@ -29,7 +75,11 @@
29
75
  }
30
76
 
31
77
  .editor-thumbnail {
32
- @apply absolute w-[500px] top-0 z-[-1000] pointer-events-none;
78
+ @apply absolute w-[780px] top-0 z-[-1000] pointer-events-none;
79
+ }
80
+
81
+ .editor-thumbnail-image {
82
+ @apply w-full h-full bg-contain bg-no-repeat bg-center;
33
83
  }
34
84
 
35
85
  .editor-icon-bg-color {
@@ -39,7 +89,7 @@
39
89
 
40
90
  [data-component="app-seamless-textarea"] {
41
91
  textarea {
42
- @apply outline outline-1 outline-transparent outline-offset-0;
92
+ @apply outline outline-1 outline-transparent outline-offset-0 transition-[outline-color] duration-100;
43
93
 
44
94
  &::placeholder {
45
95
  @apply italic;
@@ -47,20 +97,42 @@
47
97
  }
48
98
  }
49
99
 
50
- .slide-bg-light [data-component="app-seamless-textarea"] {
51
- textarea {
52
- &:hover,
53
- &:focus {
54
- outline-color: rgba(0, 0, 0, 0.3);
100
+ .slide-bg-light {
101
+ .editor-foreground-image,
102
+ .editor-image-upload-placeholder {
103
+ outline-color: rgba(0, 0, 0, 0.3) !important;
104
+ }
105
+
106
+ .editor-image-upload-placeholder {
107
+ @apply text-content-dark-1;
108
+ }
109
+
110
+ [data-component="app-seamless-textarea"] {
111
+ textarea {
112
+ &:hover,
113
+ &:focus {
114
+ outline-color: rgba(0, 0, 0, 0.3);
115
+ }
55
116
  }
56
117
  }
57
118
  }
58
119
 
59
- .slide-bg-dark [data-component="app-seamless-textarea"] {
60
- textarea {
61
- &:hover,
62
- &:focus {
63
- outline-color: rgba(255, 255, 255, 0.3);
120
+ .slide-bg-dark {
121
+ .editor-foreground-image,
122
+ .editor-image-upload-placeholder {
123
+ outline-color: rgba(255, 255, 255, 0.3) !important;
124
+ }
125
+
126
+ .editor-image-upload-placeholder {
127
+ @apply text-content-light-1;
128
+ }
129
+
130
+ [data-component="app-seamless-textarea"] {
131
+ textarea {
132
+ &:hover,
133
+ &:focus {
134
+ outline-color: rgba(255, 255, 255, 0.3);
135
+ }
64
136
  }
65
137
  }
66
138
  }
@@ -5,6 +5,30 @@
5
5
  <div class="editor-toolbar">
6
6
  <%= coco_toolbar do |toolbar| %>
7
7
  <% toolbar.with_section do |section| %>
8
+ <% if layout? %>
9
+ <% section.with_layout_picker_button(
10
+ icon: :layout_template,
11
+ selected: current_layout,
12
+ wrapper: {
13
+ data: {
14
+ role: "layout-picker"
15
+ },
16
+ x: {
17
+ "@layout-picker:change": "setLayout($event.detail.layout)"
18
+ }
19
+ }
20
+ ) do |button| %>
21
+ <% button.with_layout(name: "one-col-title", thumbnail: "slides/one-col-title-layout") %>
22
+ <% button.with_layout(name: "two-col-mixed", thumbnail: "slides/two-col-mixed-layout") %>
23
+ <% button.with_layout(name: "one-col-media", thumbnail: "slides/one-col-media-layout") %>
24
+ <% button.with_layout(name: "two-col-media", thumbnail: "slides/two-col-media-layout") %>
25
+ <% button.with_layout(name: "one-col-text", thumbnail: "slides/one-col-text-layout") %>
26
+ <% button.with_layout(name: "two-col-text", thumbnail: "slides/two-col-text-layout") %>
27
+
28
+ <%= tt("layout_picker.label") %>
29
+ <% end %>
30
+ <% end %>
31
+
8
32
  <% if bg_color? %>
9
33
  <% section.with_color_picker_button(
10
34
  **@bg_color_options.to_h,
@@ -147,6 +171,64 @@
147
171
  <%= text_1 %>
148
172
  <% end %>
149
173
  <% end %>
174
+
175
+ <% if text_2? %>
176
+ <% slide.with_text_2 do %>
177
+ <%= text_2 %>
178
+ <% end %>
179
+ <% end %>
180
+
181
+ <% if image_1? %>
182
+ <% slide.with_image_1 do %>
183
+ <%= render Coco::ImageUploader.new(
184
+ class: "editor-foreground-image-uploader",
185
+ x: {
186
+ "@image-uploader:load": "image1 = $event.detail.file"
187
+ }
188
+ ) do %>
189
+ <div class="editor-foreground-image" x-show="hasImage1">
190
+ <%= coco_button_group(
191
+ theme: :toolbar,
192
+ floating: true,
193
+ class: "editor-image-upload-toolbar"
194
+ ) do |group| %>
195
+ <% group.with_button(icon: :trash_2, tooltip: "remove image", x: {"@click.stop": "image1 = {}"}) %>
196
+ <% end %>
197
+ <img :src="image1.data">
198
+ </div>
199
+ <div class="editor-image-upload-placeholder" x-show="!hasImage1">
200
+ <%= coco_icon(:image_plus) %>
201
+ <div class="editor-image-upload-placeholder-text">Add image</div>
202
+ </div>
203
+ <% end %>
204
+ <% end %>
205
+ <% end %>
206
+
207
+ <% if image_2? %>
208
+ <% slide.with_image_2 do %>
209
+ <%= render Coco::ImageUploader.new(
210
+ class: "editor-foreground-image-uploader",
211
+ x: {
212
+ "@image-uploader:load": "image2 = $event.detail.file"
213
+ }
214
+ ) do %>
215
+ <div class="editor-foreground-image" x-show="hasImage2">
216
+ <%= coco_button_group(
217
+ theme: :toolbar,
218
+ floating: true,
219
+ class: "editor-image-upload-toolbar"
220
+ ) do |group| %>
221
+ <% group.with_button(icon: :trash_2, tooltip: "remove image", x: {"@click.stop": "image2 = {}"}) %>
222
+ <% end %>
223
+ <img :src="image2.data">
224
+ </div>
225
+ <div class="editor-image-upload-placeholder" x-show="!hasImage2">
226
+ <%= coco_icon(:image_plus) %>
227
+ <div class="editor-image-upload-placeholder-text">Add image</div>
228
+ </div>
229
+ <% end %>
230
+ <% end %>
231
+ <% end %>
150
232
  <% end %>
151
233
  </div>
152
234
 
@@ -174,6 +256,24 @@
174
256
  <span x-html="text1.replace(/\n/g, '<br>')"></span>
175
257
  <% end %>
176
258
  <% end %>
259
+
260
+ <% if text_2? %>
261
+ <% slide.with_text_2 do %>
262
+ <span x-html="text2.replace(/\n/g, '<br>')"></span>
263
+ <% end %>
264
+ <% end %>
265
+
266
+ <% if image_1? %>
267
+ <% slide.with_image_1 do %>
268
+ <div class="editor-thumbnail-image" :style="`background-image: url('${image1.data}')`"></div>
269
+ <% end %>
270
+ <% end %>
271
+
272
+ <% if image_2? %>
273
+ <% slide.with_image_2 do %>
274
+ <div class="editor-thumbnail-image" :style="`background-image: url('${image2.data}')`"></div>
275
+ <% end %>
276
+ <% end %>
177
277
  <% end %>
178
278
  </div>
179
279
  </div>
@@ -10,12 +10,21 @@ export default CocoComponent("appSlideEditor", (data) => {
10
10
  layout: data.layout,
11
11
  title: data.title,
12
12
  text1: data.text1,
13
+ text2: data.text2,
13
14
  bgColor: data.bgColor,
14
15
  textColor: data.textColor,
15
16
  bgImage: {
16
17
  name: data.bgImage,
17
18
  data: data.bgImage,
18
19
  },
20
+ image1: {
21
+ name: data.image1,
22
+ data: data.image1,
23
+ },
24
+ image2: {
25
+ name: data.image2,
26
+ data: data.image2,
27
+ },
19
28
  };
20
29
 
21
30
  return {
@@ -36,6 +45,10 @@ export default CocoComponent("appSlideEditor", (data) => {
36
45
  return getData(this.$root.querySelector("[data-role='bg-image-picker']"));
37
46
  },
38
47
 
48
+ get layoutPicker() {
49
+ return getData(this.$root.querySelector("[data-role='layout-picker']"));
50
+ },
51
+
39
52
  init() {
40
53
  this.$watch("errors", (errors) => {
41
54
  errors.forEach((error) => console.error(error.message)); // TODO display errors properly!
@@ -70,6 +83,10 @@ export default CocoComponent("appSlideEditor", (data) => {
70
83
  Array.from(inputs).forEach((el) => getData(el).onResize());
71
84
  },
72
85
 
86
+ setLayout(layout) {
87
+ this.layout = layout;
88
+ },
89
+
73
90
  handleImageDrop(event) {
74
91
  this.dragging = false;
75
92
 
@@ -157,6 +174,14 @@ export default CocoComponent("appSlideEditor", (data) => {
157
174
  return !!(this.bgImage && this.bgImage.data);
158
175
  },
159
176
 
177
+ get hasImage1() {
178
+ return !!(this.image1 && this.image1.data);
179
+ },
180
+
181
+ get hasImage2() {
182
+ return !!(this.image2 && this.image2.data);
183
+ },
184
+
160
185
  get bgColorHex() {
161
186
  return this.bgColor.replace("#", "");
162
187
  },
@@ -203,16 +228,22 @@ export default CocoComponent("appSlideEditor", (data) => {
203
228
  "slide-bg-light": !this.isDarkBg,
204
229
  };
205
230
  },
231
+ [":data-layout"]: "layout",
206
232
  },
207
233
 
208
234
  input: {
209
- layout: { "x-model.fill": "layout" },
235
+ layout: { "x-model.fill": "layout.replace(/-/g,'_')" },
210
236
  title: { "x-model.fill": "title" },
211
237
  text1: { "x-model.fill": "text1" },
238
+ text2: { "x-model.fill": "text2" },
212
239
  bgColor: { "x-model.fill": "bgColorHex" },
213
240
  textColor: { "x-model.fill": "textColorHex" },
214
241
  bgImage: { "x-effect": "syncFileInput($el, bgImage.file)" },
215
242
  bgImagePurge: { ":checked": "!hasBgImage" },
243
+ image1: { "x-effect": "syncFileInput($el, image1.file)" },
244
+ image1Purge: { ":checked": "!hasImage1" },
245
+ image2: { "x-effect": "syncFileInput($el, image2.file)" },
246
+ image2Purge: { ":checked": "!hasImage2" },
216
247
  thumbnailImage: { "x-effect": "syncFileInput($el, thumbnailFile)" },
217
248
  },
218
249
  };
@@ -6,6 +6,8 @@ module Coco
6
6
  include Coco::BookHelper
7
7
  include Coco::FormatHelper
8
8
 
9
+ DEFAULT_LAYOUT = "one-col-title"
10
+
9
11
  renders_one :title, ->(value = nil, **textarea_options) do
10
12
  Coco::App::Elements::SeamlessTextarea.new(**textarea_options,
11
13
  value: value,
@@ -23,6 +25,22 @@ module Coco
23
25
  x: {modelable: "value", model: "text1"})
24
26
  end
25
27
 
28
+ renders_one :text_2, ->(value = nil, **textarea_options) do
29
+ Coco::App::Elements::SeamlessTextarea.new(**textarea_options,
30
+ value: value,
31
+ multiline: true,
32
+ data: {role: "text-2-editor"},
33
+ x: {modelable: "value", model: "text2"})
34
+ end
35
+
36
+ renders_one :image_1, ->(src = nil, **image_options) do
37
+ @image_1_options = {src: src, **image_options}
38
+ end
39
+
40
+ renders_one :image_2, ->(src = nil, **image_options) do
41
+ @image_2_options = {src: src, **image_options}
42
+ end
43
+
26
44
  renders_one :bg_color, ->(value = nil, **input_options) do
27
45
  @bg_color_options = {selected: value, **input_options}
28
46
  end
@@ -35,6 +53,10 @@ module Coco
35
53
  @bg_image_options = {src: src, **input_options}
36
54
  end
37
55
 
56
+ renders_one :layout, ->(value = DEFAULT_LAYOUT, **input_options) do
57
+ @layout_options = {selected: value&.to_s&.tr("_", "-"), **input_options}
58
+ end
59
+
38
60
  def initialize(generate_thumbnail: true, **kwargs)
39
61
  @generate_thumbnail = generate_thumbnail
40
62
  end
@@ -46,6 +68,7 @@ module Coco
46
68
  bg_image: bg_image_src,
47
69
  bg_color_hex: bg_color_css,
48
70
  text_color_hex: text_color_css,
71
+ layout: current_layout,
49
72
  render_empty: true
50
73
  }
51
74
  end
@@ -56,7 +79,11 @@ module Coco
56
79
  text_color: text_color_css,
57
80
  title: title&.value,
58
81
  text_1: text_1&.value,
59
- bg_image: bg_image_src
82
+ text_2: text_2&.value,
83
+ image_1: image_1_src,
84
+ image_2: image_2_src,
85
+ bg_image: bg_image_src,
86
+ layout: current_layout
60
87
  }
61
88
  end
62
89
 
@@ -71,6 +98,18 @@ module Coco
71
98
  def bg_image_src
72
99
  @bg_image_options[:src] if @bg_image_options
73
100
  end
101
+
102
+ def image_1_src
103
+ @image_1_options[:src] if @image_1_options
104
+ end
105
+
106
+ def image_2_src
107
+ @image_2_options[:src] if @image_2_options
108
+ end
109
+
110
+ def current_layout
111
+ @layout_options&.fetch(:selected, DEFAULT_LAYOUT) || DEFAULT_LAYOUT
112
+ end
74
113
  end
75
114
  end
76
115
  end
@@ -1,6 +1,5 @@
1
1
  <%= render component_tag(x: {
2
- data: x_data("appLayoutPickerButton", {selected: selected}),
3
- "@dropdown:mount": "onDropdownMount"
2
+ data: x_data("appLayoutPickerButton", {selected: selected})
4
3
  }) do %>
5
4
  <div
6
5
  @layout-picker:selected="selectedLayout = $event.detail.layout"
@@ -12,6 +12,12 @@ export default CocoComponent("appLayoutPickerButton", ({ selected }) => {
12
12
  );
13
13
  },
14
14
 
15
- onDropdownMount() {},
15
+ getButton() {
16
+ return getData(this.$root.querySelector(".layout-picker-trigger"));
17
+ },
18
+
19
+ init() {
20
+ this.$watch("selectedLayout", () => this.getButton().hideDropdown());
21
+ },
16
22
  };
17
23
  });
@@ -8,6 +8,7 @@ module Coco
8
8
  include Coco::AppHelper
9
9
 
10
10
  wraps_component :button do |args|
11
+ args[:class] = [args[:class], "layout-picker-trigger"]
11
12
  Coco::App::Elements::Button.new(**args)
12
13
  end
13
14
 
@@ -13,6 +13,7 @@ export default CocoComponent("button", (data = {}) => {
13
13
  lastState: null,
14
14
  stateTooltips: data.tooltips || {},
15
15
  tooltipText: null,
16
+ dropdown: null,
16
17
 
17
18
  ...(data.props || {}),
18
19
 
@@ -66,6 +67,20 @@ export default CocoComponent("button", (data = {}) => {
66
67
  this.$options.disabled = value;
67
68
  },
68
69
 
70
+ /* dropdown */
71
+
72
+ hideDropdown() {
73
+ if (this.dropdown) {
74
+ this.dropdown.hide();
75
+ }
76
+ },
77
+
78
+ showDropdown() {
79
+ if (this.dropdown) {
80
+ this.dropdown.show();
81
+ }
82
+ },
83
+
69
84
  /* confirmation */
70
85
 
71
86
  checkConfirmation(event) {
@@ -14,6 +14,4 @@
14
14
  "@click.stop": "",
15
15
  "@change": "handleFiles($el.files)") %>
16
16
  <%= content %>
17
- <% end %>
18
-
19
-
17
+ <% end %>
@@ -55,7 +55,7 @@
55
55
  [data-slide-region],
56
56
  .slide-header,
57
57
  .slide-text,
58
- .slide-image {
58
+ .slide-media {
59
59
  @apply hidden;
60
60
  }
61
61
 
@@ -77,7 +77,8 @@
77
77
  }
78
78
 
79
79
  .slide-media {
80
- @apply w-full;
80
+ @apply w-full text-current;
81
+ font-size: var(--text-font-size);
81
82
 
82
83
  img {
83
84
  @apply w-full h-full object-contain;
@@ -147,6 +148,7 @@
147
148
 
148
149
  &[data-layout="one-col-text"] {
149
150
  .slide-container {
151
+ @apply py-6 @slide-fluid:py-[var(--slide-padding-sm)];
150
152
  @apply flex items-center;
151
153
  }
152
154
 
@@ -185,7 +187,7 @@
185
187
 
186
188
  &[data-layout="one-col-media"] {
187
189
  .slide-container {
188
- @apply py-6 @slide-fluid:py-[var(--slide-padding-sm)];
190
+ @apply p-6 @slide-fluid:p-[var(--slide-padding-sm)];
189
191
  }
190
192
 
191
193
  .slide-layout,
@@ -242,11 +244,6 @@
242
244
  [data-slide-region="content-1"],
243
245
  [data-slide-region="content-2"] {
244
246
  @apply block;
245
-
246
- .slide-text,
247
- .slide-media {
248
- @apply block;
249
- }
250
247
  }
251
248
 
252
249
  [data-slide-region="content-1"] {
@@ -254,6 +251,12 @@
254
251
  }
255
252
  }
256
253
 
254
+ &[data-layout="two-col-text"] {
255
+ .slide-text {
256
+ @apply block;
257
+ }
258
+ }
259
+
257
260
  &[data-layout="two-col-media"] {
258
261
  .slide-layout {
259
262
  @apply @slide-fluid:h-full;
@@ -264,7 +267,7 @@
264
267
  }
265
268
 
266
269
  .slide-media {
267
- @apply @slide-fluid:absolute @slide-fluid:inset-0;
270
+ @apply block @slide-fluid:absolute @slide-fluid:inset-0;
268
271
  }
269
272
  }
270
273
 
@@ -17,9 +17,10 @@
17
17
  <div class="slide-text" data-role="text-1">
18
18
  <%= text_1 %>
19
19
  </div>
20
- <% elsif image_1? %>
20
+ <% end %>
21
+ <% if image_1? %>
21
22
  <div class="slide-media" data-role="media-1">
22
- <img src="<%= image_1 %>">
23
+ <%= image_1 %>
23
24
  </div>
24
25
  <% end %>
25
26
  </div>
@@ -30,9 +31,10 @@
30
31
  <div class="slide-text" data-role="text-2">
31
32
  <%= text_2 %>
32
33
  </div>
33
- <% elsif image_2? %>
34
+ <% end %>
35
+ <% if image_2? %>
34
36
  <div class="slide-media" data-role="media-2">
35
- <img src="<%= image_2 %>">
37
+ <%= image_2 %>
36
38
  </div>
37
39
  <% end %>
38
40
  </div>
@@ -28,15 +28,15 @@ module Coco
28
28
  end
29
29
 
30
30
  renders_one :image_1,
31
- ->(href:) do
31
+ ->(src: nil, &block) do
32
32
  @has_content = true
33
- href
33
+ block ? block.call : tag.img(src: src)
34
34
  end
35
35
 
36
36
  renders_one :image_2,
37
- ->(href:) do
37
+ ->(src: nil, &block) do
38
38
  @has_content = true
39
- href
39
+ block ? block.call : tag.img(src: src)
40
40
  end
41
41
 
42
42
  before_initialize do |kwargs|
@@ -10,6 +10,8 @@ en:
10
10
  blank_state: "Drag a jpg, png or gif onto the slide area or..."
11
11
  text_color_picker:
12
12
  label: "Text colour"
13
+ layout_picker:
14
+ label: "Layout"
13
15
  undo_button:
14
16
  tooltip: "Undo"
15
17
  redo_button:
data/lib/coco.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Coco
2
- VERSION = "0.5.7"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coveragebook_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Perkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-07 00:00:00.000000000 Z
11
+ date: 2023-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails