@themarioga/grid-editor 8.0.0-beta.2 → 8.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 (55) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +16 -9
  3. package/UPGRADING.md +21 -11
  4. package/dist/grideditor.bundle.min.js +3 -3
  5. package/dist/grideditor.css +77 -35
  6. package/dist/grideditor.d.ts +29 -8
  7. package/dist/grideditor.esm.js +7 -1
  8. package/dist/grideditor.js +7 -1
  9. package/dist/grideditor.min.css +1 -1
  10. package/dist/grideditor.min.css.map +1 -1
  11. package/dist/grideditor.min.js +2 -2
  12. package/dist/grideditor.min.js.map +3 -3
  13. package/dist/locales/grideditor.es.esm.js +86 -68
  14. package/dist/locales/grideditor.es.js +86 -68
  15. package/dist/locales/grideditor.es.min.js +1 -1
  16. package/dist/locales/grideditor.es.min.js.map +2 -2
  17. package/dist/plugins/grideditor.alignment.min.js.map +1 -1
  18. package/dist/plugins/{grideditor.style.esm.js → grideditor.inline-style.esm.js} +184 -184
  19. package/dist/plugins/{grideditor.style.js → grideditor.inline-style.js} +182 -182
  20. package/dist/plugins/grideditor.inline-style.min.js +4 -0
  21. package/dist/plugins/grideditor.inline-style.min.js.map +7 -0
  22. package/dist/plugins/grideditor.tabs.esm.js +274 -6
  23. package/dist/plugins/grideditor.tabs.js +274 -6
  24. package/dist/plugins/grideditor.tabs.min.js +1 -1
  25. package/dist/plugins/grideditor.tabs.min.js.map +3 -3
  26. package/docs/locale-keys.md +97 -79
  27. package/docs/plugins.md +5 -5
  28. package/example/containers.html +64 -2
  29. package/example/index.html +6 -6
  30. package/example/{style.html → inline-style.html} +5 -5
  31. package/example/utilities.html +3 -3
  32. package/package.json +1 -1
  33. package/src/js/grideditor.js +8 -0
  34. package/src/js/{style → inline-style}/accordion.js +9 -9
  35. package/src/js/{style → inline-style}/catalog.js +6 -6
  36. package/src/js/{style → inline-style}/custom.js +4 -4
  37. package/src/js/{style → inline-style}/display.js +2 -2
  38. package/src/js/{style → inline-style}/drawerflow.js +1 -1
  39. package/src/js/{style → inline-style}/fields.js +25 -25
  40. package/src/js/{style → inline-style}/flex.js +2 -2
  41. package/src/js/{style → inline-style}/float.js +2 -2
  42. package/src/js/{style → inline-style}/options.js +5 -5
  43. package/src/js/{style → inline-style}/sections.js +50 -50
  44. package/src/js/{style → inline-style}/spacing.js +2 -2
  45. package/src/js/{style → inline-style}/sticky.js +2 -2
  46. package/src/js/{style → inline-style}/textalign.js +2 -2
  47. package/src/js/locales/grideditor.es.js +86 -68
  48. package/src/js/plugins/grideditor.alignment.js +1 -1
  49. package/src/js/plugins/grideditor.inline-style.js +185 -0
  50. package/src/js/plugins/grideditor.tabs.js +311 -5
  51. package/src/less/grideditor.less +71 -25
  52. package/types/grideditor.d.ts +29 -8
  53. package/dist/plugins/grideditor.style.min.js +0 -4
  54. package/dist/plugins/grideditor.style.min.js.map +0 -7
  55. package/src/js/plugins/grideditor.style.js +0 -185
@@ -1 +1 @@
1
- (()=>{var d=window.GridEditor;if(!d||typeof d.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 c(t,r){return t?Array.prototype.slice.call(t.querySelectorAll(r)):[]}function f(t,r){return t?t.querySelector(r):null}function g(t,r){return t?Array.prototype.filter.call(t.children,function(a){return!r||a.matches(r)}):[]}function y(t,r){return g(t,r)[0]||null}function s(t,r,a){var l=document.createElement(t);return Object.keys(r||{}).forEach(function(n){var e=r[n];e!=null&&e!==!1&&l.setAttribute(n,e)}),a!=null&&(l.textContent=a),l}function v(t,r){return x(r).forEach(function(a){t.classList.add(a)}),t}function h(t,r){return x(r).forEach(function(a){t.classList.remove(a)}),t}function E(t,r,a){return x(r).forEach(function(l){a===void 0?t.classList.toggle(l):t.classList.toggle(l,!!a)}),t}function C(t,r){return!!t&&t.nodeType===1&&t.classList.contains(r)}function x(t){return String(t||"").split(/\s+/).filter(Boolean)}function T(t){return t.style.display="none",t}function S(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)}var k=400;function B(t,r,a,l){a=a===void 0?k:a;var n=function(){T(t),l&&l()};if(!S(t)||!t.animate||a<=0){window.setTimeout(n,0);return}var e=t.animate(r(getComputedStyle(t)),{duration:a,easing:"ease-in-out"}),o=!1,i=function(){o||(o=!0,n())};e.onfinish=i,e.oncancel=i}function w(t,r,a){B(t,function(l){return[{opacity:l.opacity},{opacity:0}]},r,a)}Object.assign(d.locales.en,{"container.add_tabs":"Tabs","container.add_tab":"Add tab","container.tab_label":"Tab {number}","confirm.delete_tab":"Delete this tab and everything in it?"});d.containers.tabs=function(t){function r(n,e){e=e||{};var o=f(n,":scope > .nav-tabs"),i=f(n,":scope > .tab-content"),u=t.containerId("tab"),p=g(o,".nav-item").length+1,m=o.appendChild(s("li",{class:"nav-item ge-tab",role:"presentation"})),A=m.appendChild(s("button",{class:"nav-link",type:"button",role:"tab","data-bs-toggle":"tab","data-bs-target":"#"+u,"aria-controls":u}));A.appendChild(s("span",{class:"ge-pane-label"},e.label||t.t("container.tab_label",{number:p})));var b=i.appendChild(s("div",{class:"tab-pane fade",role:"tabpanel",tabindex:"0",id:u}));return b.appendChild(t.defaultRegion()),(e.activate||p===1)&&a(n,b),b}function a(n,e){var o=e.getAttribute("id");c(n,":scope > .tab-content > .tab-pane").forEach(function(i){h(i,"show active")}),v(e,"show active"),c(n,":scope > .nav-tabs .nav-link").forEach(function(i){var u=i.getAttribute("data-bs-target")==="#"+o;E(i,"active",u),i.setAttribute("aria-selected",u?"true":"false")})}function l(n,e){var o=f(e,".nav-link"),i=o?o.getAttribute("data-bs-target"):null;return i?f(n,i):null}return{labelKey:"container.add_tabs",onSortable:function(n){n(c(t.canvas,".ge-container-tabs > .nav-tabs"),{draggable:".ge-tab"})},addPaneKey:"container.add_tab",paneKind:"tab",create:function(n){var e=s("div",{"data-ge-container":"tabs"}),o=n.labels||[],i=n.tabs||o.length||2;e.appendChild(s("ul",{class:"nav nav-tabs",role:"tablist"})),e.appendChild(s("div",{class:"tab-content"}));for(var u=0;u<i;u++)r(e,{label:o[u]});return e},addPane:r,mark:function(n){c(n,":scope > .tab-content > .tab-pane").forEach(function(e){v(e,"ge-tab-pane")}),c(n,":scope > .nav-tabs > .nav-item").forEach(function(e){v(e,"ge-tab");var o=f(e,".nav-link");o&&t.makeLabelEditable(t.labelIn(o)),!y(e,".ge-tools-drawer")&&t.createPaneControls(e,"tab",t.settings.tab_tools,t.t("confirm.delete_tab"),function(i){var u=l(n,e),p=C(u,"active");w(e,200,function(){u&&u.remove(),i();var m=f(n,":scope > .tab-content > .tab-pane");p&&m&&a(n,m)})})})},unmark:function(n){t.resumeToggles(n),c(n,".ge-tab-pane").forEach(function(e){h(e,"ge-tab-pane")}),t.unwrapLabels(n)},afterPaneMove:function(n){var e=f(n,":scope > .tab-content");c(n,":scope > .nav-tabs > .nav-item").forEach(function(o){var i=l(n,o);i&&e.appendChild(i)})}}};})();
1
+ (()=>{var x=window.GridEditor;if(!x||typeof x.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 h(t,l){return t?Array.prototype.slice.call(t.querySelectorAll(l)):[]}function g(t,l){return t?t.querySelector(l):null}function F(t,l){if(!t)return[];var o=h(t,l);return t.nodeType===1&&t.matches(l)&&o.unshift(t),o}function w(t,l){return t?Array.prototype.filter.call(t.children,function(o){return!l||o.matches(l)}):[]}function j(t,l){return w(t,l)[0]||null}function f(t,l,o){var c=document.createElement(t);return Object.keys(l||{}).forEach(function(m){var d=l[m];d!=null&&d!==!1&&c.setAttribute(m,d)}),o!=null&&(c.textContent=o),c}function b(t,l){return L(l).forEach(function(o){t.classList.add(o)}),t}function p(t,l){return L(l).forEach(function(o){t.classList.remove(o)}),t}function G(t,l,o){return L(l).forEach(function(c){o===void 0?t.classList.toggle(c):t.classList.toggle(c,!!o)}),t}function O(t,l){return!!t&&t.nodeType===1&&t.classList.contains(l)}function L(t){return String(t||"").split(/\s+/).filter(Boolean)}function J(t){return t.getAttribute("class")||t.removeAttribute("class"),t}function Y(t){return t.style.display="none",t}function k(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)}var X=400;function $(t,l,o,c){o=o===void 0?X:o;var m=function(){Y(t),c&&c()};if(!k(t)||!t.animate||o<=0){window.setTimeout(m,0);return}var d=t.animate(l(getComputedStyle(t)),{duration:o,easing:"ease-in-out"}),y=!1,_=function(){y||(y=!0,m())};d.onfinish=_,d.oncancel=_}function M(t,l,o){$(t,function(c){return[{opacity:c.opacity},{opacity:0}]},l,o)}Object.assign(x.locales.en,{"container.add_tabs":"Tabs","container.add_tab":"Add tab","container.tab_label":"Tab {number}","confirm.delete_tab":"Delete this tab and everything in it?","container.tabs_section":"Tabs","container.tabs_style":"Style","container.tabs_style_tabs":"Tabs","container.tabs_style_pills":"Pills","container.tabs_style_underline":"Underline","container.tabs_width":"Width","container.tabs_width_natural":"Natural","container.tabs_width_fill":"Fill","container.tabs_width_justified":"Justified","container.tabs_align":"Alignment","container.tabs_align_start":"Start","container.tabs_align_center":"Center","container.tabs_align_end":"End","container.tabs_layout":"Layout","container.tabs_layout_horizontal":"Horizontal","container.tabs_layout_vertical":"Vertical","container.tabs_layout_vertical_from":"Vertical from {breakpoint}"});var A={tabs:"nav-tabs",pills:"nav-pills",underline:"nav-underline"},C={natural:null,fill:"nav-fill",justified:"nav-justified"},E={start:null,center:"justify-content-center",end:"justify-content-end"},K={variant:"tabs",width:"natural",align:"start",vertical:!1},B={variant:{labelKey:"container.tabs_style",choices:[{value:"tabs",labelKey:"container.tabs_style_tabs"},{value:"pills",labelKey:"container.tabs_style_pills"},{value:"underline",labelKey:"container.tabs_style_underline"}]},width:{labelKey:"container.tabs_width",choices:[{value:"natural",labelKey:"container.tabs_width_natural"},{value:"fill",labelKey:"container.tabs_width_fill"},{value:"justified",labelKey:"container.tabs_width_justified"}]},align:{labelKey:"container.tabs_align",choices:[{value:"start",labelKey:"container.tabs_align_start"},{value:"center",labelKey:"container.tabs_align_center"},{value:"end",labelKey:"container.tabs_align_end"}]},vertical:{labelKey:"container.tabs_layout"}},Z=0,S="data-ge-tabs-layout";function N(t){return Object.keys(t).map(function(l){return t[l]}).filter(Boolean)}x.containers.tabs=function(t){var l=[];function o(n){return j(n,".nav")}function c(){return t.breakpoints.slice(1)}function m(n){return n===!0?"":"-"+n}function d(n){var e=m(n);return{container:["d"+e+"-flex","align-items"+e+"-start"],strip:["flex"+e+"-column","me"+e+"-3"]}}function y(){return[!0].concat(c())}function _(n){var e=o(n),i=function(s,r){return!!s&&O(s,r)},a=function(s,r){return Object.keys(s).filter(function(v){return s[v]&&i(e,s[v])})[0]||r},u=y().filter(function(s){var r=d(s);return i(n,r.container[0])&&i(e,r.strip[0])})[0];return{variant:a(A,"tabs"),width:a(C,"natural"),align:a(E,"start"),vertical:u===void 0?!1:u}}function H(n,e,i){var a=o(n);if(a){if(e==="variant"&&(p(a,N(A).join(" ")),b(a,A[i])),(e==="width"||e==="vertical")&&(p(a,N(C).join(" ")),e==="width"&&C[i]&&b(a,C[i])),(e==="align"||e==="vertical"||e==="width"&&i!=="natural")&&(p(a,N(E).join(" ")),e==="align"&&E[i]&&b(a,E[i])),e==="vertical"&&(y().forEach(function(s){var r=d(s);p(n,r.container.join(" ")),p(a,r.strip.join(" "))}),a.removeAttribute("aria-orientation"),i!==!1)){var u=d(i);b(n,u.container.join(" ")),b(a,u.strip.join(" ")),a.setAttribute("aria-orientation","vertical")}J(n)}}function P(n){return n==="variant"?Object.keys(A):n==="width"?Object.keys(C):n==="align"?Object.keys(E):[!1].concat(y())}function W(n,e){var i=t.settings.tabs||{},a=n[e]!==void 0?n[e]:i[e];return a===void 0?K[e]:P(e).indexOf(a)!==-1?a:(t.warn("tabs: "+JSON.stringify(a)+" is not a "+e+", which takes "+JSON.stringify(P(e))+": "+JSON.stringify(K[e])+" is used"),K[e])}function q(n){var e=_(n).vertical;return e===!1?null:t.view()==="all"?(n.removeAttribute(S),/flex$/.test(getComputedStyle(n).display)?"vertical":"horizontal"):e===!0||t.breakpoints.indexOf(t.view())>=t.breakpoints.indexOf(e)?"vertical":"horizontal"}function D(n){var e=q(n);e?n.setAttribute(S,e):n.removeAttribute(S)}function I(n,e,i){var a=f("div",{class:"ge-tabs-variant"}),u="ge-tabs-variant-"+ ++Z;a.appendChild(f("label",{class:"form-label",for:u},t.t(n)));var s=a.appendChild(f("select",{class:"form-select form-select-sm",id:u}));return e.forEach(function(r){s.appendChild(f("option",{value:r.value},r.label))}),s.addEventListener("change",function(){i(s.value)}),{box:a,field:s}}function V(n){var e=f("div",{class:"ge-tabs-variants"}),i={};function a(r,v){H(n,r,v),D(n),s()}function u(r){return B[r].choices.map(function(v){return{value:v.value,label:t.t(v.labelKey)}})}["variant","width","align"].forEach(function(r){i[r]=I(B[r].labelKey,u(r),function(v){a(r,v)})}),i.vertical=I(B.vertical.labelKey,[{value:"false",label:t.t("container.tabs_layout_horizontal")},{value:"true",label:t.t("container.tabs_layout_vertical")}].concat(c().map(function(r){return{value:r,label:t.t("container.tabs_layout_vertical_from",{breakpoint:r})}})),function(r){a("vertical",r==="true"?!0:r==="false"?!1:r)}),["variant","width","align","vertical"].forEach(function(r){i[r].box.setAttribute("data-ge-tabs-variant",r),e.appendChild(i[r].box)});function s(){var r=_(n);i.variant.field.value=r.variant,i.width.field.value=r.width,i.align.field.value=r.align,i.vertical.field.value=String(r.vertical),i.width.field.disabled=r.vertical!==!1,i.align.field.disabled=r.vertical!==!1||r.width!=="natural"}return s(),l.push({container:n,element:e,render:s}),e}function R(n,e){e=e||{};var i=o(n),a=g(n,":scope > .tab-content"),u=t.containerId("tab"),s=w(i,".nav-item").length+1,r=i.appendChild(f("li",{class:"nav-item ge-tab",role:"presentation"})),v=r.appendChild(f("button",{class:"nav-link",type:"button",role:"tab","data-bs-toggle":"tab","data-bs-target":"#"+u,"aria-controls":u}));v.appendChild(f("span",{class:"ge-pane-label"},e.label||t.t("container.tab_label",{number:s})));var T=a.appendChild(f("div",{class:"tab-pane fade",role:"tabpanel",tabindex:"0",id:u}));return T.appendChild(t.defaultRegion()),(e.activate||s===1)&&U(n,T),T}function U(n,e){var i=e.getAttribute("id");h(n,":scope > .tab-content > .tab-pane").forEach(function(a){p(a,"show active")}),b(e,"show active"),h(o(n)||n,".nav-link").forEach(function(a){var u=a.getAttribute("data-bs-target")==="#"+i;G(a,"active",u),a.setAttribute("aria-selected",u?"true":"false")})}function z(n,e){var i=g(e,".nav-link"),a=i?i.getAttribute("data-bs-target"):null;return a?g(n,a):null}return{labelKey:"container.add_tabs",onSortable:function(n){n(h(t.canvas,".ge-container-tabs").map(o).filter(Boolean),{draggable:".ge-tab"})},addPaneKey:"container.add_tab",paneKind:"tab",create:function(n){var e=f("div",{"data-ge-container":"tabs"}),i=n.labels||[],a=n.tabs||i.length||2;e.appendChild(f("ul",{class:"nav nav-tabs",role:"tablist"})),e.appendChild(f("div",{class:"tab-content"})),["variant","width","align","vertical"].forEach(function(s){H(e,s,W(n,s))});for(var u=0;u<a;u++)R(e,{label:i[u]});return e},addPane:R,mark:function(n){h(n,":scope > .tab-content > .tab-pane").forEach(function(e){b(e,"ge-tab-pane")}),w(o(n)||n,".nav-item").forEach(function(e){b(e,"ge-tab");var i=g(e,".nav-link");i&&t.makeLabelEditable(t.labelIn(i)),!j(e,".ge-tools-drawer")&&t.createPaneControls(e,"tab",t.settings.tab_tools,t.t("confirm.delete_tab"),function(a){var u=z(n,e),s=O(u,"active");M(e,200,function(){u&&u.remove(),a();var r=g(n,":scope > .tab-content > .tab-pane");s&&r&&U(n,r)})})})},unmark:function(n){t.resumeToggles(n),n.removeAttribute(S),h(n,".ge-tab-pane").forEach(function(e){p(e,"ge-tab-pane")}),t.unwrapLabels(n)},panelSection:function(n,e){return e!=="tabs"||!o(n)?null:{labelKey:"container.tabs_section",body:V(n)}},onRefresh:function(n){F(n,'[data-ge-container="tabs"]').forEach(D),l=l.filter(function(e){return e.element.isConnected}),l.forEach(function(e){(e.container===n||n.contains(e.container))&&e.render()})},onDeinit:function(){l=[]},afterPaneMove:function(n){var e=g(n,":scope > .tab-content");w(o(n)||n,".nav-item").forEach(function(i){var a=z(n,i);a&&e.appendChild(a)})}}};})();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/js/register.js", "../../src/js/dom.js", "../../src/js/plugins/grideditor.tabs.js"],
4
- "sourcesContent": ["/**\n * What a plugin's or a locale's classic script imports in place of the\n * editor: the GridEditor the page already loaded.\n *\n * The build points `import { GridEditor } from '../grideditor.js'` here for\n * the classic scripts, so each registers on the editor the page has rather\n * than bringing its own. Loaded before the editor there is nothing to\n * register on, and saying so is better than a TypeError three calls later.\n */\nvar GridEditor = window.GridEditor;\n\nif (!GridEditor || typeof GridEditor.get !== 'function') {\n throw new Error('grid-editor: load grideditor.js (or grideditor.bundle.min.js) before its plugins, ' +\n 'its locales and grideditor.jquery.js');\n}\n\nexport { GridEditor };\nexport default GridEditor;\n", "/**\n * The DOM, the way grid-editor uses it.\n *\n * Small helpers over the browser's own API, for the core and the shipped\n * plugins. Not a public API: a plugin of a host's own is free to write its\n * DOM code however it likes, and this file makes no promise to it.\n *\n * Stateless on purpose. The build puts a copy of this file in each plugin's\n * classic script, so anything kept here would be kept once per copy; a\n * module that needs to remember something about a node keeps its own\n * WeakMap.\n */\n\n/** Every element under `root` matching `selector`, as an array. */\nexport function all(root, selector) {\n return root ? Array.prototype.slice.call(root.querySelectorAll(selector)) : [];\n}\n\n/** The first element under `root` matching `selector`, or null. */\nexport function one(root, selector) {\n return root ? root.querySelector(selector) : null;\n}\n\n/** `root` itself when it matches, then every element under it that does. */\nexport function selfAndAll(root, selector) {\n if (!root) { return []; }\n\n var found = all(root, selector);\n if (root.nodeType === 1 && root.matches(selector)) { found.unshift(root); }\n return found;\n}\n\n/** The element children of `node`, those matching `selector` if one is given. */\nexport function children(node, selector) {\n if (!node) { return []; }\n\n return Array.prototype.filter.call(node.children, function(each) {\n return !selector || each.matches(selector);\n });\n}\n\n/** The first element child matching `selector`, or null. */\nexport function child(node, selector) {\n return children(node, selector)[0] || null;\n}\n\n/** The nearest ancestor-or-self matching `selector` below `stopAt`, or null. */\nexport function closest(node, selector, stopAt) {\n var found = node && node.nodeType === 1 ? node.closest(selector) : null;\n\n if (found && stopAt && found !== stopAt && !stopAt.contains(found)) { return null; }\n return found;\n}\n\n/** Whether `node` is an element matching `selector`. */\nexport function is(node, selector) {\n return !!node && node.nodeType === 1 && node.matches(selector);\n}\n\n/** Whether `node` is in the document. */\nexport function attached(node) {\n return !!node && document.documentElement.contains(node);\n}\n\n/** The element siblings after `node` that match `selector`. */\nexport function nextAll(node, selector) {\n var found = [];\n\n for (var next = node.nextElementSibling; next; next = next.nextElementSibling) {\n if (!selector || next.matches(selector)) { found.push(next); }\n }\n return found;\n}\n\n/** The ancestors of `node` up to, and not including, `stop`, nearest first. */\nexport function parentsUntil(node, stop) {\n var found = [];\n\n for (var parent = node.parentElement; parent && parent !== stop; parent = parent.parentElement) {\n found.push(parent);\n }\n return found;\n}\n\n/**\n * The nodes the html parses into, detached. Parsed the way innerHTML parses,\n * so a <script> in it never runs, here or once it is in the page.\n */\nexport function parse(html) {\n var template = document.createElement('template');\n template.innerHTML = html;\n return Array.prototype.slice.call(template.content.childNodes);\n}\n\n/** The one element the html is, detached. */\nexport function create(html) {\n var nodes = parse(html.trim());\n\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].nodeType === 1) { return nodes[i]; }\n }\n return null;\n}\n\n/** An element of `tag`, with `attributes` and `text`. */\nexport function element(tag, attributes, text) {\n var node = document.createElement(tag);\n\n Object.keys(attributes || {}).forEach(function(name) {\n var value = attributes[name];\n if (value !== null && value !== undefined && value !== false) { node.setAttribute(name, value); }\n });\n if (text !== undefined && text !== null) { node.textContent = text; }\n\n return node;\n}\n\n/** Replace what `node` holds with `html`. A <script> in it does not run. */\nexport function setHtml(node, html) {\n node.innerHTML = html === undefined || html === null ? '' : String(html);\n return node;\n}\n\n/** Add one or several space separated classes. */\nexport function addClass(node, names) {\n split(names).forEach(function(name) { node.classList.add(name); });\n return node;\n}\n\nexport function removeClass(node, names) {\n split(names).forEach(function(name) { node.classList.remove(name); });\n return node;\n}\n\n/** Each class on, or off, or flipped when `on` is not given. */\nexport function toggleClass(node, names, state) {\n split(names).forEach(function(name) {\n if (state === undefined) {\n node.classList.toggle(name);\n } else {\n node.classList.toggle(name, !!state);\n }\n });\n return node;\n}\n\nexport function hasClass(node, name) {\n return !!node && node.nodeType === 1 && node.classList.contains(name);\n}\n\nfunction split(names) {\n return String(names || '').split(/\\s+/).filter(Boolean);\n}\n\n/** Take the class attribute off when there is nothing left in it. */\nexport function dropEmptyClass(node) {\n if (!node.getAttribute('class')) { node.removeAttribute('class'); }\n return node;\n}\n\n/** Take the style attribute off when there is nothing left in it. */\nexport function dropEmptyStyle(node) {\n if (!node.getAttribute('style')) { node.removeAttribute('style'); }\n return node;\n}\n\n/** Set attributes; a null or undefined value takes the attribute off. */\nexport function attr(node, attributes) {\n Object.keys(attributes).forEach(function(name) {\n var value = attributes[name];\n\n if (value === null || value === undefined) {\n node.removeAttribute(name);\n } else {\n node.setAttribute(name, value);\n }\n });\n return node;\n}\n\n/**\n * Inline styles, by css property name. A number is pixels for the properties\n * that take a length, as jQuery had it; an empty string takes one off.\n */\nexport function css(node, styles) {\n Object.keys(styles).forEach(function(property) {\n var value = styles[property];\n\n if (typeof value === 'number' && !UNITLESS[property]) { value = value + 'px'; }\n node.style.setProperty(property, value === null || value === undefined ? '' : String(value));\n });\n return node;\n}\n\nvar UNITLESS = { opacity: true, 'z-index': true, 'flex-grow': true, 'flex-shrink': true, order: true };\n\n/** What an element of this tag shows as when nothing hides it. */\nvar defaultDisplays = {};\n\nfunction defaultDisplay(node) {\n var tag = node.nodeName;\n\n if (!defaultDisplays[tag]) {\n var probe = document.body.appendChild(document.createElement(tag));\n defaultDisplays[tag] = getComputedStyle(probe).display;\n probe.remove();\n if (defaultDisplays[tag] === 'none') { defaultDisplays[tag] = 'block'; }\n }\n return defaultDisplays[tag];\n}\n\n/** Show a node: its inline display:none off, and a display of its own if a stylesheet hides it. */\nexport function show(node) {\n node.style.removeProperty('display');\n if (getComputedStyle(node).display === 'none') { node.style.display = defaultDisplay(node); }\n return node;\n}\n\nexport function hide(node) {\n node.style.display = 'none';\n return node;\n}\n\n/** Show or hide; flip when `on` is not given. */\nexport function toggle(node, state) {\n if (state === undefined) { state = !visible(node); }\n return state ? show(node) : hide(node);\n}\n\n/** Whether a node takes up room: what jQuery's :visible meant. */\nexport function visible(node) {\n return !!(node.offsetWidth || node.offsetHeight || node.getClientRects().length);\n}\n\n/** The border box's width, fractions included. */\nexport function outerWidth(node) {\n return node.getBoundingClientRect().width;\n}\n\nexport function outerHeight(node) {\n return node.getBoundingClientRect().height;\n}\n\n/** The content box's height, which is what jQuery's height() gave. */\nexport function contentHeight(node) {\n var style = getComputedStyle(node);\n return node.clientHeight - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom);\n}\n\n/** Where a node is on the page, not in the window. */\nexport function offset(node) {\n var box = node.getBoundingClientRect();\n return { top: box.top + window.pageYOffset, left: box.left + window.pageXOffset };\n}\n\n/** Its index among its parent's element children, those matching `selector` if given. */\nexport function indexIn(node, selector) {\n return children(node.parentElement, selector).indexOf(node);\n}\n\n/** Put `node` right after `reference`. */\nexport function insertAfter(node, reference) {\n reference.parentNode.insertBefore(node, reference.nextSibling);\n return node;\n}\n\n/** Replace `node` with what it holds. */\nexport function unwrap(node) {\n var parent = node.parentNode;\n\n while (node.firstChild) { parent.insertBefore(node.firstChild, node); }\n node.remove();\n}\n\n/** Put `node` inside `wrapper`, where `node` was. */\nexport function wrap(node, wrapper) {\n node.parentNode.insertBefore(wrapper, node);\n wrapper.appendChild(node);\n return wrapper;\n}\n\n/**\n * Listen on `root` for `types` (space separated) on descendants that match\n * `selector`, with `this` the matched element, as jQuery's delegated\n * handlers had it. Hands back the listener, for removeEventListener; a\n * signal in `options` removes it too.\n */\nexport function delegate(root, types, selector, handler, options) {\n var listener = function(event) {\n var match = closest(event.target, selector, root);\n if (match && root.contains(match)) { return handler.call(match, event); }\n return undefined;\n };\n\n split(types).forEach(function(type) { root.addEventListener(type, listener, options); });\n return listener;\n}\n\n/** Listen for several space separated event types with one handler. */\nexport function on(target, types, handler, options) {\n split(types).forEach(function(type) { target.addEventListener(type, handler, options); });\n return handler;\n}\n\nexport function off(target, types, handler, options) {\n split(types).forEach(function(type) { target.removeEventListener(type, handler, options); });\n}\n\n/** A mouse event of `type` sent to `node`, the way a pointer would. */\nexport function fire(node, type) {\n node.dispatchEvent(new MouseEvent(type, { bubbles: type !== 'mouseenter' && type !== 'mouseleave' }));\n}\n\n/* ------------------------------------------------------------------\n * Taking a node away, visibly.\n *\n * The durations are jQuery's: 400 ms unless the caller says otherwise. `done` runs once the node is out of sight, which is\n * when the caller removes it; a node that is already out of sight is done at\n * once, on the next task, as jQuery had it.\n * ------------------------------------------------------------------ */\n\nvar DEFAULT_DURATION = 400;\n\nfunction animateAway(node, frames, duration, done) {\n duration = duration === undefined ? DEFAULT_DURATION : duration;\n\n var finish = function() {\n hide(node);\n if (done) { done(); }\n };\n\n if (!visible(node) || !node.animate || duration <= 0) {\n window.setTimeout(finish, 0);\n return;\n }\n\n var animation = node.animate(frames(getComputedStyle(node)), {\n duration: duration,\n easing: 'ease-in-out',\n });\n var called = false;\n var once = function() {\n if (called) { return; }\n called = true;\n finish();\n };\n\n animation.onfinish = once;\n animation.oncancel = once;\n}\n\n/** Fold a node up to nothing, then hide it. */\nexport function slideUp(node, duration, done) {\n if (typeof duration === 'function') {\n done = duration;\n duration = undefined;\n }\n\n node.style.overflow = 'hidden';\n animateAway(node, function(style) {\n return [\n {\n height: style.height,\n paddingTop: style.paddingTop,\n paddingBottom: style.paddingBottom,\n marginTop: style.marginTop,\n marginBottom: style.marginBottom,\n },\n { height: '0px', paddingTop: '0px', paddingBottom: '0px', marginTop: '0px', marginBottom: '0px' },\n ];\n }, duration, function() {\n node.style.removeProperty('overflow');\n if (done) { done(); }\n });\n}\n\n/** Fade a node out, then hide it. */\nexport function fadeOut(node, duration, done) {\n animateAway(node, function(style) {\n return [{ opacity: style.opacity }, { opacity: 0 }];\n }, duration, done);\n}\n\n/** Fade and fold a node, in height and, with `width`, sideways too, then hide it. */\nexport function shrinkAway(node, duration, done, width) {\n node.style.overflow = 'hidden';\n animateAway(node, function(style) {\n var from = { opacity: style.opacity, height: style.height };\n var to = { opacity: 0, height: '0px' };\n\n if (width) {\n from.width = style.width;\n to.width = '0px';\n }\n return [from, to];\n }, duration, function() {\n node.style.removeProperty('overflow');\n if (done) { done(); }\n });\n}\n", "/**\n * Tabs for grid-editor.\n *\n * A container plugin: load this file after the editor and the toolbar offers\n * a tabs container. What it can ask the editor for is the handle its factory is\n * called with, described in docs/plugins.md.\n *\n * <script src=\"dist/grideditor.min.js\"></script>\n * <script src=\"dist/plugins/grideditor.tabs.min.js\"></script>\n */\nimport { GridEditor } from '../grideditor.js';\nimport * as dom from '../dom.js';\n\nObject.assign(GridEditor.locales.en, {\n 'container.add_tabs': 'Tabs',\n 'container.add_tab': 'Add tab',\n 'container.tab_label': 'Tab {number}',\n 'confirm.delete_tab': 'Delete this tab and everything in it?',\n});\n\nGridEditor.containers.tabs = function(ge) {\n\n function addTabTo(container, options) {\n options = options || {};\n\n var strip = dom.one(container, ':scope > .nav-tabs');\n var content = dom.one(container, ':scope > .tab-content');\n var id = ge.containerId('tab');\n var number = dom.children(strip, '.nav-item').length + 1;\n\n var tab = strip.appendChild(dom.element('li', { 'class': 'nav-item ge-tab', role: 'presentation' }));\n var button = tab.appendChild(dom.element('button', {\n 'class': 'nav-link',\n type: 'button',\n role: 'tab',\n 'data-bs-toggle': 'tab',\n 'data-bs-target': '#' + id,\n 'aria-controls': id,\n }));\n button.appendChild(dom.element('span', { 'class': 'ge-pane-label' },\n options.label || ge.t('container.tab_label', { number: number })));\n\n var pane = content.appendChild(dom.element('div', {\n 'class': 'tab-pane fade',\n role: 'tabpanel',\n tabindex: '0',\n id: id,\n }));\n pane.appendChild(ge.defaultRegion());\n\n if (options.activate || number === 1) { activatePane(container, pane); }\n\n return pane;\n }\n\n function activatePane(container, pane) {\n var id = pane.getAttribute('id');\n\n dom.all(container, ':scope > .tab-content > .tab-pane').forEach(function(each) {\n dom.removeClass(each, 'show active');\n });\n dom.addClass(pane, 'show active');\n\n dom.all(container, ':scope > .nav-tabs .nav-link').forEach(function(button) {\n var active = button.getAttribute('data-bs-target') === '#' + id;\n\n dom.toggleClass(button, 'active', active);\n button.setAttribute('aria-selected', active ? 'true' : 'false');\n });\n }\n\n function paneOf(container, tab) {\n var link = dom.one(tab, '.nav-link');\n var target = link ? link.getAttribute('data-bs-target') : null;\n\n return target ? dom.one(container, target) : null;\n }\n\n return {\n labelKey: 'container.add_tabs',\n\n // A tab strip sorts its own tabs, and the panes follow them. No\n // group: a tab belongs to the strip it was made in.\n onSortable: function(sortable) {\n sortable(dom.all(ge.canvas, '.ge-container-tabs > .nav-tabs'), {\n draggable: '.ge-tab',\n });\n },\n addPaneKey: 'container.add_tab',\n paneKind: 'tab',\n\n create: function(options) {\n var container = dom.element('div', { 'data-ge-container': 'tabs' });\n var labels = options.labels || [];\n var count = options.tabs || labels.length || 2;\n\n container.appendChild(dom.element('ul', { 'class': 'nav nav-tabs', role: 'tablist' }));\n container.appendChild(dom.element('div', { 'class': 'tab-content' }));\n\n for (var i = 0; i < count; i++) {\n addTabTo(container, { label: labels[i] });\n }\n\n return container;\n },\n\n addPane: addTabTo,\n\n mark: function(container) {\n dom.all(container, ':scope > .tab-content > .tab-pane').forEach(function(pane) {\n dom.addClass(pane, 'ge-tab-pane');\n });\n\n dom.all(container, ':scope > .nav-tabs > .nav-item').forEach(function(tab) {\n dom.addClass(tab, 'ge-tab');\n\n var link = dom.one(tab, '.nav-link');\n if (link) { ge.makeLabelEditable(ge.labelIn(link)); }\n\n if (dom.child(tab, '.ge-tools-drawer')) { return; }\n\n ge.createPaneControls(tab, 'tab', ge.settings.tab_tools, ge.t('confirm.delete_tab'),\n function(removed) {\n var pane = paneOf(container, tab);\n var wasActive = dom.hasClass(pane, 'active');\n\n dom.fadeOut(tab, 200, function() {\n if (pane) { pane.remove(); }\n removed();\n\n var first = dom.one(container, ':scope > .tab-content > .tab-pane');\n if (wasActive && first) { activatePane(container, first); }\n });\n });\n });\n },\n\n unmark: function(container) {\n ge.resumeToggles(container);\n dom.all(container, '.ge-tab-pane').forEach(function(pane) {\n dom.removeClass(pane, 'ge-tab-pane');\n });\n ge.unwrapLabels(container);\n },\n\n /** Panes read in tab order, whatever order they were dropped in. */\n afterPaneMove: function(container) {\n var content = dom.one(container, ':scope > .tab-content');\n\n dom.all(container, ':scope > .nav-tabs > .nav-item').forEach(function(tab) {\n var pane = paneOf(container, tab);\n if (pane) { content.appendChild(pane); }\n });\n },\n };\n};\n"],
5
- "mappings": "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",
6
- "names": ["GridEditor", "all", "root", "selector", "one", "children", "node", "selector", "each", "child", "element", "tag", "attributes", "text", "node", "name", "value", "addClass", "node", "names", "split", "name", "removeClass", "toggleClass", "state", "hasClass", "hide", "node", "visible", "node", "DEFAULT_DURATION", "animateAway", "node", "frames", "duration", "done", "finish", "hide", "visible", "animation", "called", "once", "fadeOut", "node", "duration", "done", "animateAway", "style", "GridEditor", "ge", "addTabTo", "container", "options", "strip", "one", "content", "id", "number", "children", "tab", "element", "button", "pane", "activatePane", "all", "each", "removeClass", "addClass", "active", "toggleClass", "paneOf", "link", "target", "sortable", "labels", "count", "i", "child", "removed", "wasActive", "hasClass", "fadeOut", "first"]
4
+ "sourcesContent": ["/**\n * What a plugin's or a locale's classic script imports in place of the\n * editor: the GridEditor the page already loaded.\n *\n * The build points `import { GridEditor } from '../grideditor.js'` here for\n * the classic scripts, so each registers on the editor the page has rather\n * than bringing its own. Loaded before the editor there is nothing to\n * register on, and saying so is better than a TypeError three calls later.\n */\nvar GridEditor = window.GridEditor;\n\nif (!GridEditor || typeof GridEditor.get !== 'function') {\n throw new Error('grid-editor: load grideditor.js (or grideditor.bundle.min.js) before its plugins, ' +\n 'its locales and grideditor.jquery.js');\n}\n\nexport { GridEditor };\nexport default GridEditor;\n", "/**\n * The DOM, the way grid-editor uses it.\n *\n * Small helpers over the browser's own API, for the core and the shipped\n * plugins. Not a public API: a plugin of a host's own is free to write its\n * DOM code however it likes, and this file makes no promise to it.\n *\n * Stateless on purpose. The build puts a copy of this file in each plugin's\n * classic script, so anything kept here would be kept once per copy; a\n * module that needs to remember something about a node keeps its own\n * WeakMap.\n */\n\n/** Every element under `root` matching `selector`, as an array. */\nexport function all(root, selector) {\n return root ? Array.prototype.slice.call(root.querySelectorAll(selector)) : [];\n}\n\n/** The first element under `root` matching `selector`, or null. */\nexport function one(root, selector) {\n return root ? root.querySelector(selector) : null;\n}\n\n/** `root` itself when it matches, then every element under it that does. */\nexport function selfAndAll(root, selector) {\n if (!root) { return []; }\n\n var found = all(root, selector);\n if (root.nodeType === 1 && root.matches(selector)) { found.unshift(root); }\n return found;\n}\n\n/** The element children of `node`, those matching `selector` if one is given. */\nexport function children(node, selector) {\n if (!node) { return []; }\n\n return Array.prototype.filter.call(node.children, function(each) {\n return !selector || each.matches(selector);\n });\n}\n\n/** The first element child matching `selector`, or null. */\nexport function child(node, selector) {\n return children(node, selector)[0] || null;\n}\n\n/** The nearest ancestor-or-self matching `selector` below `stopAt`, or null. */\nexport function closest(node, selector, stopAt) {\n var found = node && node.nodeType === 1 ? node.closest(selector) : null;\n\n if (found && stopAt && found !== stopAt && !stopAt.contains(found)) { return null; }\n return found;\n}\n\n/** Whether `node` is an element matching `selector`. */\nexport function is(node, selector) {\n return !!node && node.nodeType === 1 && node.matches(selector);\n}\n\n/** Whether `node` is in the document. */\nexport function attached(node) {\n return !!node && document.documentElement.contains(node);\n}\n\n/** The element siblings after `node` that match `selector`. */\nexport function nextAll(node, selector) {\n var found = [];\n\n for (var next = node.nextElementSibling; next; next = next.nextElementSibling) {\n if (!selector || next.matches(selector)) { found.push(next); }\n }\n return found;\n}\n\n/** The ancestors of `node` up to, and not including, `stop`, nearest first. */\nexport function parentsUntil(node, stop) {\n var found = [];\n\n for (var parent = node.parentElement; parent && parent !== stop; parent = parent.parentElement) {\n found.push(parent);\n }\n return found;\n}\n\n/**\n * The nodes the html parses into, detached. Parsed the way innerHTML parses,\n * so a <script> in it never runs, here or once it is in the page.\n */\nexport function parse(html) {\n var template = document.createElement('template');\n template.innerHTML = html;\n return Array.prototype.slice.call(template.content.childNodes);\n}\n\n/** The one element the html is, detached. */\nexport function create(html) {\n var nodes = parse(html.trim());\n\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].nodeType === 1) { return nodes[i]; }\n }\n return null;\n}\n\n/** An element of `tag`, with `attributes` and `text`. */\nexport function element(tag, attributes, text) {\n var node = document.createElement(tag);\n\n Object.keys(attributes || {}).forEach(function(name) {\n var value = attributes[name];\n if (value !== null && value !== undefined && value !== false) { node.setAttribute(name, value); }\n });\n if (text !== undefined && text !== null) { node.textContent = text; }\n\n return node;\n}\n\n/** Replace what `node` holds with `html`. A <script> in it does not run. */\nexport function setHtml(node, html) {\n node.innerHTML = html === undefined || html === null ? '' : String(html);\n return node;\n}\n\n/** Add one or several space separated classes. */\nexport function addClass(node, names) {\n split(names).forEach(function(name) { node.classList.add(name); });\n return node;\n}\n\nexport function removeClass(node, names) {\n split(names).forEach(function(name) { node.classList.remove(name); });\n return node;\n}\n\n/** Each class on, or off, or flipped when `on` is not given. */\nexport function toggleClass(node, names, state) {\n split(names).forEach(function(name) {\n if (state === undefined) {\n node.classList.toggle(name);\n } else {\n node.classList.toggle(name, !!state);\n }\n });\n return node;\n}\n\nexport function hasClass(node, name) {\n return !!node && node.nodeType === 1 && node.classList.contains(name);\n}\n\nfunction split(names) {\n return String(names || '').split(/\\s+/).filter(Boolean);\n}\n\n/** Take the class attribute off when there is nothing left in it. */\nexport function dropEmptyClass(node) {\n if (!node.getAttribute('class')) { node.removeAttribute('class'); }\n return node;\n}\n\n/** Take the style attribute off when there is nothing left in it. */\nexport function dropEmptyStyle(node) {\n if (!node.getAttribute('style')) { node.removeAttribute('style'); }\n return node;\n}\n\n/** Set attributes; a null or undefined value takes the attribute off. */\nexport function attr(node, attributes) {\n Object.keys(attributes).forEach(function(name) {\n var value = attributes[name];\n\n if (value === null || value === undefined) {\n node.removeAttribute(name);\n } else {\n node.setAttribute(name, value);\n }\n });\n return node;\n}\n\n/**\n * Inline styles, by css property name. A number is pixels for the properties\n * that take a length, as jQuery had it; an empty string takes one off.\n */\nexport function css(node, styles) {\n Object.keys(styles).forEach(function(property) {\n var value = styles[property];\n\n if (typeof value === 'number' && !UNITLESS[property]) { value = value + 'px'; }\n node.style.setProperty(property, value === null || value === undefined ? '' : String(value));\n });\n return node;\n}\n\nvar UNITLESS = { opacity: true, 'z-index': true, 'flex-grow': true, 'flex-shrink': true, order: true };\n\n/** What an element of this tag shows as when nothing hides it. */\nvar defaultDisplays = {};\n\nfunction defaultDisplay(node) {\n var tag = node.nodeName;\n\n if (!defaultDisplays[tag]) {\n var probe = document.body.appendChild(document.createElement(tag));\n defaultDisplays[tag] = getComputedStyle(probe).display;\n probe.remove();\n if (defaultDisplays[tag] === 'none') { defaultDisplays[tag] = 'block'; }\n }\n return defaultDisplays[tag];\n}\n\n/** Show a node: its inline display:none off, and a display of its own if a stylesheet hides it. */\nexport function show(node) {\n node.style.removeProperty('display');\n if (getComputedStyle(node).display === 'none') { node.style.display = defaultDisplay(node); }\n return node;\n}\n\nexport function hide(node) {\n node.style.display = 'none';\n return node;\n}\n\n/** Show or hide; flip when `on` is not given. */\nexport function toggle(node, state) {\n if (state === undefined) { state = !visible(node); }\n return state ? show(node) : hide(node);\n}\n\n/** Whether a node takes up room: what jQuery's :visible meant. */\nexport function visible(node) {\n return !!(node.offsetWidth || node.offsetHeight || node.getClientRects().length);\n}\n\n/** The border box's width, fractions included. */\nexport function outerWidth(node) {\n return node.getBoundingClientRect().width;\n}\n\nexport function outerHeight(node) {\n return node.getBoundingClientRect().height;\n}\n\n/** The content box's height, which is what jQuery's height() gave. */\nexport function contentHeight(node) {\n var style = getComputedStyle(node);\n return node.clientHeight - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom);\n}\n\n/** Where a node is on the page, not in the window. */\nexport function offset(node) {\n var box = node.getBoundingClientRect();\n return { top: box.top + window.pageYOffset, left: box.left + window.pageXOffset };\n}\n\n/** Its index among its parent's element children, those matching `selector` if given. */\nexport function indexIn(node, selector) {\n return children(node.parentElement, selector).indexOf(node);\n}\n\n/** Put `node` right after `reference`. */\nexport function insertAfter(node, reference) {\n reference.parentNode.insertBefore(node, reference.nextSibling);\n return node;\n}\n\n/** Replace `node` with what it holds. */\nexport function unwrap(node) {\n var parent = node.parentNode;\n\n while (node.firstChild) { parent.insertBefore(node.firstChild, node); }\n node.remove();\n}\n\n/** Put `node` inside `wrapper`, where `node` was. */\nexport function wrap(node, wrapper) {\n node.parentNode.insertBefore(wrapper, node);\n wrapper.appendChild(node);\n return wrapper;\n}\n\n/**\n * Listen on `root` for `types` (space separated) on descendants that match\n * `selector`, with `this` the matched element, as jQuery's delegated\n * handlers had it. Hands back the listener, for removeEventListener; a\n * signal in `options` removes it too.\n */\nexport function delegate(root, types, selector, handler, options) {\n var listener = function(event) {\n var match = closest(event.target, selector, root);\n if (match && root.contains(match)) { return handler.call(match, event); }\n return undefined;\n };\n\n split(types).forEach(function(type) { root.addEventListener(type, listener, options); });\n return listener;\n}\n\n/** Listen for several space separated event types with one handler. */\nexport function on(target, types, handler, options) {\n split(types).forEach(function(type) { target.addEventListener(type, handler, options); });\n return handler;\n}\n\nexport function off(target, types, handler, options) {\n split(types).forEach(function(type) { target.removeEventListener(type, handler, options); });\n}\n\n/** A mouse event of `type` sent to `node`, the way a pointer would. */\nexport function fire(node, type) {\n node.dispatchEvent(new MouseEvent(type, { bubbles: type !== 'mouseenter' && type !== 'mouseleave' }));\n}\n\n/* ------------------------------------------------------------------\n * Taking a node away, visibly.\n *\n * The durations are jQuery's: 400 ms unless the caller says otherwise. `done` runs once the node is out of sight, which is\n * when the caller removes it; a node that is already out of sight is done at\n * once, on the next task, as jQuery had it.\n * ------------------------------------------------------------------ */\n\nvar DEFAULT_DURATION = 400;\n\nfunction animateAway(node, frames, duration, done) {\n duration = duration === undefined ? DEFAULT_DURATION : duration;\n\n var finish = function() {\n hide(node);\n if (done) { done(); }\n };\n\n if (!visible(node) || !node.animate || duration <= 0) {\n window.setTimeout(finish, 0);\n return;\n }\n\n var animation = node.animate(frames(getComputedStyle(node)), {\n duration: duration,\n easing: 'ease-in-out',\n });\n var called = false;\n var once = function() {\n if (called) { return; }\n called = true;\n finish();\n };\n\n animation.onfinish = once;\n animation.oncancel = once;\n}\n\n/** Fold a node up to nothing, then hide it. */\nexport function slideUp(node, duration, done) {\n if (typeof duration === 'function') {\n done = duration;\n duration = undefined;\n }\n\n node.style.overflow = 'hidden';\n animateAway(node, function(style) {\n return [\n {\n height: style.height,\n paddingTop: style.paddingTop,\n paddingBottom: style.paddingBottom,\n marginTop: style.marginTop,\n marginBottom: style.marginBottom,\n },\n { height: '0px', paddingTop: '0px', paddingBottom: '0px', marginTop: '0px', marginBottom: '0px' },\n ];\n }, duration, function() {\n node.style.removeProperty('overflow');\n if (done) { done(); }\n });\n}\n\n/** Fade a node out, then hide it. */\nexport function fadeOut(node, duration, done) {\n animateAway(node, function(style) {\n return [{ opacity: style.opacity }, { opacity: 0 }];\n }, duration, done);\n}\n\n/** Fade and fold a node, in height and, with `width`, sideways too, then hide it. */\nexport function shrinkAway(node, duration, done, width) {\n node.style.overflow = 'hidden';\n animateAway(node, function(style) {\n var from = { opacity: style.opacity, height: style.height };\n var to = { opacity: 0, height: '0px' };\n\n if (width) {\n from.width = style.width;\n to.width = '0px';\n }\n return [from, to];\n }, duration, function() {\n node.style.removeProperty('overflow');\n if (done) { done(); }\n });\n}\n", "/**\n * Tabs for grid-editor.\n *\n * A container plugin: load this file after the editor and the toolbar offers\n * a tabs container. What it can ask the editor for is the handle its factory is\n * called with, described in docs/plugins.md.\n *\n * <script src=\"dist/grideditor.min.js\"></script>\n * <script src=\"dist/plugins/grideditor.tabs.min.js\"></script>\n *\n * A container's variant - its style, width, alignment and whether it is laid\n * out vertically, from a breakpoint up - is Bootstrap's classes on its strip\n * and on itself, and nothing else: it is read from the markup, chosen in the\n * container's settings panel, or given to createContainer and the tabs\n * setting for the ones made new.\n */\nimport { GridEditor } from '../grideditor.js';\nimport * as dom from '../dom.js';\n\nObject.assign(GridEditor.locales.en, {\n 'container.add_tabs': 'Tabs',\n 'container.add_tab': 'Add tab',\n 'container.tab_label': 'Tab {number}',\n 'confirm.delete_tab': 'Delete this tab and everything in it?',\n 'container.tabs_section': 'Tabs',\n 'container.tabs_style': 'Style',\n 'container.tabs_style_tabs': 'Tabs',\n 'container.tabs_style_pills': 'Pills',\n 'container.tabs_style_underline': 'Underline',\n 'container.tabs_width': 'Width',\n 'container.tabs_width_natural': 'Natural',\n 'container.tabs_width_fill': 'Fill',\n 'container.tabs_width_justified': 'Justified',\n 'container.tabs_align': 'Alignment',\n 'container.tabs_align_start': 'Start',\n 'container.tabs_align_center': 'Center',\n 'container.tabs_align_end': 'End',\n 'container.tabs_layout': 'Layout',\n 'container.tabs_layout_horizontal': 'Horizontal',\n 'container.tabs_layout_vertical': 'Vertical',\n 'container.tabs_layout_vertical_from': 'Vertical from {breakpoint}',\n});\n\n/** Each variant's values, the first its default, and the class each puts on the strip. */\nvar STYLES = { tabs: 'nav-tabs', pills: 'nav-pills', underline: 'nav-underline' };\nvar WIDTHS = { natural: null, fill: 'nav-fill', justified: 'nav-justified' };\nvar ALIGNS = { start: null, center: 'justify-content-center', end: 'justify-content-end' };\nvar DEFAULTS = { variant: 'tabs', width: 'natural', align: 'start', vertical: false };\n\n/** Each variant's select in the panel: its label, and its choices'. */\nvar FIELDS = {\n variant: { labelKey: 'container.tabs_style', choices: [\n { value: 'tabs', labelKey: 'container.tabs_style_tabs' },\n { value: 'pills', labelKey: 'container.tabs_style_pills' },\n { value: 'underline', labelKey: 'container.tabs_style_underline' },\n ] },\n width: { labelKey: 'container.tabs_width', choices: [\n { value: 'natural', labelKey: 'container.tabs_width_natural' },\n { value: 'fill', labelKey: 'container.tabs_width_fill' },\n { value: 'justified', labelKey: 'container.tabs_width_justified' },\n ] },\n align: { labelKey: 'container.tabs_align', choices: [\n { value: 'start', labelKey: 'container.tabs_align_start' },\n { value: 'center', labelKey: 'container.tabs_align_center' },\n { value: 'end', labelKey: 'container.tabs_align_end' },\n ] },\n vertical: { labelKey: 'container.tabs_layout' },\n};\n\nvar fieldCounter = 0;\n\n/** Where the layout marks what the view being edited lays the tabs out as. */\nvar LAYOUT_ATTR = 'data-ge-tabs-layout';\n\nfunction classValues(map) {\n return Object.keys(map).map(function(key) { return map[key]; }).filter(Boolean);\n}\n\nGridEditor.containers.tabs = function(ge) {\n\n var sections = []; // { container, render } for every panel section built\n\n /** The strip: the container's first .nav, whatever its style. */\n function stripOf(container) {\n return dom.child(container, '.nav');\n }\n\n /** The breakpoints a layout can go vertical from; xs is always. */\n function fromBreakpoints() {\n return ge.breakpoints.slice(1);\n }\n\n /** The infix of a vertical layout's classes: none for always. */\n function infix(vertical) {\n return vertical === true ? '' : '-' + vertical;\n }\n\n function verticalClasses(vertical) {\n var at = infix(vertical);\n\n return {\n container: ['d' + at + '-flex', 'align-items' + at + '-start'],\n strip: ['flex' + at + '-column', 'me' + at + '-3'],\n };\n }\n\n /** Every vertical value: always, and from each breakpoint. */\n function verticals() {\n return [true].concat(fromBreakpoints());\n }\n\n /**\n * What a container's classes say it is. Vertical is read only when the\n * container's flex and the strip's column are of the same breakpoint;\n * anything else is horizontal, and is left as it is.\n */\n function read(container) {\n var strip = stripOf(container);\n var has = function(node, name) { return !!node && dom.hasClass(node, name); };\n var found = function(map, fallback) {\n return Object.keys(map).filter(function(key) { return map[key] && has(strip, map[key]); })[0] || fallback;\n };\n\n var vertical = verticals().filter(function(each) {\n var classes = verticalClasses(each);\n return has(container, classes.container[0]) && has(strip, classes.strip[0]);\n })[0];\n\n return {\n variant: found(STYLES, 'tabs'),\n width: found(WIDTHS, 'natural'),\n align: found(ALIGNS, 'start'),\n vertical: vertical === undefined ? false : vertical,\n };\n }\n\n /**\n * Write one variant, and take off what it makes meaningless: a vertical\n * layout has no width or alignment, and a full width no alignment.\n * Choosing a layout clears every layout class, at any breakpoint, the\n * user's own included.\n */\n function write(container, key, value) {\n var strip = stripOf(container);\n if (!strip) { return; }\n\n if (key === 'variant') {\n dom.removeClass(strip, classValues(STYLES).join(' '));\n dom.addClass(strip, STYLES[value]);\n }\n\n if (key === 'width' || key === 'vertical') {\n dom.removeClass(strip, classValues(WIDTHS).join(' '));\n if (key === 'width' && WIDTHS[value]) { dom.addClass(strip, WIDTHS[value]); }\n }\n\n if (key === 'align' || key === 'vertical' || (key === 'width' && value !== 'natural')) {\n dom.removeClass(strip, classValues(ALIGNS).join(' '));\n if (key === 'align' && ALIGNS[value]) { dom.addClass(strip, ALIGNS[value]); }\n }\n\n if (key === 'vertical') {\n verticals().forEach(function(each) {\n var classes = verticalClasses(each);\n dom.removeClass(container, classes.container.join(' '));\n dom.removeClass(strip, classes.strip.join(' '));\n });\n strip.removeAttribute('aria-orientation');\n\n if (value !== false) {\n var layout = verticalClasses(value);\n dom.addClass(container, layout.container.join(' '));\n dom.addClass(strip, layout.strip.join(' '));\n strip.setAttribute('aria-orientation', 'vertical');\n }\n }\n\n dom.dropEmptyClass(container);\n }\n\n /** The values a variant takes, as the warning lists them. */\n function valuesOf(key) {\n if (key === 'variant') { return Object.keys(STYLES); }\n if (key === 'width') { return Object.keys(WIDTHS); }\n if (key === 'align') { return Object.keys(ALIGNS); }\n\n return [false].concat(verticals());\n }\n\n /**\n * A variant for a new container: the option, or the tabs setting, or the\n * default. A value it does not take is warned about and the default used.\n */\n function chosen(options, key) {\n var setting = ge.settings.tabs || {};\n var value = options[key] !== undefined ? options[key] : setting[key];\n\n if (value === undefined) { return DEFAULTS[key]; }\n if (valuesOf(key).indexOf(value) !== -1) { return value; }\n\n ge.warn('tabs: ' + JSON.stringify(value) + ' is not a ' + key + ', which takes ' +\n JSON.stringify(valuesOf(key)) + ': ' + JSON.stringify(DEFAULTS[key]) + ' is used');\n return DEFAULTS[key];\n }\n\n /**\n * What the view being edited lays a container out as. A breakpoint view\n * narrows the canvas, not the window, and Bootstrap's classes answer to\n * the window: so the view says it, from the breakpoint the container\n * goes vertical at. The all view shows what the window gives.\n */\n function layoutHere(container) {\n var vertical = read(container).vertical;\n if (vertical === false) { return null; }\n\n if (ge.view() === 'all') {\n container.removeAttribute(LAYOUT_ATTR);\n return /flex$/.test(getComputedStyle(container).display) ? 'vertical' : 'horizontal';\n }\n if (vertical === true) { return 'vertical'; }\n\n return ge.breakpoints.indexOf(ge.view()) >= ge.breakpoints.indexOf(vertical) ? 'vertical' : 'horizontal';\n }\n\n function markLayout(container) {\n var layout = layoutHere(container);\n\n if (layout) {\n container.setAttribute(LAYOUT_ATTR, layout);\n } else {\n container.removeAttribute(LAYOUT_ATTR);\n }\n }\n\n function select(labelKey, options, onChange) {\n var box = dom.element('div', { 'class': 'ge-tabs-variant' });\n var id = 'ge-tabs-variant-' + (++fieldCounter);\n\n box.appendChild(dom.element('label', { 'class': 'form-label', 'for': id }, ge.t(labelKey)));\n var field = box.appendChild(dom.element('select', { 'class': 'form-select form-select-sm', id: id }));\n\n options.forEach(function(option) {\n field.appendChild(dom.element('option', { value: option.value }, option.label));\n });\n field.addEventListener('change', function() { onChange(field.value); });\n\n return { box: box, field: field };\n }\n\n /** The Tabs section of a tabs container's settings panel: a select per variant. */\n function createSection(container) {\n var body = dom.element('div', { 'class': 'ge-tabs-variants' });\n var fields = {};\n\n function change(key, value) {\n write(container, key, value);\n markLayout(container);\n render();\n }\n\n function options(key) {\n return FIELDS[key].choices.map(function(choice) {\n return { value: choice.value, label: ge.t(choice.labelKey) };\n });\n }\n\n ['variant', 'width', 'align'].forEach(function(key) {\n fields[key] = select(FIELDS[key].labelKey, options(key), function(value) { change(key, value); });\n });\n fields.vertical = select(FIELDS.vertical.labelKey, [\n { value: 'false', label: ge.t('container.tabs_layout_horizontal') },\n { value: 'true', label: ge.t('container.tabs_layout_vertical') },\n ].concat(fromBreakpoints().map(function(key) {\n return { value: key, label: ge.t('container.tabs_layout_vertical_from', { breakpoint: key }) };\n })), function(value) {\n change('vertical', value === 'true' ? true : value === 'false' ? false : value);\n });\n\n ['variant', 'width', 'align', 'vertical'].forEach(function(key) {\n fields[key].box.setAttribute('data-ge-tabs-variant', key);\n body.appendChild(fields[key].box);\n });\n\n /** Fill the selects from the classes, and turn off what does not apply. */\n function render() {\n var values = read(container);\n\n fields.variant.field.value = values.variant;\n fields.width.field.value = values.width;\n fields.align.field.value = values.align;\n fields.vertical.field.value = String(values.vertical);\n fields.width.field.disabled = values.vertical !== false;\n fields.align.field.disabled = values.vertical !== false || values.width !== 'natural';\n }\n\n render();\n sections.push({ container: container, element: body, render: render });\n\n return body;\n }\n\n function addTabTo(container, options) {\n options = options || {};\n\n var strip = stripOf(container);\n var content = dom.one(container, ':scope > .tab-content');\n var id = ge.containerId('tab');\n var number = dom.children(strip, '.nav-item').length + 1;\n\n var tab = strip.appendChild(dom.element('li', { 'class': 'nav-item ge-tab', role: 'presentation' }));\n var button = tab.appendChild(dom.element('button', {\n 'class': 'nav-link',\n type: 'button',\n role: 'tab',\n 'data-bs-toggle': 'tab',\n 'data-bs-target': '#' + id,\n 'aria-controls': id,\n }));\n button.appendChild(dom.element('span', { 'class': 'ge-pane-label' },\n options.label || ge.t('container.tab_label', { number: number })));\n\n var pane = content.appendChild(dom.element('div', {\n 'class': 'tab-pane fade',\n role: 'tabpanel',\n tabindex: '0',\n id: id,\n }));\n pane.appendChild(ge.defaultRegion());\n\n if (options.activate || number === 1) { activatePane(container, pane); }\n\n return pane;\n }\n\n function activatePane(container, pane) {\n var id = pane.getAttribute('id');\n\n dom.all(container, ':scope > .tab-content > .tab-pane').forEach(function(each) {\n dom.removeClass(each, 'show active');\n });\n dom.addClass(pane, 'show active');\n\n dom.all(stripOf(container) || container, '.nav-link').forEach(function(button) {\n var active = button.getAttribute('data-bs-target') === '#' + id;\n\n dom.toggleClass(button, 'active', active);\n button.setAttribute('aria-selected', active ? 'true' : 'false');\n });\n }\n\n function paneOf(container, tab) {\n var link = dom.one(tab, '.nav-link');\n var target = link ? link.getAttribute('data-bs-target') : null;\n\n return target ? dom.one(container, target) : null;\n }\n\n return {\n labelKey: 'container.add_tabs',\n\n // A tab strip sorts its own tabs, and the panes follow them. No\n // group: a tab belongs to the strip it was made in.\n onSortable: function(sortable) {\n sortable(dom.all(ge.canvas, '.ge-container-tabs').map(stripOf).filter(Boolean), {\n draggable: '.ge-tab',\n });\n },\n addPaneKey: 'container.add_tab',\n paneKind: 'tab',\n\n create: function(options) {\n var container = dom.element('div', { 'data-ge-container': 'tabs' });\n var labels = options.labels || [];\n var count = options.tabs || labels.length || 2;\n\n container.appendChild(dom.element('ul', { 'class': 'nav nav-tabs', role: 'tablist' }));\n container.appendChild(dom.element('div', { 'class': 'tab-content' }));\n\n // The layout last: it takes off what a vertical strip has no use for\n ['variant', 'width', 'align', 'vertical'].forEach(function(key) {\n write(container, key, chosen(options, key));\n });\n\n for (var i = 0; i < count; i++) {\n addTabTo(container, { label: labels[i] });\n }\n\n return container;\n },\n\n addPane: addTabTo,\n\n mark: function(container) {\n dom.all(container, ':scope > .tab-content > .tab-pane').forEach(function(pane) {\n dom.addClass(pane, 'ge-tab-pane');\n });\n\n dom.children(stripOf(container) || container, '.nav-item').forEach(function(tab) {\n dom.addClass(tab, 'ge-tab');\n\n var link = dom.one(tab, '.nav-link');\n if (link) { ge.makeLabelEditable(ge.labelIn(link)); }\n\n if (dom.child(tab, '.ge-tools-drawer')) { return; }\n\n ge.createPaneControls(tab, 'tab', ge.settings.tab_tools, ge.t('confirm.delete_tab'),\n function(removed) {\n var pane = paneOf(container, tab);\n var wasActive = dom.hasClass(pane, 'active');\n\n dom.fadeOut(tab, 200, function() {\n if (pane) { pane.remove(); }\n removed();\n\n var first = dom.one(container, ':scope > .tab-content > .tab-pane');\n if (wasActive && first) { activatePane(container, first); }\n });\n });\n });\n },\n\n unmark: function(container) {\n ge.resumeToggles(container);\n container.removeAttribute(LAYOUT_ATTR);\n dom.all(container, '.ge-tab-pane').forEach(function(pane) {\n dom.removeClass(pane, 'ge-tab-pane');\n });\n ge.unwrapLabels(container);\n },\n\n panelSection: function(node, kind) {\n if (kind !== 'tabs' || !stripOf(node)) { return null; }\n\n return { labelKey: 'container.tabs_section', body: createSection(node) };\n },\n\n // After a view change or a change of classes: the layout marks and the\n // sections follow\n onRefresh: function(scope) {\n dom.selfAndAll(scope, '[data-ge-container=\"tabs\"]').forEach(markLayout);\n\n sections = sections.filter(function(entry) { return entry.element.isConnected; });\n sections.forEach(function(entry) {\n if (entry.container === scope || scope.contains(entry.container)) { entry.render(); }\n });\n },\n\n onDeinit: function() {\n sections = [];\n },\n\n /** Panes read in tab order, whatever order they were dropped in. */\n afterPaneMove: function(container) {\n var content = dom.one(container, ':scope > .tab-content');\n\n dom.children(stripOf(container) || container, '.nav-item').forEach(function(tab) {\n var pane = paneOf(container, tab);\n if (pane) { content.appendChild(pane); }\n });\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["GridEditor", "all", "root", "selector", "one", "selfAndAll", "found", "children", "node", "each", "child", "element", "tag", "attributes", "text", "node", "name", "value", "addClass", "node", "names", "split", "name", "removeClass", "toggleClass", "state", "hasClass", "dropEmptyClass", "hide", "node", "visible", "node", "DEFAULT_DURATION", "animateAway", "node", "frames", "duration", "done", "finish", "hide", "visible", "animation", "called", "once", "fadeOut", "node", "duration", "done", "animateAway", "style", "GridEditor", "STYLES", "WIDTHS", "ALIGNS", "DEFAULTS", "FIELDS", "fieldCounter", "LAYOUT_ATTR", "classValues", "map", "key", "ge", "sections", "stripOf", "container", "child", "fromBreakpoints", "infix", "vertical", "verticalClasses", "at", "verticals", "read", "strip", "has", "node", "name", "hasClass", "found", "fallback", "each", "classes", "write", "value", "removeClass", "addClass", "layout", "dropEmptyClass", "valuesOf", "chosen", "options", "setting", "layoutHere", "markLayout", "select", "labelKey", "onChange", "box", "element", "id", "field", "option", "createSection", "body", "fields", "change", "render", "choice", "values", "addTabTo", "content", "one", "number", "children", "tab", "button", "pane", "activatePane", "all", "active", "toggleClass", "paneOf", "link", "target", "sortable", "labels", "count", "i", "removed", "wasActive", "fadeOut", "first", "kind", "scope", "selfAndAll", "entry"]
7
7
  }
@@ -76,6 +76,7 @@ title. `{kind}` is one of the `panel.kind_*` keys, or a container's own label.
76
76
  | `panel.done` | Done | The modal's button that closes it |
77
77
  | `panel.id` | Id | Label of the id field |
78
78
  | `panel.classes` | Classes | Label of the classes field |
79
+ | `panel.section_general` | Id and classes | Heading of the panel's section with the id, the classes and the preset toggles |
79
80
  | `panel.editor` | Editor | Label of a text's settings field that says which editor edits it |
80
81
  | `panel.kind_row` | Row | `{kind}` for a row |
81
82
  | `panel.kind_column` | Column | For a column |
@@ -96,6 +97,23 @@ The containers: tabs, accordions and popups, and the panes inside them.
96
97
  | `container.add_tabs` | Tabs | Toolbar button that adds a tabs container |
97
98
  | `container.add_tab` | Add tab | Container drawer, adds a pane |
98
99
  | `container.tab_label` | Tab {number} | Label of a new tab. `{number}` is its position |
100
+ | `container.tabs_section` | Tabs | Heading of the tabs container's section of its settings panel |
101
+ | `container.tabs_style` | Style | Its strip's style select |
102
+ | `container.tabs_style_tabs` | Tabs | Its choice for `nav-tabs` |
103
+ | `container.tabs_style_pills` | Pills | Its choice for `nav-pills` |
104
+ | `container.tabs_style_underline` | Underline | Its choice for `nav-underline` |
105
+ | `container.tabs_width` | Width | The strip's width select |
106
+ | `container.tabs_width_natural` | Natural | Its choice for no width class |
107
+ | `container.tabs_width_fill` | Fill | Its choice for `nav-fill` |
108
+ | `container.tabs_width_justified` | Justified | Its choice for `nav-justified` |
109
+ | `container.tabs_align` | Alignment | The strip's alignment select, with the natural width and horizontal only |
110
+ | `container.tabs_align_start` | Start | Its choice for no alignment class |
111
+ | `container.tabs_align_center` | Center | Its choice for `justify-content-center` |
112
+ | `container.tabs_align_end` | End | Its choice for `justify-content-end` |
113
+ | `container.tabs_layout` | Layout | The container's layout select |
114
+ | `container.tabs_layout_horizontal` | Horizontal | Its choice for the strip above the panes |
115
+ | `container.tabs_layout_vertical` | Vertical | Its choice for the strip beside the panes at every size: `d-flex`, `flex-column` |
116
+ | `container.tabs_layout_vertical_from` | Vertical from {breakpoint} | Its choices for vertical from a breakpoint up, `d-{bp}-flex`, `flex-{bp}-column`. `{breakpoint}` is its key, `md` |
99
117
  | `container.add_accordion` | Accordion | Toolbar button that adds an accordion |
100
118
  | `container.add_accordion_item` | Add item | Container drawer, adds an item |
101
119
  | `container.accordion_label` | Item {number} | Label of a new accordion item |
@@ -222,7 +240,7 @@ utility.*
222
240
  ---------
223
241
 
224
242
  The Responsive section of a settings panel, which the utility plugins fill,
225
- and the per breakpoint fields of the style plugin's sections. The labels of
243
+ and the per breakpoint fields of the inline-style plugin's sections. The labels of
226
244
  each utility and its values are the plugins' own keys.
227
245
 
228
246
  | Key | English | Where |
@@ -236,9 +254,9 @@ each utility and its values are the plugins' own keys.
236
254
  | `utility.default` | Default | The empty choice of a field when nothing below the view sets the utility, and always in the all view |
237
255
  | `utility.inherit` | Inherit: {value} (from {breakpoint}) | The empty choice in a breakpoint view when a smaller breakpoint sets the utility. `{breakpoint}` is its key, `sm` |
238
256
  | `utility.varies` | Changes at {breakpoints}; choosing here replaces that | Note under a field in the all view when breakpoints set their own value. `{breakpoints}` is a list of keys |
239
- | `utility.display` | Display | Label of the display field, `d-*`, in the style plugin's Display section. Its other choices are the values themselves |
257
+ | `utility.display` | Display | Label of the display field, `d-*`, in the inline-style plugin's Display section. Its other choices are the values themselves |
240
258
  | `utility.visibility_hidden` | Hidden | Its choice for `d-*-none` |
241
- | `tool.hide_in_view` | Hide in this view | The style plugin's eye, on a node shown in the view being edited |
259
+ | `tool.hide_in_view` | Hide in this view | The inline-style plugin's eye, on a node shown in the view being edited |
242
260
  | `tool.show_in_view` | Show in this view | The same eye, on a node hidden there |
243
261
  | `utility.order` | Order | Label of the order plugin's field |
244
262
  | `utility.order_first` | First | Its choice for `order-*-first` |
@@ -249,7 +267,7 @@ each utility and its values are the plugins' own keys.
249
267
  | `utility.gutters` | Gutters | The gutters plugin's `g-*` field, on a row |
250
268
  | `utility.gutters_x` | Horizontal gutters | Its `gx-*` field |
251
269
  | `utility.gutters_y` | Vertical gutters | Its `gy-*` field |
252
- | `utility.padding` | Padding | The padding group, in the style plugin's Spacing section |
270
+ | `utility.padding` | Padding | The padding group, in the inline-style plugin's Spacing section |
253
271
  | `utility.margin` | Margin | Its margin group |
254
272
  | `utility.side_all` | All sides | The side of `p-*` and `m-*` in a group's side choice |
255
273
  | `utility.side_x` | Left and right | The side of `px-*` and `mx-*` |
@@ -258,11 +276,11 @@ each utility and its values are the plugins' own keys.
258
276
  | `utility.side_b` | Bottom | The side of `pb-*` and `mb-*` |
259
277
  | `utility.side_s` | Start | The side of `ps-*` and `ms-*` |
260
278
  | `utility.side_e` | End | The side of `pe-*` and `me-*` |
261
- | `utility.text_align` | Text alignment | Label of the text alignment field, in the style plugin's Text section |
279
+ | `utility.text_align` | Text alignment | Label of the text alignment field, in the inline-style plugin's Text section |
262
280
  | `utility.text_start` | Start | Its choice for `text-*-start` |
263
281
  | `utility.text_center` | Center | Its choice for `text-*-center` |
264
282
  | `utility.text_end` | End | Its choice for `text-*-end` |
265
- | `utility.flex_direction` | Direction | The `flex-*-row` / `-column` field, in the style plugin's Flex section |
283
+ | `utility.flex_direction` | Direction | The `flex-*-row` / `-column` field, in the inline-style plugin's Flex section |
266
284
  | `utility.flex_wrap` | Wrap | Its `flex-*-wrap` / `-nowrap` field |
267
285
  | `utility.justify_content` | Justify columns | Its `justify-content-*` field |
268
286
  | `utility.align_items` | Align columns | Its `align-items-*` field |
@@ -273,89 +291,89 @@ each utility and its values are the plugins' own keys.
273
291
  | `utility.flex_fill` | Fill | Its `flex-*-fill` field, on anything but a row |
274
292
  | `utility.flex_grow` | Grow | Its `flex-*-grow-*` field |
275
293
  | `utility.flex_shrink` | Shrink | Its `flex-*-shrink-*` field |
276
- | `utility.sticky` | Sticky | The `sticky-*-top` / `-bottom` field, in the style plugin's Position section |
277
- | `utility.float` | Float | Label of the float field, in the style plugin's Position section, on an element |
294
+ | `utility.sticky` | Sticky | The `sticky-*-top` / `-bottom` field, in the inline-style plugin's Position section |
295
+ | `utility.float` | Float | Label of the float field, in the inline-style plugin's Position section, on an element |
278
296
  | `utility.float_start` | Start | Its choice for `float-*-start` |
279
297
  | `utility.float_end` | End | Its choice for `float-*-end` |
280
298
  | `utility.float_none` | None | Its choice for `float-*-none` |
281
299
  | `utility.spacing_gutter` | A column's side padding is its gutter: changing it changes the gutter | Note in a column's spacing group while it carries side padding |
282
300
 
283
301
 
284
- style.*
285
- -------
302
+ inline_style.*
303
+ --------------
286
304
 
287
- The style plugin's accordion, in a node's settings panel or in the dialog.
305
+ The inline-style plugin's accordion, in a node's settings panel or in the dialog.
288
306
 
289
307
  | Key | English | Where |
290
308
  | --- | --- | --- |
291
- | `style.section_title` | Style | The style plugin's accordion, and the button that opens it in the dialog when `settings_panel` is `popover` or `inline` |
292
- | `style.dialog_title` | Style: {kind} | Title of that dialog. `{kind}` is what the panel's title calls the node |
293
- | `style.section_size` | Size | The accordion's section header |
294
- | `style.section_spacing` | Spacing | The accordion's section header |
295
- | `style.section_border` | Border | The accordion's section header |
296
- | `style.section_background` | Background | The accordion's section header |
297
- | `style.section_text` | Text | The accordion's section header |
298
- | `style.section_typography` | Typography | The accordion's section header |
299
- | `style.section_display` | Display | The accordion's section header |
300
- | `style.section_flex` | Flex | The accordion's section header |
301
- | `style.section_position` | Position | The accordion's section header |
302
- | `style.section_custom` | Custom css | The accordion's section header |
303
- | `style.all_sizes` | Applies to every size | Note over a section's inline fields in a breakpoint view: the style attribute is not responsive |
304
- | `style.overridden` | The class {class} takes priority over this value | Note under an inline field whose property a Bootstrap utility on the node also sets. `{class}` is that class |
305
- | `style.invalid` | Not a value this property takes | Tooltip of an inline field holding a value the browser refused |
306
- | `style.catalog` | Bootstrap classes | Heading of a section's Bootstrap class chips |
307
- | `style.shadow_x` | X | A part of the shadow builder |
308
- | `style.shadow_y` | Y | A part of the shadow builder |
309
- | `style.shadow_blur` | Blur | A part of the shadow builder |
310
- | `style.shadow_spread` | Spread | A part of the shadow builder |
311
- | `style.shadow_color` | Color | A part of the shadow builder |
312
- | `style.shadow_inset` | Inset | The shadow builder's inset checkbox |
313
- | `style.shadow_text_mode` | Edit as text | Link under the shadow builder that edits the value as text |
314
- | `style.prop_width` | Width | Label of the `width` field |
315
- | `style.prop_height` | Height | Label of the `height` field |
316
- | `style.prop_min_width` | Min width | Label of the `min-width` field |
317
- | `style.prop_min_height` | Min height | Label of the `min-height` field |
318
- | `style.prop_max_width` | Max width | Label of the `max-width` field |
319
- | `style.prop_max_height` | Max height | Label of the `max-height` field |
320
- | `style.prop_margin_top` | Margin top | Label of the `margin-top` field |
321
- | `style.prop_margin_right` | Margin right | Label of the `margin-right` field |
322
- | `style.prop_margin_bottom` | Margin bottom | Label of the `margin-bottom` field |
323
- | `style.prop_margin_left` | Margin left | Label of the `margin-left` field |
324
- | `style.prop_padding_top` | Padding top | Label of the `padding-top` field |
325
- | `style.prop_padding_right` | Padding right | Label of the `padding-right` field |
326
- | `style.prop_padding_bottom` | Padding bottom | Label of the `padding-bottom` field |
327
- | `style.prop_padding_left` | Padding left | Label of the `padding-left` field |
328
- | `style.prop_border_width` | Border width | Label of the `border-width` field |
329
- | `style.prop_border_style` | Border style | Label of the `border-style` field |
330
- | `style.prop_border_color` | Border color | Label of the `border-color` field |
331
- | `style.prop_border_radius` | Border radius | Label of the `border-radius` field |
332
- | `style.prop_box_shadow` | Shadow | Label of the `box-shadow` field |
333
- | `style.prop_background_color` | Background color | Label of the `background-color` field |
334
- | `style.prop_background_image` | Background image | Label of the `background-image` field |
335
- | `style.prop_background_size` | Background size | Label of the `background-size` field |
336
- | `style.prop_background_position` | Background position | Label of the `background-position` field |
337
- | `style.prop_background_repeat` | Background repeat | Label of the `background-repeat` field |
338
- | `style.prop_color` | Color | Label of the `color` field |
339
- | `style.prop_font_size` | Font size | Label of the `font-size` field |
340
- | `style.prop_text_align` | Text align | Label of the `text-align` field |
341
- | `style.prop_text_shadow` | Text shadow | Label of the `text-shadow` field |
342
- | `style.prop_font_family` | Font family | Label of the `font-family` field |
343
- | `style.prop_font_weight` | Font weight | Label of the `font-weight` field |
344
- | `style.prop_font_style` | Font style | Label of the `font-style` field |
345
- | `style.prop_line_height` | Line height | Label of the `line-height` field |
346
- | `style.prop_letter_spacing` | Letter spacing | Label of the `letter-spacing` field |
347
- | `style.prop_text_transform` | Text transform | Label of the `text-transform` field |
348
- | `style.prop_text_decoration` | Text decoration | Label of the `text-decoration` field |
349
- | `style.prop_display` | Display | Label of the `display` field |
350
- | `style.prop_opacity` | Opacity | Label of the `opacity` field |
351
- | `style.prop_overflow` | Overflow | Label of the `overflow` field |
352
- | `style.prop_visibility` | Visibility | Label of the `visibility` field |
353
- | `style.prop_position` | Position | Label of the `position` field |
354
- | `style.prop_top` | Top | Label of the `top` field |
355
- | `style.prop_right` | Right | Label of the `right` field |
356
- | `style.prop_bottom` | Bottom | Label of the `bottom` field |
357
- | `style.prop_left` | Left | Label of the `left` field |
358
- | `style.prop_z_index` | Z-index | Label of the `z-index` field |
309
+ | `inline_style.section_title` | Style | Heading of the inline-style plugin's section of the panel, and the button that opens it in the dialog when `settings_panel` is `popover` or `inline` |
310
+ | `inline_style.dialog_title` | Style: {kind} | Title of that dialog. `{kind}` is what the panel's title calls the node |
311
+ | `inline_style.section_size` | Size | The accordion's section header |
312
+ | `inline_style.section_spacing` | Spacing | The accordion's section header |
313
+ | `inline_style.section_border` | Border | The accordion's section header |
314
+ | `inline_style.section_background` | Background | The accordion's section header |
315
+ | `inline_style.section_text` | Text | The accordion's section header |
316
+ | `inline_style.section_typography` | Typography | The accordion's section header |
317
+ | `inline_style.section_display` | Display | The accordion's section header |
318
+ | `inline_style.section_flex` | Flex | The accordion's section header |
319
+ | `inline_style.section_position` | Position | The accordion's section header |
320
+ | `inline_style.section_custom` | Custom css | The accordion's section header |
321
+ | `inline_style.all_sizes` | Applies to every size | Note over a section's inline fields in a breakpoint view: the style attribute is not responsive |
322
+ | `inline_style.overridden` | The class {class} takes priority over this value | Note under an inline field whose property a Bootstrap utility on the node also sets. `{class}` is that class |
323
+ | `inline_style.invalid` | Not a value this property takes | Tooltip of an inline field holding a value the browser refused |
324
+ | `inline_style.catalog` | Bootstrap classes | Heading of a section's Bootstrap class chips |
325
+ | `inline_style.shadow_x` | X | A part of the shadow builder |
326
+ | `inline_style.shadow_y` | Y | A part of the shadow builder |
327
+ | `inline_style.shadow_blur` | Blur | A part of the shadow builder |
328
+ | `inline_style.shadow_spread` | Spread | A part of the shadow builder |
329
+ | `inline_style.shadow_color` | Color | A part of the shadow builder |
330
+ | `inline_style.shadow_inset` | Inset | The shadow builder's inset checkbox |
331
+ | `inline_style.shadow_text_mode` | Edit as text | Link under the shadow builder that edits the value as text |
332
+ | `inline_style.prop_width` | Width | Label of the `width` field |
333
+ | `inline_style.prop_height` | Height | Label of the `height` field |
334
+ | `inline_style.prop_min_width` | Min width | Label of the `min-width` field |
335
+ | `inline_style.prop_min_height` | Min height | Label of the `min-height` field |
336
+ | `inline_style.prop_max_width` | Max width | Label of the `max-width` field |
337
+ | `inline_style.prop_max_height` | Max height | Label of the `max-height` field |
338
+ | `inline_style.prop_margin_top` | Margin top | Label of the `margin-top` field |
339
+ | `inline_style.prop_margin_right` | Margin right | Label of the `margin-right` field |
340
+ | `inline_style.prop_margin_bottom` | Margin bottom | Label of the `margin-bottom` field |
341
+ | `inline_style.prop_margin_left` | Margin left | Label of the `margin-left` field |
342
+ | `inline_style.prop_padding_top` | Padding top | Label of the `padding-top` field |
343
+ | `inline_style.prop_padding_right` | Padding right | Label of the `padding-right` field |
344
+ | `inline_style.prop_padding_bottom` | Padding bottom | Label of the `padding-bottom` field |
345
+ | `inline_style.prop_padding_left` | Padding left | Label of the `padding-left` field |
346
+ | `inline_style.prop_border_width` | Border width | Label of the `border-width` field |
347
+ | `inline_style.prop_border_style` | Border style | Label of the `border-style` field |
348
+ | `inline_style.prop_border_color` | Border color | Label of the `border-color` field |
349
+ | `inline_style.prop_border_radius` | Border radius | Label of the `border-radius` field |
350
+ | `inline_style.prop_box_shadow` | Shadow | Label of the `box-shadow` field |
351
+ | `inline_style.prop_background_color` | Background color | Label of the `background-color` field |
352
+ | `inline_style.prop_background_image` | Background image | Label of the `background-image` field |
353
+ | `inline_style.prop_background_size` | Background size | Label of the `background-size` field |
354
+ | `inline_style.prop_background_position` | Background position | Label of the `background-position` field |
355
+ | `inline_style.prop_background_repeat` | Background repeat | Label of the `background-repeat` field |
356
+ | `inline_style.prop_color` | Color | Label of the `color` field |
357
+ | `inline_style.prop_font_size` | Font size | Label of the `font-size` field |
358
+ | `inline_style.prop_text_align` | Text align | Label of the `text-align` field |
359
+ | `inline_style.prop_text_shadow` | Text shadow | Label of the `text-shadow` field |
360
+ | `inline_style.prop_font_family` | Font family | Label of the `font-family` field |
361
+ | `inline_style.prop_font_weight` | Font weight | Label of the `font-weight` field |
362
+ | `inline_style.prop_font_style` | Font style | Label of the `font-style` field |
363
+ | `inline_style.prop_line_height` | Line height | Label of the `line-height` field |
364
+ | `inline_style.prop_letter_spacing` | Letter spacing | Label of the `letter-spacing` field |
365
+ | `inline_style.prop_text_transform` | Text transform | Label of the `text-transform` field |
366
+ | `inline_style.prop_text_decoration` | Text decoration | Label of the `text-decoration` field |
367
+ | `inline_style.prop_display` | Display | Label of the `display` field |
368
+ | `inline_style.prop_opacity` | Opacity | Label of the `opacity` field |
369
+ | `inline_style.prop_overflow` | Overflow | Label of the `overflow` field |
370
+ | `inline_style.prop_visibility` | Visibility | Label of the `visibility` field |
371
+ | `inline_style.prop_position` | Position | Label of the `position` field |
372
+ | `inline_style.prop_top` | Top | Label of the `top` field |
373
+ | `inline_style.prop_right` | Right | Label of the `right` field |
374
+ | `inline_style.prop_bottom` | Bottom | Label of the `bottom` field |
375
+ | `inline_style.prop_left` | Left | Label of the `left` field |
376
+ | `inline_style.prop_z_index` | Z-index | Label of the `z-index` field |
359
377
 
360
378
 
361
379
  badge.*
package/docs/plugins.md CHANGED
@@ -241,7 +241,7 @@ so `ge.detailsOf(node)` finds what is in it.
241
241
 
242
242
  A field made with `ge.utilityField` in a section follows the view and the
243
243
  classes field as the Responsive section's do, wherever the section is at the
244
- time. The style plugin's accordion is a section, and what the spacing,
244
+ time. The inline-style plugin's accordion is a section, and what the spacing,
245
245
  textalign, display, flex, sticky and float fields are in: its families are
246
246
  `panel: false`, and it makes their fields itself.
247
247
 
@@ -497,14 +497,14 @@ tool does not belong. A tool writes with `ge.setUtility(node, family, value,
497
497
  `onRefresh(scope)` runs whenever the preview is redrawn — on `init`, on a view
498
498
  change, after a write, after the user types in a classes field — with the node
499
499
  whose utilities changed, or the canvas. It is for what a plugin marks the canvas
500
- with beyond inline styles: the style plugin's display keeps hidden nodes on the
500
+ with beyond inline styles: the inline-style plugin's display keeps hidden nodes on the
501
501
  canvas and fades them there, and takes the drawer of a flex node out of the
502
502
  flow. Whatever it adds, `onDeinit` takes away.
503
503
 
504
504
  ### A panel of your own
505
505
 
506
506
  A field per family is the right panel for most plugins and the wrong one for
507
- some: spacing, part of the style plugin, has fourteen families, and fourteen
507
+ some: spacing, part of the inline-style plugin, has fourteen families, and fourteen
508
508
  fields. Such a plugin marks
509
509
  its families `panel: false` and returns its own element from
510
510
  `panel(node, kind)` — or null where it does not apply — and the editor puts it
@@ -532,7 +532,7 @@ with a warning.
532
532
 
533
533
  Plugin options live in the `utilities` setting, under the plugin's name:
534
534
  `utilities: { gutters: { scale: [...] } }`. The editor passes the
535
- setting through as it is; each plugin fills in its own defaults. The style
536
- plugin's are the `style` setting, since most of them are about its inline
535
+ setting through as it is; each plugin fills in its own defaults. The
536
+ inline-style plugin's are the `inline_style` setting, since most of them are about its inline
537
537
  css.
538
538
 
@@ -100,8 +100,11 @@
100
100
  asked to do any of it, so there is no backdrop and no focus
101
101
  trap to fight with. Double click a tab or item label to
102
102
  rename it, and a card&rsquo;s header and footer the same
103
- way. The last row shows two levels: tabs inside an
104
- accordion item.
103
+ way. The row after the popup shows two levels: tabs inside
104
+ an accordion item. A tabs container's gear has a Tabs
105
+ section for its variant - tabs, pills or underline, full
106
+ width, alignment, and vertical from a breakpoint up - and
107
+ the last row has two of them.
105
108
  </p>
106
109
  <button class="btn btn-sm btn-secondary" id="output" type="button">Show the html this produces</button>
107
110
  <button class="btn btn-sm btn-primary" id="authored" type="button">Open that html as a real page</button>
@@ -239,6 +242,65 @@
239
242
  </div>
240
243
  </div>
241
244
 
245
+ <div class="row">
246
+ <div class="col-lg-6">
247
+ <div data-ge-container="tabs" class="d-md-flex align-items-md-start">
248
+ <ul class="nav nav-pills flex-md-column me-md-3" role="tablist" aria-orientation="vertical">
249
+ <li class="nav-item" role="presentation">
250
+ <button class="nav-link active" type="button" role="tab" data-bs-toggle="tab" data-bs-target="#example-vtab-one" aria-controls="example-vtab-one">Profile</button>
251
+ </li>
252
+ <li class="nav-item" role="presentation">
253
+ <button class="nav-link" type="button" role="tab" data-bs-toggle="tab" data-bs-target="#example-vtab-two" aria-controls="example-vtab-two">Settings</button>
254
+ </li>
255
+ </ul>
256
+ <div class="tab-content">
257
+ <div class="tab-pane fade show active" id="example-vtab-one" role="tabpanel" tabindex="0">
258
+ <div class="row"><div class="col-lg-12">
259
+ <div class="ge-content" data-ge-content-type="tinymce"><p>Pills, vertical from tablet up: open the container&rsquo;s gear and look in Tabs.</p></div>
260
+ </div></div>
261
+ </div>
262
+ <div class="tab-pane fade" id="example-vtab-two" role="tabpanel" tabindex="0">
263
+ <div class="row"><div class="col-lg-12">
264
+ <div class="ge-content" data-ge-content-type="tinymce"><p>On a phone the pills are a row above the panes.</p></div>
265
+ </div></div>
266
+ </div>
267
+ </div>
268
+ </div>
269
+ </div>
270
+ <div class="col-lg-6">
271
+ <div data-ge-container="tabs">
272
+ <ul class="nav nav-underline nav-fill" role="tablist">
273
+ <li class="nav-item" role="presentation">
274
+ <button class="nav-link active" type="button" role="tab" data-bs-toggle="tab" data-bs-target="#example-utab-one" aria-controls="example-utab-one">Week</button>
275
+ </li>
276
+ <li class="nav-item" role="presentation">
277
+ <button class="nav-link" type="button" role="tab" data-bs-toggle="tab" data-bs-target="#example-utab-two" aria-controls="example-utab-two">Month</button>
278
+ </li>
279
+ <li class="nav-item" role="presentation">
280
+ <button class="nav-link" type="button" role="tab" data-bs-toggle="tab" data-bs-target="#example-utab-three" aria-controls="example-utab-three">Year</button>
281
+ </li>
282
+ </ul>
283
+ <div class="tab-content">
284
+ <div class="tab-pane fade show active" id="example-utab-one" role="tabpanel" tabindex="0">
285
+ <div class="row"><div class="col-lg-12">
286
+ <div class="ge-content" data-ge-content-type="tinymce"><p>Underline, filling the width.</p></div>
287
+ </div></div>
288
+ </div>
289
+ <div class="tab-pane fade" id="example-utab-two" role="tabpanel" tabindex="0">
290
+ <div class="row"><div class="col-lg-12">
291
+ <div class="ge-content" data-ge-content-type="tinymce"><p>The second.</p></div>
292
+ </div></div>
293
+ </div>
294
+ <div class="tab-pane fade" id="example-utab-three" role="tabpanel" tabindex="0">
295
+ <div class="row"><div class="col-lg-12">
296
+ <div class="ge-content" data-ge-content-type="tinymce"><p>The third.</p></div>
297
+ </div></div>
298
+ </div>
299
+ </div>
300
+ </div>
301
+ </div>
302
+ </div>
303
+
242
304
  </div> <!-- /#myGrid -->
243
305
  </div> <!-- /.container -->
244
306