@innovastudio/contentbuilder 1.5.59 → 1.5.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/public/contentbuilder/contentbuilder.css +241 -80
  3. package/public/contentbuilder/contentbuilder.esm.js +594 -767
  4. package/public/contentbuilder/contentbuilder.min.js +3 -3
  5. package/public/contentbuilder/lang/en.js +2 -2
  6. package/public/contentbuilder/lang/fr.js +2 -2
  7. package/public/contentbuilder/themes/colored-blue.css +31 -16
  8. package/public/contentbuilder/themes/colored-blue2.css +31 -16
  9. package/public/contentbuilder/themes/colored-blue3.css +31 -16
  10. package/public/contentbuilder/themes/colored-blue4.css +31 -16
  11. package/public/contentbuilder/themes/colored-blue5.css +31 -16
  12. package/public/contentbuilder/themes/colored-blue6.css +31 -16
  13. package/public/contentbuilder/themes/colored-blue7.css +31 -16
  14. package/public/contentbuilder/themes/colored-blue8.css +31 -16
  15. package/public/contentbuilder/themes/colored-darkblue.css +31 -16
  16. package/public/contentbuilder/themes/colored-gray.css +31 -16
  17. package/public/contentbuilder/themes/colored-green.css +31 -16
  18. package/public/contentbuilder/themes/colored-green2.css +31 -16
  19. package/public/contentbuilder/themes/colored-green3.css +31 -16
  20. package/public/contentbuilder/themes/colored-green4.css +31 -16
  21. package/public/contentbuilder/themes/colored-green5.css +31 -16
  22. package/public/contentbuilder/themes/colored-magenta.css +31 -16
  23. package/public/contentbuilder/themes/colored-orange.css +31 -16
  24. package/public/contentbuilder/themes/colored-orange2.css +31 -16
  25. package/public/contentbuilder/themes/colored-orange3.css +31 -16
  26. package/public/contentbuilder/themes/colored-pink.css +31 -16
  27. package/public/contentbuilder/themes/colored-pink2.css +31 -16
  28. package/public/contentbuilder/themes/colored-pink3.css +31 -16
  29. package/public/contentbuilder/themes/colored-pink4.css +31 -16
  30. package/public/contentbuilder/themes/colored-purple.css +31 -16
  31. package/public/contentbuilder/themes/colored-purple2.css +31 -16
  32. package/public/contentbuilder/themes/colored-red.css +31 -16
  33. package/public/contentbuilder/themes/colored-red2.css +31 -16
  34. package/public/contentbuilder/themes/colored-red3.css +31 -16
  35. package/public/contentbuilder/themes/colored-red4.css +31 -16
  36. package/public/contentbuilder/themes/colored-red5.css +31 -16
  37. package/public/contentbuilder/themes/colored-yellow.css +31 -16
  38. package/public/contentbuilder/themes/colored-yellow2.css +31 -16
  39. package/public/contentbuilder/themes/dark-blue.css +19 -15
  40. package/public/contentbuilder/themes/dark-blue2.css +19 -15
  41. package/public/contentbuilder/themes/dark-blue3.css +19 -15
  42. package/public/contentbuilder/themes/dark-gray.css +19 -15
  43. package/public/contentbuilder/themes/dark-pink.css +19 -15
  44. package/public/contentbuilder/themes/dark-purple.css +19 -15
  45. package/public/contentbuilder/themes/dark-red.css +19 -15
  46. package/public/contentbuilder/themes/dark.css +19 -15
  47. package/public/contentbuilder/themes/light-blue.css +30 -15
  48. package/public/contentbuilder/themes/light-blue2.css +30 -15
  49. package/public/contentbuilder/themes/light-blue3.css +30 -15
  50. package/public/contentbuilder/themes/light-cyan.css +30 -15
  51. package/public/contentbuilder/themes/light-gray.css +30 -15
  52. package/public/contentbuilder/themes/light-gray2.css +30 -15
  53. package/public/contentbuilder/themes/light-gray3.css +30 -15
  54. package/public/contentbuilder/themes/light-green.css +30 -15
  55. package/public/contentbuilder/themes/light-pink.css +30 -15
  56. package/public/contentbuilder/themes/light-pink2.css +30 -15
  57. package/public/contentbuilder/themes/light-purple.css +30 -15
  58. package/public/contentbuilder/themes/light-purple2.css +30 -15
  59. package/public/contentbuilder/themes/light-red.css +30 -15
  60. package/public/contentbuilder/themes/light-yellow.css +30 -15
  61. package/public/contentbuilder/themes/light-yellow2.css +30 -15
  62. package/readme.txt +1 -1
@@ -4599,27 +4599,7 @@ class Util {
4599
4599
  pop.classList.add('pop4');
4600
4600
  overlay.classList.add('pop4');
4601
4601
  }
4602
- const handlePopKeyDown = e => {
4603
- if (e.keyCode === 27) {
4604
- // escape key
4605
- overlay.remove();
4606
- pop.style.display = '';
4607
- pop.classList.remove('active');
4608
- pop.setAttribute('aria-hidden', true);
4609
- overlay.classList.remove('pop1');
4610
- overlay.classList.remove('pop2');
4611
- overlay.classList.remove('pop3');
4612
- overlay.classList.remove('pop4');
4613
- pop.classList.remove('pop1');
4614
- pop.classList.remove('pop2');
4615
- pop.classList.remove('pop3');
4616
- pop.classList.remove('pop4');
4617
- pop.removeEventListener('keydown', handlePopKeyDown);
4618
- if (cancelCallback) cancelCallback();
4619
- if (btn) btn.focus();
4620
- }
4621
- };
4622
- overlay.addEventListener('click', e => {
4602
+ const close = () => {
4623
4603
  overlay.remove();
4624
4604
  pop.style.display = '';
4625
4605
  pop.classList.remove('active');
@@ -4635,6 +4615,17 @@ class Util {
4635
4615
  pop.removeEventListener('keydown', handlePopKeyDown);
4636
4616
  if (cancelCallback) cancelCallback();
4637
4617
  if (btn) btn.focus();
4618
+ };
4619
+ this.hidePopOverlay = close; // so that the close() can be called programmatically (used by gradientpicker.js 411)
4620
+
4621
+ const handlePopKeyDown = e => {
4622
+ if (e.keyCode === 27) {
4623
+ // escape key
4624
+ close();
4625
+ }
4626
+ };
4627
+ overlay.addEventListener('click', e => {
4628
+ close();
4638
4629
  e.preventDefault();
4639
4630
  e.stopImmediatePropagation();
4640
4631
  });
@@ -15799,6 +15790,11 @@ const prepareSvgIcons = builder => {
15799
15790
  <path d="M12 5l0 14"></path>
15800
15791
  <path d="M5 12l14 0"></path>
15801
15792
  </symbol>
15793
+
15794
+ <symbol id="icon-minus" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
15795
+ <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
15796
+ <path d="M5 12l14 0"></path>
15797
+ </symbol>
15802
15798
  </svg>`;
15803
15799
  builder.dom.appendHtml(builder.builderStuff, html);
15804
15800
  };
@@ -51828,11 +51824,16 @@ class RowTool {
51828
51824
  <a title="${util.out('More')}" id="tabRowMore" href="#" data-content="divRowMore">${util.out('More')}</a>
51829
51825
  </div>
51830
51826
  <div id="divRowGeneral" class="is-tab-content active" data-group="rowsettings" style="display:flex" tabindex="-1">
51831
-
51832
- <div style="padding-bottom: 3px;">${util.out('Background Color')}:</div>
51833
- <div style="display:flex;">
51834
- <button title="${util.out('Background Color')}" class="input-row-bgcolor is-btn-color" style="margin-right:15px"></button>
51835
- <button title="${util.out('Gradient')}" class="input-row-gradient classic" data-value="+"> ${util.out('Gradient')} </button>
51827
+
51828
+ <div style="display:flex;gap:40px">
51829
+ <div>
51830
+ <div style="padding-bottom: 3px;">${util.out('Background Color')}:</div>
51831
+ <button title="${util.out('Background Color')}" class="input-row-bgcolor is-btn-color" style="margin-right:15px"></button>
51832
+ </div>
51833
+ <div>
51834
+ <div style="padding-bottom: 3px;">${util.out('Gradient')}:</div>
51835
+ <button title="${util.out('Gradient')}" class="input-row-gradient is-btn-color"></button>
51836
+ </div>
51836
51837
  </div>
51837
51838
 
51838
51839
  <div style="padding-top:20px;padding-bottom: 3px;">${util.out('Background Image')}:</div>
@@ -52079,11 +52080,6 @@ class RowTool {
52079
52080
  });
52080
52081
 
52081
52082
  // Background gradient
52082
- // const gradientPicker = new GradientPicker({
52083
- // colors: this.builder.colors,
52084
- // gradientcolors: this.builder.opts.gradientcolors,
52085
- // lang: this.builder.opts.lang
52086
- // }, this.builder);
52087
52083
  const gradientPicker = this.builder.gradientpicker();
52088
52084
  let btnRowGradient = rowSettings.querySelector('.input-row-gradient');
52089
52085
  btnRowGradient.addEventListener('click', () => {
@@ -52479,6 +52475,16 @@ class RowTool {
52479
52475
  } else {
52480
52476
  div.innerHTML = '';
52481
52477
  }
52478
+
52479
+ // Gradient
52480
+ let btnGradient = this.rowSettings.querySelector('.input-row-gradient');
52481
+ btnGradient.style.backgroundImage = '';
52482
+ if (row.style.backgroundImage) {
52483
+ if (row.style.backgroundImage.includes('linear')) {
52484
+ let cssGradient = row.style.backgroundImage;
52485
+ btnGradient.style.backgroundImage = cssGradient;
52486
+ }
52487
+ }
52482
52488
  const chkRowGrayscale = this.rowSettings.querySelector('.chk-row-grayscale');
52483
52489
  chkRowGrayscale.checked = false;
52484
52490
  if (row.style.filter) {
@@ -52637,7 +52643,6 @@ class RowAddTool {
52637
52643
  }
52638
52644
  }
52639
52645
 
52640
- // import GradientPicker from './gradientpicker.js';
52641
52646
  class ColumnTool {
52642
52647
  constructor(builder) {
52643
52648
  this.builder = builder;
@@ -53411,10 +53416,15 @@ class ColumnTool {
53411
53416
  </div>
53412
53417
  <div id="divCellGeneral" class="is-tab-content active" data-group="cellsettings" style="display:flex" tabindex="-1">
53413
53418
 
53414
- <div style="padding-bottom: 3px;">${util.out('Background Color')}:</div>
53415
- <div style="display:flex;">
53416
- <button title="${util.out('Background Color')}" class="input-cell-bgcolor is-btn-color" style="margin-right:15px"></button>
53417
- <button title="${util.out('Gradient')}" class="input-cell-gradient classic" data-value="+"> ${util.out('Gradient')} </button>
53419
+ <div style="display:flex;gap:40px">
53420
+ <div>
53421
+ <div style="padding-bottom: 3px;">${util.out('Background Color')}:</div>
53422
+ <button title="${util.out('Background Color')}" class="input-cell-bgcolor is-btn-color" style="margin-right:15px"></button>
53423
+ </div>
53424
+ <div>
53425
+ <div style="padding-bottom: 3px;">${util.out('Gradient')}:</div>
53426
+ <button title="${util.out('Gradient')}" class="input-cell-gradient is-btn-color"></button>
53427
+ </div>
53418
53428
  </div>
53419
53429
 
53420
53430
  <div style="padding-top:20px;padding-bottom: 3px;">${util.out('Background Image')}:</div>
@@ -53806,12 +53816,6 @@ class ColumnTool {
53806
53816
  });
53807
53817
 
53808
53818
  // Background gradient
53809
- // const gradientPicker = new GradientPicker({
53810
- // colors: this.builder.colors,
53811
- // gradientcolors: this.builder.opts.gradientcolors,
53812
- // lang: this.builder.opts.lang
53813
- // }, this.builder);
53814
-
53815
53819
  const gradientPicker = this.builder.gradientpicker();
53816
53820
  let btnCellGradient = cellSettings.querySelector('.input-cell-gradient');
53817
53821
  btnCellGradient.addEventListener('click', () => {
@@ -54583,6 +54587,16 @@ class ColumnTool {
54583
54587
  } else {
54584
54588
  div.innerHTML = '';
54585
54589
  }
54590
+
54591
+ // Gradient
54592
+ let btnGradient = this.cellSettings.querySelector('.input-cell-gradient');
54593
+ btnGradient.style.backgroundImage = '';
54594
+ if (cell.style.backgroundImage) {
54595
+ if (cell.style.backgroundImage.includes('linear')) {
54596
+ let cssGradient = cell.style.backgroundImage;
54597
+ btnGradient.style.backgroundImage = cssGradient;
54598
+ }
54599
+ }
54586
54600
  const inpClickSrc = this.cellSettings.querySelector('.input-src');
54587
54601
  inpClickSrc.value = '';
54588
54602
  let clickUrl = cell.getAttribute('data-modal-url');
@@ -55419,11 +55433,14 @@ class ElementGeneralStyles {
55419
55433
  let panelStuff = builderStuff.querySelector('#divElementGeneral');
55420
55434
  this.panelStuff = panelStuff;
55421
55435
  const html = `
55422
- <div class="is-settings" style="width: 100%">
55423
- <div class="is-label" style="margin:0 0 3px">${util.out('Background Color')}:</div>
55424
- <div>
55436
+ <div class="is-settings" style="width: 100%;display:flex;gap:40px">
55437
+ <div style="display:flex;flex-direction:column;align-items:flex-start;">
55438
+ <div style="padding-bottom: 7px;">${util.out('Background Color')}:</div>
55425
55439
  <button title="${util.out('Background Color')}" class="input-elm-bgcolor is-btn-color" style="margin-right:15px"></button>
55426
- <button title="${util.out('Gradient')}" class="input-elm-gradient classic" data-value="+"> ${util.out('Gradient')} </button>
55440
+ </div>
55441
+ <div style="display:flex;flex-direction:column;align-items:flex-start;">
55442
+ <div style="padding-bottom: 7px;">${util.out('Gradient')}:</div>
55443
+ <button title="${util.out('Gradient')}" class="input-elm-gradient is-btn-color"></button>
55427
55444
  </div>
55428
55445
  </div>
55429
55446
 
@@ -55508,12 +55525,6 @@ class ElementGeneralStyles {
55508
55525
  });
55509
55526
 
55510
55527
  // Background gradient
55511
- // const gradientPicker = new GradientPicker({
55512
- // colors: this.builder.colors,
55513
- // gradientcolors: this.builder.opts.gradientcolors,
55514
- // lang: this.builder.opts.lang
55515
- // }, this.builder);
55516
-
55517
55528
  const gradientPicker = this.builder.gradientpicker();
55518
55529
  let btnElmGradient = panelStuff.querySelector('.input-elm-gradient');
55519
55530
  btnElmGradient.addEventListener('click', () => {
@@ -55712,6 +55723,16 @@ class ElementGeneralStyles {
55712
55723
  let btn = panelStuff.querySelector('.input-elm-bgcolor');
55713
55724
  if (s) btn.style.backgroundColor = s;else btn.style.backgroundColor = 'transparent';
55714
55725
 
55726
+ // Gradient
55727
+ let btnGradient = panelStuff.querySelector('.input-elm-gradient');
55728
+ btnGradient.style.backgroundImage = '';
55729
+ if (elm.style.backgroundImage) {
55730
+ if (elm.style.backgroundImage.includes('linear')) {
55731
+ let cssGradient = elm.style.backgroundImage;
55732
+ btnGradient.style.backgroundImage = cssGradient;
55733
+ }
55734
+ }
55735
+
55715
55736
  // Background image
55716
55737
  let imgUrl = '';
55717
55738
  const div = panelStuff.querySelector('.elm-bgimage-preview');
@@ -63443,7 +63464,8 @@ class ColorPicker {
63443
63464
  pickr.on('change', color => {
63444
63465
  if (poppicker.style.display !== 'flex') return;
63445
63466
  let s = color.toRGBA().toString(0);
63446
- this.opts.onPick(s);
63467
+ if (!this.noCallback) this.opts.onPick(s);
63468
+ this.noCallback = false; //just in case
63447
63469
  }).on('clear', () => {
63448
63470
  this.opts.onPick('');
63449
63471
  poppicker.querySelector('.pcr-result').value = ''; //clear
@@ -63602,6 +63624,7 @@ class ColorPicker {
63602
63624
  this.opts.color = color;
63603
63625
  this.setColor(color, true);
63604
63626
  }
63627
+ this.noCallback = false;
63605
63628
  }
63606
63629
  openByTab(color) {
63607
63630
  // Rte
@@ -63617,9 +63640,10 @@ class ColorPicker {
63617
63640
  setColorRte(color) {
63618
63641
  this.pickrRte.setColor(color);
63619
63642
  }
63620
- setColor(color) {
63643
+ setColor(color, noCallback) {
63621
63644
  //, noCallback
63622
63645
 
63646
+ if (noCallback) this.noCallback = true; // will be passed to onChange, since the onChanhe calls onPick(color)
63623
63647
  this.pickr.setColor(color);
63624
63648
 
63625
63649
  // if(!noCallback) this.opts.onPick(color);
@@ -63649,585 +63673,539 @@ class ColorPicker {
63649
63673
  }
63650
63674
  }
63651
63675
 
63652
- class Modal {
63653
- constructor(opts = {}) {
63654
- let defaults = {
63655
- animateModal: false,
63656
- elementToAnimate: '',
63657
- stuffPlacement: '#_cbhtml'
63676
+ class RoundedSlider {
63677
+ constructor(element, settings = {}) {
63678
+ const defaults = {
63679
+ selector: '.myslider',
63680
+ onStart: () => {}
63658
63681
  };
63659
- this.opts = Object.assign(this, defaults, opts);
63660
- this.id = this.makeId();
63661
- let builderStuff = document.querySelector(this.opts.stuffPlacement);
63662
- if (!builderStuff) {
63663
- builderStuff = document.createElement('div');
63664
- builderStuff.id = '_cbhtml';
63665
- document.body.appendChild(builderStuff);
63666
- }
63667
- this.builderStuff = builderStuff;
63682
+ this.opts = Object.assign(this, defaults, settings);
63683
+ this.startDrag = this.startDrag.bind(this);
63684
+ this.onDrag = this.onDrag.bind(this);
63685
+ this.endDrag = this.endDrag.bind(this);
63686
+ this.handleTouchMove = this.handleTouchMove.bind(this);
63687
+ this.element = element; //document.querySelector(this.opts.selector);
63668
63688
 
63669
- // Stuff placement for this (single) instance
63670
- const objStuff = document.createElement('div');
63671
- objStuff.id = this.id;
63672
- builderStuff.appendChild(objStuff);
63673
- this.objStuff = objStuff;
63689
+ this.created = false;
63674
63690
  }
63675
- confirm(message, callback, animated) {
63676
- let html = `<div class="is-modal is-confirm" tabindex="-1" role="dialog" aria-modal="true" aria-hidden="true">
63677
- <div class="is-modal-content" style="padding-bottom:20px;">
63678
- <div style="margin: 20px 0 30px;font-size: 14px;">${message}</div>
63679
- <button title="${this.out('Delete')}" class="input-ok classic">${this.out('Delete')}</button>
63680
- </div>
63681
- </div>`;
63682
- let confirmModal = this.objStuff.querySelector('.is-confirm');
63683
- if (!confirmModal) {
63684
- this.objStuff.insertAdjacentHTML('beforeend', html);
63685
- confirmModal = this.builderStuff.querySelector('.is-confirm');
63686
- }
63687
- this.show(confirmModal, false, () => {
63688
- //this function runs when overlay is clicked. Remove modal.
63689
- confirmModal.parentNode.removeChild(confirmModal);
63690
-
63691
- //do task
63692
- callback(false);
63693
- }, animated);
63694
- let buttonok = confirmModal.querySelector('.is-confirm .input-ok');
63695
- this.addEventListener(buttonok, 'click', () => {
63696
- this.hide(confirmModal);
63697
- confirmModal.parentNode.removeChild(confirmModal); //remove modal
63698
-
63699
- //do task
63700
- callback(true);
63691
+ create() {
63692
+ if (this.created === true) return; // so that it is saved to call multiple times
63693
+ this.created = true;
63694
+ const element = this.element;
63695
+ const container = document.createElement('div');
63696
+ container.classList.add('roundslider-container');
63697
+ container.innerHTML = `
63698
+ <div class="roundslider">
63699
+ <div class="knob"></div>
63700
+ </div>
63701
+ `;
63702
+ element.insertAdjacentElement('afterend', container);
63703
+ this.container = container;
63704
+ const knob = container.querySelector('.knob');
63705
+ const roundslider = container.querySelector('.roundslider');
63706
+ const angleValue = element;
63707
+ this.knob = knob;
63708
+ this.roundslider = roundslider;
63709
+ this.angleValue = angleValue;
63710
+ this.isDragging = false;
63711
+ this.angleOffset = 0;
63712
+ knob.addEventListener('mousedown', this.startDrag);
63713
+ document.addEventListener('mousemove', this.onDrag);
63714
+ document.addEventListener('mouseup', this.endDrag);
63715
+ knob.addEventListener('touchstart', this.startDrag, {
63716
+ passive: false
63701
63717
  });
63718
+ // document.addEventListener('touchmove', e => this.onDrag(e.touches[0]));
63719
+ document.addEventListener('touchmove', this.handleTouchMove);
63720
+ document.addEventListener('touchend', this.endDrag);
63721
+ this.setKnobPosition(angleValue.value, true); // no trigger for initial create
63722
+
63723
+ element.style.display = 'none';
63724
+ }
63725
+ setValue(val, noTrigger = false) {
63726
+ // true = no trigger only for setting angle position (gradientpicker.js 500)
63727
+ this.setKnobPosition(val, noTrigger);
63702
63728
  }
63703
- show(modal, overlayStay, cancelCallback, animated) {
63704
- this.addClass(modal, 'active');
63729
+ setKnobPosition(angle, noTrigger = false) {
63730
+ const knob = this.knob;
63731
+ const roundslider = this.roundslider;
63732
+ const angleValue = this.angleValue;
63733
+ const degToRad = deg => deg * Math.PI / 180;
63734
+ const radius = roundslider.offsetWidth / 2;
63735
+ const x = radius + radius * Math.cos(degToRad(angle - 90));
63736
+ const y = radius + radius * Math.sin(degToRad(angle - 90));
63737
+ knob.style.left = `${x - knob.offsetWidth / 2}px`;
63738
+ knob.style.top = `${y - knob.offsetHeight / 2}px`;
63739
+ angle = angle % 360;
63705
63740
 
63706
- // animated param (if set) will overide global setting
63707
- let animate = false;
63708
- if (!(typeof animated === 'undefined' || animated === null)) {
63709
- // animated param is set
63710
- animate = animated;
63711
- } else {
63712
- // if animated param is not set
63713
- animate = this.opts.animateModal; // use global setting
63714
- }
63741
+ // angleValue.value = `${Math.round(angle)}°`;
63742
+ angleValue.value = `${Math.round(angle)}`;
63743
+ knob.dataset.angle = angle.toString(); // Update the internal state with the new angle
63715
63744
 
63716
- if (animate) {
63717
- const buildercontainers = document.querySelectorAll(this.opts.elementToAnimate);
63718
- Array.prototype.forEach.call(buildercontainers, buildercontainer => {
63719
- // buildercontainer.style.transform = 'scale(0.98)';
63720
- // buildercontainer.style.WebkitTransform= 'scale(0.98)';
63721
- // buildercontainer.style.MozTransform= 'scale(0.98)';
63722
- buildercontainer.style.transform = `scale(${this.builder.opts.zoom - 0.02})`;
63723
- buildercontainer.style.WebkitTransform = `scale(${this.builder.opts.zoom - 0.02})`;
63724
- buildercontainer.style.MozTransform = `scale(${this.builder.opts.zoom - 0.02})`;
63725
- buildercontainer.setAttribute('scaled-down', '1');
63726
- });
63727
- }
63728
- if (!modal.querySelector('.is-modal-overlay')) {
63729
- let html;
63730
- if (overlayStay) {
63731
- html = '<div class="is-modal-overlay overlay-stay"></div>';
63732
- } else {
63733
- html = '<div class="is-modal-overlay"></div>';
63734
- }
63735
- modal.insertAdjacentHTML('afterbegin', html);
63736
- if (!overlayStay) {
63737
- let overlay = modal.querySelector('.is-modal-overlay');
63738
- this.addEventListener(overlay, 'click', () => {
63739
- //cancelCallback
63740
- if (cancelCallback) cancelCallback();
63741
- this.hide(modal);
63742
- });
63743
- }
63744
- }
63745
- }
63746
- hide(modal) {
63747
- if (this.opts.elementToAnimate !== '') {
63748
- const buildercontainers = document.querySelectorAll(this.opts.elementToAnimate);
63749
- Array.prototype.forEach.call(buildercontainers, buildercontainer => {
63750
- // buildercontainer.style.transform = '';
63751
- // buildercontainer.style.WebkitTransform= '';
63752
- // buildercontainer.style.MozTransform= '';
63753
- if (buildercontainer.getAttribute('scaled-down')) {
63754
- buildercontainer.style.transform = `scale(${this.builder.opts.zoom})`;
63755
- buildercontainer.style.WebkitTransform = `scale(${this.builder.opts.zoom})`;
63756
- buildercontainer.style.MozTransform = `scale(${this.builder.opts.zoom})`;
63757
- buildercontainer.removeAttribute('scaled-down');
63758
- }
63745
+ if (!noTrigger) {
63746
+ const event = new Event('input', {
63747
+ bubbles: true
63759
63748
  });
63749
+ angleValue.dispatchEvent(event);
63760
63750
  }
63761
- this.removeClass(modal, 'active');
63762
- }
63763
-
63764
- // http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript
63765
- makeId() {
63766
- let text = '';
63767
- let possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
63768
- for (let i = 0; i < 2; i++) text += possible.charAt(Math.floor(Math.random() * possible.length));
63769
- let text2 = '';
63770
- let possible2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
63771
- for (let i = 0; i < 5; i++) text2 += possible2.charAt(Math.floor(Math.random() * possible2.length));
63772
- return text + text2;
63773
63751
  }
63774
- addClass(element, classname) {
63775
- if (!element) return;
63776
- if (this.hasClass(element, classname)) return;
63777
- if (element.classList.length === 0) element.className = classname;else element.className = element.className + ' ' + classname;
63752
+ startDrag(e) {
63753
+ e.preventDefault();
63754
+ const radToDeg = rad => rad * 180 / Math.PI;
63755
+ const knob = this.knob;
63756
+ const roundslider = this.roundslider;
63757
+ const angleValue = this.angleValue;
63758
+ const rect = roundslider.getBoundingClientRect();
63759
+ const centerX = rect.left + rect.width / 2;
63760
+ const centerY = rect.top + rect.height / 2;
63761
+ const mouseX = e.clientX || e.touches[0].clientX;
63762
+ const mouseY = e.clientY || e.touches[0].clientY;
63763
+ const startAngle = radToDeg(Math.atan2(mouseY - centerY, mouseX - centerX)) + 180;
63764
+ const knobAngle = parseInt(knob.dataset.angle || `${angleValue.value}`, 10);
63765
+ this.angleOffset = knobAngle - startAngle;
63766
+ this.isDragging = true;
63767
+ this.onStart();
63778
63768
  }
63779
- removeClass(element, classname) {
63780
- if (!element) return;
63781
- if (element.classList.length > 0) {
63782
- element.className = element.className.replace(classname, '');
63769
+ handleTouchMove(e) {
63770
+ if (e.touches && e.touches.length > 0) {
63771
+ this.onDrag(e.touches[0]);
63783
63772
  }
63784
63773
  }
63785
- hasClass(element, classname) {
63786
- if (!element) return false;
63787
- return element.classList ? element.classList.contains(classname) : new RegExp('\\b' + classname + '\\b').test(element.className);
63774
+ onDrag(e) {
63775
+ if (!this.isDragging) return;
63776
+ const radToDeg = rad => rad * 180 / Math.PI;
63777
+ const knob = this.knob;
63778
+ const roundslider = this.roundslider;
63779
+ const rect = roundslider.getBoundingClientRect();
63780
+ const centerX = rect.left + rect.width / 2;
63781
+ const centerY = rect.top + rect.height / 2;
63782
+ const mouseX = e.clientX || e.touches[0].clientX;
63783
+ const mouseY = e.clientY || e.touches[0].clientY;
63784
+ let angle = radToDeg(Math.atan2(mouseY - centerY, mouseX - centerX)) + 180;
63785
+ angle += this.angleOffset;
63786
+ angle = angle % 360;
63787
+ angle = angle < 0 ? 359 + angle : angle;
63788
+ knob.dataset.angle = angle.toString();
63789
+ this.setKnobPosition(angle);
63790
+ }
63791
+ endDrag() {
63792
+ this.isDragging = false;
63788
63793
  }
63789
- addEventListener(parent, type, listener) {
63790
- parent.addEventListener(type, listener);
63794
+ destroy() {
63795
+ const element = this.element;
63796
+ const knob = this.knob;
63797
+ const container = this.container;
63798
+ knob.removeEventListener('mousedown', this.startDrag);
63799
+ document.removeEventListener('mousemove', this.onDrag);
63800
+ document.removeEventListener('mouseup', this.endDrag);
63801
+ knob.removeEventListener('touchstart', this.startDrag);
63802
+ // document.removeEventListener('touchmove', e => this.onDrag(e.touches[0]));
63803
+ document.removeEventListener('touchmove', this.handleTouchMove);
63804
+ document.removeEventListener('touchend', this.endDrag);
63805
+ container.remove();
63806
+ element.style.display = '';
63791
63807
  }
63792
63808
  }
63793
63809
 
63794
- // import ColorPicker from './colorpicker.js';
63795
-
63796
63810
  class GradientPicker {
63797
- constructor(opts = {}, builder) {
63811
+ constructor(builder) {
63798
63812
  this.builder = builder;
63799
- let defaults = {
63800
- colors: ['#ff9f01', '#f57c00', '#e64918', '#d32f2f', '#5d4038', '#37474f', '#353535', '#fbc02c', '#b0b42a', '#689f39', '#c21f5b', '#7b21a2', '#522da8', '#616161', '#01b8c9', '#009688', '#388d3c', '#0388d0', '#1465c0', '#2f3f9e', '#9e9e9e'],
63801
- gradientcolors: [['linear-gradient(0deg, rgb(255, 57, 25), rgb(249, 168, 37))'], ['linear-gradient(0deg, rgb(255, 57, 25), rgb(255, 104, 15))'], ['linear-gradient(0deg, #FF5722, #FF9800)'], ['linear-gradient(0deg, #613ca2, rgb(110, 123, 217))'], ['linear-gradient(0deg, rgb(65, 70, 206), rgb(236, 78, 130))'], ['linear-gradient(0deg, rgb(0, 150, 102), rgb(90, 103, 197))'], ['linear-gradient(30deg, rgb(249, 119, 148), rgb(98, 58, 162))'], ['linear-gradient(0deg, rgb(223, 70, 137), rgb(90, 103, 197))'], ['linear-gradient(0deg, rgb(40, 53, 147), rgb(90, 103, 197))'], ['linear-gradient(0deg, rgb(21, 101, 192), rgb(52, 169, 239))'], ['linear-gradient(0deg, rgb(32, 149, 219), rgb(139, 109, 230))'], ['linear-gradient(0deg, rgb(90, 103, 197), rgb(0, 184, 201))'], ['linear-gradient(0deg, rgb(0, 184, 201), rgb(253, 187, 45))'], ['linear-gradient(0deg, rgb(255, 208, 100), rgb(239, 98, 159))'], ['linear-gradient(0deg, rgb(0, 214, 223), rgb(130, 162, 253))'], ['linear-gradient(0deg, rgb(50, 234, 251), rgb(248, 247, 126))'], ['linear-gradient(0deg, rgb(141, 221, 255), rgb(255, 227, 255))'], ['linear-gradient(0deg, rgb(255, 170, 170), rgb(255, 255, 200))'], ['linear-gradient(0deg, rgb(239, 239, 239), rgb(252, 252, 252))']],
63802
- animateModal: false,
63803
- elementToAnimate: '',
63804
- stuffPlacement: '#_cbhtml',
63805
- lang: []
63806
- };
63807
- this.opts = Object.assign(this, defaults, opts);
63808
- this.id = makeid();
63809
- let builderStuff = document.querySelector(this.opts.stuffPlacement);
63810
- if (!builderStuff) {
63811
- builderStuff = document.createElement('div');
63812
- builderStuff.id = '_cbhtml';
63813
- builderStuff.className = 'is-ui';
63814
- document.body.appendChild(builderStuff);
63815
- }
63816
- this.builderStuff = builderStuff;
63817
-
63818
- // Stuff placement for this (single) instance
63819
- const objStuff = document.createElement('div');
63820
- objStuff.id = this.id;
63821
- builderStuff.appendChild(objStuff);
63822
- this.objStuff = objStuff;
63823
- const modal = new Modal({
63824
- animateModal: this.opts.animateModal,
63825
- elementToAnimate: this.opts.elementToAnimate,
63826
- stuffPlacement: this.opts.stuffPlacement
63827
- });
63828
- this.modal = modal;
63813
+ this.builderStuff = this.builder.builderStuff;
63814
+ this.util = this.builder.util;
63829
63815
  let html_gradcolors = '';
63830
- for (var i = 0; i < this.opts.gradientcolors.length; i++) {
63831
- html_gradcolors += `<button data-elmgradient="${this.opts.gradientcolors[i][0]}" data-textcolor="${this.opts.gradientcolors[i][1] ? this.opts.gradientcolors[i][1] : ''}" style="background-image:${this.opts.gradientcolors[i][0]};"></button>`;
63832
- }
63816
+ this.builder.gradientColors.forEach(s => {
63817
+ html_gradcolors += `
63818
+ <button
63819
+ title="${this.out('Select')}"
63820
+ class="btn-graditem" data-value="${s}"
63821
+ style="background-image:${s}"></button>
63822
+ `;
63823
+ });
63833
63824
  let html = `<div class="is-pop pickgradientcolor" style="z-index:10005" tabindex="-1" role="dialog" aria-modal="true" aria-hidden="true">
63834
- <div class="div-gradients" style="display: flex;flex-flow: wrap;margin-bottom:10px;">
63825
+ <div class="div-presets">
63835
63826
  ${html_gradcolors}
63836
- <button class="input-gradient-clear" title="${this.out('Clear')}" data-value="" style="width:35px;height:35px;"><svg class="is-icon-flex" style="width:23px;height:23px;"><use xlink:href="#ion-ios-close-empty"></use></svg></button>
63837
63827
  </div>
63838
- <div class="is-settings" style="margin-bottom:0">
63839
- <div class="is-label" style="margin-top:0">${this.out('Custom')}:</div>
63840
- <div class="div-custom-gradients" style="height:auto;display: flex;flex-flow: wrap;"></div>
63841
- <div style="display: flex;align-items: center;">
63842
- <button title="${this.out('Select Color')}" class="input-gradient-color1 is-btn-color" data-value="dark" style="width:36px;height:36px;"></button>
63843
- <button title="${this.out('Select Color')}" class="input-gradient-color2 is-btn-color" data-value="dark" style="width:36px;height:36px;"></button>
63844
- <input type="text" class="input-gradient-deg" id="{id}" value="0" style="width:60px;height:35px;margin-left:7px;margin-right:5px;font-size:14px;"/> deg
63845
- </div>
63828
+
63829
+ <div class="label-saved">${this.out('Saved')}:</div>
63830
+ <div class="div-saved"></div>
63831
+
63832
+ <div class="gradient-preview"></div>
63833
+
63834
+ <div class="label-saved">${this.out('Gradient Colors')}:</div>
63835
+ <div class="div-sort"></div>
63836
+
63837
+ <div class="div-add">
63838
+ <button title="${this.out('Clear')}" class="btn-clear">
63839
+ <svg><use xlink:href="#icon-eraser"></use></svg>
63840
+ </button>
63841
+ <input type="text" class="inp-angle" value="0">
63842
+ <button title="${this.out('Add')}" class="btn-addstop"><svg class="is-icon-flex"><use xlink:href="#icon-plus"></use></svg></button>
63846
63843
  </div>
63847
- <div class="is-settings" style="margin-bottom:0">
63848
- <button title="${this.out('Add')}" class="input-gradient-save classic" style="width:100%;border:none;"> ${this.out('Add')} </button>
63844
+
63845
+ <div class="div-save">
63846
+ <button title="${this.out('Save')}" class="btn-save">${this.out('Save')}</button>
63849
63847
  </div>
63850
- </div>
63851
63848
  `;
63852
- objStuff.insertAdjacentHTML('beforeend', html.replace(/{id}/g, this.makeId()));
63853
- const pickGradient = objStuff.querySelector('.is-pop.pickgradientcolor');
63849
+ this.builderStuff.insertAdjacentHTML('beforeend', html);
63850
+ const pickGradient = this.builderStuff.querySelector('.is-pop.pickgradientcolor');
63854
63851
  this.pickGradient = pickGradient;
63855
- const setupTabKeys = div => {
63856
- let inputs = div.querySelectorAll('a[href], input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), *[tabindex]');
63857
- if (inputs.length === 0) return;
63858
- let firstInput = inputs[0];
63859
- let lastInput = inputs[inputs.length - 1];
63860
- // firstInput.focus();
63861
-
63862
- // console.log(lastInput)
63863
- // console.log(firstInput)
63864
-
63865
- // Redirect last tab to first input
63866
- lastInput.addEventListener('keydown', e => {
63867
- if (e.which === 9 && !e.shiftKey) {
63868
- e.preventDefault();
63869
- firstInput.focus();
63870
- }
63871
- });
63852
+ this.init();
63853
+ } //constructor
63872
63854
 
63873
- // Redirect first shift+tab to last input
63874
- firstInput.addEventListener('keydown', e => {
63875
- if (e.which === 9 && e.shiftKey) {
63876
- e.preventDefault();
63877
- lastInput.focus();
63878
- }
63879
- });
63855
+ out(s) {
63856
+ if (this.builder.lang) {
63857
+ let val = this.builder.lang[s];
63858
+ if (val) return val;else {
63859
+ return s;
63860
+ }
63861
+ } else {
63862
+ return s;
63863
+ }
63864
+ }
63865
+ init() {
63866
+ this.renderSavedGradients();
63867
+ const btnAddStop = this.pickGradient.querySelector('.btn-addstop');
63868
+ if (btnAddStop) btnAddStop.addEventListener('click', () => {
63869
+ this.builder.uo.saveForUndo();
63870
+ let lastColor = this.colorsArray[this.colorsArray.length - 1];
63871
+ this.colorsArray.push(lastColor);
63872
+ this.renderColorStops();
63873
+ this.applyGradient();
63874
+ if (this.onChange) this.onChange();
63875
+ this.builder.onChange();
63876
+ });
63877
+ const btnSave = this.pickGradient.querySelector('.btn-save');
63878
+ if (btnSave) btnSave.addEventListener('click', () => {
63879
+ this.saveGradient();
63880
+ this.renderSavedGradients();
63881
+ });
63882
+ const inpAngle = this.pickGradient.querySelector('.inp-angle');
63883
+ this.slider = new RoundedSlider(inpAngle, {
63884
+ onStart: () => {
63885
+ this.builder.uo.saveForUndo(true); // checkLater = true
63886
+ }
63887
+ });
63888
+
63889
+ inpAngle.oninput = () => {
63890
+ this.angle = inpAngle.value;
63891
+ this.applyGradient();
63892
+ if (this.onChange) this.onChange();
63893
+ this.builder.onChange();
63880
63894
  };
63881
- setupTabKeys(pickGradient);
63882
- new Draggable$2({
63883
- selector: '#' + this.id + ' .is-draggable'
63895
+ const btnClear = this.pickGradient.querySelector('.btn-clear');
63896
+ if (btnClear) btnClear.addEventListener('click', () => {
63897
+ this.builder.uo.saveForUndo();
63898
+ this.colorsArray = [];
63899
+ this.renderColorStops();
63900
+ this.angle = 0;
63901
+ this.renderAngle();
63902
+ this.applyGradient();
63903
+ if (this.onChange) this.onChange();
63904
+ this.builder.onChange();
63884
63905
  });
63885
63906
 
63886
- // const colorPicker = new ColorPicker({
63887
- // colors: this.opts.colors,
63888
- // animateModal: this.opts.animateModal,
63889
- // elementToAnimate: this.opts.container,
63890
- // lang: this.opts.lang
63891
- // });
63892
- const colorPicker = this.builder.colorPicker;
63893
- let btnColor1 = objStuff.querySelector('.input-gradient-color1');
63894
- btnColor1.addEventListener('click', () => {
63895
- colorPicker.open(color => {
63896
- if (color === '') color = 'transparent';
63897
-
63898
- // set element style
63899
- let color1 = color;
63900
- let color2 = objStuff.querySelector('.input-gradient-color2').style.backgroundColor;
63901
- let deg = objStuff.querySelector('.input-gradient-deg').value;
63902
- if (color2 === '') color2 = '#ffffff';
63903
- let css = `linear-gradient(${deg}deg, ${color1}, ${color2})`;
63904
- this.targetElement.style.backgroundImage = css;
63905
- if (this.opts.onChange) this.opts.onChange(css);
63906
-
63907
- // update preview
63908
- btnColor1.style.backgroundColor = color;
63909
- }, btnColor1.style.backgroundColor, () => {
63910
- btnColor1.removeAttribute('data-focus');
63911
- btnColor1.focus();
63912
- }, btnColor1, true); // overlay=true
63913
-
63914
- btnColor1.setAttribute('data-focus', true);
63915
- });
63916
- let btnColor2 = objStuff.querySelector('.input-gradient-color2');
63917
- btnColor2.addEventListener('click', () => {
63918
- colorPicker.open(color => {
63919
- if (color === '') color = 'transparent';
63920
-
63921
- // set element style
63922
- let color1 = objStuff.querySelector('.input-gradient-color1').style.backgroundColor;
63923
- let color2 = color;
63924
- let deg = objStuff.querySelector('.input-gradient-deg').value;
63925
- if (color1 === '') color1 = '#ffffff';
63926
- let css = `linear-gradient(${deg}deg, ${color1}, ${color2})`;
63927
- this.targetElement.style.backgroundImage = css;
63928
- if (this.opts.onChange) this.opts.onChange(css);
63929
-
63930
- // update preview
63931
- btnColor2.style.backgroundColor = color;
63932
- }, btnColor2.style.backgroundColor, () => {
63933
- btnColor2.removeAttribute('data-focus');
63934
- btnColor2.focus();
63935
- }, btnColor2, true); // overlay=true
63936
-
63937
- btnColor2.setAttribute('data-focus', true);
63938
- });
63939
-
63940
- // Apply default gradient
63941
- let btns = objStuff.querySelectorAll('.div-gradients [data-elmgradient]');
63942
- Array.prototype.forEach.call(btns, btn => {
63943
- let grad = btn.getAttribute('data-elmgradient');
63944
- let textcolor = btn.getAttribute('data-textcolor');
63907
+ // presets
63908
+ const divPreset = this.pickGradient.querySelector('.div-presets');
63909
+ const btnApply = divPreset.querySelectorAll('.btn-graditem');
63910
+ btnApply.forEach(btn => {
63945
63911
  btn.addEventListener('click', () => {
63946
- this.targetElement.style.backgroundImage = grad;
63947
- if (this.opts.onChange) this.opts.onChange(grad, textcolor);
63948
-
63949
- // Read gradient
63950
- const s = this.targetElement.style.backgroundImage;
63951
- if (s.indexOf('linear-gradient') !== -1) {
63952
- const result = getGradient(s);
63953
- if (result !== null) {
63954
- try {
63955
- let color1 = result.colorStopList[0].color;
63956
- let color2 = result.colorStopList[1].color;
63957
- let line = result.line;
63958
- this.objStuff.querySelector('.input-gradient-color1').style.backgroundColor = color1;
63959
- this.objStuff.querySelector('.input-gradient-color2').style.backgroundColor = color2;
63960
- if (line.indexOf('deg') !== -1) {
63961
- this.objStuff.querySelector('.input-gradient-deg').value = line.replace('deg', '');
63962
- }
63963
- } catch (e) {
63964
- // Do Nothing
63965
- }
63966
- }
63967
- }
63968
- let btns = objStuff.querySelectorAll('.div-gradients [data-elmgradient]');
63969
- Array.prototype.forEach.call(btns, btn => {
63970
- this.removeClass(btn, 'active');
63971
- });
63972
- this.addClass(btn, 'active');
63912
+ this.builder.uo.saveForUndo();
63913
+ let cssGradient = btn.getAttribute('data-value');
63914
+ this.element.style.backgroundImage = cssGradient;
63915
+ this.btn.style.backgroundImage = cssGradient;
63916
+ const colorsArray = this.extractColors(cssGradient);
63917
+ this.colorsArray = colorsArray;
63918
+ const angle = this.extractAngle(cssGradient);
63919
+ this.angle = angle;
63920
+ this.renderAngle();
63921
+ this.renderColorStops();
63922
+ if (this.onChange) this.onChange();
63923
+ this.builder.onChange();
63973
63924
  });
63974
63925
  });
63975
- let btnClear = objStuff.querySelector('.input-gradient-clear');
63976
- btnClear.addEventListener('click', () => {
63977
- this.targetElement.style.backgroundImage = '';
63978
- if (this.opts.onChange) this.opts.onChange('');
63979
- this.objStuff.querySelector('.input-gradient-color1').style.backgroundColor = '';
63980
- this.objStuff.querySelector('.input-gradient-color2').style.backgroundColor = '';
63981
- this.objStuff.querySelector('.input-gradient-deg').value = '0';
63982
- });
63983
- let inputDeg = objStuff.querySelector('.input-gradient-deg');
63984
- inputDeg.addEventListener('keyup', () => {
63985
- // set element style
63986
- let color1 = objStuff.querySelector('.input-gradient-color1').style.backgroundColor;
63987
- let color2 = objStuff.querySelector('.input-gradient-color2').style.backgroundColor;
63988
- let deg = inputDeg.value;
63926
+ }
63927
+ saveGradient() {
63928
+ let gradient = {
63929
+ angle: this.angle,
63930
+ colors: this.colorsArray
63931
+ };
63932
+ this.savedGrads.push(gradient);
63933
+ localStorage.setItem('_savedgrads', JSON.stringify(this.savedGrads));
63934
+ }
63935
+ renderSavedGradients() {
63936
+ let savedGrads = [];
63937
+ if (localStorage.getItem('_savedgrads') !== null) {
63938
+ savedGrads = JSON.parse(localStorage.getItem('_savedgrads'));
63939
+ }
63940
+ this.savedGrads = savedGrads;
63989
63941
 
63990
- // if(color1 === '') color1 = '#ffffff';
63991
- // if(color2 === '') color2 = '#ffffff';
63942
+ // backward (move old saved gradients to the new. Then delete the old)
63943
+ let oldGrads = [];
63944
+ let customgradcolors = [];
63945
+ if (localStorage.getItem('_customgradcolors') !== null) {
63946
+ customgradcolors = JSON.parse(localStorage.getItem('_customgradcolors'));
63947
+ customgradcolors.forEach(cssGradient => {
63948
+ const colorsArray = this.extractColors(cssGradient);
63949
+ const angle = this.extractAngle(cssGradient);
63950
+ let gradient = {
63951
+ angle: angle,
63952
+ colors: colorsArray
63953
+ };
63954
+ oldGrads.push(gradient);
63955
+ });
63956
+ Array.prototype.push.apply(this.savedGrads, oldGrads); // combine old with the new
63957
+ localStorage.setItem('_savedgrads', JSON.stringify(this.savedGrads));
63958
+ localStorage.removeItem('_customgradcolors');
63959
+ }
63960
+ // /backward
63992
63961
 
63993
- let css = `linear-gradient(${deg}deg, ${color1}, ${color2})`;
63994
- this.targetElement.style.backgroundImage = css;
63995
- if (this.opts.onChange) this.opts.onChange(css);
63962
+ const divSaved = this.pickGradient.querySelector('.div-saved');
63963
+ const labelSaved = this.pickGradient.querySelector('.label-saved');
63964
+ let html = '';
63965
+ savedGrads.forEach((gradient, index) => {
63966
+ let deg = gradient.angle;
63967
+ let colorsArray = gradient.colors;
63968
+ let s = this.convertColorsToGradient(colorsArray, deg);
63969
+ html += `
63970
+ <div>
63971
+ <button
63972
+ data-index="${index}"
63973
+ title="${this.out('Select')}"
63974
+ class="btn-graditem" data-value="${s}"
63975
+ style="background-image:${s}"></button>
63976
+
63977
+ <button title="${this.out('Remove')}" class="btn-remove">
63978
+ <svg class="is-icon-flex"><use xlink:href="#icon-minus"></use></svg>
63979
+ </button>
63980
+ </div>
63981
+ `;
63996
63982
  });
63997
- let btnSave = objStuff.querySelector('.input-gradient-save');
63998
- btnSave.addEventListener('click', () => {
63999
- let color1 = objStuff.querySelector('.input-gradient-color1').style.backgroundColor;
64000
- let color2 = objStuff.querySelector('.input-gradient-color2').style.backgroundColor;
64001
- let deg = inputDeg.value;
64002
-
64003
- // if(color1 === '') color1 = '#ffffff';
64004
- // if(color2 === '') color2 = '#ffffff';
64005
-
64006
- let css = `linear-gradient(${deg}deg, ${color1}, ${color2})`;
64007
-
64008
- // Save
64009
- let customgradcolors = [];
64010
- if (localStorage.getItem('_customgradcolors') !== null) {
64011
- customgradcolors = JSON.parse(localStorage.getItem('_customgradcolors'));
64012
- }
64013
- customgradcolors.push(css);
64014
- localStorage.setItem('_customgradcolors', JSON.stringify(customgradcolors));
64015
-
64016
- // Render custom gradients
64017
- if (localStorage.getItem('_customgradcolors') !== null) {
64018
- let customgradcolors = JSON.parse(localStorage.getItem('_customgradcolors'));
64019
- let html_gradcolors = '';
64020
- for (var i = 0; i < customgradcolors.length; i++) {
64021
- html_gradcolors += `<button class="is-elmgrad-item" data-elmgradient="${customgradcolors[i]}" style="background-image:${customgradcolors[i]};"><div class="is-elmgrad-remove"><svg class="is-icon-flex" style="fill:rgba(255, 255, 255, 1);width:20px;height:20px;"><use xlink:href="#ion-ios-close-empty"></use></svg></div></button>`;
64022
- }
64023
- this.objStuff.querySelector('.div-custom-gradients').innerHTML = html_gradcolors;
64024
- }
64025
-
64026
- // Apply custom gradient
64027
- let btns = this.objStuff.querySelectorAll('.div-custom-gradients [data-elmgradient]');
64028
- Array.prototype.forEach.call(btns, btn => {
64029
- let grad = btn.getAttribute('data-elmgradient');
64030
- btn.addEventListener('click', () => {
64031
- this.targetElement.style.backgroundImage = grad;
64032
- if (this.opts.onChange) this.opts.onChange(grad);
64033
-
64034
- // Read gradient
64035
- const s = this.targetElement.style.backgroundImage;
64036
- if (s.indexOf('linear-gradient') !== -1) {
64037
- const result = getGradient(s);
64038
- if (result !== null) {
64039
- try {
64040
- let color1 = result.colorStopList[0].color;
64041
- let color2 = result.colorStopList[1].color;
64042
- let line = result.line;
64043
- this.objStuff.querySelector('.input-gradient-color1').style.backgroundColor = color1;
64044
- this.objStuff.querySelector('.input-gradient-color2').style.backgroundColor = color2;
64045
- if (line.indexOf('deg') !== -1) {
64046
- this.objStuff.querySelector('.input-gradient-deg').value = line.replace('deg', '');
64047
- }
64048
- } catch (e) {
64049
- // Do Nothing
64050
- }
64051
- }
64052
- }
64053
- let btns = objStuff.querySelectorAll('.div-custom-gradients [data-elmgradient]');
64054
- Array.prototype.forEach.call(btns, btn => {
64055
- this.removeClass(btn, 'active');
64056
- });
64057
- this.addClass(btn, 'active');
64058
- });
63983
+ divSaved.innerHTML = html;
63984
+ if (savedGrads.length === 0) {
63985
+ divSaved.style.display = 'none';
63986
+ labelSaved.style.display = 'none';
63987
+ } else {
63988
+ divSaved.style.display = '';
63989
+ labelSaved.style.display = '';
63990
+ }
63991
+ const btnApply = divSaved.querySelectorAll('.btn-graditem');
63992
+ btnApply.forEach(btn => {
63993
+ btn.addEventListener('click', () => {
63994
+ this.builder.uo.saveForUndo();
63995
+ let cssGradient = btn.getAttribute('data-value');
63996
+ this.element.style.backgroundImage = cssGradient;
63997
+ this.btn.style.backgroundImage = cssGradient;
63998
+ const colorsArray = this.extractColors(cssGradient);
63999
+ this.colorsArray = colorsArray;
64000
+ const angle = this.extractAngle(cssGradient);
64001
+ this.angle = angle;
64002
+ this.renderAngle();
64003
+ this.renderColorStops();
64004
+ if (this.onChange) this.onChange();
64005
+ this.builder.onChange();
64059
64006
  });
64060
-
64061
- // Delete custom gradient
64062
- let btnsRemoveGrad = this.objStuff.querySelectorAll('.div-custom-gradients .is-elmgrad-remove');
64063
- Array.prototype.forEach.call(btnsRemoveGrad, btnRemoveGrad => {
64064
- btnRemoveGrad.addEventListener('click', () => {
64065
- //Custom grad colors
64066
- let customgradcolors = [];
64067
- if (localStorage.getItem('_customgradcolors') !== null) {
64068
- customgradcolors = JSON.parse(localStorage.getItem('_customgradcolors'));
64069
- }
64070
- var css = btnRemoveGrad.parentNode.getAttribute('data-elmgradient');
64071
- for (var i = 0; i < customgradcolors.length; i++) {
64072
- if (customgradcolors[i] === css) {
64073
- customgradcolors.splice(i, 1);
64074
- }
64075
- }
64076
- localStorage.setItem('_customgradcolors', JSON.stringify(customgradcolors));
64077
- btnRemoveGrad.parentNode.parentNode.removeChild(btnRemoveGrad.parentNode);
64078
- return false;
64079
- });
64007
+ });
64008
+ const btnRemove = divSaved.querySelectorAll('.btn-remove');
64009
+ btnRemove.forEach(btn => {
64010
+ btn.addEventListener('click', e => {
64011
+ let index = btn.getAttribute('data-index');
64012
+ btn.parentNode.remove();
64013
+ this.removeItemByIndex(this.savedGrads, index);
64014
+ localStorage.setItem('_savedgrads', JSON.stringify(this.savedGrads));
64015
+ if (this.savedGrads.length === 0) {
64016
+ divSaved.style.display = 'none';
64017
+ labelSaved.style.display = 'none';
64018
+ } else {
64019
+ divSaved.style.display = '';
64020
+ labelSaved.style.display = '';
64021
+ }
64022
+ e.preventDefault();
64023
+ e.stopImmediatePropagation();
64080
64024
  });
64081
64025
  });
64082
- } //constructor
64083
-
64084
- makeId() {
64085
- let text = '';
64086
- let possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
64087
- for (let i = 0; i < 2; i++) text += possible.charAt(Math.floor(Math.random() * possible.length));
64088
- let text2 = '';
64089
- let possible2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
64090
- for (let i = 0; i < 5; i++) text2 += possible2.charAt(Math.floor(Math.random() * possible2.length));
64091
- return text + text2;
64092
64026
  }
64093
- out(s) {
64094
- if (this.opts.lang) {
64095
- let val = this.opts.lang[s];
64096
- if (val) return val;else {
64097
- return s;
64098
- }
64027
+ removeItemByIndex(arr, index) {
64028
+ if (index > -1 && index < arr.length) {
64029
+ arr.splice(index, 1);
64030
+ }
64031
+ return arr;
64032
+ }
64033
+ extractColors(gradientString) {
64034
+ // Regular expression to match rgb(a) colors and hex colors (with optional alpha)
64035
+ const colorRegex = /rgba?\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*(,\s*\d*\.?\d+\s*)?\)|#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?/g;
64036
+ // Extract all color occurrences
64037
+ const colors = gradientString.match(colorRegex);
64038
+ return colors || [];
64039
+ }
64040
+ extractAngle(gradientString) {
64041
+ const anglePattern = /linear-gradient\((\d+)deg,/;
64042
+ const match = anglePattern.exec(gradientString);
64043
+ if (match && match[1]) {
64044
+ return parseInt(match[1], 10);
64099
64045
  } else {
64100
- return s;
64046
+ return 0;
64101
64047
  }
64102
64048
  }
64103
- open(elm, onChange, onFinish, btn, overlay) {
64104
- this.opts.onChange = onChange;
64105
- this.opts.onFinish = onFinish;
64106
- this.targetElement = elm;
64107
-
64108
- // Read gradient
64109
- this.objStuff.querySelector('.input-gradient-color1').style.backgroundColor = '';
64110
- this.objStuff.querySelector('.input-gradient-color2').style.backgroundColor = '';
64111
- this.objStuff.querySelector('.input-gradient-deg').value = '0';
64112
- const s = elm.style.backgroundImage;
64113
- if (s.indexOf('linear-gradient') !== -1) {
64114
- const result = getGradient(s);
64115
- if (result !== null) {
64116
- try {
64117
- let color1 = result.colorStopList[0].color;
64118
- let color2 = result.colorStopList[1].color;
64119
- let line = result.line;
64120
- this.objStuff.querySelector('.input-gradient-color1').style.backgroundColor = color1;
64121
- this.objStuff.querySelector('.input-gradient-color2').style.backgroundColor = color2;
64122
- if (line.indexOf('deg') !== -1) {
64123
- this.objStuff.querySelector('.input-gradient-deg').value = line.replace('deg', '');
64124
- }
64125
- } catch (e) {
64126
- // Do Nothing
64127
- }
64049
+ updateColorsArray() {
64050
+ let arr = [];
64051
+ const divSort = this.pickGradient.querySelector('.div-sort');
64052
+ divSort.querySelectorAll('button[data-color]').forEach(btn => {
64053
+ let s = btn.getAttribute('data-color');
64054
+ arr.push(s);
64055
+ });
64056
+ this.colorsArray = arr;
64057
+ }
64058
+ allowRemoveStop() {
64059
+ const divSort = this.pickGradient.querySelector('.div-sort');
64060
+ const btns = divSort.querySelectorAll('button[data-color]');
64061
+ if (btns.length === 2) {
64062
+ return false;
64063
+ } else {
64064
+ return true;
64065
+ }
64066
+ }
64067
+ convertColorsToGradient(colorsArray, deg = 0) {
64068
+ let gradientString = `linear-gradient(${deg}deg, `;
64069
+ colorsArray.forEach((color, index) => {
64070
+ gradientString += color;
64071
+ if (index < colorsArray.length - 1) {
64072
+ gradientString += ', ';
64128
64073
  }
64074
+ });
64075
+ gradientString += ')';
64076
+ return gradientString;
64077
+ }
64078
+ applyGradient() {
64079
+ let cssGradient;
64080
+ if (this.colorsArray.length === 0) {
64081
+ cssGradient = '';
64082
+ } else {
64083
+ cssGradient = this.convertColorsToGradient(this.colorsArray, this.angle);
64084
+ }
64085
+ this.element.style.backgroundImage = cssGradient;
64086
+ this.btn.style.backgroundImage = cssGradient;
64087
+ const divPreview = this.pickGradient.querySelector('.gradient-preview');
64088
+ divPreview.style.backgroundImage = cssGradient;
64089
+ }
64090
+ areArraysIdentical(arr1, arr2) {
64091
+ if (arr1.length !== arr2.length) {
64092
+ return false; // Arrays of different lengths cannot be identical
64129
64093
  }
64130
64094
 
64131
- // Save original style
64132
- this.original = s;
64133
-
64134
- // Render custom gradients
64135
- let customgradcolors = [];
64136
- if (localStorage.getItem('_customgradcolors') !== null) {
64137
- customgradcolors = JSON.parse(localStorage.getItem('_customgradcolors'));
64138
- let html_gradcolors = '';
64139
- for (var i = 0; i < customgradcolors.length; i++) {
64140
- html_gradcolors += `<button class="is-elmgrad-item" data-elmgradient="${customgradcolors[i]}" style="background-image:${customgradcolors[i]};"><div class="is-elmgrad-remove"><svg class="is-icon-flex" style="fill:rgba(255, 255, 255, 1);width:20px;height:20px;"><use xlink:href="#ion-ios-close-empty"></use></svg></div></button>`;
64095
+ for (let i = 0; i < arr1.length; i++) {
64096
+ if (arr1[i] !== arr2[i]) {
64097
+ return false; // Found elements that are not the same
64141
64098
  }
64142
- this.objStuff.querySelector('.div-custom-gradients').innerHTML = html_gradcolors;
64143
64099
  }
64144
64100
 
64145
- // Apply custom gradient
64146
- let btns = this.objStuff.querySelectorAll('.div-custom-gradients [data-elmgradient]');
64147
- Array.prototype.forEach.call(btns, btn => {
64148
- let grad = btn.getAttribute('data-elmgradient');
64101
+ return true; // All elements are the same and in the same order
64102
+ }
64103
+
64104
+ renderColorStops() {
64105
+ let colorsArray = this.colorsArray;
64106
+ if (colorsArray.length === 0) {
64107
+ colorsArray = ['rgba(255, 255, 255, 1)', 'rgba(255, 255, 255, 1)'];
64108
+ }
64109
+ let htmlStop = '';
64110
+ let n = 0;
64111
+ colorsArray.forEach(color => {
64112
+ htmlStop += `<div>
64113
+ <button data-color="${color}"
64114
+ data-index="${n}"
64115
+ title="${this.out('Select Color')}"
64116
+ class="btn-colorstop is-btn-color"
64117
+ data-value="${color}"
64118
+ style="background-color:${color}"></button>
64119
+
64120
+ <button title="${this.out('Remove')}" class="btn-remove">
64121
+ <svg class="is-icon-flex"><use xlink:href="#icon-minus"></use></svg>
64122
+ </button>
64123
+ </div>`;
64124
+ n++;
64125
+ });
64126
+ const divSort = this.pickGradient.querySelector('.div-sort');
64127
+ divSort.innerHTML = htmlStop;
64128
+ new Sortable(divSort, {
64129
+ animation: 600,
64130
+ dragClass: 'hide-drag-class',
64131
+ onStart: () => {},
64132
+ onSort: () => {
64133
+ this.updateColorsArray();
64134
+ this.applyGradient();
64135
+ }
64136
+ });
64137
+ const colorPicker = this.builder.colorPicker;
64138
+ const btnPicks = this.pickGradient.querySelectorAll('.btn-colorstop');
64139
+ btnPicks.forEach(btn => {
64149
64140
  btn.addEventListener('click', () => {
64150
- this.targetElement.style.backgroundImage = grad;
64151
- if (this.opts.onChange) this.opts.onChange(grad);
64152
-
64153
- // Read gradient
64154
- const s = this.targetElement.style.backgroundImage;
64155
- if (s.indexOf('linear-gradient') !== -1) {
64156
- const result = getGradient(s);
64157
- if (result !== null) {
64158
- try {
64159
- let color1 = result.colorStopList[0].color;
64160
- let color2 = result.colorStopList[1].color;
64161
- let line = result.line;
64162
- this.objStuff.querySelector('.input-gradient-color1').style.backgroundColor = color1;
64163
- this.objStuff.querySelector('.input-gradient-color2').style.backgroundColor = color2;
64164
- if (line.indexOf('deg') !== -1) {
64165
- this.objStuff.querySelector('.input-gradient-deg').value = line.replace('deg', '');
64166
- }
64167
- } catch (e) {
64168
- // Do Nothing
64141
+ this.builder.uo.saveForUndo(true);
64142
+ colorPicker.open(color => {
64143
+ if (color === '') {
64144
+ const allow = this.allowRemoveStop();
64145
+ if (allow) {
64146
+ // clear
64147
+ btn.parentNode.remove();
64148
+ this.updateColorsArray();
64149
+ this.applyGradient();
64150
+ if (this.onChange) this.onChange();
64151
+ this.builder.onChange();
64152
+ this.builder.util.hidePopOverlay(); // if pop is opened using overlay, to programmatically close, use this
64153
+ return;
64169
64154
  }
64170
64155
  }
64171
- }
64172
- let btns = this.objStuff.querySelectorAll('.div-custom-gradients [data-elmgradient]');
64173
- Array.prototype.forEach.call(btns, btn => {
64174
- this.removeClass(btn, 'active');
64175
- });
64176
- this.addClass(btn, 'active');
64177
- });
64178
- });
64156
+ if (color === '') color = 'rgba(255, 255, 255, 1)'; // gradient stop requires value
64179
64157
 
64180
- // Delete custom gradient
64181
- let btnsRemoveGrad = this.objStuff.querySelectorAll('.div-custom-gradients .is-elmgrad-remove');
64182
- Array.prototype.forEach.call(btnsRemoveGrad, btnRemoveGrad => {
64183
- btnRemoveGrad.addEventListener('click', () => {
64184
- //Custom grad colors
64185
- let customgradcolors = [];
64186
- if (localStorage.getItem('_customgradcolors') !== null) {
64187
- customgradcolors = JSON.parse(localStorage.getItem('_customgradcolors'));
64188
- }
64189
- var css = btnRemoveGrad.parentNode.getAttribute('data-elmgradient');
64190
- for (var i = 0; i < customgradcolors.length; i++) {
64191
- if (customgradcolors[i] === css) {
64192
- customgradcolors.splice(i, 1);
64158
+ btn.setAttribute('data-color', color);
64159
+ btn.style.backgroundColor = color;
64160
+ this.updateColorsArray();
64161
+ if (this.areArraysIdentical(this.colorsArray, ['rgba(255, 255, 255, 1)', 'rgba(255, 255, 255, 1)'])) {
64162
+ console.log('Initial, no gradient');
64163
+ return;
64193
64164
  }
64194
- }
64195
- localStorage.setItem('_customgradcolors', JSON.stringify(customgradcolors));
64196
- btnRemoveGrad.parentNode.parentNode.removeChild(btnRemoveGrad.parentNode);
64197
- return false;
64165
+ this.applyGradient();
64166
+ if (this.onChange) this.onChange();
64167
+ this.builder.onChange();
64168
+ }, btn.style.backgroundColor, () => {
64169
+ btn.removeAttribute('data-focus');
64170
+ btn.focus();
64171
+ }, btn, true); // overlay=true
64172
+
64173
+ btn.setAttribute('data-focus', true);
64198
64174
  });
64199
64175
  });
64200
- const handleKeyDown = e => {
64201
- if (e.keyCode === 27) {
64202
- // escape key
64203
- this.pickGradient.classList.remove('active'); // hide
64204
-
64205
- this.pickGradient.removeEventListener('keydown', handleKeyDown);
64176
+ const btnRemove = divSort.querySelectorAll('.btn-remove');
64177
+ btnRemove.forEach(btn => {
64178
+ btn.addEventListener('click', e => {
64179
+ this.builder.uo.saveForUndo();
64180
+ const allow = this.allowRemoveStop();
64181
+ if (allow) {
64182
+ btn.parentNode.remove();
64183
+ } else {
64184
+ let color = 'rgba(255, 255, 255, 1)'; // gradient stop requires value
64206
64185
 
64207
- // no change
64208
- if (this.opts.onFinish) {
64209
- this.opts.onFinish(false);
64186
+ const btnColor = btn.parentNode.querySelector('.btn-colorstop');
64187
+ btnColor.setAttribute('data-color', color);
64188
+ btnColor.style.backgroundColor = color;
64210
64189
  }
64211
- }
64212
- };
64213
-
64214
- // this.modal.show(this.pickGradient, false, ()=>{
64215
-
64216
- // this.pickGradient.removeEventListener('keydown', handleKeyDown);
64190
+ this.updateColorsArray();
64191
+ this.applyGradient();
64192
+ if (this.onChange) this.onChange();
64193
+ this.builder.onChange();
64194
+ e.preventDefault();
64195
+ e.stopImmediatePropagation();
64196
+ });
64197
+ });
64198
+ }
64199
+ renderAngle() {
64200
+ const inpAngle = this.pickGradient.querySelector('.inp-angle');
64201
+ inpAngle.value = this.angle;
64202
+ if (this.slider.created) this.slider.setValue(this.angle, true); // use only after slider.create()
64203
+ // true = no trigger only for setting angle position
64204
+ }
64217
64205
 
64218
- // if(this.original === this.targetElement.style.backgroundImage) {
64219
- // // no change
64220
- // if(this.opts.onFinish) {
64221
- // this.opts.onFinish(false);
64222
- // }
64223
- // } else {
64224
- // // changed
64225
- // if(this.opts.onFinish) {
64226
- // this.opts.onFinish(true);
64227
- // }
64228
- // }
64206
+ open(elm, onChange, onFinish, btn, overlay) {
64207
+ // Pop Stuff first
64229
64208
 
64230
- // }, false);
64231
64209
  if (!btn) {
64232
64210
  const iframes = document.getElementsByTagName('iframe');
64233
64211
  for (let i = 0; i < iframes.length; i++) {
@@ -64244,7 +64222,7 @@ class GradientPicker {
64244
64222
  if (!btn) btn = document.activeElement;
64245
64223
  }
64246
64224
  let popGradient = this.pickGradient;
64247
- this.builder.util.showPop(popGradient, false, btn, overlay);
64225
+ this.builder.util.showPop(popGradient, onFinish, btn, overlay);
64248
64226
  const w = popGradient.offsetWidth;
64249
64227
  const h = popGradient.offsetHeight;
64250
64228
  const newPos = this.getElementPosition(btn);
@@ -64315,28 +64293,24 @@ class GradientPicker {
64315
64293
  };
64316
64294
  doc.addEventListener('click', handlePopClickOut);
64317
64295
  }
64318
- this.pickGradient.addEventListener('keydown', handleKeyDown);
64319
64296
 
64320
- // const btn = this.pickGradient.querySelector('button');
64321
- // btn.focus();
64322
- }
64297
+ // Gradient Stuff
64323
64298
 
64324
- addClass(element, classname) {
64325
- if (!element) return;
64326
- if (this.hasClass(element, classname)) return;
64327
- if (element.classList.length === 0) element.className = classname;else element.className = element.className + ' ' + classname;
64328
- //else element.classList.add(classname); //error if there is -
64329
- }
64299
+ this.element = elm;
64300
+ this.btn = btn;
64301
+ this.onChange = onChange;
64302
+ // this.onFinish = onFinish; // used in showPop below
64330
64303
 
64331
- removeClass(element, classname) {
64332
- if (!element) return;
64333
- if (element.classList.length > 0) {
64334
- element.className = element.className.replace(classname, '');
64335
- }
64336
- }
64337
- hasClass(element, classname) {
64338
- if (!element) return false;
64339
- return element.classList ? element.classList.contains(classname) : new RegExp('\\b' + classname + '\\b').test(element.className);
64304
+ let cssGradient = elm.style.backgroundImage;
64305
+ const colorsArray = this.extractColors(cssGradient);
64306
+ this.colorsArray = colorsArray;
64307
+ const angle = this.extractAngle(cssGradient);
64308
+ this.angle = angle;
64309
+ this.renderAngle();
64310
+ this.renderColorStops();
64311
+ setTimeout(() => {
64312
+ this.slider.create();
64313
+ }, 0);
64340
64314
  }
64341
64315
  getElementPosition(element) {
64342
64316
  const top = element.getBoundingClientRect().top;
@@ -64362,156 +64336,6 @@ class GradientPicker {
64362
64336
  }
64363
64337
  }
64364
64338
 
64365
- // source: http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript
64366
- function makeid() {
64367
- let text = '';
64368
- let possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
64369
- for (let i = 0; i < 2; i++) text += possible.charAt(Math.floor(Math.random() * possible.length));
64370
- let text2 = '';
64371
- let possible2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
64372
- for (let i = 0; i < 5; i++) text2 += possible2.charAt(Math.floor(Math.random() * possible2.length));
64373
- return text + text2;
64374
- }
64375
-
64376
- // source: https://stackoverflow.com/questions/20215440/parse-css-gradient-rule-with-javascript-regex
64377
- function getGradient(input) {
64378
- var result,
64379
- regExpLib = generateRegExp(),
64380
- //rGradientEnclosedInBrackets = /.*gradient\s*\(((?:\([^\)]*\)|[^\)\(]*)*)\)/,// Captures inside brackets - max one additional inner set.
64381
- rGradientEnclosedInBrackets = /.*gradient\s*\(((?:\([^)]*\)|[^)(]*)*)\)/,
64382
- // Oct 29, 2019
64383
- match = rGradientEnclosedInBrackets.exec(input);
64384
- if (match !== null) {
64385
- // Get the parameters for the gradient
64386
- result = parseGradient(regExpLib, match[1]);
64387
- if (result.original.trim() !== match[1].trim()) {
64388
- // Did not match the input exactly - possible parsing error.
64389
- result.parseWarning = true;
64390
- }
64391
- } else {
64392
- result = 'Failed to find gradient';
64393
- }
64394
- return result;
64395
- }
64396
- var combineRegExp = function (regexpList, flags) {
64397
- var i,
64398
- source = '';
64399
- for (i = 0; i < regexpList.length; i++) {
64400
- if (typeof regexpList[i] === 'string') {
64401
- source += regexpList[i];
64402
- } else {
64403
- source += regexpList[i].source;
64404
- }
64405
- }
64406
- return new RegExp(source, flags);
64407
- };
64408
- var generateRegExp = function () {
64409
- // Note any variables with "Capture" in name include capturing bracket set(s).
64410
- var searchFlags = 'gi',
64411
- // ignore case for angles, "rgb" etc
64412
- rAngle = /(?:[+-]?\d*\.?\d+)(?:deg|grad|rad|turn)/,
64413
- // Angle +ive, -ive and angle types
64414
- rSideCornerCapture = /to\s+((?:(?:left|right)(?:\s+(?:top|bottom))?))/,
64415
- // optional 2nd part
64416
- rComma = /\s*,\s*/,
64417
- // Allow space around comma.
64418
- //rColorHex = /\#(?:[a-f0-9]{6}|[a-f0-9]{3})/, // 3 or 6 character form
64419
- rColorHex = /#(?:[a-f0-9]{6}|[a-f0-9]{3})/,
64420
- // 3 or 6 character form // Oct 29, 2019
64421
- rDigits3 = /\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*\)/,
64422
- // "(1, 2, 3)"
64423
- rDigits4 = /\(\s*(?:\d{1,3}\s*,\s*){2}\d{1,3}\s*,\s*\d*\.?\d+\)/,
64424
- // "(1, 2, 3, 4)"
64425
- rValue = /(?:[+-]?\d*\.?\d+)(?:%|[a-z]+)?/,
64426
- // ".9", "-5px", "100%".
64427
- rKeyword = /[_a-z-][_a-z0-9-]*/,
64428
- // "red", "transparent", "border-collapse".
64429
- rColor = combineRegExp(['(?:', rColorHex, '|', '(?:rgb|hsl)', rDigits3, '|', '(?:rgba|hsla)', rDigits4, '|', rKeyword, ')'], ''),
64430
- rColorStop = combineRegExp([rColor, '(?:\\s+', rValue, '(?:\\s+', rValue, ')?)?'], ''),
64431
- // Single Color Stop, optional %, optional length.
64432
- rColorStopList = combineRegExp(['(?:', rColorStop, rComma, ')*', rColorStop], ''),
64433
- // List of color stops min 1.
64434
- rLineCapture = combineRegExp(['(?:(', rAngle, ')|', rSideCornerCapture, ')'], ''),
64435
- // Angle or SideCorner
64436
- rGradientSearch = combineRegExp(['(?:(', rLineCapture, ')', rComma, ')?(', rColorStopList, ')'], searchFlags),
64437
- // Capture 1:"line", 2:"angle" (optional), 3:"side corner" (optional) and 4:"stop list".
64438
- rColorStopSearch = combineRegExp(['\\s*(', rColor, ')', '(?:\\s+', '(', rValue, '))?', '(?:', rComma, '\\s*)?'], searchFlags); // Capture 1:"color" and 2:"position" (optional).
64439
-
64440
- return {
64441
- gradientSearch: rGradientSearch,
64442
- colorStopSearch: rColorStopSearch
64443
- };
64444
- };
64445
- var parseGradient = function (regExpLib, input) {
64446
- var result, matchGradient, matchColorStop, stopResult;
64447
-
64448
- // reset search position, because we reuse regex.
64449
- regExpLib.gradientSearch.lastIndex = 0;
64450
- matchGradient = regExpLib.gradientSearch.exec(input);
64451
- if (matchGradient !== null) {
64452
- result = {
64453
- original: matchGradient[0],
64454
- colorStopList: []
64455
- };
64456
-
64457
- // // Line (Angle or Side-Corner).
64458
- // if (!!matchGradient[1]) {
64459
- // result.line = matchGradient[1];
64460
- // }
64461
- // // Angle or undefined if side-corner.
64462
- // if (!!matchGradient[2]) {
64463
- // result.angle = matchGradient[2];
64464
- // }
64465
- // // Side-corner or undefined if angle.
64466
- // if (!!matchGradient[3]) {
64467
- // result.sideCorner = matchGradient[3];
64468
- // }
64469
-
64470
- // Oct 29, 2019
64471
- // Line (Angle or Side-Corner).
64472
- if (matchGradient[1]) {
64473
- result.line = matchGradient[1];
64474
- }
64475
- // Angle or undefined if side-corner.
64476
- if (matchGradient[2]) {
64477
- result.angle = matchGradient[2];
64478
- }
64479
- // Side-corner or undefined if angle.
64480
- if (matchGradient[3]) {
64481
- result.sideCorner = matchGradient[3];
64482
- }
64483
-
64484
- // reset search position, because we reuse regex.
64485
- regExpLib.colorStopSearch.lastIndex = 0;
64486
-
64487
- // Loop though all the color-stops.
64488
- matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);
64489
- while (matchColorStop !== null) {
64490
- stopResult = {
64491
- color: matchColorStop[1]
64492
- };
64493
-
64494
- // // Position (optional).
64495
- // if (!!matchColorStop[2]) {
64496
- // stopResult.position = matchColorStop[2];
64497
- // }
64498
-
64499
- // Oct 29, 2019
64500
- // Position (optional).
64501
- if (matchColorStop[2]) {
64502
- stopResult.position = matchColorStop[2];
64503
- }
64504
- result.colorStopList.push(stopResult);
64505
-
64506
- // Continue searching from previous position.
64507
- matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);
64508
- }
64509
- }
64510
-
64511
- // Can be undefined if match not found.
64512
- return result;
64513
- };
64514
-
64515
64339
  const fontList = [{
64516
64340
  value: '',
64517
64341
  label: '',
@@ -81684,6 +81508,10 @@ class Dictation {
81684
81508
  this.builderStuff = builderStuff;
81685
81509
  const util = this.builder.util;
81686
81510
  this.util = util;
81511
+ let disclaimerText = util.out('AI-Disclaimer');
81512
+ if (disclaimerText === 'AI-Disclaimer') {
81513
+ disclaimerText = this.builder.disclaimerAI;
81514
+ }
81687
81515
 
81688
81516
  // const dom = this.builder.dom;
81689
81517
 
@@ -81893,7 +81721,7 @@ class Dictation {
81893
81721
  ${util.out('AI-Powered Features')}
81894
81722
  <button class="is-modal-close" tabindex="-1" title="${util.out('Close')}">&#10005;</button>
81895
81723
  </div>
81896
- ${util.out('AI-Disclaimer', this.builder.disclaimerAI)}
81724
+ ${disclaimerText}
81897
81725
  <div style="text-align:right;margin-top:20px;">
81898
81726
  <button title="${util.out('Ok')}" class="input-ok classic-primary" style="width:100%;text-transform: uppercase;
81899
81727
  font-size: 14px;">${util.out('Ok')}</button>
@@ -84598,22 +84426,25 @@ class Command {
84598
84426
  const builderStuff = this.builder.builderStuff;
84599
84427
  this.builderStuff = builderStuff;
84600
84428
  this.lib = new Lib(builder);
84601
- let html = `
84602
- <div class="is-modal ai-disclaimer" style="z-index:10005" tabindex="-1" role="dialog" aria-modal="true" aria-hidden="true">
84603
- <div class="is-modal-content" style="max-width:450px;padding:55px 40px 35px;font-size:16px;line-height:1.4;letter-spacing: 1px;">
84604
- <div class="is-modal-bar is-draggable">
84605
- ${util.out('AI-Powered Features')}
84606
- <button class="is-modal-close" tabindex="-1" title="${util.out('Close')}">&#10005;</button>
84607
- </div>
84608
- ${util.out('AI-Disclaimer', this.builder.disclaimerAI)}
84609
- <div style="text-align:right;margin-top:20px;">
84610
- <button title="${util.out('Ok')}" class="input-ok classic-primary" style="width:100%;text-transform: uppercase;
84611
- font-size: 14px;">${util.out('Ok')}</button>
84612
- </div>
84613
- </div>
84614
- </div>`;
84615
- builderStuff.insertAdjacentHTML('beforeend', html);
84616
- this.modalDisclaimer = builderStuff.querySelector('.ai-disclaimer');
84429
+ let html = '';
84430
+ // let html = `
84431
+ // <div class="is-modal ai-disclaimer" style="z-index:10005" tabindex="-1" role="dialog" aria-modal="true" aria-hidden="true">
84432
+ // <div class="is-modal-content" style="max-width:450px;padding:55px 40px 35px;font-size:16px;line-height:1.4;letter-spacing: 1px;">
84433
+ // <div class="is-modal-bar is-draggable">
84434
+ // ${util.out('AI-Powered Features')}
84435
+ // <button class="is-modal-close" tabindex="-1" title="${util.out('Close')}">&#10005;</button>
84436
+ // </div>
84437
+ // ${util.out('AI-Disclaimer', this.builder.disclaimerAI)}
84438
+ // <div style="text-align:right;margin-top:20px;">
84439
+ // <button title="${util.out('Ok')}" class="input-ok classic-primary" style="width:100%;text-transform: uppercase;
84440
+ // font-size: 14px;">${util.out('Ok')}</button>
84441
+ // </div>
84442
+ // </div>
84443
+ // </div>`;
84444
+ // builderStuff.insertAdjacentHTML('beforeend', html);
84445
+
84446
+ // this.modalDisclaimer = builderStuff.querySelector('.ai-disclaimer');
84447
+
84617
84448
  let cl = contextBlockList;
84618
84449
  if (this.builder.contextList) cl = this.builder.contextList;
84619
84450
  const localProcess = question => {
@@ -91138,7 +90969,9 @@ class ContentBuilder {
91138
90969
  defaultFontSizes: [16, 17, 18, 19, 21, 24, 32, 35, 42, 48, 54, 64 /*, 76, 96, 120, 200, 300*/],
91139
90970
  fontSizeClassValues: [12, 14, 15, 16, 17, 18, 19, 21, 24, 28, 32, 35, 38, 42, 46, 48, 50, 54, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, 300, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400],
91140
90971
  /* If not empty, applying font size will apply class: size-12, size-14, and so on. All responsive, defined in content.css */
91141
- gradientcolors: [['linear-gradient(0deg, rgb(255, 57, 25), rgb(249, 168, 37))'], ['linear-gradient(0deg, rgb(255, 57, 25), rgb(255, 104, 15))'], ['linear-gradient(0deg, #FF5722, #FF9800)'], ['linear-gradient(0deg, #613ca2, rgb(110, 123, 217))'], ['linear-gradient(0deg, rgb(65, 70, 206), rgb(236, 78, 130))'], ['linear-gradient(0deg, rgb(0, 150, 102), rgb(90, 103, 197))'], ['linear-gradient(30deg, rgb(249, 119, 148), rgb(98, 58, 162))'], ['linear-gradient(0deg, rgb(223, 70, 137), rgb(90, 103, 197))'], ['linear-gradient(0deg, rgb(40, 53, 147), rgb(90, 103, 197))'], ['linear-gradient(0deg, rgb(21, 101, 192), rgb(52, 169, 239))'], ['linear-gradient(0deg, rgb(32, 149, 219), rgb(139, 109, 230))'], ['linear-gradient(0deg, rgb(90, 103, 197), rgb(0, 184, 201))'], ['linear-gradient(0deg, rgb(0, 184, 201), rgb(253, 187, 45))'], ['linear-gradient(0deg, rgb(255, 208, 100), rgb(239, 98, 159))'], ['linear-gradient(0deg, rgb(0, 214, 223), rgb(130, 162, 253))'], ['linear-gradient(0deg, rgb(50, 234, 251), rgb(248, 247, 126))'], ['linear-gradient(0deg, rgb(141, 221, 255), rgb(255, 227, 255))'], ['linear-gradient(0deg, rgb(255, 170, 170), rgb(255, 255, 200))'], ['linear-gradient(0deg, rgb(239, 239, 239), rgb(252, 252, 252))']],
90972
+ gradientColors: [
90973
+ // 'linear-gradient(234deg, rgba(255, 253, 185, 1), rgb(255, 208, 100), rgb(239, 98, 159), rgb(73, 88, 195), rgba(2, 20, 145, 1))',
90974
+ 'linear-gradient(234deg, rgba(255, 253, 193, 1), rgba(255, 211, 111, 1), rgba(246, 108, 168, 1), rgba(97, 110, 204, 1), rgba(4, 98, 183, 1))', 'linear-gradient(15deg, rgba(222, 90, 69, 1), rgba(255, 118, 96, 1), rgba(249, 214, 137, 1), rgba(255, 242, 172, 1))', 'linear-gradient(357deg, rgba(68, 85, 204, 1), rgba(4, 166, 240, 1), rgba(51, 241, 255, 1))', 'linear-gradient(26deg, rgba(41, 145, 255, 1), rgba(49, 103, 240, 1), rgba(67, 107, 208, 1), rgba(149, 115, 255, 1), rgba(159, 159, 255, 1))', 'linear-gradient(0deg, rgba(198, 233, 155, 1), rgba(97, 221, 180, 1), rgba(244, 255, 190, 1))', 'linear-gradient(342deg, rgb(189, 156, 219), rgb(163, 172, 240), rgba(154, 203, 253, 1))', 'linear-gradient(45deg, rgb(255, 225, 172), rgb(253, 194, 141), rgba(246, 150, 183, 1), rgba(221, 140, 207, 1))', 'linear-gradient(0deg, rgba(157, 172, 246, 1), rgba(129, 205, 255, 1), rgba(202, 255, 207, 1))'],
91142
90975
  elementEditor: true,
91143
90976
  customval: '',
91144
90977
  moduleConfig: [],
@@ -92481,13 +92314,7 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
92481
92314
  }, this);
92482
92315
 
92483
92316
  // Gradient Picker
92484
- this.gradpicker = new GradientPicker({
92485
- gradientcolors: this.opts.gradientcolors,
92486
- colors: this.opts.colors,
92487
- animateModal: this.opts.animateModal,
92488
- elementToAnimate: this.opts.container,
92489
- lang: this.opts.lang
92490
- }, this);
92317
+ this.gradpicker = new GradientPicker(this);
92491
92318
 
92492
92319
  // Shortcut Info
92493
92320
  this.ShortcutInfo = new ShortcutInfo(this);