@themarioga/grid-editor 9.0.0-beta.2 → 9.0.0-beta.4

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 (43) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +76 -8
  3. package/dist/grideditor.bundle.min.js +2 -2
  4. package/dist/grideditor.css +187 -0
  5. package/dist/grideditor.d.ts +75 -0
  6. package/dist/grideditor.esm.js +38 -11
  7. package/dist/grideditor.js +38 -11
  8. package/dist/grideditor.min.css +1 -1
  9. package/dist/grideditor.min.css.map +1 -1
  10. package/dist/grideditor.min.js +1 -1
  11. package/dist/grideditor.min.js.map +3 -3
  12. package/dist/locales/grideditor.es.esm.js +22 -0
  13. package/dist/locales/grideditor.es.js +22 -0
  14. package/dist/locales/grideditor.es.min.js +2 -2
  15. package/dist/locales/grideditor.es.min.js.map +2 -2
  16. package/dist/plugins/grideditor.history.esm.js +360 -0
  17. package/dist/plugins/grideditor.history.js +365 -0
  18. package/dist/plugins/grideditor.history.min.js +1 -0
  19. package/dist/plugins/grideditor.history.min.js.map +7 -0
  20. package/dist/plugins/grideditor.offcanvas.esm.js +551 -0
  21. package/dist/plugins/grideditor.offcanvas.js +556 -0
  22. package/dist/plugins/grideditor.offcanvas.min.js +1 -0
  23. package/dist/plugins/grideditor.offcanvas.min.js.map +7 -0
  24. package/dist/plugins/grideditor.popup.esm.js +90 -37
  25. package/dist/plugins/grideditor.popup.js +90 -37
  26. package/dist/plugins/grideditor.popup.min.js +1 -1
  27. package/dist/plugins/grideditor.popup.min.js.map +4 -4
  28. package/docs/events.md +7 -3
  29. package/docs/locale-keys.md +32 -1
  30. package/docs/plugins.md +19 -5
  31. package/example/clipboard.html +22 -0
  32. package/example/containers.html +22 -4
  33. package/example/history.html +94 -0
  34. package/example/index.html +9 -1
  35. package/package.json +1 -1
  36. package/src/js/grideditor.js +37 -9
  37. package/src/js/locales/grideditor.es.js +22 -0
  38. package/src/js/plugins/grideditor.history.js +367 -0
  39. package/src/js/plugins/grideditor.offcanvas.js +420 -0
  40. package/src/js/plugins/grideditor.popup.js +8 -70
  41. package/src/js/triggers/triggers.js +121 -0
  42. package/src/less/grideditor.less +60 -0
  43. package/types/grideditor.d.ts +75 -0
@@ -0,0 +1,556 @@
1
+ (() => {
2
+ // src/js/register.js
3
+ var GridEditor = window.GridEditor;
4
+ if (!GridEditor || typeof GridEditor.get !== "function") {
5
+ throw new Error("grid-editor: load grideditor.js (or grideditor.bundle.min.js) before its plugins, its locales and grideditor.jquery.js");
6
+ }
7
+
8
+ // src/js/dom.js
9
+ function all(root, selector) {
10
+ return root ? Array.prototype.slice.call(root.querySelectorAll(selector)) : [];
11
+ }
12
+ function children(node, selector) {
13
+ if (!node) {
14
+ return [];
15
+ }
16
+ return Array.prototype.filter.call(node.children, function(each) {
17
+ return !selector || each.matches(selector);
18
+ });
19
+ }
20
+ function child(node, selector) {
21
+ return children(node, selector)[0] || null;
22
+ }
23
+ function closest(node, selector, stopAt) {
24
+ var found = node && node.nodeType === 1 ? node.closest(selector) : null;
25
+ if (found && stopAt && found !== stopAt && !stopAt.contains(found)) {
26
+ return null;
27
+ }
28
+ return found;
29
+ }
30
+ function parse(html) {
31
+ var template = document.createElement("template");
32
+ template.innerHTML = html;
33
+ return Array.prototype.slice.call(template.content.childNodes);
34
+ }
35
+ function create(html) {
36
+ var nodes = parse(html.trim());
37
+ for (var i = 0; i < nodes.length; i++) {
38
+ if (nodes[i].nodeType === 1) {
39
+ return nodes[i];
40
+ }
41
+ }
42
+ return null;
43
+ }
44
+ function element(tag, attributes, text) {
45
+ var node = document.createElement(tag);
46
+ Object.keys(attributes || {}).forEach(function(name) {
47
+ var value = attributes[name];
48
+ if (value !== null && value !== void 0 && value !== false) {
49
+ node.setAttribute(name, value);
50
+ }
51
+ });
52
+ if (text !== void 0 && text !== null) {
53
+ node.textContent = text;
54
+ }
55
+ return node;
56
+ }
57
+ function addClass(node, names) {
58
+ split(names).forEach(function(name) {
59
+ node.classList.add(name);
60
+ });
61
+ return node;
62
+ }
63
+ function removeClass(node, names) {
64
+ split(names).forEach(function(name) {
65
+ node.classList.remove(name);
66
+ });
67
+ return node;
68
+ }
69
+ function toggleClass(node, names, state) {
70
+ split(names).forEach(function(name) {
71
+ if (state === void 0) {
72
+ node.classList.toggle(name);
73
+ } else {
74
+ node.classList.toggle(name, !!state);
75
+ }
76
+ });
77
+ return node;
78
+ }
79
+ function hasClass(node, name) {
80
+ return !!node && node.nodeType === 1 && node.classList.contains(name);
81
+ }
82
+ function split(names) {
83
+ return String(names || "").split(/\s+/).filter(Boolean);
84
+ }
85
+ function dropEmptyClass(node) {
86
+ if (!node.getAttribute("class")) {
87
+ node.removeAttribute("class");
88
+ }
89
+ return node;
90
+ }
91
+ function delegate(root, types, selector, handler, options) {
92
+ var listener = function(event) {
93
+ var match = closest(event.target, selector, root);
94
+ if (match && root.contains(match)) {
95
+ return handler.call(match, event);
96
+ }
97
+ return void 0;
98
+ };
99
+ split(types).forEach(function(type) {
100
+ root.addEventListener(type, listener, options);
101
+ });
102
+ return listener;
103
+ }
104
+
105
+ // src/js/triggers/triggers.js
106
+ function triggersFor(ge, kind, idAttribute, targetAttribute, toggle) {
107
+ var triggerClass = "ge-" + kind + "-trigger";
108
+ var orphanClass = "ge-" + kind + "-orphan";
109
+ var listening = null;
110
+ function idOf(container) {
111
+ return container.getAttribute(idAttribute);
112
+ }
113
+ function exists(id, root) {
114
+ return all(root || ge.canvas, "[" + idAttribute + "]").some(function(container) {
115
+ return idOf(container) === id;
116
+ });
117
+ }
118
+ function wire() {
119
+ all(ge.canvas, "[" + targetAttribute + "]").forEach(function(trigger) {
120
+ addClass(trigger, triggerClass);
121
+ var wanted = trigger.getAttribute(targetAttribute);
122
+ trigger.removeAttribute("data-bs-toggle");
123
+ trigger.removeAttribute("data-bs-target");
124
+ if (exists(wanted)) {
125
+ removeClass(trigger, orphanClass);
126
+ return;
127
+ }
128
+ var column = trigger.closest(".column");
129
+ var nearby = column ? all(column, "[" + idAttribute + "]") : [];
130
+ if (nearby.length === 1) {
131
+ trigger.setAttribute(targetAttribute, idOf(nearby[0]));
132
+ removeClass(trigger, orphanClass);
133
+ return;
134
+ }
135
+ addClass(trigger, orphanClass);
136
+ ge.operate(function() {
137
+ ge.emit(kind + "-orphan", ge.payloadFor(kind, trigger, {
138
+ parent: trigger.parentElement,
139
+ source: "api",
140
+ missing: wanted
141
+ }));
142
+ });
143
+ });
144
+ }
145
+ function write(root) {
146
+ root = root || ge.canvas;
147
+ all(root, "[" + targetAttribute + "]").forEach(function(trigger) {
148
+ var wanted = trigger.getAttribute(targetAttribute);
149
+ removeClass(trigger, orphanClass);
150
+ dropEmptyClass(trigger);
151
+ if (!exists(wanted, root)) {
152
+ return;
153
+ }
154
+ trigger.setAttribute("data-bs-toggle", toggle);
155
+ trigger.setAttribute("data-bs-target", "#" + wanted);
156
+ });
157
+ }
158
+ return {
159
+ write,
160
+ // Triggers are markup the host owns, anywhere in the canvas, so they
161
+ // are looked at whenever the canvas is initialized rather than only
162
+ // when a container is touched
163
+ onInit: function() {
164
+ wire();
165
+ if (listening) {
166
+ listening.abort();
167
+ }
168
+ listening = new AbortController();
169
+ delegate(ge.canvas, "click", "." + triggerClass + ", [" + targetAttribute + "]", function(e) {
170
+ if (hasClass(ge.canvas, "ge-editing")) {
171
+ e.preventDefault();
172
+ }
173
+ }, { signal: listening.signal });
174
+ },
175
+ onDeinit: function() {
176
+ if (listening) {
177
+ listening.abort();
178
+ }
179
+ listening = null;
180
+ write();
181
+ }
182
+ };
183
+ }
184
+
185
+ // src/js/plugins/grideditor.offcanvas.js
186
+ Object.assign(GridEditor.locales.en, {
187
+ "container.add_offcanvas": "Offcanvas",
188
+ "container.offcanvas_title": "Title",
189
+ "container.offcanvas_trigger": "Open",
190
+ "tool.toggle_offcanvas": "Fold this offcanvas away while editing",
191
+ "container.offcanvas_section": "Offcanvas",
192
+ "container.offcanvas_placement": "Placement",
193
+ "container.offcanvas_start": "Start",
194
+ "container.offcanvas_end": "End",
195
+ "container.offcanvas_top": "Top",
196
+ "container.offcanvas_bottom": "Bottom",
197
+ "container.offcanvas_backdrop": "Backdrop",
198
+ "container.offcanvas_backdrop_yes": "Yes",
199
+ "container.offcanvas_backdrop_no": "No",
200
+ "container.offcanvas_backdrop_static": "Static",
201
+ "container.offcanvas_scroll": "Allow body scroll",
202
+ "container.offcanvas_keyboard": "Close with Esc",
203
+ "container.offcanvas_responsive": "Responsive",
204
+ "container.offcanvas_responsive_never": "Always offcanvas",
205
+ "container.offcanvas_responsive_from": "Inline from {breakpoint}",
206
+ "container.offcanvas_dark": "Dark theme"
207
+ });
208
+ var DEFAULTS = {
209
+ placement: "start",
210
+ backdrop: true,
211
+ scroll: false,
212
+ keyboard: true,
213
+ responsive: null,
214
+ dark: false
215
+ };
216
+ var KEYS = ["placement", "backdrop", "scroll", "keyboard", "responsive", "dark"];
217
+ var PLACEMENTS = ["start", "end", "top", "bottom"];
218
+ var BACKDROPS = [true, false, "static"];
219
+ var LABELS = {
220
+ placement: { labelKey: "container.offcanvas_placement" },
221
+ backdrop: { labelKey: "container.offcanvas_backdrop" },
222
+ responsive: { labelKey: "container.offcanvas_responsive" },
223
+ scroll: { labelKey: "container.offcanvas_scroll" },
224
+ keyboard: { labelKey: "container.offcanvas_keyboard" },
225
+ dark: { labelKey: "container.offcanvas_dark" }
226
+ };
227
+ var PLACEMENT_CHOICES = [
228
+ { value: "start", labelKey: "container.offcanvas_start" },
229
+ { value: "end", labelKey: "container.offcanvas_end" },
230
+ { value: "top", labelKey: "container.offcanvas_top" },
231
+ { value: "bottom", labelKey: "container.offcanvas_bottom" }
232
+ ];
233
+ var BACKDROP_CHOICES = [
234
+ { value: "true", labelKey: "container.offcanvas_backdrop_yes" },
235
+ { value: "false", labelKey: "container.offcanvas_backdrop_no" },
236
+ { value: "static", labelKey: "container.offcanvas_backdrop_static" }
237
+ ];
238
+ var fieldCounter = 0;
239
+ GridEditor.containers.offcanvas = function(ge) {
240
+ var RESPONSIVE = ge.breakpoints.filter(function(key) {
241
+ return key !== "xs";
242
+ });
243
+ var sections = [];
244
+ var triggers = triggersFor(ge, "offcanvas", "data-ge-offcanvas-id", "data-ge-offcanvas-target", "offcanvas");
245
+ var CHECKS = {
246
+ placement: function(value) {
247
+ return PLACEMENTS.indexOf(value) !== -1;
248
+ },
249
+ backdrop: function(value) {
250
+ return BACKDROPS.indexOf(value) !== -1;
251
+ },
252
+ responsive: function(value) {
253
+ return value === null || RESPONSIVE.indexOf(value) !== -1;
254
+ }
255
+ };
256
+ function isValid(key, value) {
257
+ return CHECKS[key] ? CHECKS[key](value) : typeof value === "boolean";
258
+ }
259
+ function takes(key) {
260
+ if (key === "placement") {
261
+ return JSON.stringify(PLACEMENTS);
262
+ }
263
+ if (key === "backdrop") {
264
+ return JSON.stringify(BACKDROPS);
265
+ }
266
+ if (key === "responsive") {
267
+ return JSON.stringify([null].concat(RESPONSIVE));
268
+ }
269
+ return "[true,false]";
270
+ }
271
+ function chosen(options, key) {
272
+ var setting = ge.settings.offcanvas || {};
273
+ var value = options[key] !== void 0 ? options[key] : setting[key];
274
+ if (value === void 0) {
275
+ return DEFAULTS[key];
276
+ }
277
+ if (isValid(key, value)) {
278
+ return value;
279
+ }
280
+ ge.warn("offcanvas: " + JSON.stringify(value) + " is not a " + key + ", which takes " + takes(key) + ": " + JSON.stringify(DEFAULTS[key]) + " is used");
281
+ return DEFAULTS[key];
282
+ }
283
+ function isPanelClass(name) {
284
+ return name === "offcanvas" || /^offcanvas-/.test(name) && RESPONSIVE.indexOf(name.slice(10)) !== -1;
285
+ }
286
+ function isPanel(node) {
287
+ return Array.prototype.some.call(node.classList, isPanelClass);
288
+ }
289
+ function panelOf(container) {
290
+ var id = container.getAttribute("data-ge-offcanvas-id");
291
+ var own = children(container);
292
+ return own.filter(function(node) {
293
+ return id && node.id === id;
294
+ })[0] || own.filter(isPanel)[0] || null;
295
+ }
296
+ function triggerOf(container) {
297
+ return child(container, "[data-ge-offcanvas-target]");
298
+ }
299
+ function dropTriggerMarks(root) {
300
+ all(root, ".ge-offcanvas-trigger").forEach(function(trigger) {
301
+ removeClass(trigger, "ge-offcanvas-trigger");
302
+ dropEmptyClass(trigger);
303
+ });
304
+ }
305
+ function hideClass(responsive) {
306
+ return "d-" + responsive + "-none";
307
+ }
308
+ function read(container) {
309
+ var panel = panelOf(container);
310
+ var backdrop = panel.getAttribute("data-bs-backdrop");
311
+ var responsive = null;
312
+ Array.prototype.forEach.call(panel.classList, function(name) {
313
+ if (name !== "offcanvas" && isPanelClass(name)) {
314
+ responsive = name.slice(10);
315
+ }
316
+ });
317
+ return {
318
+ placement: PLACEMENTS.filter(function(place) {
319
+ return hasClass(panel, "offcanvas-" + place);
320
+ })[0] || "start",
321
+ backdrop: backdrop === "false" ? false : backdrop === "static" ? "static" : true,
322
+ scroll: panel.getAttribute("data-bs-scroll") === "true",
323
+ keyboard: panel.getAttribute("data-bs-keyboard") !== "false",
324
+ responsive,
325
+ dark: panel.getAttribute("data-bs-theme") === "dark"
326
+ };
327
+ }
328
+ function setAttribute(panel, name, value) {
329
+ if (value === null) {
330
+ panel.removeAttribute(name);
331
+ } else {
332
+ panel.setAttribute(name, value);
333
+ }
334
+ }
335
+ function write(container, key, value) {
336
+ var panel = panelOf(container);
337
+ if (key === "placement") {
338
+ PLACEMENTS.forEach(function(place) {
339
+ removeClass(panel, "offcanvas-" + place);
340
+ });
341
+ addClass(panel, "offcanvas-" + value);
342
+ }
343
+ if (key === "backdrop") {
344
+ setAttribute(panel, "data-bs-backdrop", value === true ? null : String(value));
345
+ }
346
+ if (key === "scroll") {
347
+ setAttribute(panel, "data-bs-scroll", value ? "true" : null);
348
+ }
349
+ if (key === "keyboard") {
350
+ setAttribute(panel, "data-bs-keyboard", value ? null : "false");
351
+ }
352
+ if (key === "responsive") {
353
+ var before = read(container).responsive;
354
+ var trigger = triggerOf(container);
355
+ var rest = Array.prototype.filter.call(panel.classList, function(name) {
356
+ return !isPanelClass(name);
357
+ });
358
+ panel.className = [value === null ? "offcanvas" : "offcanvas-" + value].concat(rest).join(" ");
359
+ if (trigger) {
360
+ if (before !== null) {
361
+ removeClass(trigger, hideClass(before));
362
+ }
363
+ if (value !== null) {
364
+ addClass(trigger, hideClass(value));
365
+ }
366
+ dropEmptyClass(trigger);
367
+ }
368
+ }
369
+ if (key === "dark") {
370
+ if (value) {
371
+ panel.setAttribute("data-bs-theme", "dark");
372
+ } else if (panel.getAttribute("data-bs-theme") === "dark") {
373
+ panel.removeAttribute("data-bs-theme");
374
+ }
375
+ }
376
+ }
377
+ function nextId() {
378
+ return "ge-offcanvas-option-" + ++fieldCounter;
379
+ }
380
+ function field(labelKey, control, id) {
381
+ var box = element("div", { "class": "ge-offcanvas-option mb-2" });
382
+ box.appendChild(element("label", { "class": "form-label", "for": id }, ge.t(labelKey)));
383
+ box.appendChild(control);
384
+ return box;
385
+ }
386
+ function checkbox(labelKey, onChange) {
387
+ var id = nextId();
388
+ var box = element("div", { "class": "form-check" });
389
+ var input = box.appendChild(element("input", { "class": "form-check-input", type: "checkbox", id }));
390
+ box.appendChild(element("label", { "class": "form-check-label", "for": id }, ge.t(labelKey)));
391
+ input.addEventListener("change", function() {
392
+ onChange(input.checked);
393
+ });
394
+ return { box, input };
395
+ }
396
+ function select(choices, onChange) {
397
+ var id = nextId();
398
+ var control = element("select", { "class": "form-select form-select-sm", id });
399
+ choices.forEach(function(choice) {
400
+ control.appendChild(element("option", { value: choice.value }, choice.label));
401
+ });
402
+ control.addEventListener("change", function() {
403
+ onChange(control.value);
404
+ });
405
+ return { id, control };
406
+ }
407
+ function createSection(container) {
408
+ var body = element("div", { "class": "ge-offcanvas-options" });
409
+ function change(key, value) {
410
+ write(container, key, value);
411
+ render();
412
+ }
413
+ var translated = function(choice) {
414
+ return { value: choice.value, label: ge.t(choice.labelKey) };
415
+ };
416
+ var selects = {
417
+ placement: select(PLACEMENT_CHOICES.map(translated), function(value) {
418
+ change("placement", value);
419
+ }),
420
+ backdrop: select(BACKDROP_CHOICES.map(translated), function(value) {
421
+ change("backdrop", value === "static" ? "static" : value === "true");
422
+ }),
423
+ responsive: select([{ value: "", label: ge.t("container.offcanvas_responsive_never") }].concat(
424
+ RESPONSIVE.map(function(key) {
425
+ return { value: key, label: ge.t("container.offcanvas_responsive_from", { breakpoint: key }) };
426
+ })
427
+ ), function(value) {
428
+ change("responsive", value === "" ? null : value);
429
+ })
430
+ };
431
+ Object.keys(selects).forEach(function(key) {
432
+ var box = field(LABELS[key].labelKey, selects[key].control, selects[key].id);
433
+ box.setAttribute("data-ge-offcanvas-option", key);
434
+ body.appendChild(box);
435
+ });
436
+ var inputs = {};
437
+ ["scroll", "keyboard", "dark"].forEach(function(key) {
438
+ var each = checkbox(LABELS[key].labelKey, function(on) {
439
+ change(key, on);
440
+ });
441
+ inputs[key] = each.input;
442
+ each.box.setAttribute("data-ge-offcanvas-option", key);
443
+ body.appendChild(each.box);
444
+ });
445
+ function render() {
446
+ var values = read(container);
447
+ selects.placement.control.value = values.placement;
448
+ selects.backdrop.control.value = String(values.backdrop);
449
+ selects.responsive.control.value = values.responsive === null ? "" : values.responsive;
450
+ Object.keys(inputs).forEach(function(key) {
451
+ inputs[key].checked = values[key];
452
+ });
453
+ }
454
+ render();
455
+ sections.push({ node: container, element: body, render });
456
+ return body;
457
+ }
458
+ return {
459
+ labelKey: "container.add_offcanvas",
460
+ paneKind: "offcanvas",
461
+ // The ids a copy of an offcanvas has to rename together
462
+ references: ["data-ge-offcanvas-id", "data-ge-offcanvas-target"],
463
+ onInit: triggers.onInit,
464
+ onDeinit: function() {
465
+ sections = [];
466
+ triggers.onDeinit();
467
+ dropTriggerMarks(ge.canvas);
468
+ },
469
+ // What onDeinit and unmark do, on a copy of the canvas
470
+ cleanMarkup: function(root) {
471
+ var definition = this;
472
+ triggers.write(root);
473
+ dropTriggerMarks(root);
474
+ all(root, '[data-ge-container="offcanvas"]').forEach(function(container) {
475
+ definition.unmark(container);
476
+ });
477
+ },
478
+ create: function(options) {
479
+ options = options || {};
480
+ var id = ge.containerId("offcanvas");
481
+ var container = element("div", { "data-ge-container": "offcanvas", "data-ge-offcanvas-id": id });
482
+ if (options.trigger !== false) {
483
+ container.appendChild(element("button", {
484
+ type: "button",
485
+ "class": "btn btn-primary ge-offcanvas-trigger",
486
+ "data-ge-offcanvas-target": id
487
+ }, options.trigger_label || ge.t("container.offcanvas_trigger")));
488
+ }
489
+ var panel = container.appendChild(element("div", {
490
+ "class": "offcanvas",
491
+ tabindex: "-1",
492
+ id,
493
+ "aria-labelledby": id + "-label"
494
+ }));
495
+ var header = panel.appendChild(element("div", { "class": "offcanvas-header" }));
496
+ header.appendChild(element("h5", { "class": "offcanvas-title", id: id + "-label" })).appendChild(element(
497
+ "span",
498
+ { "class": "ge-pane-label" },
499
+ options.title || ge.t("container.offcanvas_title")
500
+ ));
501
+ header.appendChild(create('<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>'));
502
+ panel.appendChild(element("div", { "class": "offcanvas-body" })).appendChild(ge.defaultRegion());
503
+ KEYS.forEach(function(key) {
504
+ write(container, key, chosen(options, key));
505
+ });
506
+ return container;
507
+ },
508
+ mark: function(container) {
509
+ var header = child(panelOf(container), ".offcanvas-header");
510
+ all(header, "[data-bs-dismiss]").forEach(function(dismiss) {
511
+ ge.suspendToggles(dismiss);
512
+ });
513
+ all(header, ".offcanvas-title").forEach(function(title) {
514
+ ge.makeLabelEditable(ge.labelIn(title));
515
+ });
516
+ },
517
+ unmark: function(container) {
518
+ var header = child(panelOf(container), ".offcanvas-header");
519
+ if (header) {
520
+ ge.resumeToggles(header);
521
+ ge.unwrapLabels(header);
522
+ }
523
+ removeClass(container, "ge-offcanvas-collapsed");
524
+ },
525
+ /** A page of unfolded panels stays workable if they can be folded away. */
526
+ tools: function(drawer, container) {
527
+ ge.createTool(
528
+ drawer,
529
+ ge.t("tool.toggle_offcanvas"),
530
+ "ge-toggle-offcanvas",
531
+ "bi bi-chevron-bar-contract",
532
+ function() {
533
+ toggleClass(container, "ge-offcanvas-collapsed");
534
+ }
535
+ );
536
+ },
537
+ panelSection: function(node, kind) {
538
+ if (kind === "offcanvas" && panelOf(node)) {
539
+ return { labelKey: "container.offcanvas_section", body: createSection(node) };
540
+ }
541
+ return null;
542
+ },
543
+ // After a view change or a change of classes: the sections follow
544
+ onRefresh: function(scope) {
545
+ sections = sections.filter(function(entry) {
546
+ return entry.element.isConnected;
547
+ });
548
+ sections.forEach(function(entry) {
549
+ if (entry.node === scope || scope.contains(entry.node)) {
550
+ entry.render();
551
+ }
552
+ });
553
+ }
554
+ };
555
+ };
556
+ })();
@@ -0,0 +1 @@
1
+ (()=>{var S=window.GridEditor;if(!S||typeof S.get!="function")throw new Error("grid-editor: load grideditor.js (or grideditor.bundle.min.js) before its plugins, its locales and grideditor.jquery.js");function y(n,o){return n?Array.prototype.slice.call(n.querySelectorAll(o)):[]}function P(n,o){return n?Array.prototype.filter.call(n.children,function(f){return!o||f.matches(o)}):[]}function K(n,o){return P(n,o)[0]||null}function Q(n,o,f){var l=n&&n.nodeType===1?n.closest(o):null;return l&&f&&l!==f&&!f.contains(l)?null:l}function Z(n){var o=document.createElement("template");return o.innerHTML=n,Array.prototype.slice.call(o.content.childNodes)}function F(n){for(var o=Z(n.trim()),f=0;f<o.length;f++)if(o[f].nodeType===1)return o[f];return null}function u(n,o,f){var l=document.createElement(n);return Object.keys(o||{}).forEach(function(x){var v=o[x];v!=null&&v!==!1&&l.setAttribute(x,v)}),f!=null&&(l.textContent=f),l}function A(n,o){return N(o).forEach(function(f){n.classList.add(f)}),n}function C(n,o){return N(o).forEach(function(f){n.classList.remove(f)}),n}function M(n,o,f){return N(o).forEach(function(l){f===void 0?n.classList.toggle(l):n.classList.toggle(l,!!f)}),n}function B(n,o){return!!n&&n.nodeType===1&&n.classList.contains(o)}function N(n){return String(n||"").split(/\s+/).filter(Boolean)}function O(n){return n.getAttribute("class")||n.removeAttribute("class"),n}function U(n,o,f,l,x){var v=function(m){var d=Q(m.target,f,n);if(d&&n.contains(d))return l.call(d,m)};return N(o).forEach(function(m){n.addEventListener(m,v,x)}),v}function q(n,o,f,l,x){var v="ge-"+o+"-trigger",m="ge-"+o+"-orphan",d=null;function _(c){return c.getAttribute(f)}function T(c,p){return y(p||n.canvas,"["+f+"]").some(function(g){return _(g)===c})}function E(){y(n.canvas,"["+l+"]").forEach(function(c){A(c,v);var p=c.getAttribute(l);if(c.removeAttribute("data-bs-toggle"),c.removeAttribute("data-bs-target"),T(p)){C(c,m);return}var g=c.closest(".column"),k=g?y(g,"["+f+"]"):[];if(k.length===1){c.setAttribute(l,_(k[0])),C(c,m);return}A(c,m),n.operate(function(){n.emit(o+"-orphan",n.payloadFor(o,c,{parent:c.parentElement,source:"api",missing:p}))})})}function L(c){c=c||n.canvas,y(c,"["+l+"]").forEach(function(p){var g=p.getAttribute(l);C(p,m),O(p),T(g,c)&&(p.setAttribute("data-bs-toggle",x),p.setAttribute("data-bs-target","#"+g))})}return{write:L,onInit:function(){E(),d&&d.abort(),d=new AbortController,U(n.canvas,"click","."+v+", ["+l+"]",function(c){B(n.canvas,"ge-editing")&&c.preventDefault()},{signal:d.signal})},onDeinit:function(){d&&d.abort(),d=null,L()}}}Object.assign(S.locales.en,{"container.add_offcanvas":"Offcanvas","container.offcanvas_title":"Title","container.offcanvas_trigger":"Open","tool.toggle_offcanvas":"Fold this offcanvas away while editing","container.offcanvas_section":"Offcanvas","container.offcanvas_placement":"Placement","container.offcanvas_start":"Start","container.offcanvas_end":"End","container.offcanvas_top":"Top","container.offcanvas_bottom":"Bottom","container.offcanvas_backdrop":"Backdrop","container.offcanvas_backdrop_yes":"Yes","container.offcanvas_backdrop_no":"No","container.offcanvas_backdrop_static":"Static","container.offcanvas_scroll":"Allow body scroll","container.offcanvas_keyboard":"Close with Esc","container.offcanvas_responsive":"Responsive","container.offcanvas_responsive_never":"Always offcanvas","container.offcanvas_responsive_from":"Inline from {breakpoint}","container.offcanvas_dark":"Dark theme"});var j={placement:"start",backdrop:!0,scroll:!1,keyboard:!0,responsive:null,dark:!1},$=["placement","backdrop","scroll","keyboard","responsive","dark"],I=["start","end","top","bottom"],G=[!0,!1,"static"],Y={placement:{labelKey:"container.offcanvas_placement"},backdrop:{labelKey:"container.offcanvas_backdrop"},responsive:{labelKey:"container.offcanvas_responsive"},scroll:{labelKey:"container.offcanvas_scroll"},keyboard:{labelKey:"container.offcanvas_keyboard"},dark:{labelKey:"container.offcanvas_dark"}},ee=[{value:"start",labelKey:"container.offcanvas_start"},{value:"end",labelKey:"container.offcanvas_end"},{value:"top",labelKey:"container.offcanvas_top"},{value:"bottom",labelKey:"container.offcanvas_bottom"}],ne=[{value:"true",labelKey:"container.offcanvas_backdrop_yes"},{value:"false",labelKey:"container.offcanvas_backdrop_no"},{value:"static",labelKey:"container.offcanvas_backdrop_static"}],te=0;S.containers.offcanvas=function(n){var o=n.breakpoints.filter(function(e){return e!=="xs"}),f=[],l=q(n,"offcanvas","data-ge-offcanvas-id","data-ge-offcanvas-target","offcanvas"),x={placement:function(e){return I.indexOf(e)!==-1},backdrop:function(e){return G.indexOf(e)!==-1},responsive:function(e){return e===null||o.indexOf(e)!==-1}};function v(e,t){return x[e]?x[e](t):typeof t=="boolean"}function m(e){return e==="placement"?JSON.stringify(I):e==="backdrop"?JSON.stringify(G):e==="responsive"?JSON.stringify([null].concat(o)):"[true,false]"}function d(e,t){var a=n.settings.offcanvas||{},r=e[t]!==void 0?e[t]:a[t];return r===void 0?j[t]:v(t,r)?r:(n.warn("offcanvas: "+JSON.stringify(r)+" is not a "+t+", which takes "+m(t)+": "+JSON.stringify(j[t])+" is used"),j[t])}function _(e){return e==="offcanvas"||/^offcanvas-/.test(e)&&o.indexOf(e.slice(10))!==-1}function T(e){return Array.prototype.some.call(e.classList,_)}function E(e){var t=e.getAttribute("data-ge-offcanvas-id"),a=P(e);return a.filter(function(r){return t&&r.id===t})[0]||a.filter(T)[0]||null}function L(e){return K(e,"[data-ge-offcanvas-target]")}function c(e){y(e,".ge-offcanvas-trigger").forEach(function(t){C(t,"ge-offcanvas-trigger"),O(t)})}function p(e){return"d-"+e+"-none"}function g(e){var t=E(e),a=t.getAttribute("data-bs-backdrop"),r=null;return Array.prototype.forEach.call(t.classList,function(s){s!=="offcanvas"&&_(s)&&(r=s.slice(10))}),{placement:I.filter(function(s){return B(t,"offcanvas-"+s)})[0]||"start",backdrop:a==="false"?!1:a==="static"?"static":!0,scroll:t.getAttribute("data-bs-scroll")==="true",keyboard:t.getAttribute("data-bs-keyboard")!=="false",responsive:r,dark:t.getAttribute("data-bs-theme")==="dark"}}function k(e,t,a){a===null?e.removeAttribute(t):e.setAttribute(t,a)}function R(e,t,a){var r=E(e);if(t==="placement"&&(I.forEach(function(i){C(r,"offcanvas-"+i)}),A(r,"offcanvas-"+a)),t==="backdrop"&&k(r,"data-bs-backdrop",a===!0?null:String(a)),t==="scroll"&&k(r,"data-bs-scroll",a?"true":null),t==="keyboard"&&k(r,"data-bs-keyboard",a?null:"false"),t==="responsive"){var s=g(e).responsive,b=L(e),w=Array.prototype.filter.call(r.classList,function(i){return!_(i)});r.className=[a===null?"offcanvas":"offcanvas-"+a].concat(w).join(" "),b&&(s!==null&&C(b,p(s)),a!==null&&A(b,p(a)),O(b))}t==="dark"&&(a?r.setAttribute("data-bs-theme","dark"):r.getAttribute("data-bs-theme")==="dark"&&r.removeAttribute("data-bs-theme"))}function H(){return"ge-offcanvas-option-"+ ++te}function V(e,t,a){var r=u("div",{class:"ge-offcanvas-option mb-2"});return r.appendChild(u("label",{class:"form-label",for:a},n.t(e))),r.appendChild(t),r}function W(e,t){var a=H(),r=u("div",{class:"form-check"}),s=r.appendChild(u("input",{class:"form-check-input",type:"checkbox",id:a}));return r.appendChild(u("label",{class:"form-check-label",for:a},n.t(e))),s.addEventListener("change",function(){t(s.checked)}),{box:r,input:s}}function D(e,t){var a=H(),r=u("select",{class:"form-select form-select-sm",id:a});return e.forEach(function(s){r.appendChild(u("option",{value:s.value},s.label))}),r.addEventListener("change",function(){t(r.value)}),{id:a,control:r}}function z(e){var t=u("div",{class:"ge-offcanvas-options"});function a(i,h){R(e,i,h),w()}var r=function(i){return{value:i.value,label:n.t(i.labelKey)}},s={placement:D(ee.map(r),function(i){a("placement",i)}),backdrop:D(ne.map(r),function(i){a("backdrop",i==="static"?"static":i==="true")}),responsive:D([{value:"",label:n.t("container.offcanvas_responsive_never")}].concat(o.map(function(i){return{value:i,label:n.t("container.offcanvas_responsive_from",{breakpoint:i})}})),function(i){a("responsive",i===""?null:i)})};Object.keys(s).forEach(function(i){var h=V(Y[i].labelKey,s[i].control,s[i].id);h.setAttribute("data-ge-offcanvas-option",i),t.appendChild(h)});var b={};["scroll","keyboard","dark"].forEach(function(i){var h=W(Y[i].labelKey,function(X){a(i,X)});b[i]=h.input,h.box.setAttribute("data-ge-offcanvas-option",i),t.appendChild(h.box)});function w(){var i=g(e);s.placement.control.value=i.placement,s.backdrop.control.value=String(i.backdrop),s.responsive.control.value=i.responsive===null?"":i.responsive,Object.keys(b).forEach(function(h){b[h].checked=i[h]})}return w(),f.push({node:e,element:t,render:w}),t}return{labelKey:"container.add_offcanvas",paneKind:"offcanvas",references:["data-ge-offcanvas-id","data-ge-offcanvas-target"],onInit:l.onInit,onDeinit:function(){f=[],l.onDeinit(),c(n.canvas)},cleanMarkup:function(e){var t=this;l.write(e),c(e),y(e,'[data-ge-container="offcanvas"]').forEach(function(a){t.unmark(a)})},create:function(e){e=e||{};var t=n.containerId("offcanvas"),a=u("div",{"data-ge-container":"offcanvas","data-ge-offcanvas-id":t});e.trigger!==!1&&a.appendChild(u("button",{type:"button",class:"btn btn-primary ge-offcanvas-trigger","data-ge-offcanvas-target":t},e.trigger_label||n.t("container.offcanvas_trigger")));var r=a.appendChild(u("div",{class:"offcanvas",tabindex:"-1",id:t,"aria-labelledby":t+"-label"})),s=r.appendChild(u("div",{class:"offcanvas-header"}));return s.appendChild(u("h5",{class:"offcanvas-title",id:t+"-label"})).appendChild(u("span",{class:"ge-pane-label"},e.title||n.t("container.offcanvas_title"))),s.appendChild(F('<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>')),r.appendChild(u("div",{class:"offcanvas-body"})).appendChild(n.defaultRegion()),$.forEach(function(b){R(a,b,d(e,b))}),a},mark:function(e){var t=K(E(e),".offcanvas-header");y(t,"[data-bs-dismiss]").forEach(function(a){n.suspendToggles(a)}),y(t,".offcanvas-title").forEach(function(a){n.makeLabelEditable(n.labelIn(a))})},unmark:function(e){var t=K(E(e),".offcanvas-header");t&&(n.resumeToggles(t),n.unwrapLabels(t)),C(e,"ge-offcanvas-collapsed")},tools:function(e,t){n.createTool(e,n.t("tool.toggle_offcanvas"),"ge-toggle-offcanvas","bi bi-chevron-bar-contract",function(){M(t,"ge-offcanvas-collapsed")})},panelSection:function(e,t){return t==="offcanvas"&&E(e)?{labelKey:"container.offcanvas_section",body:z(e)}:null},onRefresh:function(e){f=f.filter(function(t){return t.element.isConnected}),f.forEach(function(t){(t.node===e||e.contains(t.node))&&t.render()})}}};})();