@innovastudio/contentbox 1.6.91 → 1.6.93

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.
@@ -13193,6 +13193,11 @@ class PanelBox {
13193
13193
  <button title="${out('Increase')}" data-content-size="+"><svg><use xlink:href="#icon-plus2"></use></svg></button>
13194
13194
  </div>
13195
13195
 
13196
+ <label class="label checkbox mt-3" style="margin-bottom:15px">
13197
+ <input type="checkbox" class="chk-lock-contentsize" />
13198
+ <span>${out('Lock Content Size')}</span>
13199
+ </label>
13200
+
13196
13201
  <div class="flex">
13197
13202
  <div class="mr-4">
13198
13203
  <div class="label mt-2">${out('Position')}:</div>
@@ -13729,6 +13734,11 @@ class PanelBox {
13729
13734
  chkParallax.addEventListener('click', () => {
13730
13735
  let isParallax = chkParallax.checked;
13731
13736
  this.box.parallaxContent(isParallax);
13737
+ });
13738
+ const chkLockContentSize = panel.querySelector('.chk-lock-contentsize');
13739
+ chkLockContentSize.addEventListener('click', () => {
13740
+ let isLockContentSize = chkLockContentSize.checked;
13741
+ this.box.lockContentSize(isLockContentSize);
13732
13742
  }); // Text
13733
13743
 
13734
13744
  const btnTextAlign = panel.querySelectorAll('[data-align]');
@@ -14285,6 +14295,16 @@ class PanelBox {
14285
14295
  chkParallax.checked = true;
14286
14296
  }
14287
14297
  }
14298
+ } // Lock Content Size
14299
+
14300
+
14301
+ const chkLockContentSize = panel.querySelector('.chk-lock-contentsize');
14302
+ chkLockContentSize.checked = false;
14303
+
14304
+ if (container) {
14305
+ if (container.classList.contains('v3')) {
14306
+ chkLockContentSize.checked = true;
14307
+ }
14288
14308
  } // Text Color
14289
14309
 
14290
14310
 
@@ -27883,10 +27903,10 @@ const renderQuickAdd = builder => {
27883
27903
  elm = quickadd.querySelector('.add-video');
27884
27904
  dom.addEventListener(elm, 'click', () => {
27885
27905
  const mode = quickadd.getAttribute('data-mode');
27886
- let html = `<video style="width: 100%;" loop="" autoplay="">
27906
+ let html = `<video style="width: 100%;" loop="" playsinline="" muted="" autoplay="">
27887
27907
  <source src="${builder.opts.snippetPath}example.mp4" type="video/mp4"></video>`;
27888
27908
  if (builder.opts.snippetSampleVideo) {
27889
- html = `<video style="width: 100%;" loop="" autoplay="">
27909
+ html = `<video style="width: 100%;" loop="" playsinline="" muted="" autoplay="">
27890
27910
  <source src="${builder.opts.snippetSampleVideo}" type="video/mp4"></video>`;
27891
27911
  }
27892
27912
  util.addContent(html, mode);
@@ -31723,15 +31743,15 @@ class Util$1 {
31723
31743
  } else {
31724
31744
  newelement.click();
31725
31745
  }
31726
- const builderStuff = this.builder.builderStuff;
31727
- let quickadd = builderStuff.querySelector('.quickadd');
31728
- this.hidePop(quickadd);
31729
31746
 
31730
31747
  // LATER: auto scroll
31731
31748
 
31732
31749
  // LATER: If image, then it needs time to load (resulting incorrect position), so hide element tool.
31733
31750
  }
31734
31751
 
31752
+ const builderStuff = this.builder.builderStuff;
31753
+ let quickadd = builderStuff.querySelector('.quickadd');
31754
+ if (quickadd) this.hidePop(quickadd);
31735
31755
  if (this.builder.useCssClasses) {
31736
31756
  let builderActive = this.builder.doc.querySelector('.builder-active');
31737
31757
  if (builderActive) dom.contentReformat(builderActive, this.builder.cssClasses);
@@ -41026,6 +41046,16 @@ class HtmlUtil {
41026
41046
  imgUrl = convertMediaUrl(imgUrl);
41027
41047
  elm.setAttribute('href', `${imgUrl}`);
41028
41048
  }
41049
+ if (elm.tagName.toLowerCase() === 'a') {
41050
+ //lightbox
41051
+ let s = elm.getAttribute('href');
41052
+ let extension = s.split('.').pop().split('?')[0].split('#')[0]; //
41053
+ extension = extension.toLowerCase();
41054
+ if (extension === 'jpg' || extension === 'jpeg' || extension === 'png' || extension === 'gif' || extension === 'webm' || extension === 'webp' || extension === 'mp4' || extension === 'mp3') {
41055
+ let mediaUrl = convertMediaUrl(s);
41056
+ elm.setAttribute('href', `${mediaUrl}`);
41057
+ }
41058
+ }
41029
41059
  }
41030
41060
  });
41031
41061
  }
@@ -44265,6 +44295,7 @@ const renderSnippetPanel = (builder, snippetOpen) => {
44265
44295
  block.offsetWidth / 2;
44266
44296
  let x = (snippetX - block.offsetWidth / 2 - rectContainer.left) / docContainer.offsetWidth * 100;
44267
44297
  let y = (snippetY - block.offsetHeight / 2 - rectContainer.top) / docContainer.offsetHeight * 100;
44298
+ if (y < 0) y = 15; // if block is not fully loaded, block height may be incorrect (y can be negative). Adjust to 15%.
44268
44299
  block.style.top = y + '%';
44269
44300
  block.style.left = x + '%';
44270
44301
  block.removeAttribute('data-new-dummy');
@@ -72780,28 +72811,33 @@ class Image$1 {
72780
72811
  if (this.builder.moveable) this.builder.moveable.updateRect();
72781
72812
  const movControlBox = document.querySelector('.moveable-control-box');
72782
72813
  if (movControlBox && !this.builder.hideImageResizer) movControlBox.style.display = 'block';
72783
- const handleImageToolClickOut = e => {
72784
- let elm = e.target;
72785
- if (!elm) return;
72786
- if (!elm.closest('#divImageResizer') && !elm.closest('#divImageTool') && !elm.closest('.is-modal') && !elm.closest('.keep-selection') && !elm.closest('.sl-wrapper') && !elm.closest('.sl-overlay') && !elm.closest('.sl-close') && !elm.closest('img')) {
72787
- // click outside
72788
-
72789
- // hide
72790
- this.hideImageTool();
72791
- document.removeEventListener('click', handleImageToolClickOut);
72792
- if (this.builder.iframeDocument) {
72793
- this.builder.doc.removeEventListener('click', handleImageToolClickOut);
72814
+
72815
+ /*
72816
+ const handleImageToolClickOut = e =>{
72817
+ let elm = e.target;
72818
+ if(!elm) return;
72819
+ if(!elm.closest('#divImageResizer') && !elm.closest('#divImageTool') &&
72820
+ !elm.closest('.is-modal') && !elm.closest('.keep-selection') &&
72821
+ !elm.closest('.sl-wrapper') && !elm.closest('.sl-overlay') && !elm.closest('.sl-close') &&
72822
+ !elm.closest('img')) { // click outside
72823
+
72824
+ // hide
72825
+ this.hideImageTool();
72826
+ document.removeEventListener('click', handleImageToolClickOut);
72827
+ if(this.builder.iframeDocument) {
72828
+ this.builder.doc.removeEventListener('click', handleImageToolClickOut);
72829
+ }
72830
+ this.builder.handleImageToolClickOut_=false;
72794
72831
  }
72795
- this.builder.handleImageToolClickOut_ = false;
72796
- }
72797
72832
  };
72798
- if (!this.builder.handleImageToolClickOut_) {
72799
- document.addEventListener('click', handleImageToolClickOut);
72800
- if (this.builder.iframeDocument) {
72801
- this.builder.doc.addEventListener('click', handleImageToolClickOut);
72802
- }
72803
- this.builder.handleImageToolClickOut_ = true;
72833
+ if(!this.builder.handleImageToolClickOut_) {
72834
+ document.addEventListener('click', handleImageToolClickOut);
72835
+ if(this.builder.iframeDocument) {
72836
+ this.builder.doc.addEventListener('click', handleImageToolClickOut);
72837
+ }
72838
+ this.builder.handleImageToolClickOut_=true;
72804
72839
  }
72840
+ */
72805
72841
  } else {
72806
72842
  let imageResizer = this.imageResizer;
72807
72843
  imageResizer.style.display = 'none';
@@ -72815,6 +72851,28 @@ class Image$1 {
72815
72851
  const movControlBox = document.querySelector('.moveable-control-box');
72816
72852
  if (movControlBox) movControlBox.style.display = 'none';
72817
72853
  }
72854
+ const handleImageToolClickOut = e => {
72855
+ let elm = e.target;
72856
+ if (!elm) return;
72857
+ if (!elm.closest('#divImageResizer') && !elm.closest('#divImageTool') && !elm.closest('.is-modal') && !elm.closest('.keep-selection') && !elm.closest('.sl-wrapper') && !elm.closest('.sl-overlay') && !elm.closest('.sl-close') && !elm.closest('img')) {
72858
+ // click outside
72859
+
72860
+ // hide
72861
+ this.hideImageTool();
72862
+ document.removeEventListener('click', handleImageToolClickOut);
72863
+ if (this.builder.iframeDocument) {
72864
+ this.builder.doc.removeEventListener('click', handleImageToolClickOut);
72865
+ }
72866
+ this.builder.handleImageToolClickOut_ = false;
72867
+ }
72868
+ };
72869
+ if (!this.builder.handleImageToolClickOut_) {
72870
+ document.addEventListener('click', handleImageToolClickOut);
72871
+ if (this.builder.iframeDocument) {
72872
+ this.builder.doc.addEventListener('click', handleImageToolClickOut);
72873
+ }
72874
+ this.builder.handleImageToolClickOut_ = true;
72875
+ }
72818
72876
  if (this.builder.canvas) ; else {
72819
72877
  let prog = false;
72820
72878
  if (e.screenX && e.screenX !== 0 && e.screenY && e.screenY !== 0) ; else {
@@ -73168,7 +73226,7 @@ class ButtonEditor {
73168
73226
  <div class="flex flex-row" style="margin:15px 0 0">
73169
73227
  <div class="flex flex-col" style="margin-right: 40px;">
73170
73228
  <div>
73171
- <span>${util.out('Border Color')}</span>:
73229
+ <span>${util.out('Border Style')}</span>:
73172
73230
  </div>
73173
73231
  <div class="flex flex-row flex-wrap" style="margin-top:5px">
73174
73232
  <button title="${util.out('Transparent')}" data-command="transparent" class="border-color-command" style="margin-right:4px">${util.out('Transparent')}</button>
@@ -73358,7 +73416,7 @@ class ButtonEditor {
73358
73416
 
73359
73417
  <div class="flex flex-col" style="margin:15px 0 0">
73360
73418
  <div>
73361
- <span>${util.out('Border Color')}</span>:
73419
+ <span>${util.out('Border Style')}</span>:
73362
73420
  </div>
73363
73421
  <div class="flex flex-row flex-wrap" style="margin-top:5px">
73364
73422
  <button title="${util.out('Transparent')}" data-command="transparent" class="border-color-hover-command" style="margin-right:4px">${util.out('Transparent')}</button>
@@ -76954,6 +77012,12 @@ class Video {
76954
77012
  } else {
76955
77013
  inpAutoplay.checked = false;
76956
77014
  }
77015
+ const inpMuted = videoModal.querySelector('.input-video-muted');
77016
+ if (video.hasAttribute('muted')) {
77017
+ inpMuted.checked = true;
77018
+ } else {
77019
+ inpMuted.checked = false;
77020
+ }
76957
77021
  util.showModal(videoModal, true, () => {
76958
77022
  btn.removeAttribute('data-focus');
76959
77023
  btn.focus();
@@ -76997,6 +77061,9 @@ class Video {
76997
77061
  <label style="display:block;margin-top:5px;">
76998
77062
  <input class="input-video-autoplay" id="__input_video_autoplay" type="checkbox" /> ${util.out('Autoplay')}&nbsp;
76999
77063
  </label>
77064
+ <label style="display:block;margin-top:5px;">
77065
+ <input class="input-video-muted" id="__input_video_muted" type="checkbox" /> ${util.out('Muted')}&nbsp;
77066
+ </label>
77000
77067
 
77001
77068
  <div style="text-align:right;margin-top:14px;">
77002
77069
  <button title="${util.out('Cancel')}" class="input-cancel classic-secondary">${util.out('Cancel')}</button>
@@ -77075,6 +77142,11 @@ class Video {
77075
77142
  } else {
77076
77143
  video.removeAttribute('autoplay');
77077
77144
  }
77145
+ if (videoModal.querySelector('.input-video-muted').checked) {
77146
+ video.setAttribute('muted', '');
77147
+ } else {
77148
+ video.removeAttribute('muted');
77149
+ }
77078
77150
  if (videoModal.querySelector('.input-url').value !== '') {
77079
77151
  let url = videoModal.querySelector('.input-url').value;
77080
77152
  let source = video.querySelector('source');
@@ -77726,8 +77798,8 @@ class RowTool {
77726
77798
  const builderStuff = this.builder.builderStuff;
77727
77799
  let rowtool = row.querySelector('.is-row-tool');
77728
77800
  if (!rowtool) {
77729
- let html = `<div class="is-tool is-row-tool">
77730
- <div title="${util.out('Move')}" role="button" tabindex="-1" class="row-handle" style="width:100%;cursor:move;text-align:center;"><svg class="is-icon-flex"><use xlink:href="#ion-move"></use></svg></div>
77801
+ let html = `<div class="is-tool is-row-tool" style="${!this.builder.rowTool && this.builder.rowTool !== '' ? 'display:none;' : ''}">
77802
+ <div title="${util.out('Move')}" role="button" tabindex="-1" class="row-handle" style="${this.builder.rowHandle ? '' : 'display:none;'}width:100%;cursor:move;text-align:center;"><svg class="is-icon-flex"><use xlink:href="#ion-move"></use></svg></div>
77731
77803
  <button type="button" tabindex="-1" title="${util.out('More')}" class="row-more"><svg class="is-icon-flex"><use xlink:href="#ion-more"></use></svg></button>
77732
77804
  <button type="button" tabindex="-1" title="${util.out('Grid Editor')}" class="row-grideditor"><svg class="is-icon-flex"><use xlink:href="#ion-grid"></use></svg></button>
77733
77805
  <button type="button" tabindex="-1" title="${util.out('Delete')}" class="row-remove"><svg class="is-icon-flex"><use xlink:href="#ion-ios-close-empty"></use></svg></button>
@@ -89900,6 +89972,10 @@ class ColorPicker {
89900
89972
  const poppicker = builderStuff.querySelector('.pop-picker');
89901
89973
  poppicker.style.display = 'flex';
89902
89974
  poppicker.style.opacity = 0;
89975
+ if (this.opts.colors.length <= 21) poppicker.style.height = '360px'; // 3 lines
89976
+ else if (this.opts.colors.length > 21 && this.opts.colors.length <= 28) poppicker.style.height = '390px'; // 4 lines
89977
+ else if (this.opts.colors.length > 28) poppicker.style.height = '420px'; // 5 lines
89978
+
89903
89979
  const pickr = Pickr.create({
89904
89980
  el: '._pop-colpick',
89905
89981
  theme: 'nano',
@@ -93788,6 +93864,10 @@ class Rte {
93788
93864
  btnRteColor.forEach(btn => {
93789
93865
  btn.addEventListener('click', () => {
93790
93866
  const pop = this.rteColorPicker;
93867
+ const numOfColors = this.builder.colors.length;
93868
+ if (numOfColors > 21 && numOfColors <= 28) pop.classList.add('_4lines'); // 4 lines
93869
+ else if (numOfColors > 28) pop.classList.add('_5lines'); // 5 lines
93870
+
93791
93871
  if (!dom.hasClass(pop, 'active')) {
93792
93872
  this.util.showRtePop(pop, () => {
93793
93873
  const top = btn.getBoundingClientRect().top;
@@ -94717,15 +94797,15 @@ class Rte {
94717
94797
  activeCol = this.builder.activeCol;
94718
94798
  spans = activeCol.querySelectorAll('span');
94719
94799
  Array.prototype.forEach.call(spans, span => {
94720
- let attr = span.getAttribute('data-keep');
94800
+ let attr = span.hasAttribute('data-keep');
94721
94801
  if (!attr) {
94722
94802
  span.outerHTML = span.innerHTML;
94723
94803
  }
94724
94804
  });
94725
94805
  Array.prototype.forEach.call(spans, span => {
94726
- let attr = span.getAttribute('data-keep');
94806
+ let attr = span.hasAttribute('data-keep');
94727
94807
  if (attr) {
94728
- dom.removeAttribute(span, 'data-keep');
94808
+ span.removeAttribute('data-keep');
94729
94809
  }
94730
94810
  });
94731
94811
  this.getState();
@@ -108468,8 +108548,6 @@ Important: Do not change the 'div.is-container' element!
108468
108548
  }
108469
108549
  }
108470
108550
 
108471
- // import RecordRTC from 'recordrtc';
108472
- // import Recorder from 'opus-recorder'; // Using Recorder
108473
108551
  const dom$i = new Dom();
108474
108552
  class Dictation {
108475
108553
  constructor(opts = {}, builder) {
@@ -108817,6 +108895,9 @@ class Dictation {
108817
108895
  dom$i.appendHtml(builderStuff, html);
108818
108896
  const modalCommand = builderStuff.querySelector('.page-command');
108819
108897
  this.modalCommand = modalCommand;
108898
+ new Draggable$2({
108899
+ selector: '.is-modal.page-command .is-draggable'
108900
+ });
108820
108901
  const modalCommandList = builderStuff.querySelector('.commandlist');
108821
108902
  this.modalCommandList = modalCommandList;
108822
108903
  const modalConfig = builderStuff.querySelector('.commandconfig');
@@ -115298,6 +115379,8 @@ class Editable {
115298
115379
  this.handleEditStart = this.handleEditStart.bind(this);
115299
115380
  this.handleMouseClick = this.handleMouseClick.bind(this);
115300
115381
  this.handleTouchStart = this.handleTouchStart.bind(this);
115382
+ this.handleMouseDown = this.handleMouseDown.bind(this);
115383
+ this.handleMouseUp = this.handleMouseUp.bind(this);
115301
115384
  this.setup();
115302
115385
  }
115303
115386
  setup() {
@@ -115306,6 +115389,7 @@ class Editable {
115306
115389
  element.addEventListener('touchstart', this.handleTouchStart, {
115307
115390
  passive: false
115308
115391
  });
115392
+ element.addEventListener('mousedown', this.handleMouseDown);
115309
115393
  });
115310
115394
  }
115311
115395
  refresh() {
@@ -115313,23 +115397,49 @@ class Editable {
115313
115397
  this.elements.forEach(element => {
115314
115398
  element.removeEventListener('dblclick', this.handleEditStart);
115315
115399
  element.removeEventListener('touchstart', this.handleTouchStart);
115400
+ element.removeEventListener('mousedown', this.handleMouseDown);
115316
115401
  });
115317
115402
  this.elements.forEach(element => {
115318
115403
  element.addEventListener('dblclick', this.handleEditStart);
115319
115404
  element.addEventListener('touchstart', this.handleTouchStart, {
115320
115405
  passive: false
115321
115406
  });
115407
+ element.addEventListener('mousedown', this.handleMouseDown);
115322
115408
  });
115323
115409
  }
115410
+ handleMouseDown(event) {
115411
+ const currentTarget = event.currentTarget;
115412
+ this.lastClickTime = false;
115413
+ if (!currentTarget.classList.contains('active')) return;
115414
+ if (currentTarget.classList.contains('editable')) return;
115415
+ currentTarget.addEventListener('mouseup', this.handleMouseUp);
115416
+ const now = new Date().getTime();
115417
+ this.lastClickTime = now;
115418
+ }
115419
+ handleMouseUp(event) {
115420
+ if (!this.lastClickTime) return;
115421
+ const currentTarget = event.currentTarget;
115422
+ currentTarget.removeEventListener('mouseup', this.handleMouseUp);
115423
+ const now = new Date().getTime();
115424
+ const lastClickTime = this.lastClickTime || now;
115425
+ const timeDiff = now - lastClickTime;
115426
+ if (timeDiff < 300 && timeDiff > 0) {
115427
+ // Less than 300ms since the last touch, enable editing
115428
+ this.handleEditStart(event);
115429
+ }
115430
+ this.lastClickTime = now;
115431
+ }
115324
115432
  destroy(element) {
115325
115433
  if (element) {
115326
115434
  element.removeEventListener('dblclick', this.handleEditStart);
115327
115435
  element.removeEventListener('touchstart', this.handleTouchStart);
115436
+ element.removeEventListener('mousedown', this.handleMouseDown);
115328
115437
  } else {
115329
115438
  this.elements = this.doc.querySelectorAll(this.selector);
115330
115439
  this.elements.forEach(element => {
115331
115440
  element.removeEventListener('dblclick', this.handleEditStart);
115332
115441
  element.removeEventListener('touchstart', this.handleTouchStart);
115442
+ element.removeEventListener('mousedown', this.handleMouseDown);
115333
115443
  });
115334
115444
  }
115335
115445
  }
@@ -115642,6 +115752,8 @@ class EditableBlocks {
115642
115752
  target.style.zIndex = newZIndex;
115643
115753
  }
115644
115754
  selectStart(block) {
115755
+ if (block.classList.contains('editable')) return; // do not proceed if in editing mode
115756
+
115645
115757
  if (block.classList.contains('is-shape')) return; // do not clone if block is shape
115646
115758
 
115647
115759
  if (!this.clone) return;
@@ -117853,6 +117965,7 @@ class ContentBuilder {
117853
117965
  outlineMode: '',
117854
117966
  toolStyle: '',
117855
117967
  outlineStyle: '',
117968
+ rowHandle: true,
117856
117969
  snippetAddTool: true,
117857
117970
  elementTool: true,
117858
117971
  elementHighlight: true,
@@ -120626,7 +120739,118 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
120626
120739
  // let outlineStyle = localStorage.getItem('_outlinestyle');
120627
120740
  // this.preferences.setOutlineStyle(outlineStyle);
120628
120741
  // }
120629
- if (this.preferences) this.preferences.initBuilder(builder);
120742
+ if (this.preferences) this.preferences.initBuilder(builder);else {
120743
+ const setColumnTool = hidecolumntool => {
120744
+ const builders = this.doc.querySelectorAll(this.opts.container);
120745
+ if (hidecolumntool) {
120746
+ Array.prototype.forEach.call(builders, builder => {
120747
+ builder.setAttribute('hidecolumntool', '');
120748
+ });
120749
+ } else {
120750
+ Array.prototype.forEach.call(builders, builder => {
120751
+ builder.removeAttribute('hidecolumntool');
120752
+ });
120753
+ }
120754
+ };
120755
+ setColumnTool(!this.columnTool);
120756
+ const setElementTool = hideelementtool => {
120757
+ const builderStuff = this.builderStuff;
120758
+ if (hideelementtool) {
120759
+ builderStuff.setAttribute('hideelementtool', '');
120760
+ } else {
120761
+ builderStuff.removeAttribute('hideelementtool', '');
120762
+ }
120763
+ if (this.iframe) {
120764
+ const contentStuff = this.contentStuff;
120765
+ if (hideelementtool) {
120766
+ contentStuff.setAttribute('hideelementtool', '');
120767
+ } else {
120768
+ contentStuff.removeAttribute('hideelementtool', '');
120769
+ }
120770
+ }
120771
+ };
120772
+ setElementTool(!this.elementTool);
120773
+ const setOutline = hideoutline => {
120774
+ const builders = this.doc.querySelectorAll(this.opts.container);
120775
+ Array.prototype.forEach.call(builders, builder => {
120776
+ if (hideoutline) {
120777
+ builder.setAttribute('hideoutline', '');
120778
+ } else {
120779
+ builder.removeAttribute('hideoutline');
120780
+ }
120781
+ });
120782
+ };
120783
+ setOutline(!this.rowcolOutline);
120784
+ const setOutlineStyle = outlineStyle => {
120785
+ const builders = this.doc.querySelectorAll(this.opts.container);
120786
+ Array.prototype.forEach.call(builders, builder => {
120787
+ if (outlineStyle === 'grayoutline') {
120788
+ builder.setAttribute('grayoutline', '');
120789
+ } else {
120790
+ builder.removeAttribute('grayoutline');
120791
+ }
120792
+ });
120793
+ };
120794
+ setOutlineStyle(this.outlineStyle);
120795
+ const setElementHighlight = hideelementhighlight => {
120796
+ const builders = this.doc.querySelectorAll(this.opts.container);
120797
+ Array.prototype.forEach.call(builders, builder => {
120798
+ if (hideelementhighlight) {
120799
+ builder.setAttribute('hideelementhighlight', '');
120800
+ } else {
120801
+ builder.removeAttribute('hideelementhighlight', '');
120802
+ }
120803
+ });
120804
+ };
120805
+ setElementHighlight(!this.elementHighlight);
120806
+ const setToolStyle = toolStyle => {
120807
+ const builderStuff = this.builderStuff;
120808
+ if (toolStyle === 'gray') {
120809
+ builderStuff.setAttribute('gray', '');
120810
+ } else {
120811
+ builderStuff.removeAttribute('gray', '');
120812
+ }
120813
+ if (this.iframe) {
120814
+ const contentStuff = this.contentStuff;
120815
+ if (toolStyle === 'gray') {
120816
+ contentStuff.setAttribute('gray', '');
120817
+ } else {
120818
+ contentStuff.removeAttribute('gray', '');
120819
+ }
120820
+ }
120821
+ const builders = this.doc.querySelectorAll(this.opts.container);
120822
+ Array.prototype.forEach.call(builders, builder => {
120823
+ if (toolStyle === 'gray') {
120824
+ builder.setAttribute('gray', '');
120825
+ } else {
120826
+ builder.removeAttribute('gray');
120827
+ }
120828
+ });
120829
+ };
120830
+ setToolStyle(this.toolStyle);
120831
+ const setSnippetAddTool = hidesnippetaddtool => {
120832
+ const builders = this.doc.querySelectorAll(this.opts.container);
120833
+ Array.prototype.forEach.call(builders, builder => {
120834
+ if (hidesnippetaddtool) {
120835
+ builder.setAttribute('hidesnippetaddtool', '');
120836
+ } else {
120837
+ builder.removeAttribute('hidesnippetaddtool', '');
120838
+ }
120839
+ });
120840
+ };
120841
+ setSnippetAddTool(!this.snippetAddTool);
120842
+ const setRowToolPosition = rowTool => {
120843
+ const builders = this.doc.querySelectorAll(this.opts.container);
120844
+ Array.prototype.forEach.call(builders, builder => {
120845
+ if (rowTool === 'right') {
120846
+ builder.removeAttribute('leftrowtool');
120847
+ } else {
120848
+ builder.setAttribute('leftrowtool', '');
120849
+ }
120850
+ });
120851
+ };
120852
+ setRowToolPosition(this.rowTool);
120853
+ }
120630
120854
 
120631
120855
  // Apply behavior on each row
120632
120856
  const rows = this.dom.elementChildren(builder);
@@ -122895,8 +123119,8 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
122895
123119
  */
122896
123120
  src = this.viewFileUrl + '?url=' + src;
122897
123121
  }
122898
- const width = 512;
122899
- const height = 512;
123122
+ const width = this.ai_width; //768;
123123
+ const height = this.ai_height; //512;
122900
123124
  const img = new Image();
122901
123125
  img.src = src;
122902
123126
  img.crossOrigin = 'anonymous';
@@ -122928,6 +123152,47 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
122928
123152
  callback(result.url);
122929
123153
  };
122930
123154
  }
123155
+ getOrientation(width, height) {
123156
+ const aspectRatio = width / height;
123157
+ const predefinedRatios = [{
123158
+ ratio: '1:1',
123159
+ value: 1 / 1
123160
+ }, {
123161
+ ratio: '4:5',
123162
+ value: 4 / 5
123163
+ }, {
123164
+ ratio: '2:3',
123165
+ value: 2 / 3
123166
+ }, {
123167
+ ratio: '9:16',
123168
+ value: 9 / 16
123169
+ }, {
123170
+ ratio: '4:7',
123171
+ value: 4 / 7
123172
+ }, {
123173
+ ratio: '5:4',
123174
+ value: 5 / 4
123175
+ }, {
123176
+ ratio: '3:2',
123177
+ value: 3 / 2
123178
+ }, {
123179
+ ratio: '16:9',
123180
+ value: 16 / 9
123181
+ }, {
123182
+ ratio: '7:4',
123183
+ value: 7 / 4
123184
+ }];
123185
+ let closestRatio = predefinedRatios[0].ratio;
123186
+ let smallestDifference = Math.abs(aspectRatio - predefinedRatios[0].value);
123187
+ for (let i = 1; i < predefinedRatios.length; i++) {
123188
+ const difference = Math.abs(aspectRatio - predefinedRatios[i].value);
123189
+ if (difference < smallestDifference) {
123190
+ smallestDifference = difference;
123191
+ closestRatio = predefinedRatios[i].ratio;
123192
+ }
123193
+ }
123194
+ return closestRatio;
123195
+ }
122931
123196
  async generateImage(prompt, callback) {
122932
123197
  this.controller = new AbortController(); // Create a new AbortController
122933
123198
  this.signal = this.controller.signal; // Get a new signal object
@@ -122937,12 +123202,82 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
122937
123202
  let steps = this.imageSteps || 25;
122938
123203
  let guidance = this.imageGuidance || 7.5;
122939
123204
  let scheduler = this.imageScheduler || 'dpmsolver++';
123205
+ let width = 768;
123206
+ let height = 512;
123207
+ if (this.activeImage) {
123208
+ // check selected image dimension
123209
+ const activeImage = this.activeImage;
123210
+ const w = activeImage.offsetWidth;
123211
+ const h = activeImage.offsetHeight;
123212
+ const ratio = this.getOrientation(w, h);
123213
+ if (model === 'flux-schnell') {
123214
+ if (ratio === '1:1') {
123215
+ width = 1024;
123216
+ height = 1024;
123217
+ } else if (ratio === '4:5') {
123218
+ width = 768;
123219
+ height = 960;
123220
+ } else if (ratio === '2:3') {
123221
+ width = 768;
123222
+ height = 1152;
123223
+ } else if (ratio === '9:16') {
123224
+ width = 720;
123225
+ height = 1280;
123226
+ } else if (ratio === '4:7') {
123227
+ width = 512;
123228
+ height = 896;
123229
+ } else if (ratio === '5:4') {
123230
+ width = 960;
123231
+ height = 768;
123232
+ } else if (ratio === '3:2') {
123233
+ width = 1152;
123234
+ height = 768;
123235
+ } else if (ratio === '16:9') {
123236
+ width = 1280;
123237
+ height = 720;
123238
+ } else if (ratio === '7:4') {
123239
+ width = 896;
123240
+ height = 512;
123241
+ }
123242
+ } else {
123243
+ if (ratio === '1:1') {
123244
+ width = 512;
123245
+ height = 512;
123246
+ } else if (ratio === '4:5') {
123247
+ width = 512;
123248
+ height = 640;
123249
+ } else if (ratio === '2:3') {
123250
+ width = 512;
123251
+ height = 768;
123252
+ } else if (ratio === '9:16') {
123253
+ width = 576;
123254
+ height = 1024;
123255
+ } else if (ratio === '4:7') {
123256
+ width = 512;
123257
+ height = 896;
123258
+ } else if (ratio === '5:4') {
123259
+ width = 640;
123260
+ height = 512;
123261
+ } else if (ratio === '3:2') {
123262
+ width = 768;
123263
+ height = 512;
123264
+ } else if (ratio === '16:9') {
123265
+ width = 1024;
123266
+ height = 576;
123267
+ } else if (ratio === '7:4') {
123268
+ width = 896;
123269
+ height = 512;
123270
+ }
123271
+ }
123272
+ }
123273
+ this.ai_width = width;
123274
+ this.ai_height = height;
122940
123275
  const messages = {
122941
123276
  model,
122942
123277
  prompt: prompt,
122943
123278
  negative_prompt,
122944
- width: 512,
122945
- height: 512,
123279
+ width: this.ai_width,
123280
+ height: this.ai_height,
122946
123281
  steps,
122947
123282
  guidance,
122948
123283
  scheduler,
@@ -122968,10 +123303,15 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
122968
123303
  return;
122969
123304
  }
122970
123305
  const imageUrl = result.url;
122971
- if (this.imageAutoUpscale) {
122972
- this.upscaleImage(imageUrl, callback);
122973
- } else {
123306
+ if (this.activeImage) {
123307
+ // selectable image on content doesn't need tp be upscaled
122974
123308
  callback(imageUrl);
123309
+ } else {
123310
+ if (this.imageAutoUpscale) {
123311
+ this.upscaleImage(imageUrl, callback);
123312
+ } else {
123313
+ callback(imageUrl);
123314
+ }
122975
123315
  }
122976
123316
  } catch (error) {
122977
123317
  if (error.name === 'AbortError') ; else {
@@ -123635,18 +123975,21 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
123635
123975
  }
123636
123976
 
123637
123977
  if (this.dom.textSelection()) {
123638
- if (e.keyCode === '38') {
123978
+ if (e.keyCode === 38) {
123639
123979
  // Up arrow
123640
123980
  this.util.saveSelection();
123641
- } else if (e.keyCode === '40') {
123981
+ } else if (e.keyCode === 40) {
123642
123982
  // Down arrow
123643
123983
  this.util.saveSelection();
123644
- } else if (e.keyCode === '37') {
123984
+ } else if (e.keyCode === 37) {
123645
123985
  // Left arrow
123646
123986
  this.util.saveSelection();
123647
- } else if (e.keyCode === '39') {
123987
+ } else if (e.keyCode === 39) {
123648
123988
  // Right arrow
123649
123989
  this.util.saveSelection();
123990
+ } else if (e.keyCode === 13) {
123991
+ // Enter
123992
+ this.util.saveSelection();
123650
123993
  }
123651
123994
  }
123652
123995
 
@@ -138817,6 +139160,18 @@ class Box {
138817
139160
  this.builder.onChange();
138818
139161
  }
138819
139162
 
139163
+ lockContentSize(isLock) {
139164
+ this.builder.editor.saveForUndo();
139165
+ let activeBox = this.builder.activeBox;
139166
+ let container = activeBox.querySelector('.is-builder');
139167
+
139168
+ if (isLock) {
139169
+ container.classList.add('v3');
139170
+ } else {
139171
+ container.classList.remove('v3');
139172
+ }
139173
+ }
139174
+
138820
139175
  parallaxContent(isParallax) {
138821
139176
  this.builder.editor.saveForUndo();
138822
139177
  let activeBox = this.builder.activeBox;
@@ -154981,6 +155336,7 @@ class ContentBox {
154981
155336
  rowTool: 'right',
154982
155337
  toolStyle: '',
154983
155338
  outlineStyle: '',
155339
+ rowHandle: true,
154984
155340
  snippetAddTool: true,
154985
155341
  mobileSimpleEdit: false,
154986
155342
  clearPreferences: false,
@@ -158537,6 +158893,7 @@ Add an image for each feature.`, 'Create a new block showcasing a photo gallery
158537
158893
  rowTool: this.settings.rowTool,
158538
158894
  toolStyle: this.settings.toolStyle,
158539
158895
  outlineStyle: this.settings.outlineStyle,
158896
+ rowHandle: this.settings.rowHandle,
158540
158897
  snippetAddTool: this.settings.snippetAddTool,
158541
158898
  mobileSimpleEdit: this.settings.mobileSimpleEdit,
158542
158899
  clearPreferences: this.settings.clearPreferences,
@@ -160273,65 +160630,93 @@ Add an image for each feature.`, 'Create a new block showcasing a photo gallery
160273
160630
 
160274
160631
 
160275
160632
  boxRender() {
160633
+ if (!this.linksWithClickListeners) {
160634
+ this.linksWithClickListeners = new Set();
160635
+ }
160636
+
160637
+ const links = this.wrapperEl.querySelectorAll('.is-box .is-overlay a'); // eg. slider links
160638
+
160639
+ links.forEach(link => {
160640
+ let url = link.getAttribute('href');
160641
+
160642
+ if (url.indexOf('#') === 0 || link.classList.contains('glightbox')) ; else {
160643
+ if (!this.linksWithClickListeners.has(link)) {
160644
+ link.addEventListener('click', e => {
160645
+ // Will go to the link
160646
+ const answer = window.confirm(out('Do you really want to leave?')); // Cancel the navigation and stay on the same page
160647
+
160648
+ if (!answer) {
160649
+ e.preventDefault();
160650
+ }
160651
+
160652
+ e.stopImmediatePropagation();
160653
+ });
160654
+ this.linksWithClickListeners.add(link); // Mark the listener as added
160655
+ }
160656
+ }
160657
+ });
160276
160658
  const navbar = this.doc.querySelector('.is-section-navbar');
160277
160659
 
160278
160660
  if (navbar) {
160279
160661
  const links = navbar.querySelectorAll('a');
160280
160662
  links.forEach(link => {
160281
- link.addEventListener('click', e => {
160282
- let url = link.getAttribute('href');
160283
-
160284
- if (url) {
160285
- if (url.indexOf('#') === 0) {
160286
- // Will go to bookmark
160287
- if (url.indexOf('#section') === 0) {
160288
- let num = url.replace('#section', '');
160289
-
160290
- if (!isNaN(parseInt(num))) {
160291
- let sections = this.doc.querySelectorAll('.is-section');
160292
- let gotoSection;
160293
- let x = 0;
160294
- sections.forEach(function (section) {
160295
- if (!dom.hasClass(section, 'is-section-navbar')) {
160296
- if (x === num - 1) {
160297
- gotoSection = section;
160663
+ if (!this.linksWithClickListeners.has(link)) {
160664
+ link.addEventListener('click', e => {
160665
+ let url = link.getAttribute('href');
160666
+
160667
+ if (url) {
160668
+ if (url.indexOf('#') === 0) {
160669
+ // Will go to bookmark
160670
+ if (url.indexOf('#section') === 0) {
160671
+ let num = url.replace('#section', '');
160672
+
160673
+ if (!isNaN(parseInt(num))) {
160674
+ let sections = this.doc.querySelectorAll('.is-section');
160675
+ let gotoSection;
160676
+ let x = 0;
160677
+ sections.forEach(function (section) {
160678
+ if (!dom.hasClass(section, 'is-section-navbar')) {
160679
+ if (x === num - 1) {
160680
+ gotoSection = section;
160681
+ }
160682
+
160683
+ x++;
160298
160684
  }
160685
+ });
160299
160686
 
160300
- x++;
160687
+ if (gotoSection) {
160688
+ this.scrollTo(gotoSection);
160301
160689
  }
160302
- });
160303
160690
 
160304
- if (gotoSection) {
160305
- this.scrollTo(gotoSection);
160691
+ e.preventDefault();
160306
160692
  }
160693
+ } else {
160694
+ try {
160695
+ let bookmark = this.doc.querySelector(url);
160307
160696
 
160308
- e.preventDefault();
160309
- }
160310
- } else {
160311
- try {
160312
- let bookmark = this.doc.querySelector(url);
160313
-
160314
- if (bookmark) {
160315
- this.scrollTo(bookmark);
160316
- e.preventDefault();
160697
+ if (bookmark) {
160698
+ this.scrollTo(bookmark);
160699
+ e.preventDefault();
160700
+ }
160701
+ } catch (e) {// Do Nothing
160317
160702
  }
160318
- } catch (e) {// Do Nothing
160319
160703
  }
160704
+ } else {
160705
+ // Prevent to go to the link
160706
+ if (e.target.closest('#is-menu-toggle')) return;
160707
+ e.preventDefault();
160708
+ e.stopImmediatePropagation();
160320
160709
  }
160321
160710
  } else {
160322
- // Prevent to go to the link
160323
- if (e.target.closest('#is-menu-toggle')) return;
160324
- e.preventDefault();
160325
- e.stopImmediatePropagation();
160326
- }
160327
- } else {
160328
- if (link.closest('.is-menu-search')) ; else {
160329
- if (!e.target.getAttribute('href')) return;
160330
- e.preventDefault();
160331
- e.stopImmediatePropagation();
160711
+ if (link.closest('.is-menu-search')) ; else {
160712
+ if (!e.target.getAttribute('href')) return;
160713
+ e.preventDefault();
160714
+ e.stopImmediatePropagation();
160715
+ }
160332
160716
  }
160333
- }
160334
- });
160717
+ });
160718
+ this.linksWithClickListeners.add(link); // Mark the listener as added
160719
+ }
160335
160720
  });
160336
160721
  }
160337
160722
  } // box
@@ -160498,7 +160883,7 @@ Add an image for each feature.`, 'Create a new block showcasing a photo gallery
160498
160883
  '</div>');
160499
160884
  */
160500
160885
 
160501
- dom.appendHtml(box, '<div class="is-box-tool" data-tool="1">' + '<button type="button" class="is-cover-upload" tabindex="-1" data-tooltip-top data-title="' + out('Change Background') + '" title="' + out('Change Background') + '" style="background:rgb(78 170 57)"><svg class="is-icon-flex" style="position: absolute;top: 9px;left: 9px;fill:rgb(255,255,255);"><use xlink:href="#ion-image"></use></svg></button>' + '<button type="button" class="is-select-image" tabindex="-1" data-tooltip-top data-title="' + out('Select') + '" title="' + out('Select') + '" style="background:rgb(251 173 27)"><svg class="is-icon-flex" style="color:#fff;width:17px;height:17px;"><use style="color: #fff;" xlink:href="#icon-folder2"></use></svg></button>' + '<button type="button" class="is-box-edit" tabindex="-1" data-tooltip-top data-title="' + out('Box Settings') + '" title="' + out('Box Settings') + '"><svg class="is-icon-flex"><use xlink:href="#ion-wrench"></use></svg></button>' + '<button type="button" class="is-module-edit" tabindex="-1" data-tooltip-top data-title="' + out('Module Settings') + '" title="' + out('Module Settings') + '" style="background:rgb(135 116 215)"><svg class="is-icon-flex"><use xlink:href="#ion-ios-gear"></use></svg></button>' + '</div>');
160886
+ dom.appendHtml(box, '<div class="is-box-tool" data-tool="1">' + '<button type="button" class="is-cover-upload" tabindex="-1" data-tooltip-top data-title="' + out('Upload Background') + '" title="' + out('Upload Background') + '" style="background:rgb(78 170 57)"><svg class="is-icon-flex" style="position: absolute;top: 9px;left: 9px;fill:rgb(255,255,255);"><use xlink:href="#ion-image"></use></svg></button>' + '<button type="button" class="is-select-image" tabindex="-1" data-tooltip-top data-title="' + out('Select Background') + '" title="' + out('Select Background') + '" style="background:rgb(251 173 27)"><svg class="is-icon-flex" style="color:#fff;width:17px;height:17px;"><use style="color: #fff;" xlink:href="#icon-folder2"></use></svg></button>' + '<button type="button" class="is-box-edit" tabindex="-1" data-tooltip-top data-title="' + out('Box Settings') + '" title="' + out('Box Settings') + '"><svg class="is-icon-flex"><use xlink:href="#ion-wrench"></use></svg></button>' + '<button type="button" class="is-module-edit" tabindex="-1" data-tooltip-top data-title="' + out('Module Settings') + '" title="' + out('Module Settings') + '" style="background:rgb(135 116 215)"><svg class="is-icon-flex"><use xlink:href="#ion-ios-gear"></use></svg></button>' + '</div>');
160502
160887
  let info = box.querySelector('.is-box-info');
160503
160888
  if (info) info.parentNode.removeChild(info);
160504
160889