@themarioga/grid-editor 4.0.0 → 5.0.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 (65) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +121 -9
  3. package/UPGRADING.md +55 -0
  4. package/dist/grideditor.css +609 -0
  5. package/dist/grideditor.min.css +1 -1
  6. package/dist/grideditor.min.css.map +1 -1
  7. package/dist/jquery.grideditor.bundle.min.js +2 -2
  8. package/dist/jquery.grideditor.js +1189 -118
  9. package/dist/jquery.grideditor.min.js +1 -1
  10. package/dist/jquery.grideditor.min.js.map +1 -1
  11. package/dist/locales/grideditor.es.js +58 -0
  12. package/dist/locales/grideditor.es.min.js +1 -1
  13. package/dist/locales/grideditor.es.min.js.map +1 -1
  14. package/dist/plugins/grideditor.alignment.js +81 -0
  15. package/dist/plugins/grideditor.alignment.min.js +2 -0
  16. package/dist/plugins/grideditor.alignment.min.js.map +1 -0
  17. package/dist/plugins/grideditor.float.js +56 -0
  18. package/dist/plugins/grideditor.float.min.js +2 -0
  19. package/dist/plugins/grideditor.float.min.js.map +1 -0
  20. package/dist/plugins/grideditor.gutters.js +145 -0
  21. package/dist/plugins/grideditor.gutters.min.js +2 -0
  22. package/dist/plugins/grideditor.gutters.min.js.map +1 -0
  23. package/dist/plugins/grideditor.order.js +206 -0
  24. package/dist/plugins/grideditor.order.min.js +2 -0
  25. package/dist/plugins/grideditor.order.min.js.map +1 -0
  26. package/dist/plugins/grideditor.sections.js +199 -0
  27. package/dist/plugins/grideditor.sections.min.js +2 -0
  28. package/dist/plugins/grideditor.sections.min.js.map +1 -0
  29. package/dist/plugins/grideditor.spacing.js +299 -0
  30. package/dist/plugins/grideditor.spacing.min.js +2 -0
  31. package/dist/plugins/grideditor.spacing.min.js.map +1 -0
  32. package/dist/plugins/grideditor.textalign.js +60 -0
  33. package/dist/plugins/grideditor.textalign.min.js +2 -0
  34. package/dist/plugins/grideditor.textalign.min.js.map +1 -0
  35. package/dist/plugins/grideditor.visibility.js +172 -0
  36. package/dist/plugins/grideditor.visibility.min.js +2 -0
  37. package/dist/plugins/grideditor.visibility.min.js.map +1 -0
  38. package/docs/events.md +32 -2
  39. package/docs/locale-keys.md +88 -1
  40. package/docs/plugins.md +141 -3
  41. package/example/autocols.html +137 -0
  42. package/example/autosave.html +5 -0
  43. package/example/basic.html +5 -0
  44. package/example/breakpoints.html +12 -5
  45. package/example/ckeditor.html +5 -0
  46. package/example/containers.html +4 -0
  47. package/example/elements.html +5 -0
  48. package/example/index.html +38 -1
  49. package/example/locale.html +5 -0
  50. package/example/plugins.html +5 -0
  51. package/example/summernote.html +5 -0
  52. package/example/utilities.html +166 -0
  53. package/example/wrap_content.html +5 -0
  54. package/package.json +1 -1
  55. package/src/js/jquery.grideditor.js +1190 -119
  56. package/src/js/locales/grideditor.es.js +58 -0
  57. package/src/js/plugins/grideditor.alignment.js +81 -0
  58. package/src/js/plugins/grideditor.float.js +56 -0
  59. package/src/js/plugins/grideditor.gutters.js +145 -0
  60. package/src/js/plugins/grideditor.order.js +206 -0
  61. package/src/js/plugins/grideditor.sections.js +199 -0
  62. package/src/js/plugins/grideditor.spacing.js +299 -0
  63. package/src/js/plugins/grideditor.textalign.js +60 -0
  64. package/src/js/plugins/grideditor.visibility.js +172 -0
  65. package/src/less/grideditor.less +299 -0
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Column order for grid-editor.
3
+ *
4
+ * A utility plugin: load this file after the editor and a column's place in
5
+ * its row can differ per breakpoint, with Bootstrap's order-{breakpoint}-*
6
+ * classes. What it can ask the editor for is the handle its factory is called
7
+ * with, described in docs/plugins.md.
8
+ *
9
+ * <script src="dist/jquery.grideditor.min.js"></script>
10
+ * <script src="dist/plugins/grideditor.order.min.js"></script>
11
+ *
12
+ * Two arrows in each column's drawer move it one place earlier or later in
13
+ * the view being edited, by numbering the row's columns; the markup does not
14
+ * move. Dragging still moves the markup, as it always has.
15
+ *
16
+ * utilities.order.drawer: false leaves the arrows out, and the panel field is
17
+ * the only control.
18
+ */
19
+ (function($) {
20
+
21
+ $.extend($.fn.gridEditor.locales.en, {
22
+ 'utility.order': 'Order',
23
+ 'utility.order_first': 'First',
24
+ 'utility.order_last': 'Last',
25
+ 'tool.order_earlier': 'Earlier in this view',
26
+ 'tool.order_later': 'Later in this view',
27
+ 'badge.order': 'Order: {value}',
28
+ });
29
+
30
+ var VALUES = ['first', '0', '1', '2', '3', '4', '5', 'last'];
31
+
32
+ /** Where each value puts a column, as Bootstrap's css has it. */
33
+ var RANK = { first: -1, last: 6 };
34
+
35
+ /** A column that carries any class of the family, at any breakpoint. */
36
+ var CLASS_PATTERN = /(?:^|\s)order-(?:(?:sm|md|lg|xl|xxl)-)?(?:first|last|[0-5])(?:\s|$)/;
37
+
38
+ $.fn.gridEditor.utilities.order = function(ge) {
39
+
40
+ var options = $.extend({ drawer: true }, ge.settings.utilities.order);
41
+ var warnedAboutDrag = false;
42
+
43
+ function rank(value) {
44
+ if (value === null) { return 0; }
45
+
46
+ return RANK[value] !== undefined ? RANK[value] : parseInt(value, 10);
47
+ }
48
+
49
+ function label(value) {
50
+ if (value === 'first') { return ge.t('utility.order_first'); }
51
+ if (value === 'last') { return ge.t('utility.order_last'); }
52
+
53
+ return value;
54
+ }
55
+
56
+ /** The columns of a row in the order a view shows them, given what each one's order is. */
57
+ function visualOrder(columns, read) {
58
+ return columns.get()
59
+ .map(function(element, index) {
60
+ return { element: element, index: index, rank: rank(read($(element))) };
61
+ })
62
+ .sort(function(a, b) { return a.rank - b.rank || a.index - b.index; })
63
+ .map(function(entry) { return entry.element; });
64
+ }
65
+
66
+ function sameOrder(a, b) {
67
+ return a.every(function(element, index) { return element === b[index]; });
68
+ }
69
+
70
+ /**
71
+ * The values that put n columns in n places, or null past eight: that
72
+ * is how many places Bootstrap's order classes have.
73
+ */
74
+ function slots(count) {
75
+ if (count <= 6) { return VALUES.slice(1, 1 + count); }
76
+ if (count === 7) { return VALUES.slice(1); }
77
+ if (count === 8) { return VALUES.slice(); }
78
+
79
+ return null;
80
+ }
81
+
82
+ /**
83
+ * Move a column one place earlier or later in the view being edited.
84
+ *
85
+ * The row's columns are numbered in their new order. When that order is
86
+ * the markup's own, the numbers are taken off instead - unless what is
87
+ * left underneath, the breakpoint below, would then order them some other
88
+ * way, and the numbers are what keep them in the markup's order.
89
+ */
90
+ function move(col, direction) {
91
+ var view = ge.view();
92
+ var columns = col.parent().children('.column');
93
+ var shown = visualOrder(columns, function(column) { return ge.getUtility(column, 'order', view); });
94
+ var from = shown.indexOf(col[0]);
95
+ var to = from + direction;
96
+
97
+ if (to < 0 || to >= shown.length) { return; }
98
+
99
+ shown.splice(to, 0, shown.splice(from, 1)[0]);
100
+
101
+ var values = null;
102
+ if (!sameOrder(shown, columns.get()) || !inheritsMarkupOrder(columns, view)) {
103
+ values = slots(shown.length);
104
+
105
+ if (!values) {
106
+ ge.warn('a row of ' + shown.length + ' columns cannot be reordered with Bootstrap\'s ' +
107
+ 'order classes, which have eight places');
108
+ return;
109
+ }
110
+ }
111
+
112
+ ge.operate(function() {
113
+ shown.forEach(function(element, index) {
114
+ ge.setUtility($(element), 'order', values ? values[index] : null, { source: 'tool' });
115
+ });
116
+ });
117
+ }
118
+
119
+ /** Whether taking this view's classes off leaves the columns in the markup's order. */
120
+ function inheritsMarkupOrder(columns, view) {
121
+ var index = ge.breakpoints.indexOf(view);
122
+ if (index <= 0) { return true; }
123
+
124
+ var below = ge.breakpoints[index - 1];
125
+
126
+ return sameOrder(visualOrder(columns, function(column) {
127
+ return ge.getUtility(column, 'order', below);
128
+ }), columns.get());
129
+ }
130
+
131
+ /** Whether a row's columns are ordered by class, rather than by the markup, in this view. */
132
+ function ordered(row) {
133
+ return row.children('.column').get().some(function(element) {
134
+ return ge.getUtility($(element), 'order', ge.view()) !== null;
135
+ });
136
+ }
137
+
138
+ /** The badge: a column ordered by class in this view says where. */
139
+ function mark(scope) {
140
+ scope.find('.column').addBack('.column').each(function() {
141
+ var col = $(this);
142
+ var value = CLASS_PATTERN.test(col.attr('class') || '')
143
+ ? ge.getUtility(col, 'order', ge.view())
144
+ : null;
145
+
146
+ if (value === null) {
147
+ col.removeAttr('data-ge-order');
148
+ } else {
149
+ col.attr('data-ge-order', ge.t('badge.order', { value: label(value) }));
150
+ }
151
+ });
152
+ }
153
+
154
+ /**
155
+ * A column dropped in a row ordered by class lands where the markup puts
156
+ * it, and shows up where its order does, which is worth saying once.
157
+ */
158
+ function afterMove(e, payload) {
159
+ if (warnedAboutDrag || payload.kind !== 'column' || !payload.to) { return; }
160
+ if (!ordered(payload.to.parent)) { return; }
161
+
162
+ warnedAboutDrag = true;
163
+ ge.warn('a column was dropped in a row whose columns carry order classes in this view: ' +
164
+ 'where it shows is set by those classes, not by where it sits in the markup');
165
+ }
166
+
167
+ return {
168
+ families: [{
169
+ name: 'order',
170
+ prefix: 'order',
171
+ values: VALUES,
172
+ appliesTo: ['column'],
173
+ labelKey: 'utility.order',
174
+ label: label,
175
+ preview: function(value) {
176
+ return { order: rank(value) };
177
+ },
178
+ }],
179
+
180
+ drawerTools: function(drawer, node, kind) {
181
+ if (!options.drawer || kind !== 'column') { return; }
182
+
183
+ ge.createTool(drawer, ge.t('tool.order_earlier'), 'ge-order-earlier', 'bi bi-chevron-left', function() {
184
+ move(node, -1);
185
+ });
186
+ ge.createTool(drawer, ge.t('tool.order_later'), 'ge-order-later', 'bi bi-chevron-right', function() {
187
+ move(node, 1);
188
+ });
189
+ },
190
+
191
+ // init runs again whenever a node is added, without a deinit
192
+ // between, so the listener is replaced rather than stacked
193
+ onInit: function() {
194
+ ge.canvas.off('grideditor:after-move.ge-order').on('grideditor:after-move.ge-order', afterMove);
195
+ },
196
+
197
+ onRefresh: mark,
198
+
199
+ onDeinit: function() {
200
+ ge.canvas.off('grideditor:after-move.ge-order');
201
+ ge.canvas.find('[data-ge-order]').removeAttr('data-ge-order');
202
+ },
203
+ };
204
+ };
205
+
206
+ })(jQuery);
@@ -0,0 +1,2 @@
1
+ (u=>{u.extend(u.fn.gridEditor.locales.en,{"utility.order":"Order","utility.order_first":"First","utility.order_last":"Last","tool.order_earlier":"Earlier in this view","tool.order_later":"Later in this view","badge.order":"Order: {value}"});var c=["first","0","1","2","3","4","5","last"],r={first:-1,last:6},f=/(?:^|\s)order-(?:(?:sm|md|lg|xl|xxl)-)?(?:first|last|[0-5])(?:\s|$)/;u.fn.gridEditor.utilities.order=function(l){var n=u.extend({drawer:!0},l.settings.utilities.order),t=!1;function i(e){return null===e?0:void 0!==r[e]?r[e]:parseInt(e,10)}function o(e){return"first"===e?l.t("utility.order_first"):"last"===e?l.t("utility.order_last"):e}function a(e,t){return e.get().map(function(e,r){return{element:e,index:r,rank:i(t(u(e)))}}).sort(function(e,r){return e.rank-r.rank||e.index-r.index}).map(function(e){return e.element})}function d(e,t){return e.every(function(e,r){return e===t[r]})}function s(e,r){var t,n=l.view(),i=e.parent().children(".column"),o=a(i,function(e){return l.getUtility(e,"order",n)}),e=o.indexOf(e[0]),r=e+r;r<0||r>=o.length||(o.splice(r,0,o.splice(e,1)[0]),t=null,d(o,i.get())&&((e,r)=>{var t;return(r=l.breakpoints.indexOf(r))<=0||(t=l.breakpoints[r-1],d(a(e,function(e){return l.getUtility(e,"order",t)}),e.get()))})(i,n)||(r=o.length,t=r<=6?c.slice(1,1+r):7===r?c.slice(1):8===r?c.slice():null)?l.operate(function(){o.forEach(function(e,r){l.setUtility(u(e),"order",t?t[r]:null,{source:"tool"})})}):l.warn("a row of "+o.length+" columns cannot be reordered with Bootstrap's order classes, which have eight places"))}function e(e,r){!t&&"column"===r.kind&&r.to&&r.to.parent.children(".column").get().some(function(e){return null!==l.getUtility(u(e),"order",l.view())})&&(t=!0,l.warn("a column was dropped in a row whose columns carry order classes in this view: where it shows is set by those classes, not by where it sits in the markup"))}return{families:[{name:"order",prefix:"order",values:c,appliesTo:["column"],labelKey:"utility.order",label:o,preview:function(e){return{order:i(e)}}}],drawerTools:function(e,r,t){n.drawer&&"column"===t&&(l.createTool(e,l.t("tool.order_earlier"),"ge-order-earlier","bi bi-chevron-left",function(){s(r,-1)}),l.createTool(e,l.t("tool.order_later"),"ge-order-later","bi bi-chevron-right",function(){s(r,1)}))},onInit:function(){l.canvas.off("grideditor:after-move.ge-order").on("grideditor:after-move.ge-order",e)},onRefresh:function(e){e.find(".column").addBack(".column").each(function(){var e=u(this),r=f.test(e.attr("class")||"")?l.getUtility(e,"order",l.view()):null;null===r?e.removeAttr("data-ge-order"):e.attr("data-ge-order",l.t("badge.order",{value:o(r)}))})},onDeinit:function(){l.canvas.off("grideditor:after-move.ge-order"),l.canvas.find("[data-ge-order]").removeAttr("data-ge-order")}}}})(jQuery);
2
+ //# sourceMappingURL=grideditor.order.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grideditor.order.min.js","sources":["../../src/js/plugins/grideditor.order.js"],"names":["$","extend","fn","gridEditor","locales","en","utility.order","utility.order_first","utility.order_last","tool.order_earlier","tool.order_later","badge.order","VALUES","RANK","first","last","CLASS_PATTERN","utilities","order","ge","options","drawer","settings","warnedAboutDrag","rank","value","undefined","parseInt","label","t","visualOrder","columns","read","get","map","element","index","sort","a","b","entry","sameOrder","every","move","col","direction","values","view","parent","children","shown","column","getUtility","from","indexOf","to","length","splice","below","breakpoints","count","slice","operate","forEach","setUtility","source","warn","afterMove","e","payload","kind","some","families","name","prefix","appliesTo","labelKey","preview","drawerTools","node","createTool","onInit","canvas","off","on","onRefresh","scope","find","addBack","each","this","test","attr","removeAttr","onDeinit","jQuery"],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Sections for grid-editor.
3
+ *
4
+ * A feature plugin: load this file after the editor and the canvas can hold
5
+ * sections - Bootstrap's .container, .container-fluid and .container-{bp} -
6
+ * each grouping rows at a width of its own. What it can ask the editor for is
7
+ * the handle its factory is called with, described in docs/plugins.md.
8
+ *
9
+ * <script src="dist/jquery.grideditor.min.js"></script>
10
+ * <script src="dist/plugins/grideditor.sections.min.js"></script>
11
+ *
12
+ * Called sections, not containers, because a container is what the tabs,
13
+ * accordion, popup and card plugins make. A section is recognised by its
14
+ * Bootstrap class alone, and only as a child of the canvas: a .container
15
+ * somewhere inside an element's markup is that element's business.
16
+ *
17
+ * sections.widths narrows the widths the field offers.
18
+ */
19
+ (function($) {
20
+
21
+ $.extend($.fn.gridEditor.locales.en, {
22
+ 'section.add': 'Section',
23
+ 'section.width': 'Width',
24
+ 'section.fixed': 'Fixed',
25
+ 'section.fluid': 'Full width',
26
+ 'section.from': 'Fixed from {breakpoint}',
27
+ 'tool.add_row_to_section': 'Add row',
28
+ 'tool.delete_section': 'Remove section',
29
+ 'confirm.delete_section': 'Delete this section and everything in it?',
30
+ });
31
+
32
+ /** Each width, and the class that gives it. */
33
+ var WIDTHS = {
34
+ fixed: 'container',
35
+ fluid: 'container-fluid',
36
+ sm: 'container-sm',
37
+ md: 'container-md',
38
+ lg: 'container-lg',
39
+ xl: 'container-xl',
40
+ xxl: 'container-xxl',
41
+ };
42
+
43
+ var ORDER = ['fixed', 'sm', 'md', 'lg', 'xl', 'xxl', 'fluid'];
44
+
45
+ $.fn.gridEditor.features.sections = function(ge) {
46
+
47
+ var options = $.extend({ widths: ORDER }, ge.settings.sections);
48
+
49
+ function widthOf(section) {
50
+ var found = null;
51
+
52
+ $.each(WIDTHS, function(width, className) {
53
+ if (!found && section.hasClass(className)) { found = width; }
54
+ });
55
+
56
+ return found;
57
+ }
58
+
59
+ function isSection(node) {
60
+ return node.parent()[0] === ge.canvas[0] && widthOf(node) !== null;
61
+ }
62
+
63
+ function sections() {
64
+ return ge.canvas.children().filter(function() { return isSection($(this)); });
65
+ }
66
+
67
+ function label(width) {
68
+ if (width === 'fixed') { return ge.t('section.fixed'); }
69
+ if (width === 'fluid') { return ge.t('section.fluid'); }
70
+
71
+ return ge.t('section.from', { breakpoint: width });
72
+ }
73
+
74
+ /**
75
+ * Change a section's width, announced like a utility: the width is its
76
+ * one container class, the same at every breakpoint.
77
+ */
78
+ function setWidth(section, width, source) {
79
+ var from = widthOf(section);
80
+ if (from === width || !WIDTHS[width]) { return false; }
81
+
82
+ return ge.operate(function() {
83
+ var payload = ge.payloadFor('section', section, {
84
+ family: 'section',
85
+ breakpoint: 'all',
86
+ tiers: [],
87
+ from: from,
88
+ to: width,
89
+ source: source || 'api',
90
+ });
91
+
92
+ if (!ge.emit('before-utility', payload)) {
93
+ section.find('> .ge-tools-drawer .ge-section-width select').val(from);
94
+ return false;
95
+ }
96
+
97
+ section.removeClass(WIDTHS[from]).addClass(WIDTHS[width]);
98
+ ge.emit('after-utility', payload);
99
+
100
+ return true;
101
+ });
102
+ }
103
+
104
+ function widthField(section) {
105
+ var select = $('<select />');
106
+ var current = widthOf(section);
107
+ var offered = options.widths.indexOf(current) === -1 ? options.widths.concat([current]) : options.widths;
108
+
109
+ ORDER.forEach(function(width) {
110
+ if (offered.indexOf(width) === -1) { return; }
111
+ $('<option />').attr('value', width).text(label(width)).appendTo(select);
112
+ });
113
+
114
+ select.val(current).on('change', function() { setWidth(section, this.value, 'panel'); });
115
+
116
+ return $('<label class="ge-utility ge-section-width" />')
117
+ .append($('<span class="ge-utility-label" />').text(ge.t('section.width')))
118
+ .append(select);
119
+ }
120
+
121
+ function createControls(section) {
122
+ var drawer = $('<div class="ge-tools-drawer ge-section-drawer" />').prependTo(section);
123
+
124
+ ge.createMoveTool(drawer);
125
+ ge.addSettingsTool(drawer, section, ge.settings.section_classes || []).append(widthField(section));
126
+
127
+ ge.createTool(drawer, ge.t('tool.add_row_to_section'), 'ge-add-row', 'bi bi-plus-circle', function() {
128
+ ge.place(ge.rowFromLayout([12]), 'row', { appendTo: section });
129
+ });
130
+
131
+ ge.createTool(drawer, ge.t('tool.delete_section'), 'ge-delete-section', 'bi bi-trash', function() {
132
+ ge.deleteNode('section', section, ge.t('confirm.delete_section'), function(removed) {
133
+ section.slideUp(removed);
134
+ });
135
+ });
136
+ }
137
+
138
+ function mark() {
139
+ sections().each(function() {
140
+ var section = $(this).addClass('ge-section');
141
+ if (!section.children('.ge-tools-drawer').length) { createControls(section); }
142
+ });
143
+ }
144
+
145
+ function unmark() {
146
+ ge.canvas.children('.ge-section').removeClass('ge-section');
147
+ }
148
+
149
+ /** createSection(options): a section, detached unless a placement is given. */
150
+ function createSection(settings) {
151
+ settings = settings || {};
152
+
153
+ var section = $('<div />').addClass(WIDTHS[settings.width] || WIDTHS.fixed);
154
+
155
+ (settings.rows || [[12]]).forEach(function(layout) {
156
+ ge.rowFromLayout(layout).appendTo(section);
157
+ });
158
+
159
+ return ge.place(section, 'section', settings);
160
+ }
161
+
162
+ return {
163
+ methods: {
164
+ createSection: createSection,
165
+ },
166
+
167
+ kindOf: function(node) {
168
+ return node.hasClass('ge-section') ? 'section' : null;
169
+ },
170
+
171
+ // A section is a block the canvas moves, and a region rows move in
172
+ blocks: '.ge-section',
173
+ regions: '.ge-section',
174
+
175
+ /** A section goes on the canvas and nowhere else, and holds rows and nothing else. */
176
+ accepts: function(region, node) {
177
+ if (node.hasClass('ge-section') || isSectionMade(node)) { return region[0] === ge.canvas[0]; }
178
+ if (region.hasClass('ge-section')) { return node.hasClass('row'); }
179
+
180
+ return true;
181
+ },
182
+
183
+ toolbar: [{
184
+ labelKey: 'section.add',
185
+ kind: 'section',
186
+ create: function() { return createSection(); },
187
+ }],
188
+
189
+ onInit: mark,
190
+ onDeinit: unmark,
191
+ };
192
+
193
+ /** A section the toolbar just made, before init has marked it. */
194
+ function isSectionMade(node) {
195
+ return !node.parent().length && widthOf(node) !== null;
196
+ }
197
+ };
198
+
199
+ })(jQuery);
@@ -0,0 +1,2 @@
1
+ (c=>{c.extend(c.fn.gridEditor.locales.en,{"section.add":"Section","section.width":"Width","section.fixed":"Fixed","section.fluid":"Full width","section.from":"Fixed from {breakpoint}","tool.add_row_to_section":"Add row","tool.delete_section":"Remove section","confirm.delete_section":"Delete this section and everything in it?"});var r={fixed:"container",fluid:"container-fluid",sm:"container-sm",md:"container-md",lg:"container-lg",xl:"container-xl",xxl:"container-xxl"},l=["fixed","sm","md","lg","xl","xxl","fluid"];c.fn.gridEditor.features.sections=function(s){var o=c.extend({widths:l},s.settings.sections);function a(n){var i=null;return c.each(r,function(e,t){!i&&n.hasClass(t)&&(i=e)}),i}function e(){return s.canvas.children().filter(function(){return(e=c(this)).parent()[0]===s.canvas[0]&&null!==a(e);var e})}function n(e){var t=c("<select />"),n=a(e),i=-1===o.widths.indexOf(n)?o.widths.concat([n]):o.widths;return l.forEach(function(e){-1!==i.indexOf(e)&&c("<option />").attr("value",e).text("fixed"===(e=e)?s.t("section.fixed"):"fluid"===e?s.t("section.fluid"):s.t("section.from",{breakpoint:e})).appendTo(t)}),t.val(n).on("change",function(){var t,n,i,o;t=e,n=this.value,i="panel",(o=a(t))!==n&&r[n]&&s.operate(function(){var e=s.payloadFor("section",t,{family:"section",breakpoint:"all",tiers:[],from:o,to:n,source:i||"api"});return s.emit("before-utility",e)?(t.removeClass(r[o]).addClass(r[n]),s.emit("after-utility",e),!0):(t.find("> .ge-tools-drawer .ge-section-width select").val(o),!1)})}),c('<label class="ge-utility ge-section-width" />').append(c('<span class="ge-utility-label" />').text(s.t("section.width"))).append(t)}function t(e){e=e||{};var t=c("<div />").addClass(r[e.width]||r.fixed);return(e.rows||[[12]]).forEach(function(e){s.rowFromLayout(e).appendTo(t)}),s.place(t,"section",e)}return{methods:{createSection:t},kindOf:function(e){return e.hasClass("ge-section")?"section":null},blocks:".ge-section",regions:".ge-section",accepts:function(e,t){var n;return t.hasClass("ge-section")||!(n=t).parent().length&&null!==a(n)?e[0]===s.canvas[0]:!e.hasClass("ge-section")||t.hasClass("row")},toolbar:[{labelKey:"section.add",kind:"section",create:function(){return t()}}],onInit:function(){e().each(function(){var t,e=c(this).addClass("ge-section");e.children(".ge-tools-drawer").length||(t=e,e=c('<div class="ge-tools-drawer ge-section-drawer" />').prependTo(t),s.createMoveTool(e),s.addSettingsTool(e,t,s.settings.section_classes||[]).append(n(t)),s.createTool(e,s.t("tool.add_row_to_section"),"ge-add-row","bi bi-plus-circle",function(){s.place(s.rowFromLayout([12]),"row",{appendTo:t})}),s.createTool(e,s.t("tool.delete_section"),"ge-delete-section","bi bi-trash",function(){s.deleteNode("section",t,s.t("confirm.delete_section"),function(e){t.slideUp(e)})}))})},onDeinit:function(){s.canvas.children(".ge-section").removeClass("ge-section")}}}})(jQuery);
2
+ //# sourceMappingURL=grideditor.sections.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grideditor.sections.min.js","sources":["../../src/js/plugins/grideditor.sections.js"],"names":["$","extend","fn","gridEditor","locales","en","section.add","section.width","section.fixed","section.fluid","section.from","tool.add_row_to_section","tool.delete_section","confirm.delete_section","WIDTHS","fixed","fluid","sm","md","lg","xl","xxl","ORDER","features","sections","ge","options","widths","settings","widthOf","section","found","each","width","className","hasClass","canvas","children","filter","node","this","parent","widthField","select","current","offered","indexOf","concat","forEach","attr","text","t","breakpoint","appendTo","val","on","source","from","value","operate","payload","payloadFor","family","tiers","to","emit","removeClass","addClass","find","append","createSection","rows","layout","rowFromLayout","place","methods","kindOf","blocks","regions","accepts","region","length","toolbar","labelKey","kind","create","onInit","drawer","prependTo","createMoveTool","addSettingsTool","section_classes","createTool","deleteNode","removed","slideUp","onDeinit","jQuery"],"mappings":"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"}