@innovastudio/contentbuilder 1.5.49 → 1.5.51

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@innovastudio/contentbuilder",
3
3
  "type": "module",
4
- "version": "1.5.49",
4
+ "version": "1.5.51",
5
5
  "description": "",
6
6
  "main": "public/contentbuilder/contentbuilder.esm.js",
7
7
  "types": "index.d.ts",
@@ -17122,6 +17122,24 @@ const renderSnippetPanel = (builder, snippetOpen) => {
17122
17122
  }
17123
17123
  });
17124
17124
  }
17125
+ let snippetid;
17126
+ if (isMobile && builder.isContentBox) {
17127
+ const items = snippetlist.querySelectorAll('.snippet-item');
17128
+ items.forEach(item => {
17129
+ if (item.classList.contains('data-click')) return;
17130
+ item.addEventListener('touchstart', () => {
17131
+ snippetid = item.getAttribute('data-id');
17132
+ }, {
17133
+ passive: false
17134
+ });
17135
+ item.addEventListener('touchend', () => {
17136
+ builder.dropSnippet(snippetid);
17137
+ }, {
17138
+ passive: false
17139
+ });
17140
+ item.classList.add('data-click');
17141
+ });
17142
+ }
17125
17143
  }
17126
17144
  });
17127
17145
  inpSnippet.setValue(defaultcatval + '');
@@ -17242,14 +17260,23 @@ const renderSnippetPanel = (builder, snippetOpen) => {
17242
17260
  let activeBuilderArea;
17243
17261
  let itemHeight;
17244
17262
  const isMobile = dom.detectMobileOrTablet();
17263
+ let snippetid;
17245
17264
  let useClick = false;
17246
17265
  if (isMobile && builder.isContentBox) {
17247
17266
  const items = snippetlist.querySelectorAll('.snippet-item');
17248
17267
  items.forEach(item => {
17249
- item.addEventListener('click', () => {
17250
- const snippetid = item.getAttribute('data-id');
17268
+ if (item.classList.contains('data-click')) return;
17269
+ item.addEventListener('touchstart', () => {
17270
+ snippetid = item.getAttribute('data-id');
17271
+ }, {
17272
+ passive: false
17273
+ });
17274
+ item.addEventListener('touchend', () => {
17251
17275
  builder.dropSnippet(snippetid);
17276
+ }, {
17277
+ passive: false
17252
17278
  });
17279
+ item.classList.add('data-click');
17253
17280
  });
17254
17281
  useClick = true;
17255
17282
  }
@@ -72863,15 +72890,19 @@ class Resizeable {
72863
72890
  resizing();
72864
72891
  }
72865
72892
  getScale(container) {
72866
- let matrix = window.getComputedStyle(container).transform;
72867
- if (matrix === 'none') return false;
72868
- let values = matrix.split('(')[1];
72869
- values = values.split(')')[0];
72870
- values = values.split(',');
72871
- let a = values[0];
72872
- let b = values[1];
72873
- let scale = Math.sqrt(a * a + b * b);
72874
- return scale;
72893
+ try {
72894
+ let matrix = window.getComputedStyle(container).transform;
72895
+ if (matrix === 'none') return false;
72896
+ let values = matrix.split('(')[1];
72897
+ values = values.split(')')[0];
72898
+ values = values.split(',');
72899
+ let a = values[0];
72900
+ let b = values[1];
72901
+ let scale = Math.sqrt(a * a + b * b);
72902
+ return scale;
72903
+ } catch (e) {
72904
+ return 1;
72905
+ }
72875
72906
  }
72876
72907
  destroy() {
72877
72908
  const pane = this.pane;
@@ -83310,6 +83341,7 @@ class Draggable {
83310
83341
  passive: false
83311
83342
  });
83312
83343
  this.doc.addEventListener('keydown', this.handleKeyDown);
83344
+ if (this.doc !== document) document.addEventListener('keydown', this.handleKeyDown);
83313
83345
  }
83314
83346
  refresh() {
83315
83347
  this.elements = this.doc.querySelectorAll(this.selector);
@@ -83335,6 +83367,7 @@ class Draggable {
83335
83367
  this.doc.removeEventListener('mousedown', this.handleSelect);
83336
83368
  this.doc.removeEventListener('touchstart', this.handleSelect);
83337
83369
  this.doc.removeEventListener('keydown', this.handleKeyDown);
83370
+ if (this.doc !== document) document.removeEventListener('keydown', this.handleKeyDown);
83338
83371
  const blocks = this.doc.querySelectorAll(this.selector);
83339
83372
  blocks.forEach(elm => elm.classList.remove('active'));
83340
83373
  }
@@ -83645,14 +83678,18 @@ class Draggable {
83645
83678
  let blocks = Array.from(this.doc.querySelectorAll(this.selector)).filter(elm => elm.classList.contains('active') && elm.classList.contains('editable'));
83646
83679
  if (blocks.length > 0) return;
83647
83680
  if (this.onBeforeChange) this.onBeforeChange();
83681
+ let isDeleted = false;
83648
83682
  blocks = Array.from(this.doc.querySelectorAll(this.selector)).filter(elm => elm.classList.contains('active'));
83649
83683
  blocks.forEach(element => {
83650
83684
  element.removeEventListener('mousedown', this.handleDragStart);
83651
83685
  element.removeEventListener('touchstart', this.handleDragStart);
83652
83686
  if (this.onDelete) this.onDelete(element);
83653
83687
  element.parentNode.removeChild(element);
83688
+ isDeleted = true;
83654
83689
  });
83655
- if (this.onChange) this.onChange();
83690
+ if (isDeleted && this.onChange) {
83691
+ this.onChange();
83692
+ }
83656
83693
  }
83657
83694
  handleKeyDown(event) {
83658
83695
  if (event.key === 'Delete' || event.key === 'Backspace' || event.keyCode === 46) {
@@ -92375,6 +92412,19 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
92375
92412
  });
92376
92413
  let html = result[0].html;
92377
92414
  let noedit = result[0].noedit;
92415
+ let html2 = '';
92416
+ if (result[0].mode === 'canvas') {
92417
+ html2 = result[0].html2;
92418
+ if (!html2) {
92419
+ html2 = `
92420
+ <div class="row">
92421
+ <div class="column pt-0 pb-0 pl-0 pr-0 flex flex-col justify-center">
92422
+ <img src="${this.opts.snippetPath}images/img-2400x1350.png" alt="">
92423
+ </div>
92424
+ </div>
92425
+ `;
92426
+ }
92427
+ }
92378
92428
  let bSnippet;
92379
92429
  if (html.indexOf('"row') === -1) {
92380
92430
  bSnippet = true; // Just snippet (without row/column grid)
@@ -92453,9 +92503,22 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
92453
92503
  });
92454
92504
  html = snippet.innerHTML;
92455
92505
  }
92456
- const activeBox = this.doc.querySelector('.box-select');
92506
+ let activeBox = this.doc.querySelector('.box-select');
92507
+ if (!activeBox) {
92508
+ activeBox = this.activeBox;
92509
+ if (!this.doc.body.contains(activeBox)) activeBox = null; // box deleted
92510
+ }
92511
+
92512
+ if (!activeBox) {
92513
+ this.doc.querySelectorAll('.is-box').forEach(box => {
92514
+ if (this.isMoreThan50PercentVisible(box)) {
92515
+ activeBox = box;
92516
+ }
92517
+ });
92518
+ }
92457
92519
  const activeRow = this.doc.querySelector('.row-active');
92458
92520
  if (activeRow) {
92521
+ if (html2) html = html2; // if it is canvas block, change it to normal using html2
92459
92522
  this.addRow(html, activeBox);
92460
92523
  } else {
92461
92524
  if (activeBox) {
@@ -92477,41 +92540,61 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
92477
92540
  block.innerHTML = html;
92478
92541
  });
92479
92542
  html = snippet.innerHTML;
92480
- const blockTemplate = `
92481
- <div class="is-block block-steady height-auto" data-new-dummy="1" style="top: 20%; left: 20%; width: 760px;">
92482
- <div class="is-container container-new size-18 leading-14">
92483
- [%CONTENT%]
92543
+ this.uo.saveForUndo();
92544
+ activeBox.querySelectorAll('.is-container.container-new').forEach(elm => elm.classList.remove('container-new'));
92545
+ if (isBlock) {
92546
+ this.eb.addBlock(html, activeBox);
92547
+ } else {
92548
+ const blockTemplate = `
92549
+ <div class="is-block block-steady height-auto" data-new-dummy="1" style="top: 20%; left: 20%; width: 760px;">
92550
+ <div class="is-container container-new size-18 leading-14">
92551
+ [%CONTENT%]
92552
+ </div>
92484
92553
  </div>
92485
- </div>
92486
- `; // data-new-dummy will be used by onSort to apply top/left position (snippetpanel.js)
92487
- // html = blockTemplate.replace('[%CONTENT%]', html);
92554
+ `; // data-new-dummy will be used by onSort to apply top/left position (snippetpanel.js)
92555
+ // html = blockTemplate.replace('[%CONTENT%]', html);
92488
92556
 
92489
- this.uo.saveForUndo();
92490
- this.eb.addBlock(blockTemplate, activeBox);
92491
- const builders = activeBox.querySelectorAll('.is-container.container-new');
92492
- builders.forEach(builder => {
92493
- // After snippet has been added, re-apply behavior on builder areas
92557
+ this.eb.addBlock(blockTemplate, activeBox);
92558
+ const builders = activeBox.querySelectorAll('.is-container.container-new');
92559
+ builders.forEach(builder => {
92560
+ // After snippet has been added, re-apply behavior on builder areas
92494
92561
 
92495
- var range = document.createRange();
92496
- range.setStart(builder, 0);
92497
- builder.appendChild(range.createContextualFragment(html));
92498
- this.applyBehaviorOn(builder);
92499
- builder.classList.remove('container-new');
92500
- });
92562
+ var range = document.createRange();
92563
+ range.setStart(builder, 0);
92564
+ builder.appendChild(range.createContextualFragment(html));
92565
+ this.applyBehaviorOn(builder);
92566
+ builder.classList.remove('container-new');
92567
+ });
92568
+ }
92501
92569
  this.opts.onChange();
92502
92570
  this.opts.onRender();
92503
92571
  if (this.opts.onBlockCanvasAdd) this.opts.onBlockCanvasAdd();
92504
92572
  } else {
92505
92573
  let container = activeBox.querySelector('.builder-active');
92506
92574
  if (container) {
92575
+ if (html2) html = html2;
92507
92576
  this.addRow(html, activeBox);
92508
92577
  } else {
92509
92578
  container = activeBox.querySelector('.is-container');
92510
92579
  if (container) {
92580
+ if (html2) html = html2;
92511
92581
  this.addRow(html, activeBox);
92512
92582
  }
92513
92583
  }
92514
92584
  }
92585
+ } else {
92586
+ // No Active Box => Add Section
92587
+
92588
+ let sectionTemplate = this.settings.sectionTemplate;
92589
+ const occurrences = this.dom.countOccurrences(html, 'column');
92590
+ if (occurrences === 1) {
92591
+ sectionTemplate = sectionTemplate.replace('is-content-1000', 'is-content-700');
92592
+ }
92593
+ html = sectionTemplate.replace('[%CONTENT%]', html);
92594
+ const wrapper = this.doc.querySelector(this.page);
92595
+ wrapper.insertAdjacentHTML('afterbegin', html);
92596
+ this.activeBox = wrapper.querySelector('.is-box');
92597
+ if (this.opts.onBlockSectionAdd) this.opts.onBlockSectionAdd();
92515
92598
  }
92516
92599
  }
92517
92600
  this.activeCol = null;
@@ -92552,7 +92635,7 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
92552
92635
  let builderActive = box.querySelector('.builder-active');
92553
92636
  if (builderActive) this.applyBehaviorOn(builderActive);else {
92554
92637
  builderActive = box.querySelector('.is-builder');
92555
- this.applyBehaviorOn(builderActive);
92638
+ if (builderActive) this.applyBehaviorOn(builderActive);
92556
92639
  }
92557
92640
  let cellElement = rowElement.querySelector('div');
92558
92641
  if (cellElement) cellElement.click(); //change active block to the newly created
@@ -92565,6 +92648,16 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
92565
92648
  this.opts.onChange();
92566
92649
  this.opts.onRender();
92567
92650
  }
92651
+ isMoreThan50PercentVisible(el) {
92652
+ const rect = el.getBoundingClientRect();
92653
+ const windowHeight = this.win.innerHeight || this.doc.documentElement.clientHeight;
92654
+
92655
+ // Calculate the visible part of the element in the viewport
92656
+ const visibleHeight = Math.min(rect.bottom, windowHeight) - Math.max(rect.top, 0);
92657
+
92658
+ // Check if more than 50% of the element is visible
92659
+ return visibleHeight / rect.height > 0.5;
92660
+ }
92568
92661
  sectionDropSetup() {
92569
92662
  if (this.blockContainer) {
92570
92663
  this.sortableOnCanvas = [];