@themarioga/grid-editor 6.0.0 → 7.1.0

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 (147) hide show
  1. package/AUTO_SAVE.md +2 -2
  2. package/BUILDING.md +45 -29
  3. package/CHANGELOG.md +59 -0
  4. package/README.md +163 -87
  5. package/UPGRADING.md +119 -0
  6. package/dist/grideditor.bundle.min.js +14 -0
  7. package/dist/grideditor.d.ts +335 -0
  8. package/dist/grideditor.esm.js +3977 -0
  9. package/dist/grideditor.jquery.js +253 -0
  10. package/dist/grideditor.jquery.min.js +1 -0
  11. package/dist/grideditor.jquery.min.js.map +7 -0
  12. package/dist/grideditor.js +3983 -0
  13. package/dist/grideditor.min.js +6 -0
  14. package/dist/grideditor.min.js.map +7 -0
  15. package/dist/locales/grideditor.es.esm.js +158 -0
  16. package/dist/locales/grideditor.es.js +164 -168
  17. package/dist/locales/grideditor.es.min.js +6 -2
  18. package/dist/locales/grideditor.es.min.js.map +7 -1
  19. package/dist/plugins/grideditor.accordion.esm.js +294 -0
  20. package/dist/plugins/grideditor.accordion.js +286 -180
  21. package/dist/plugins/grideditor.accordion.min.js +1 -2
  22. package/dist/plugins/grideditor.accordion.min.js.map +7 -1
  23. package/dist/plugins/grideditor.alignment.esm.js +55 -0
  24. package/dist/plugins/grideditor.alignment.js +58 -77
  25. package/dist/plugins/grideditor.alignment.min.js +1 -2
  26. package/dist/plugins/grideditor.alignment.min.js.map +7 -1
  27. package/dist/plugins/grideditor.card.esm.js +73 -0
  28. package/dist/plugins/grideditor.card.js +74 -64
  29. package/dist/plugins/grideditor.card.min.js +1 -2
  30. package/dist/plugins/grideditor.card.min.js.map +7 -1
  31. package/dist/plugins/grideditor.ckeditor.esm.js +500 -0
  32. package/dist/plugins/grideditor.ckeditor.js +484 -449
  33. package/dist/plugins/grideditor.ckeditor.min.js +1 -2
  34. package/dist/plugins/grideditor.ckeditor.min.js.map +7 -1
  35. package/dist/plugins/grideditor.clipboard.esm.js +326 -0
  36. package/dist/plugins/grideditor.clipboard.js +298 -235
  37. package/dist/plugins/grideditor.clipboard.min.js +1 -2
  38. package/dist/plugins/grideditor.clipboard.min.js.map +7 -1
  39. package/dist/plugins/grideditor.codemirror-inline.esm.js +205 -0
  40. package/dist/plugins/grideditor.codemirror-inline.js +188 -168
  41. package/dist/plugins/grideditor.codemirror-inline.min.js +1 -2
  42. package/dist/plugins/grideditor.codemirror-inline.min.js.map +7 -1
  43. package/dist/plugins/grideditor.codemirror.esm.js +63 -0
  44. package/dist/plugins/grideditor.codemirror.js +60 -71
  45. package/dist/plugins/grideditor.codemirror.min.js +1 -2
  46. package/dist/plugins/grideditor.codemirror.min.js.map +7 -1
  47. package/dist/plugins/grideditor.elements.esm.js +271 -0
  48. package/dist/plugins/grideditor.elements.js +256 -149
  49. package/dist/plugins/grideditor.elements.min.js +1 -2
  50. package/dist/plugins/grideditor.elements.min.js.map +7 -1
  51. package/dist/plugins/grideditor.float.esm.js +34 -0
  52. package/dist/plugins/grideditor.float.js +37 -52
  53. package/dist/plugins/grideditor.float.min.js +1 -2
  54. package/dist/plugins/grideditor.float.min.js.map +7 -1
  55. package/dist/plugins/grideditor.gutters.esm.js +143 -0
  56. package/dist/plugins/grideditor.gutters.js +134 -131
  57. package/dist/plugins/grideditor.gutters.min.js +1 -2
  58. package/dist/plugins/grideditor.gutters.min.js.map +7 -1
  59. package/dist/plugins/grideditor.order.esm.js +189 -0
  60. package/dist/plugins/grideditor.order.js +170 -182
  61. package/dist/plugins/grideditor.order.min.js +1 -2
  62. package/dist/plugins/grideditor.order.min.js.map +7 -1
  63. package/dist/plugins/grideditor.popup.esm.js +187 -0
  64. package/dist/plugins/grideditor.popup.js +183 -134
  65. package/dist/plugins/grideditor.popup.min.js +1 -2
  66. package/dist/plugins/grideditor.popup.min.js.map +7 -1
  67. package/dist/plugins/grideditor.sections.esm.js +271 -0
  68. package/dist/plugins/grideditor.sections.js +250 -173
  69. package/dist/plugins/grideditor.sections.min.js +1 -2
  70. package/dist/plugins/grideditor.sections.min.js.map +7 -1
  71. package/dist/plugins/grideditor.spacing.esm.js +318 -0
  72. package/dist/plugins/grideditor.spacing.js +296 -272
  73. package/dist/plugins/grideditor.spacing.min.js +1 -2
  74. package/dist/plugins/grideditor.spacing.min.js.map +7 -1
  75. package/dist/plugins/grideditor.summernote.esm.js +509 -0
  76. package/dist/plugins/grideditor.summernote.js +493 -427
  77. package/dist/plugins/grideditor.summernote.min.js +1 -2
  78. package/dist/plugins/grideditor.summernote.min.js.map +7 -1
  79. package/dist/plugins/grideditor.tabs.esm.js +237 -0
  80. package/dist/plugins/grideditor.tabs.js +233 -139
  81. package/dist/plugins/grideditor.tabs.min.js +1 -2
  82. package/dist/plugins/grideditor.tabs.min.js.map +7 -1
  83. package/dist/plugins/grideditor.textalign.esm.js +40 -0
  84. package/dist/plugins/grideditor.textalign.js +43 -56
  85. package/dist/plugins/grideditor.textalign.min.js +1 -2
  86. package/dist/plugins/grideditor.textalign.min.js.map +7 -1
  87. package/dist/plugins/grideditor.tinymce.esm.js +519 -0
  88. package/dist/plugins/grideditor.tinymce.js +502 -490
  89. package/dist/plugins/grideditor.tinymce.min.js +1 -2
  90. package/dist/plugins/grideditor.tinymce.min.js.map +7 -1
  91. package/dist/plugins/grideditor.visibility.esm.js +158 -0
  92. package/dist/plugins/grideditor.visibility.js +140 -149
  93. package/dist/plugins/grideditor.visibility.min.js +1 -2
  94. package/dist/plugins/grideditor.visibility.min.js.map +7 -1
  95. package/docs/events.md +47 -21
  96. package/docs/locale-keys.md +6 -0
  97. package/docs/plugins.md +47 -25
  98. package/example/adapter.html +112 -0
  99. package/example/attributes.html +89 -62
  100. package/example/autocols.html +9 -9
  101. package/example/autosave.html +18 -16
  102. package/example/basic.html +8 -6
  103. package/example/breakpoints.html +5 -6
  104. package/example/ckeditor.html +4 -5
  105. package/example/clipboard.html +15 -11
  106. package/example/codemirror.html +13 -8
  107. package/example/containers.html +11 -9
  108. package/example/custom_editor.html +53 -34
  109. package/example/elements.html +14 -12
  110. package/example/index.html +16 -2
  111. package/example/locale.html +6 -7
  112. package/example/plugins.html +44 -29
  113. package/example/summernote.html +6 -5
  114. package/example/utilities.html +17 -13
  115. package/example/wrap_content.html +13 -10
  116. package/package.json +44 -12
  117. package/src/js/dom.js +401 -0
  118. package/src/js/grideditor.classic.js +16 -0
  119. package/src/js/grideditor.jquery.js +325 -0
  120. package/src/js/{jquery.grideditor.js → grideditor.js} +1284 -1124
  121. package/src/js/locales/grideditor.es.js +163 -156
  122. package/src/js/plugins/grideditor.accordion.js +97 -77
  123. package/src/js/plugins/grideditor.alignment.js +5 -7
  124. package/src/js/plugins/grideditor.card.js +23 -23
  125. package/src/js/plugins/grideditor.ckeditor.js +107 -106
  126. package/src/js/plugins/grideditor.clipboard.js +49 -37
  127. package/src/js/plugins/grideditor.codemirror-inline.js +50 -37
  128. package/src/js/plugins/grideditor.codemirror.js +9 -10
  129. package/src/js/plugins/grideditor.elements.js +57 -33
  130. package/src/js/plugins/grideditor.float.js +4 -6
  131. package/src/js/plugins/grideditor.gutters.js +20 -15
  132. package/src/js/plugins/grideditor.order.js +28 -25
  133. package/src/js/plugins/grideditor.popup.js +63 -51
  134. package/src/js/plugins/grideditor.sections.js +39 -32
  135. package/src/js/plugins/grideditor.spacing.js +42 -45
  136. package/src/js/plugins/grideditor.summernote.js +112 -76
  137. package/src/js/plugins/grideditor.tabs.js +65 -57
  138. package/src/js/plugins/grideditor.textalign.js +4 -6
  139. package/src/js/plugins/grideditor.tinymce.js +148 -140
  140. package/src/js/plugins/grideditor.visibility.js +24 -25
  141. package/src/js/register.js +18 -0
  142. package/src/js/text/grideditor.text.js +77 -56
  143. package/types/grideditor.d.ts +335 -0
  144. package/dist/jquery.grideditor.bundle.min.js +0 -10
  145. package/dist/jquery.grideditor.js +0 -4927
  146. package/dist/jquery.grideditor.min.js +0 -2
  147. package/dist/jquery.grideditor.min.js.map +0 -1
@@ -9,15 +9,14 @@
9
9
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
10
10
 
11
11
  <!-- JS dependencies -->
12
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
13
12
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
14
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.8.6/tinymce.min.js"></script>
13
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/7.9.3/tinymce.min.js"></script>
15
14
 
16
15
  <!-- Grid editor CSS -->
17
16
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
18
17
  <!-- Grid editor javascript -->
19
18
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
20
- <script src="../dist/jquery.grideditor.min.js"></script>
19
+ <script src="../dist/grideditor.min.js"></script>
21
20
  <!-- The text editor is a plugin of its own, loaded after the editor -->
22
21
  <script src="../dist/plugins/grideditor.tinymce.min.js"></script>
23
22
  </head>
@@ -41,30 +40,33 @@
41
40
  </div>
42
41
  <script>
43
42
  const LOCAL_STORAGE_KEY = 'gridEditorLayout';
43
+ const grid = document.getElementById('myGrid');
44
+ let editor = null;
44
45
 
45
46
  function initEditor(initialContent = '') {
46
- const $grid = $('#myGrid');
47
- $grid.html(initialContent);
48
- $grid.gridEditor({
47
+ grid.innerHTML = initialContent;
48
+ editor = new GridEditor(grid, {
49
49
  new_row_layouts: [[12], [6,6], [4,4,4]],
50
- content_types: ['tinymce']
50
+ content_types: ['tinymce'],
51
+ // tinyMCE 7 is GPL-2.0-or-later: 'gpl' accepts that licence.
52
+ // A commercial licence passes its own key here instead.
53
+ tinymce: { config: { license_key: 'gpl' } },
51
54
  });
52
55
  }
53
56
 
54
57
  function autoSave() {
55
- const html = $('#myGrid').gridEditor('getHtml');
56
- localStorage.setItem(LOCAL_STORAGE_KEY, html);
58
+ localStorage.setItem(LOCAL_STORAGE_KEY, editor.getHtml());
57
59
  }
58
60
 
59
- $(function () {
61
+ document.addEventListener('DOMContentLoaded', function () {
60
62
  // Restore the previous draft, falling back to whatever markup is in the page
61
63
  const saved = localStorage.getItem(LOCAL_STORAGE_KEY);
62
- initEditor(saved || $('#myGrid').html());
64
+ initEditor(saved || grid.innerHTML);
63
65
 
64
66
  setInterval(autoSave, 5000);
65
67
 
66
- $('#exportBtn').on('click', () => {
67
- const html = $('#myGrid').gridEditor('getHtml');
68
+ document.getElementById('exportBtn').addEventListener('click', () => {
69
+ const html = editor.getHtml();
68
70
  const blob = new Blob([html], { type: 'text/html' });
69
71
  const url = URL.createObjectURL(blob);
70
72
  const a = document.createElement('a');
@@ -74,19 +76,19 @@
74
76
  URL.revokeObjectURL(url);
75
77
  });
76
78
 
77
- $('#importInput').on('change', function (e) {
79
+ document.getElementById('importInput').addEventListener('change', function (e) {
78
80
  const file = e.target.files[0];
79
81
  if (!file) return;
80
82
  const reader = new FileReader();
81
83
  reader.onload = function (e) {
82
- $('#myGrid').gridEditor('remove');
84
+ editor.destroy();
83
85
  initEditor(e.target.result);
84
86
  autoSave();
85
87
  };
86
88
  reader.readAsText(file);
87
89
  });
88
90
 
89
- $('#resetBtn').on('click', function () {
91
+ document.getElementById('resetBtn').addEventListener('click', function () {
90
92
  localStorage.removeItem(LOCAL_STORAGE_KEY);
91
93
  location.reload();
92
94
  });
@@ -8,30 +8,32 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.8.6/tinymce.min.js"></script>
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/7.9.3/tinymce.min.js"></script>
14
13
 
15
14
  <!-- Grid editor CSS -->
16
15
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
17
16
  <!-- Grid editor javascript -->
18
17
  <!-- The editor with SortableJS inside it. Every other example loads the
19
18
  two files separately; a page does one or the other, never both. -->
20
- <script src="../dist/jquery.grideditor.bundle.min.js"></script>
19
+ <script src="../dist/grideditor.bundle.min.js"></script>
21
20
  <!-- The text editor is a plugin of its own, loaded after the editor -->
22
21
  <script src="../dist/plugins/grideditor.tinymce.min.js"></script>
23
22
 
24
23
  <script>
25
- $(function() {
24
+ document.addEventListener('DOMContentLoaded', function() {
26
25
  // Initialize grid editor
27
- $('#myGrid').gridEditor({
26
+ var editor = new GridEditor('#myGrid', {
28
27
  drag_handle: 'drawer',
29
28
  new_row_layouts: [[12], [6,6], [9,3]],
30
29
  content_types: ['tinymce'],
30
+ // tinyMCE 7 is GPL-2.0-or-later: 'gpl' accepts that licence.
31
+ // A commercial licence passes its own key here instead.
32
+ tinymce: { config: { license_key: 'gpl' } },
31
33
  });
32
34
 
33
35
  // // Get resulting html
34
- // var html = $('#myGrid').gridEditor('getHtml');
36
+ // var html = editor.getHtml();
35
37
  // console.log(html);
36
38
  });
37
39
  </script>
@@ -8,18 +8,17 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
12
 
14
13
  <!-- Grid editor CSS -->
15
14
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
16
15
  <!-- Grid editor javascript -->
17
16
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
18
- <script src="../dist/jquery.grideditor.min.js"></script>
17
+ <script src="../dist/grideditor.min.js"></script>
19
18
 
20
19
  <script>
21
- $(function() {
22
- $('#myGrid').gridEditor({
20
+ document.addEventListener('DOMContentLoaded', function() {
21
+ var editor = new GridEditor('#myGrid', {
23
22
  new_row_layouts: [[12], [6,6], [4,4,4], [8,4]],
24
23
  content_types: [],
25
24
 
@@ -33,8 +32,8 @@
33
32
  // layout_modes: ['all', 'lg', 'sm', 'xs'],
34
33
  });
35
34
 
36
- $('#output').on('click', function() {
37
- $('#html').text($('#myGrid').gridEditor('getHtml'));
35
+ document.getElementById('output').addEventListener('click', function() {
36
+ document.getElementById('html').textContent = editor.getHtml();
38
37
  });
39
38
  });
40
39
  </script>
@@ -8,7 +8,6 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
12
 
14
13
  <!-- Ckeditor js -->
@@ -18,14 +17,14 @@
18
17
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
19
18
  <!-- Grid editor javascript -->
20
19
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
21
- <script src="../dist/jquery.grideditor.min.js"></script>
20
+ <script src="../dist/grideditor.min.js"></script>
22
21
  <!-- The text editor is a plugin of its own, loaded after the editor -->
23
22
  <script src="../dist/plugins/grideditor.ckeditor.min.js"></script>
24
23
 
25
24
  <script>
26
- $(function() {
25
+ document.addEventListener('DOMContentLoaded', function() {
27
26
  // Initialize grid editor
28
- $('#myGrid').gridEditor({
27
+ var editor = new GridEditor('#myGrid', {
29
28
  new_row_layouts: [[12], [6, 6], [9, 3]],
30
29
  content_types: ['ckeditor'],
31
30
  ckeditor: {
@@ -41,7 +40,7 @@
41
40
  });
42
41
 
43
42
  // Get resulting html
44
- var html = $('#myGrid').gridEditor('getHtml');
43
+ var html = editor.getHtml();
45
44
  console.log(html);
46
45
  });
47
46
  </script>
@@ -8,15 +8,14 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.8.6/tinymce.min.js"></script>
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/7.9.3/tinymce.min.js"></script>
14
13
 
15
14
  <!-- Grid editor CSS -->
16
15
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
17
16
  <!-- Grid editor javascript -->
18
17
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
19
- <script src="../dist/jquery.grideditor.min.js"></script>
18
+ <script src="../dist/grideditor.min.js"></script>
20
19
  <!-- The text editor is a plugin of its own, loaded after the editor -->
21
20
  <script src="../dist/plugins/grideditor.tinymce.min.js"></script>
22
21
  <!-- Copy and paste is a plugin of its own. The others are here so there
@@ -28,20 +27,25 @@
28
27
  <script src="../dist/plugins/grideditor.elements.min.js"></script>
29
28
 
30
29
  <script>
31
- $(function() {
30
+ document.addEventListener('DOMContentLoaded', function() {
32
31
  var settings = {
33
32
  new_row_layouts: [[12], [6, 6], [4, 4, 4]],
34
33
  content_types: ['tinymce'],
34
+ // tinyMCE 7 is GPL-2.0-or-later: 'gpl' accepts that licence.
35
+ // A commercial licence passes its own key here instead.
36
+ tinymce: { config: { license_key: 'gpl' } },
35
37
  };
36
38
 
37
- $('#myGrid').gridEditor(settings);
38
- $('#otherGrid').gridEditor(settings);
39
+ ['#myGrid', '#otherGrid'].forEach(function(selector) {
40
+ var grid = document.querySelector(selector);
41
+ new GridEditor(grid, settings);
39
42
 
40
- // A paste is an add like any other, with source 'paste'
41
- $('#myGrid, #otherGrid').on('grideditor:after-add', function(e, payload) {
42
- if (payload.source === 'paste') {
43
- $('#log').text('Pasted a ' + payload.kind + ' into ' + e.currentTarget.id);
44
- }
43
+ // A paste is an add like any other, with source 'paste'
44
+ grid.addEventListener('grideditor:after-add', function(e) {
45
+ if (e.detail.source === 'paste') {
46
+ document.getElementById('log').textContent = 'Pasted a ' + e.detail.kind + ' into ' + e.currentTarget.id;
47
+ }
48
+ });
45
49
  });
46
50
  });
47
51
  </script>
@@ -9,9 +9,8 @@
9
9
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/codemirror@5.65.21/lib/codemirror.min.css">
10
10
 
11
11
  <!-- Javascript dependencies -->
12
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
13
12
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
14
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.8.6/tinymce.min.js"></script>
13
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/7.9.3/tinymce.min.js"></script>
15
14
 
16
15
  <!-- CodeMirror 5 and its html mode, which is made of the xml, javascript
17
16
  and css modes -->
@@ -25,7 +24,7 @@
25
24
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
26
25
  <!-- Grid editor javascript -->
27
26
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
28
- <script src="../dist/jquery.grideditor.min.js"></script>
27
+ <script src="../dist/grideditor.min.js"></script>
29
28
  <script src="../dist/plugins/grideditor.tinymce.min.js"></script>
30
29
  <!-- The source view in CodeMirror, a plugin of its own -->
31
30
  <script src="../dist/plugins/grideditor.codemirror.min.js"></script>
@@ -33,23 +32,29 @@
33
32
  <script src="../dist/plugins/grideditor.codemirror-inline.min.js"></script>
34
33
 
35
34
  <script>
36
- $(function() {
35
+ document.addEventListener('DOMContentLoaded', function() {
36
+ var checkbox = document.getElementById('editSource');
37
+
37
38
  function start() {
38
- if ($('#myGrid').data('grideditor')) { $('#myGrid').gridEditor('destroy'); }
39
+ var running = GridEditor.get('#myGrid');
40
+ if (running) { running.destroy(); }
39
41
 
40
- $('#myGrid').gridEditor({
42
+ new GridEditor('#myGrid', {
41
43
  new_row_layouts: [[12], [6, 6], [4, 4, 4]],
42
44
  // false leaves the toolbar's source button out
43
- edit_source: $('#editSource').prop('checked'),
45
+ edit_source: checkbox.checked,
44
46
  // Anything CodeMirror.fromTextArea takes, over the
45
47
  // plugin's own defaults
46
48
  codemirror: {
47
49
  config: { lineNumbers: true },
48
50
  },
51
+ // tinyMCE 7 is GPL-2.0-or-later: 'gpl' accepts that licence.
52
+ // A commercial licence passes its own key here instead.
53
+ tinymce: { config: { license_key: 'gpl' } },
49
54
  });
50
55
  }
51
56
 
52
- $('#editSource').on('change', start);
57
+ checkbox.addEventListener('change', start);
53
58
  start();
54
59
  });
55
60
  </script>
@@ -8,15 +8,14 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.8.6/tinymce.min.js"></script>
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/7.9.3/tinymce.min.js"></script>
14
13
 
15
14
  <!-- Grid editor CSS -->
16
15
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
17
16
  <!-- Grid editor javascript -->
18
17
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
19
- <script src="../dist/jquery.grideditor.min.js"></script>
18
+ <script src="../dist/grideditor.min.js"></script>
20
19
  <!-- The text editor is a plugin of its own, loaded after the editor -->
21
20
  <script src="../dist/plugins/grideditor.tinymce.min.js"></script>
22
21
  <!-- One file per container type: load the ones this page offers -->
@@ -26,10 +25,13 @@
26
25
  <script src="../dist/plugins/grideditor.card.min.js"></script>
27
26
 
28
27
  <script>
29
- $(function() {
30
- $('#myGrid').gridEditor({
28
+ document.addEventListener('DOMContentLoaded', function() {
29
+ var editor = new GridEditor('#myGrid', {
31
30
  new_row_layouts: [[12], [6,6]],
32
31
  content_types: ['tinymce'],
32
+ // tinyMCE 7 is GPL-2.0-or-later: 'gpl' accepts that licence.
33
+ // A commercial licence passes its own key here instead.
34
+ tinymce: { config: { license_key: 'gpl' } },
33
35
 
34
36
  // Every container plugin the page loaded is offered. Name
35
37
  // them to offer fewer than were loaded:
@@ -47,12 +49,12 @@
47
49
  accordion_tools: [],
48
50
  });
49
51
 
50
- $('#output').on('click', function() {
51
- $('#html').text($('#myGrid').gridEditor('getHtml'));
52
+ document.getElementById('output').addEventListener('click', function() {
53
+ document.getElementById('html').textContent = editor.getHtml();
52
54
  });
53
55
 
54
- $('#authored').on('click', function() {
55
- var html = $('#myGrid').gridEditor('getHtml');
56
+ document.getElementById('authored').addEventListener('click', function() {
57
+ var html = editor.getHtml();
56
58
  var page = window.open('', '_blank');
57
59
 
58
60
  // The output, in a page that loads Bootstrap and nothing else:
@@ -8,7 +8,6 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
12
 
14
13
  <!-- Grid editor CSS -->
@@ -17,39 +16,47 @@
17
16
  <!-- The editor, and no text editor of the shipped ones: the one this page
18
17
  edits text with is written below -->
19
18
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
20
- <script src="../dist/jquery.grideditor.min.js"></script>
19
+ <script src="../dist/grideditor.min.js"></script>
21
20
 
22
21
  <!-- A text editor of the page's own. It is a feature plugin like any
23
22
  other: the core knows nothing of text, and asks the plugins through
24
23
  textTypes which types there are. This one edits with the browser's
25
24
  own contenteditable. -->
26
25
  <script id="simpletext-plugin">
27
- (function($) {
26
+ (function() {
28
27
 
29
- $.extend($.fn.gridEditor.locales.en, {
28
+ Object.assign(GridEditor.locales.en, {
30
29
  'simpletext.label': 'Simple text',
31
30
  'simpletext.add': 'Simple text',
32
31
  });
33
32
 
34
33
  var TYPE = 'simpletext';
35
34
 
36
- $.fn.gridEditor.features.simpletext = function(ge) {
35
+ GridEditor.features.simpletext = function(ge) {
37
36
 
38
37
  /** A content area of this plugin's: its type is on it. */
39
38
  function isOurs(area) {
40
- return area.attr('data-ge-content-type') === TYPE;
39
+ return !!area && area.getAttribute('data-ge-content-type') === TYPE;
41
40
  }
42
41
 
43
42
  function start(area) {
44
- if (area.hasClass('ge-rte-active')) { return; }
43
+ if (area.classList.contains('ge-rte-active')) { return; }
45
44
 
46
- area.addClass('ge-rte-active').attr('contenteditable', 'true').trigger('focus');
45
+ area.classList.add('ge-rte-active');
46
+ area.setAttribute('contenteditable', 'true');
47
+ area.focus();
47
48
  }
48
49
 
49
50
  // Whatever start put on the content area comes off: what is
50
51
  // left is what getHtml saves
51
52
  function stop(area) {
52
- area.removeClass('ge-rte-active').removeAttr('contenteditable');
53
+ area.classList.remove('ge-rte-active');
54
+ area.removeAttribute('contenteditable');
55
+ }
56
+
57
+ /** The content area a text block holds. */
58
+ function areaOf(textBlock) {
59
+ return textBlock.querySelector(':scope > .ge-content');
53
60
  }
54
61
 
55
62
  /**
@@ -58,23 +65,32 @@
58
65
  * drawer of a type a plugin declares to that plugin.
59
66
  */
60
67
  function createDrawer(textBlock) {
61
- var area = textBlock.children('.ge-content');
62
- var drawer = $('<div class="ge-tools-drawer ge-text-drawer" />').prependTo(textBlock);
68
+ var area = areaOf(textBlock);
69
+ var drawer = document.createElement('div');
70
+ drawer.className = 'ge-tools-drawer ge-text-drawer';
71
+ textBlock.insertBefore(drawer, textBlock.firstChild);
63
72
 
64
73
  ge.createMoveTool(drawer);
65
74
  ge.createTool(drawer, ge.t('tool.delete_text'), 'ge-delete-text', 'bi bi-trash', function() {
66
75
  ge.deleteNode('text', area, ge.t('confirm.delete_text'), function(removed) {
67
76
  stop(area);
68
- textBlock.slideUp(function() {
77
+ // Folded away, then gone
78
+ var fold = textBlock.animate(
79
+ [{ height: textBlock.offsetHeight + 'px', opacity: 1 }, { height: '0px', opacity: 0 }],
80
+ { duration: 400, easing: 'ease-in-out' }
81
+ );
82
+ textBlock.style.overflow = 'hidden';
83
+ fold.onfinish = function() {
69
84
  textBlock.remove();
70
85
  removed();
71
- });
86
+ };
72
87
  });
73
88
  });
74
89
  }
75
90
 
76
- function onClick() {
77
- if (isOurs($(this))) { start($(this)); }
91
+ function onClick(e) {
92
+ var area = e.target.closest('.ge-content');
93
+ if (area && ge.canvas.contains(area) && isOurs(area)) { start(area); }
78
94
  }
79
95
 
80
96
  return {
@@ -87,8 +103,9 @@
87
103
  type: TYPE,
88
104
  label: ge.t('simpletext.label'),
89
105
  edit: function(area) {
90
- var textBlock = area.parent('.ge-text-block');
91
- if (textBlock.length && !textBlock.children('.ge-tools-drawer').length) {
106
+ var textBlock = area.parentElement;
107
+ if (textBlock.classList.contains('ge-text-block') &&
108
+ !textBlock.querySelector(':scope > .ge-tools-drawer')) {
92
109
  createDrawer(textBlock);
93
110
  }
94
111
 
@@ -105,47 +122,49 @@
105
122
  kind: 'text',
106
123
  inColumn: true,
107
124
  create: function() {
108
- return $('<div class="ge-content" />')
109
- .addClass('ge-content-type-' + TYPE)
110
- .attr('data-ge-content-type', TYPE)
111
- .html('<p>Write here</p>');
125
+ var area = document.createElement('div');
126
+ area.className = 'ge-content ge-content-type-' + TYPE;
127
+ area.setAttribute('data-ge-content-type', TYPE);
128
+ area.innerHTML = '<p>Write here</p>';
129
+ return area;
112
130
  },
113
131
  }],
114
132
 
115
133
  onInit: function() {
116
- ge.canvas.find('.ge-text-block').each(function() {
117
- var textBlock = $(this);
118
- if (textBlock.children('.ge-tools-drawer').length) { return; }
119
- if (isOurs(textBlock.children('.ge-content'))) { createDrawer(textBlock); }
134
+ ge.canvas.querySelectorAll('.ge-text-block').forEach(function(textBlock) {
135
+ if (textBlock.querySelector(':scope > .ge-tools-drawer')) { return; }
136
+ if (isOurs(areaOf(textBlock))) { createDrawer(textBlock); }
120
137
  });
121
138
 
122
- ge.canvas.off('click.simpletext').on('click.simpletext', '.ge-content', onClick);
139
+ // One listener, however many times the canvas is initialized
140
+ ge.canvas.removeEventListener('click', onClick);
141
+ ge.canvas.addEventListener('click', onClick);
123
142
  },
124
143
 
125
144
  // Before the drawers and the text blocks come off
126
145
  onBeforeDeinit: function() {
127
- ge.canvas.find('.ge-content').each(function() {
128
- if (isOurs($(this))) { stop($(this)); }
146
+ ge.canvas.querySelectorAll('.ge-content').forEach(function(area) {
147
+ if (isOurs(area)) { stop(area); }
129
148
  });
130
149
  },
131
150
 
132
151
  onDeinit: function() {
133
- ge.canvas.off('click.simpletext');
152
+ ge.canvas.removeEventListener('click', onClick);
134
153
  },
135
154
  };
136
155
  };
137
156
 
138
- })(jQuery);
157
+ })();
139
158
  </script>
140
159
 
141
160
  <script>
142
- $(function() {
143
- $('#myGrid').gridEditor({
161
+ document.addEventListener('DOMContentLoaded', function() {
162
+ var editor = new GridEditor('#myGrid', {
144
163
  new_row_layouts: [[12], [6, 6], [4, 4, 4]],
145
164
  });
146
165
 
147
- $('#output').on('click', function() {
148
- $('#html').text($('#myGrid').gridEditor('getHtml'));
166
+ document.getElementById('output').addEventListener('click', function() {
167
+ document.getElementById('html').textContent = editor.getHtml();
149
168
  });
150
169
  });
151
170
  </script>
@@ -8,15 +8,14 @@
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.css">
9
9
 
10
10
  <!-- Javascript dependencies -->
11
- <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
12
11
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
13
- <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.8.6/tinymce.min.js"></script>
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/7.9.3/tinymce.min.js"></script>
14
13
 
15
14
  <!-- Grid editor CSS -->
16
15
  <link rel="stylesheet" type="text/css" href="../dist/grideditor.css" />
17
16
  <!-- Grid editor javascript -->
18
17
  <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.6/Sortable.min.js"></script>
19
- <script src="../dist/jquery.grideditor.min.js"></script>
18
+ <script src="../dist/grideditor.min.js"></script>
20
19
  <!-- The text editor is a plugin of its own, loaded after the editor -->
21
20
  <script src="../dist/plugins/grideditor.tinymce.min.js"></script>
22
21
  <script src="../dist/plugins/grideditor.elements.min.js"></script>
@@ -37,10 +36,13 @@
37
36
  </style>
38
37
 
39
38
  <script>
40
- $(function() {
41
- $('#myGrid').gridEditor({
39
+ document.addEventListener('DOMContentLoaded', function() {
40
+ var editor = new GridEditor('#myGrid', {
42
41
  new_row_layouts: [[12], [6,6]],
43
42
  content_types: ['tinymce'],
43
+ // tinyMCE 7 is GPL-2.0-or-later: 'gpl' accepts that licence.
44
+ // A commercial licence passes its own key here instead.
45
+ tinymce: { config: { license_key: 'gpl' } },
44
46
 
45
47
  elements: {
46
48
  // The default. Only nodes carrying this attribute are
@@ -61,9 +63,9 @@
61
63
  className: 'my-app-edit',
62
64
  on: {
63
65
  click: function() {
64
- var element = $(this).closest('.ge-element');
66
+ var element = this.closest('.ge-element');
65
67
  alert('The host would open its own editor for ' +
66
- element.attr('data-ge-element') + ' here.');
68
+ element.getAttribute('data-ge-element') + ' here.');
67
69
  },
68
70
  },
69
71
  }],
@@ -73,17 +75,17 @@
73
75
  // placeholder to see and move while editing, and strips it in its
74
76
  // own save step. Grid editor needs no feature for this - the
75
77
  // element level controls already apply (spec 4.4).
76
- $('#addTag').on('click', function() {
77
- var column = $('#myGrid .column').first();
78
+ document.getElementById('addTag').addEventListener('click', function() {
79
+ var column = document.querySelector('#myGrid .column');
78
80
 
79
- $('#myGrid').gridEditor('createElement',
81
+ editor.createElement(
80
82
  '<span class="my-app-tag-placeholder">Analytics tag</span>',
81
83
  { type: 'analytics-tag', label: 'Analytics', appendTo: column }
82
84
  );
83
85
  });
84
86
 
85
- $('#output').on('click', function() {
86
- $('#html').text($('#myGrid').gridEditor('getHtml'));
87
+ document.getElementById('output').addEventListener('click', function() {
88
+ document.getElementById('html').textContent = editor.getHtml();
87
89
  });
88
90
  });
89
91
  </script>