formeo 5.5.0 → 5.7.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.
@@ -1,7 +1,7 @@
1
1
 
2
2
  /**
3
3
  formeo - https://formeo.io
4
- Version: 5.4.0
4
+ Version: 5.6.0
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
@@ -6061,7 +6061,7 @@ if (globalThis !== void 0) globalThis.SmartTooltip = SmartTooltip;
6061
6061
  var name$1, version$2, type, main, module$1, unpkg, exports$1, files, homepage, repository, author, contributors, bugs, description, keywords, ignore, config, scripts, devDependencies, dependencies, release, commitlint, package_default;
6062
6062
  var init_package = __esmMin((() => {
6063
6063
  name$1 = "formeo";
6064
- version$2 = "5.4.0";
6064
+ version$2 = "5.6.0";
6065
6065
  type = "module";
6066
6066
  main = "dist/formeo.cjs.js";
6067
6067
  module$1 = "dist/formeo.es.js";
@@ -8334,7 +8334,7 @@ function buildFlatDataStructure(data, componentId, componentType, result = {}) {
8334
8334
  }
8335
8335
  return result;
8336
8336
  }
8337
- var import_mergeWith, uuidv4, shortId, match, remove, componentType, unique, uuid, merge, clone$1, percent, numToPercent, formDataStorageKey, sessionStorage, isAddress, isInternalAddress, cleanFormData;
8337
+ var import_mergeWith, uuidv4, shortId, match, remove, componentType, unique, uuid, looksLikeArrayIndex, nonIndexId, merge, clone$1, percent, numToPercent, formDataStorageKey, sessionStorage, isAddress, isInternalAddress, cleanFormData;
8338
8338
  var init_utils = __esmMin((() => {
8339
8339
  import_mergeWith = /* @__PURE__ */ __toESM(require_mergeWith(), 1);
8340
8340
  init_constants();
@@ -8366,6 +8366,12 @@ var init_utils = __esmMin((() => {
8366
8366
  uuid = (elem) => {
8367
8367
  return elem?.attrs?.id || elem?.id || shortId();
8368
8368
  };
8369
+ looksLikeArrayIndex = (id) => /^(?:0|[1-9]\d*)$/.test(id) && Number(id) < 2 ** 32 - 1;
8370
+ nonIndexId = () => {
8371
+ let id = uuid();
8372
+ while (looksLikeArrayIndex(id)) id = uuid();
8373
+ return id;
8374
+ };
8369
8375
  merge = (obj1, obj2) => {
8370
8376
  const customizer = (objValue, srcValue) => {
8371
8377
  if (Array.isArray(objValue)) {
@@ -8432,8 +8438,8 @@ var init_utils = __esmMin((() => {
8432
8438
  //#region src/lib/icons/formeo-sprite.svg?raw
8433
8439
  var formeo_sprite_default;
8434
8440
  var init_formeo_sprite = __esmMin((() => {
8435
- formeo_sprite_default = "<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><symbol id=\"f-i-autocomplete\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6,5h1v1H6V5z M4,4H3v1h1V4z M6,4H5v1h1V4z M2,5v1h1V5H2z M3,7h1V6H3V7z M5,7h1V6H5V7z M4,5v1h1V5H4z M2,14h1v-1H2V14z M4,14h1v-1H4V14z M6,14h1v-1H6V14z M9,13H8v1h1V13z M16,3.5v4C16,8.3,15.3,9,14.5,9H14v3v3c0,0.6-0.4,1-1,1H1c-0.6,0-1-0.4-1-1V3.5 C0,2.7,0.7,2,1.5,2h3H8V1.5V1H7H6V0.5V0h2.5H11v0.5V1h-1H9v0.5V2h3h2.5C15.3,2,16,2.7,16,3.5z M13,12H7H1v3h12V12z M3,11v-1H2v1H3z M5,11v-1H4v1H5z M15,3.5C15,3.2,14.8,3,14.5,3H9v2.5V8H8.5H8V7.5V7H7V6h1V5.5V5H7V4h1V3.5V3H1.5C1.2,3,1,3.2,1,3.5v4 C1,7.8,1.2,8,1.5,8H8v1H6v0.5V10h2.5H11V9.5V9H9V8h5.5C14.8,8,15,7.8,15,7.5V3.5z\"/></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-bin\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M4 10v20c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-20h-22zM10 28h-2v-14h2v14zM14 28h-2v-14h2v14zM18 28h-2v-14h2v14zM22 28h-2v-14h2v14zM26.5 4h-6.5v-2.5c0-.825-.675-1.5-1.5-1.5h-7c-.825 0-1.5.675-1.5 1.5v2.5h-6.5c-.825 0-1.5.675-1.5 1.5v2.5h26v-2.5c0-.825-.675-1.5-1.5-1.5zM18 4h-6v-1.975h6v1.975z\"/></symbol><symbol id=\"f-i-button\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"acprefix__metadata8\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><path id=\"acprefix__rect4140\" d=\"M 0.4765625,4 A 0.47706934,0.47706934 0 0 0 0,4.4765625 L 0,11.523438 A 0.47706934,0.47706934 0 0 0 0.4765625,12 L 15.523438,12 A 0.47706934,0.47706934 0 0 0 16,11.523438 L 16,4.4765625 A 0.47706934,0.47706934 0 0 0 15.523438,4 L 0.4765625,4 Z m 0.4765625,0.953125 14.09375,0 0,6.09375 -14.09375,0 0,-6.09375 z\"/><g id=\"acprefix__layer1\"><g id=\"acprefix__text4203\"><g id=\"acprefix__g4212\" transform=\"translate(0.10112835,0.1001358)\"><path id=\"acprefix__path4208\" d=\"m 6.0690374,6.4093857 q -0.5371093,0 -0.8544922,0.4003906 -0.3149414,0.4003906 -0.3149414,1.0913086 0,0.6884766 0.3149414,1.0888672 0.3173829,0.4003906 0.8544922,0.4003906 0.5371094,0 0.8496094,-0.4003906 0.3149414,-0.4003906 0.3149414,-1.0888672 0,-0.690918 -0.3149414,-1.0913086 -0.3125,-0.4003906 -0.8496094,-0.4003906 z m 0,-0.4003906 q 0.7666016,0 1.225586,0.5151367 0.4589843,0.5126953 0.4589843,1.3769531 0,0.8618164 -0.4589843,1.3769531 -0.4589844,0.5126953 -1.225586,0.5126953 -0.7690429,0 -1.2304687,-0.5126953 -0.4589844,-0.5126953 -0.4589844,-1.3769531 0,-0.8642578 0.4589844,-1.3769531 0.4614258,-0.5151367 1.2304687,-0.5151367 z\"/><path id=\"acprefix__path4210\" d=\"m 8.5250921,6.074913 0.4931641,0 0,1.5405274 1.6357418,-1.5405274 0.634766,0 -1.809082,1.6992188 1.938477,1.9458008 -0.649415,0 -1.7504878,-1.7553711 0,1.7553711 -0.4931641,0 0,-3.6450196 z\"/></g></g></g></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-calendar\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12.048 16.961c-0.178 0.257-0.395 0.901-0.652 1.059-0.257 0.157-0.547 0.267-0.869 0.328-0.323 0.062-0.657 0.089-1.002 0.079v1.527h2.467v6.046h1.991v-9.996h-1.584c-0.056 0.381-0.173 0.7-0.351 0.957zM23 8h2c0.553 0 1-0.448 1-1v-6c0-0.552-0.447-1-1-1h-2c-0.553 0-1 0.448-1 1v6c0 0.552 0.447 1 1 1zM7 8h2c0.552 0 1-0.448 1-1v-6c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v6c0 0.552 0.448 1 1 1zM30 4h-2v5c0 0.552-0.447 1-1 1h-6c-0.553 0-1-0.448-1-1v-5h-8v5c0 0.552-0.448 1-1 1h-6c-0.552 0-1-0.448-1-1v-5h-2c-1.104 0-2 0.896-2 2v24c0 1.104 0.896 2 2 2h28c1.104 0 2-0.896 2-2v-24c0-1.104-0.896-2-2-2zM30 29c0 0.553-0.447 1-1 1h-26c-0.552 0-1-0.447-1-1v-16c0-0.552 0.448-1 1-1h26c0.553 0 1 0.448 1 1v16zM15.985 17.982h4.968c-0.936 1.152-1.689 2.325-2.265 3.705-0.575 1.381-0.638 2.818-0.749 4.312h2.131c0.009-0.666-0.195-1.385-0.051-2.156 0.146-0.771 0.352-1.532 0.617-2.285 0.267-0.752 0.598-1.461 0.996-2.127 0.396-0.667 0.853-1.229 1.367-1.686v-1.742h-7.015v1.979z\"/></symbol><symbol id=\"f-i-checkbox\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M13.5,5v8c0,0.8-0.7,1.5-1.5,1.5H3c-0.8,0-1.5-0.7-1.5-1.5V4c0-0.8,0.7-1.5,1.5-1.5h9c0.7,0,1.3,0.5,1.5,1.2l2.4-1.4L13.5,5 z M12.5,6.2L7.7,12L2.8,5.5l4.9,1.6l4.8-2.9V4c0-0.3-0.2-0.5-0.5-0.5H3C2.7,3.5,2.5,3.7,2.5,4v9c0,0.3,0.2,0.5,0.5,0.5h9 c0.3,0,0.5-0.2,0.5-0.5V6.2z\"/></symbol><symbol id=\"f-i-checkbox-group\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0,1h16V0H0V1z M0,3h16V2H0V3z M6,5v1h9V5H6z M15,14v-1H6v1H15z M6,10h9V9H6V10z M4,12l-2.5,1.5L0,13l1.5,2L4,12z M4,8 L1.5,9.5L0,9l1.5,2L4,8z M4,4L1.5,5.5L0,5l1.5,2L4,4z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-columns\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"agprefix__metadata4318\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><path id=\"agprefix__rect4860-3-5\" d=\"M 16,0.5 A 0.50004997,0.50004997 0 0 0 15.5,0 l -5,0 -5,0 -5,0 A 0.50004997,0.50004997 0 0 0 0,0.5 l 0,15 A 0.50004997,0.50004997 0 0 0 0.5,16 l 5,0 5,0 5,0 A 0.50004997,0.50004997 0 0 0 16,15.5 l 0,-15 z M 15,1 15,15 11,15 11,1 15,1 Z M 10,1 10,15 6,15 6,1 10,1 Z M 5,1 5,15 1,15 1,1 5,1 Z\"/></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-copy\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M20 8v-8h-14l-6 6v18h12v8h20v-24h-12zM6 2.828v3.172h-3.172l3.172-3.172zM2 22v-14h6v-6h10v6l-6 6v8h-10zM18 10.828v3.172h-3.172l3.172-3.172zM30 30h-16v-14h6v-6h10v20z\"/></symbol><symbol id=\"f-i-divider\" viewBox=\"0 0 15 15\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"aiprefix__metadata10\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><rect y=\"7\" x=\"0\" height=\"1\" width=\"15\" id=\"aiprefix__rect4182\"/></symbol><symbol viewBox=\"0 0 28 32\" id=\"f-i-edit\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M22 2l-4 4 6 6 4-4-6-6zM0 24l0.021 6.018 5.979-0.018 16-16-6-6-16 16zM6 28h-4v-4h2v2h2v2z\"/></symbol><symbol viewBox=\"0 0 24 24\" id=\"f-i-email\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12,2 C17.4292399,2 21.8479317,6.32667079 21.9961582,11.7200952 L22,12 L22,13 C22,15.1729208 20.477434,17 18.5,17 C17.3269391,17 16.3139529,16.3570244 15.6839382,15.3803024 C14.770593,16.3757823 13.4581934,17 12,17 C9.23857625,17 7,14.7614237 7,12 C7,9.23857625 9.23857625,7 12,7 C14.6887547,7 16.8818181,9.12230671 16.9953805,11.7831104 L17,12 L17,13 C17,14.1407877 17.7160103,15 18.5,15 C19.2447902,15 19.928229,14.2245609 19.9947109,13.1689341 L20,13 L20,12 C20,7.581722 16.418278,4 12,4 C7.581722,4 4,7.581722 4,12 C4,16.418278 7.581722,20 12,20 C13.1630948,20 14.2892822,19.7522618 15.3225159,19.2798331 C15.8247876,19.0501777 16.4181317,19.271177 16.647787,19.7734487 C16.8774423,20.2757205 16.656443,20.8690646 16.1541713,21.0987199 C14.861218,21.689901 13.4515463,22 12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 Z M12,9 C10.3431458,9 9,10.3431458 9,12 C9,13.6568542 10.3431458,15 12,15 C13.6568542,15 15,13.6568542 15,12 C15,10.3431458 13.6568542,9 12,9 Z\"/></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-floppy-disk\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M28 0h-28v32h32v-28l-4-4zM16 4h4v8h-4v-8zM28 28h-24v-24h2v10h18v-10h2.343l1.657 1.657v22.343z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"aqprefix__metadata8\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><g transform=\"translate(0,-2)\" id=\"aqprefix__g4220\"><rect id=\"aqprefix__rect4191\" width=\"2\" height=\"2\" x=\"2\" y=\"7\"/><rect id=\"aqprefix__rect4191-2\" width=\"2\" height=\"2\" x=\"7\" y=\"7\"/><rect id=\"aqprefix__rect4191-4\" width=\"2\" height=\"2\" x=\"12\" y=\"7\"/></g><g transform=\"translate(0,2)\" id=\"aqprefix__g4220-6\"><rect id=\"aqprefix__rect4191-40\" width=\"2\" height=\"2\" x=\"2\" y=\"7\"/><rect id=\"aqprefix__rect4191-2-3\" width=\"2\" height=\"2\" x=\"7\" y=\"7\"/><rect id=\"aqprefix__rect4191-4-9\" width=\"2\" height=\"2\" x=\"12\" y=\"7\"/></g></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-column\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2 7h2v2H2zM7 7h2v2H7zM12 7h2v2h-2zM2 12h2v2H2zM7 12h2v2H7zM12 12h2v2h-2z\" transform=\"rotate(90 9.25 9.25)\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-field\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.5-6.5h2v2h-2zm-5 0h2v2h-2zm5-5h2v2h-2zm-5 0h2v2h-2z\" transform=\"rotate(90)\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-row\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 9.5h2v2h-2zm-5 0h2v2H7Zm-5 0h2v2H2Zm10-5h2v2h-2zm-5 0h2v2H7Zm-5 0h2v2H2Z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-stage\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2 4.5h2v2H2zM7 4.5h2v2H7zM12 4.5h2v2h-2zM2 9.5h2v2H2zM7 9.5h2v2H7zM12 9.5h2v2h-2zM2-.5h2v2H2zM7-.5h2v2H7zM12-.5h2v2h-2z\" transform=\"translate(0 2.5)\"/></symbol><symbol viewBox=\"0 0 448 512\" id=\"f-i-hash\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"arprefix__icomoon-ignore\"/><path d=\"M448 192v-64h-80.064l16-128h-64l-16 128h-127.968l16-128h-64l-16 128h-111.968v64h103.968l-15.968 128h-88v64h80l-16 128h64l16-128h127.968l-16 128h64.032l16-128h112v-64h-104l15.936-128h88.064zM279.968 320h-127.968l15.968-128h127.968l-15.968 128z\"/></symbol><symbol viewBox=\"0 0 28 28\" id=\"f-i-header\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M26.281 26q-0.688 0-2.070-0.055t-2.086-0.055q-0.688 0-2.063 0.055t-2.063 0.055q-0.375 0-0.578-0.32t-0.203-0.711q0-0.484 0.266-0.719t0.609-0.266 0.797-0.109 0.703-0.234q0.516-0.328 0.516-2.188l-0.016-6.109q0-0.328-0.016-0.484-0.203-0.063-0.781-0.063h-10.547q-0.594 0-0.797 0.063-0.016 0.156-0.016 0.484l-0.016 5.797q0 2.219 0.578 2.562 0.25 0.156 0.75 0.203t0.891 0.055 0.703 0.234 0.313 0.711q0 0.406-0.195 0.75t-0.57 0.344q-0.734 0-2.18-0.055t-2.164-0.055q-0.672 0-2 0.055t-1.984 0.055q-0.359 0-0.555-0.328t-0.195-0.703q0-0.469 0.242-0.703t0.562-0.273 0.742-0.117 0.656-0.234q0.516-0.359 0.516-2.234l-0.016-0.891v-12.703q0-0.047 0.008-0.406t0-0.57-0.023-0.602-0.055-0.656-0.102-0.57-0.172-0.492-0.25-0.281q-0.234-0.156-0.703-0.187t-0.828-0.031-0.641-0.219-0.281-0.703q0-0.406 0.187-0.75t0.562-0.344q0.719 0 2.164 0.055t2.164 0.055q0.656 0 1.977-0.055t1.977-0.055q0.391 0 0.586 0.344t0.195 0.75q0 0.469-0.266 0.68t-0.602 0.227-0.773 0.063-0.672 0.203q-0.547 0.328-0.547 2.5l0.016 5q0 0.328 0.016 0.5 0.203 0.047 0.609 0.047h10.922q0.391 0 0.594-0.047 0.016-0.172 0.016-0.5l0.016-5q0-2.172-0.547-2.5-0.281-0.172-0.914-0.195t-1.031-0.203-0.398-0.773q0-0.406 0.195-0.75t0.586-0.344q0.688 0 2.063 0.055t2.063 0.055q0.672 0 2.016-0.055t2.016-0.055q0.391 0 0.586 0.344t0.195 0.75q0 0.469-0.273 0.688t-0.625 0.227-0.805 0.047-0.688 0.195q-0.547 0.359-0.547 2.516l0.016 14.734q0 1.859 0.531 2.188 0.25 0.156 0.719 0.211t0.836 0.070 0.648 0.242 0.281 0.695q0 0.406-0.187 0.75t-0.562 0.344z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-hidden\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 12h1v-1H0Zm15-7h1V4h-1zm-1 7h1v-1h-1zm-2 0h1v-1h-1zm-2 0h1v-1h-1Zm-2 0h1v-1H8Zm-2 0h1v-1H6Zm-2 0h1v-1H4Zm-2 0h1v-1H2Zm13-1h1v-1h-1ZM0 10h1V9H0Zm15-1h1V8h-1ZM0 8h1V7H0Zm15-1h1V6h-1ZM0 6h1V5H0Zm13-1h1V4h-1zm-2 0h1V4h-1ZM9 5h1V4H9ZM7 5h1V4H7ZM5 5h1V4H5ZM3 5h1V4H3ZM1 5h1V4H1Z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 32 32\" id=\"f-i-info-circle\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m17.962 24.725 1.806.096v2.531h-7.534v-2.406l1.045-.094c.568-.063.916-.254.916-1.014v-8.801c0-.699-.188-.92-.791-.92l-1.106-.062v-2.626h5.666zM15.747 4.648c1.394 0 2.405 1.047 2.405 2.374 0 1.331-1.014 2.313-2.438 2.313-1.454 0-2.404-.982-2.404-2.313 0-1.327.95-2.374 2.437-2.374M16 32C7.178 32 0 24.822 0 16S7.178 0 16 0c8.82 0 16 7.178 16 16s-7.18 16-16 16m0-29C8.832 3 3 8.832 3 16s5.832 13 13 13 13-5.832 13-13S23.168 3 16 3\"/></symbol><symbol viewBox=\"0 0 384 512\" id=\"f-i-menu\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"avprefix__icomoon-ignore\"/><path d=\"M0 96v64h384v-64h-384zM0 288h384v-64h-384v64zM0 416h384v-64h-384v64z\"/></symbol><symbol viewBox=\"0 0 24 24\" fill=\"none\" id=\"f-i-minus\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 12L18 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-move\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M287.744 94.736v129.008h128v-64l96.256 96.256-96.256 96.24v-65.488h-128v129.008h64.496l-96.24 96.24-96.256-96.24h64v-129.008h-128v64.992l-95.744-95.744 95.744-95.744v63.488h128v-129.008h-62.496l94.752-94.736 94.752 94.736h-63.008z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-move-vertical\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m 287.744,94.736 0,321.024 64.496,0 L 256,512 l -96.256,-96.24 64,0 0,-321.024 -62.496,0 L 256,0 350.752,94.736 Z\"/></symbol><symbol viewBox=\"0 0 20 28\" id=\"f-i-paragraph\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M19.969 2.953v1.141q0 0.453-0.289 0.953t-0.664 0.5q-0.781 0-0.844 0.016-0.406 0.094-0.5 0.484-0.047 0.172-0.047 1v18q0 0.391-0.281 0.672t-0.672 0.281h-1.687q-0.391 0-0.672-0.281t-0.281-0.672v-19.031h-2.234v19.031q0 0.391-0.273 0.672t-0.68 0.281h-1.687q-0.406 0-0.68-0.281t-0.273-0.672v-7.75q-2.297-0.187-3.828-0.922-1.969-0.906-3-2.797-1-1.828-1-4.047 0-2.594 1.375-4.469 1.375-1.844 3.266-2.484 1.734-0.578 6.516-0.578h7.484q0.391 0 0.672 0.281t0.281 0.672z\"/></symbol><symbol id=\"f-i-phone-receiver\" viewBox=\"0 0 578.106 578.106\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><g><g><path d=\"M577.83,456.128c1.225,9.385-1.635,17.545-8.568,24.48l-81.396,80.781 c-3.672,4.08-8.465,7.551-14.381,10.404c-5.916,2.857-11.729,4.693-17.439,5.508c-0.408,0-1.635,0.105-3.676,0.309 c-2.037,0.203-4.689,0.307-7.953,0.307c-7.754,0-20.301-1.326-37.641-3.979s-38.555-9.182-63.645-19.584 c-25.096-10.404-53.553-26.012-85.376-46.818c-31.823-20.805-65.688-49.367-101.592-85.68 c-28.56-28.152-52.224-55.08-70.992-80.783c-18.768-25.705-33.864-49.471-45.288-71.299 c-11.425-21.828-19.993-41.616-25.705-59.364S4.59,177.362,2.55,164.51s-2.856-22.95-2.448-30.294 c0.408-7.344,0.612-11.424,0.612-12.24c0.816-5.712,2.652-11.526,5.508-17.442s6.324-10.71,10.404-14.382L98.022,8.756 c5.712-5.712,12.24-8.568,19.584-8.568c5.304,0,9.996,1.53,14.076,4.59s7.548,6.834,10.404,11.322l65.484,124.236 c3.672,6.528,4.692,13.668,3.06,21.42c-1.632,7.752-5.1,14.28-10.404,19.584l-29.988,29.988c-0.816,0.816-1.53,2.142-2.142,3.978 s-0.918,3.366-0.918,4.59c1.632,8.568,5.304,18.36,11.016,29.376c4.896,9.792,12.444,21.726,22.644,35.802 s24.684,30.293,43.452,48.653c18.36,18.77,34.68,33.354,48.96,43.76c14.277,10.4,26.215,18.053,35.803,22.949 c9.588,4.896,16.932,7.854,22.031,8.871l7.648,1.531c0.816,0,2.145-0.307,3.979-0.918c1.836-0.613,3.162-1.326,3.979-2.143 l34.883-35.496c7.348-6.527,15.912-9.791,25.705-9.791c6.938,0,12.443,1.223,16.523,3.672h0.611l118.115,69.768 C571.098,441.238,576.197,447.968,577.83,456.128z\"/></g></g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></symbol><symbol viewBox=\"0 0 24 24\" fill=\"none\" id=\"f-i-plus\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 12H18M12 6V18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></symbol><symbol id=\"f-i-radio-group\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0,1h16V0H0V1z M0,3h16V2H0V3z M5,6h10V5H5V6z M15,9H5v1h10V9z M15,14v-1H5v1H15z M1.5,7C0.7,7,0,6.3,0,5.5S0.7,4,1.5,4 S3,4.7,3,5.5S2.3,7,1.5,7z M1.5,5C1.2,5,1,5.2,1,5.5S1.2,6,1.5,6S2,5.8,2,5.5S1.8,5,1.5,5z M1.5,11.1C0.7,11.1,0,10.4,0,9.6 s0.7-1.5,1.5-1.5S3,8.7,3,9.6S2.3,11.1,1.5,11.1z M1.5,9.1C1.2,9.1,1,9.3,1,9.6s0.2,0.5,0.5,0.5S2,9.8,2,9.6S1.8,9.1,1.5,9.1z M1.5,15C0.7,15,0,14.3,0,13.5S0.7,12,1.5,12S3,12.7,3,13.5S2.3,15,1.5,15z M1.5,13C1.2,13,1,13.2,1,13.5S1.2,14,1.5,14 S2,13.8,2,13.5S1.8,13,1.5,13z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-remove\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M193.694-139.2h87.322v510.916h-87.322zM-18.103 159.92V72.597h510.915v87.322z\" transform=\"rotate(45 77.994 208.636)\"/></symbol><symbol id=\"f-i-rich-text\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15,1H1C0.4,1,0,1.4,0,2v12c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1V2C16,1.4,15.6,1,15,1z M1,3.1h0.8v0.3H1V3.1z M1,3.6h0.8 v0.3H1V3.6z M15,14H1V5.1h14V14z M15,4.9H1V4.6h14V4.9z M15,4.4H1V4.1h0.8v0.2h1.5V4.1h1.3v0.2H6V4.1h1.3v0.2h1.5V4.1H10v0.2h1.5 V4.1h1.3v0.2h1.5V4.1H15V4.4z M4.5,3.6v0.3H3.3V3.6H4.5z M3.3,3.4V3.1h1.3v0.3H3.3z M7.3,3.6v0.3H6V3.6H7.3z M6,3.4V3.1h1.3v0.3H6z M10,3.6v0.3H8.8V3.6H10z M8.8,3.4V3.1H10v0.3H8.8z M12.8,3.6v0.3h-1.3V3.6H12.8z M11.5,3.4V3.1h1.3v0.3H11.5z M15,3.9h-0.8V3.6H15 V3.9z M15,3.4h-0.8V3.1H15V3.4z M15,2.9h-0.8V2.8h-1.5v0.2h-1.3V2.8H10v0.2H8.8V2.8H7.3v0.2H6V2.8H4.5v0.2H3.3V2.8H1.8v0.2H1V2.6h14 V2.9z M15,2.4H1V2.1h14V2.4z M3,12v-1h10v1H3z M13,10H3V9h10V10z M11,8H3V7h8V8z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-rows\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"bfprefix__metadata4318\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><g transform=\"matrix(0,1,-1,0,3.0984025,11.835155)\" id=\"bfprefix__g7209\"><path id=\"bfprefix__rect4860-3-5\" d=\"m 4.1640625,-12.402344 a 0.50004997,0.50004997 0 0 0 -0.5,-0.5 l -5,0 -5,0 -5.0000005,0 a 0.50004997,0.50004997 0 0 0 -0.5,0.5 l 0,15.0000002 a 0.50004997,0.50004997 0 0 0 0.5,0.5 l 4.9648442,0 a 0.50004997,0.50004997 0 0 0 0.035156,0 l 4.9648437,0 a 0.50004997,0.50004997 0 0 0 0.035156,0 l 5,0 a 0.50004997,0.50004997 0 0 0 0.5,-0.5 l 0,-15.0000002 z m -1,0.5 0,14.0000002 -4,0 0,-14.0000002 4,0 z m -5,0 0,14.0000002 -4,0 0,-14.0000002 4,0 z m -5,0 0,14.0000002 -4.0000005,0 0,-14.0000002 4.0000005,0 z\"/></g></symbol><symbol id=\"f-i-select\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path id=\"bgprefix__XMLID_1_\" d=\"M0,0v14h0c0,0.6,0.4,1,1,1h10c0.6,0,1-0.4,1-1h0V5h4V0H0z M1,1h10v3H1V1z M1,7h10v3H1V7z M1,14v-3h10v3H1z M15,4h-3V1h3V4z M2,2h1v1H2V2z M2,12h1v1H2V12z M4,12h1v1H4V12z M6,12h1v1H6V12z M9,12v1H8v-1H9z M2,8h1v1H2V8z M4,8h1v1H4V8z M6,8 h1v1H6V8z M13.5,3.1l-1-1.1h1.9L13.5,3.1z M2,6V5h1v1H2L2,6z M4,6V5h1v1H4L4,6z\"/></symbol><symbol viewBox=\"0 0 448 512\" id=\"f-i-settings\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"bhprefix__icomoon-ignore\"/><path d=\"M223.969 175c-44.703 0-80.969 36.266-80.969 81 0 44.688 36.266 81.031 80.969 81.031 44.719 0 80.719-36.344 80.719-81.031-0-44.734-36-81-80.719-81zM386.313 302.531l-14.594 35.156 29.469 57.875-36.094 36.094-59.218-27.969-35.156 14.438-17.844 54.625-2.281 7.25h-51.016l-22.078-61.656-35.156-14.5-57.952 29.344-36.078-36.063 27.938-59.25-14.484-35.125-61.767-20.156v-50.984l61.703-22.109 14.485-35.094-25.953-51.234-3.422-6.719 36.031-36.031 59.297 27.922 35.109-14.516 17.828-54.594 2.297-7.234h51l22.094 61.734 35.063 14.516 58.031-29.406 36.063 36.031-27.938 59.203 14.438 35.172 61.875 20.125v50.969l-61.688 22.187z\"/></symbol><symbol id=\"f-i-text-input\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path id=\"biprefix__XMLID_10_\" d=\"M15,4H4.5V3H6V2H4.5h-1H2v1h1.5v1H1C0.4,4,0,4.5,0,5v6c0,0.6,0.4,1,1,1h2.5v1H2v1h4v-1H4.5v-1H15 c0.6,0,1-0.4,1-1V5C16,4.5,15.6,4,15,4z M1,11V5h2.5v6H1z M15,11H4.5V5H15V11z\"/></symbol><symbol id=\"f-i-textarea\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path id=\"bjprefix__XMLID_1_\" d=\"M3,11v-1h8v1H3L3,11z M3,7h10V6H3V7L3,7z M3,8v1h10V8H3L3,8z M13,4H3v1h10V4L13,4z M16,14V2c0-0.6-0.4-1-1-1 H1C0.4,1,0,1.4,0,2v12c0,0.6,0.4,1,1,1h14C15.6,15,16,14.6,16,14z M15,2v12H1V2H15z\"/></symbol><symbol viewBox=\"0 0 24 32\" id=\"f-i-triangle-down\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 12l11.992 11.992 11.992-11.992h-23.984z\"/></symbol><symbol viewBox=\"0 0 12 32\" id=\"f-i-triangle-left\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 15.996l11.992 11.992v-23.984l-11.992 11.992z\"/></symbol><symbol viewBox=\"0 0 12 32\" id=\"f-i-triangle-right\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.002 4.008l11.992 11.992-11.992 11.992v-23.984z\"/></symbol><symbol viewBox=\"0 0 24 32\" id=\"f-i-triangle-up\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.992 8l-11.992 11.992h23.984l-11.992-11.992z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-upload\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"boprefix__icomoon-ignore\"/><path d=\"M240 352h-240v128h480v-128h-240zM448 416h-64v-32h64v32zM112 160l128-128 128 128h-80v160h-96v-160z\"/></symbol></svg>";
8436
- })), name, version$1, PACKAGE_NAME, formeoSpriteId, FALLBACK_SVG_SPRITE_URL, CSS_URL, FALLBACK_CSS_URL, PANEL_CLASSNAME, CONTROL_GROUP_CLASSNAME, STAGE_CLASSNAME, ROW_CLASSNAME, COLUMN_CLASSNAME, FIELD_CLASSNAME, HIDDEN_BY_CONDITION_SELECTOR, CUSTOM_COLUMN_OPTION_CLASSNAME, COLUMN_PRESET_CLASSNAME, COLUMN_RESIZE_CLASSNAME, CHILD_CLASSNAME_MAP, INTERNAL_COMPONENT_TYPES, INTERNAL_COMPONENT_INDEX_TYPES, INTERNAL_COMPONENT_INDEX_REGEX, COMPONENT_TYPES, COMPONENT_INDEX_TYPES, COMPONENT_INDEX_TYPE_MAP, COMPONENT_TYPE_MAP, COMPONENT_TYPE_CONFIGS, COMPONENT_TYPE_CLASSNAMES, COMPONENT_TYPE_CLASSNAMES_LOOKUP, COMPONENT_TYPE_CLASSNAMES_ARRAY, COMPONENT_TYPE_CLASSNAMES_REGEXP, childTypeMapVals, childTypeIndexMapVals, parentTypeMap, CHILD_TYPE_MAP, CHILD_TYPE_INDEX_MAP, PARENT_TYPE_MAP, columnTemplates, COLUMN_TEMPLATES, SESSION_FORMDATA_KEY, SESSION_LOCALE_KEY, ANIMATION_SPEED_FAST, ANIMATION_SPEED_SLOW, EVENT_FORMEO_SAVED, EVENT_FORMEO_UPDATED, EVENT_FORMEO_CHANGED, EVENT_FORMEO_UPDATED_STAGE, EVENT_FORMEO_UPDATED_ROW, EVENT_FORMEO_UPDATED_COLUMN, EVENT_FORMEO_UPDATED_FIELD, EVENT_FORMEO_CLEARED, EVENT_FORMEO_ON_RENDER, EVENT_FORMEO_CONDITION_UPDATED, EVENT_FORMEO_ADDED_ROW, EVENT_FORMEO_ADDED_COLUMN, EVENT_FORMEO_ADDED_FIELD, EVENT_FORMEO_REMOVED_ROW, EVENT_FORMEO_REMOVED_COLUMN, EVENT_FORMEO_REMOVED_FIELD, COMPARISON_OPERATORS, LOGICAL_OPERATORS, ASSIGNMENT_OPERATORS, CONDITION_INPUT_ORDER, CHECKABLE_OPTIONS, VISIBLE_OPTIONS, PROPERTY_OPTIONS, OPERATORS, conditionTypeThen, CONDITION_TEMPLATE, UUID_REGEXP, bsColRegExp, iconPrefix, DEFAULT_FORMDATA, CHECKED_TYPES, REVERSED_CHECKED_TYPES, FILTERED_PANEL_DATA_KEYS;
8441
+ formeo_sprite_default = "<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><symbol id=\"f-i-autocomplete\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6,5h1v1H6V5z M4,4H3v1h1V4z M6,4H5v1h1V4z M2,5v1h1V5H2z M3,7h1V6H3V7z M5,7h1V6H5V7z M4,5v1h1V5H4z M2,14h1v-1H2V14z M4,14h1v-1H4V14z M6,14h1v-1H6V14z M9,13H8v1h1V13z M16,3.5v4C16,8.3,15.3,9,14.5,9H14v3v3c0,0.6-0.4,1-1,1H1c-0.6,0-1-0.4-1-1V3.5 C0,2.7,0.7,2,1.5,2h3H8V1.5V1H7H6V0.5V0h2.5H11v0.5V1h-1H9v0.5V2h3h2.5C15.3,2,16,2.7,16,3.5z M13,12H7H1v3h12V12z M3,11v-1H2v1H3z M5,11v-1H4v1H5z M15,3.5C15,3.2,14.8,3,14.5,3H9v2.5V8H8.5H8V7.5V7H7V6h1V5.5V5H7V4h1V3.5V3H1.5C1.2,3,1,3.2,1,3.5v4 C1,7.8,1.2,8,1.5,8H8v1H6v0.5V10h2.5H11V9.5V9H9V8h5.5C14.8,8,15,7.8,15,7.5V3.5z\"/></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-bin\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M4 10v20c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-20h-22zM10 28h-2v-14h2v14zM14 28h-2v-14h2v14zM18 28h-2v-14h2v14zM22 28h-2v-14h2v14zM26.5 4h-6.5v-2.5c0-.825-.675-1.5-1.5-1.5h-7c-.825 0-1.5.675-1.5 1.5v2.5h-6.5c-.825 0-1.5.675-1.5 1.5v2.5h26v-2.5c0-.825-.675-1.5-1.5-1.5zM18 4h-6v-1.975h6v1.975z\"/></symbol><symbol id=\"f-i-button\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"acprefix__metadata8\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><path id=\"acprefix__rect4140\" d=\"M 0.4765625,4 A 0.47706934,0.47706934 0 0 0 0,4.4765625 L 0,11.523438 A 0.47706934,0.47706934 0 0 0 0.4765625,12 L 15.523438,12 A 0.47706934,0.47706934 0 0 0 16,11.523438 L 16,4.4765625 A 0.47706934,0.47706934 0 0 0 15.523438,4 L 0.4765625,4 Z m 0.4765625,0.953125 14.09375,0 0,6.09375 -14.09375,0 0,-6.09375 z\"/><g id=\"acprefix__layer1\"><g id=\"acprefix__text4203\"><g id=\"acprefix__g4212\" transform=\"translate(0.10112835,0.1001358)\"><path id=\"acprefix__path4208\" d=\"m 6.0690374,6.4093857 q -0.5371093,0 -0.8544922,0.4003906 -0.3149414,0.4003906 -0.3149414,1.0913086 0,0.6884766 0.3149414,1.0888672 0.3173829,0.4003906 0.8544922,0.4003906 0.5371094,0 0.8496094,-0.4003906 0.3149414,-0.4003906 0.3149414,-1.0888672 0,-0.690918 -0.3149414,-1.0913086 -0.3125,-0.4003906 -0.8496094,-0.4003906 z m 0,-0.4003906 q 0.7666016,0 1.225586,0.5151367 0.4589843,0.5126953 0.4589843,1.3769531 0,0.8618164 -0.4589843,1.3769531 -0.4589844,0.5126953 -1.225586,0.5126953 -0.7690429,0 -1.2304687,-0.5126953 -0.4589844,-0.5126953 -0.4589844,-1.3769531 0,-0.8642578 0.4589844,-1.3769531 0.4614258,-0.5151367 1.2304687,-0.5151367 z\"/><path id=\"acprefix__path4210\" d=\"m 8.5250921,6.074913 0.4931641,0 0,1.5405274 1.6357418,-1.5405274 0.634766,0 -1.809082,1.6992188 1.938477,1.9458008 -0.649415,0 -1.7504878,-1.7553711 0,1.7553711 -0.4931641,0 0,-3.6450196 z\"/></g></g></g></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-calendar\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12.048 16.961c-0.178 0.257-0.395 0.901-0.652 1.059-0.257 0.157-0.547 0.267-0.869 0.328-0.323 0.062-0.657 0.089-1.002 0.079v1.527h2.467v6.046h1.991v-9.996h-1.584c-0.056 0.381-0.173 0.7-0.351 0.957zM23 8h2c0.553 0 1-0.448 1-1v-6c0-0.552-0.447-1-1-1h-2c-0.553 0-1 0.448-1 1v6c0 0.552 0.447 1 1 1zM7 8h2c0.552 0 1-0.448 1-1v-6c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v6c0 0.552 0.448 1 1 1zM30 4h-2v5c0 0.552-0.447 1-1 1h-6c-0.553 0-1-0.448-1-1v-5h-8v5c0 0.552-0.448 1-1 1h-6c-0.552 0-1-0.448-1-1v-5h-2c-1.104 0-2 0.896-2 2v24c0 1.104 0.896 2 2 2h28c1.104 0 2-0.896 2-2v-24c0-1.104-0.896-2-2-2zM30 29c0 0.553-0.447 1-1 1h-26c-0.552 0-1-0.447-1-1v-16c0-0.552 0.448-1 1-1h26c0.553 0 1 0.448 1 1v16zM15.985 17.982h4.968c-0.936 1.152-1.689 2.325-2.265 3.705-0.575 1.381-0.638 2.818-0.749 4.312h2.131c0.009-0.666-0.195-1.385-0.051-2.156 0.146-0.771 0.352-1.532 0.617-2.285 0.267-0.752 0.598-1.461 0.996-2.127 0.396-0.667 0.853-1.229 1.367-1.686v-1.742h-7.015v1.979z\"/></symbol><symbol id=\"f-i-checkbox\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M13.5,5v8c0,0.8-0.7,1.5-1.5,1.5H3c-0.8,0-1.5-0.7-1.5-1.5V4c0-0.8,0.7-1.5,1.5-1.5h9c0.7,0,1.3,0.5,1.5,1.2l2.4-1.4L13.5,5 z M12.5,6.2L7.7,12L2.8,5.5l4.9,1.6l4.8-2.9V4c0-0.3-0.2-0.5-0.5-0.5H3C2.7,3.5,2.5,3.7,2.5,4v9c0,0.3,0.2,0.5,0.5,0.5h9 c0.3,0,0.5-0.2,0.5-0.5V6.2z\"/></symbol><symbol id=\"f-i-checkbox-group\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0,1h16V0H0V1z M0,3h16V2H0V3z M6,5v1h9V5H6z M15,14v-1H6v1H15z M6,10h9V9H6V10z M4,12l-2.5,1.5L0,13l1.5,2L4,12z M4,8 L1.5,9.5L0,9l1.5,2L4,8z M4,4L1.5,5.5L0,5l1.5,2L4,4z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-columns\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"agprefix__metadata4318\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><path id=\"agprefix__rect4860-3-5\" d=\"M 16,0.5 A 0.50004997,0.50004997 0 0 0 15.5,0 l -5,0 -5,0 -5,0 A 0.50004997,0.50004997 0 0 0 0,0.5 l 0,15 A 0.50004997,0.50004997 0 0 0 0.5,16 l 5,0 5,0 5,0 A 0.50004997,0.50004997 0 0 0 16,15.5 l 0,-15 z M 15,1 15,15 11,15 11,1 15,1 Z M 10,1 10,15 6,15 6,1 10,1 Z M 5,1 5,15 1,15 1,1 5,1 Z\"/></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-copy\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M20 8v-8h-14l-6 6v18h12v8h20v-24h-12zM6 2.828v3.172h-3.172l3.172-3.172zM2 22v-14h6v-6h10v6l-6 6v8h-10zM18 10.828v3.172h-3.172l3.172-3.172zM30 30h-16v-14h6v-6h10v20z\"/></symbol><symbol id=\"f-i-divider\" viewBox=\"0 0 15 15\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"aiprefix__metadata10\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><rect y=\"7\" x=\"0\" height=\"1\" width=\"15\" id=\"aiprefix__rect4182\"/></symbol><symbol viewBox=\"0 0 28 32\" id=\"f-i-edit\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M22 2l-4 4 6 6 4-4-6-6zM0 24l0.021 6.018 5.979-0.018 16-16-6-6-16 16zM6 28h-4v-4h2v2h2v2z\"/></symbol><symbol viewBox=\"0 0 24 24\" id=\"f-i-email\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12,2 C17.4292399,2 21.8479317,6.32667079 21.9961582,11.7200952 L22,12 L22,13 C22,15.1729208 20.477434,17 18.5,17 C17.3269391,17 16.3139529,16.3570244 15.6839382,15.3803024 C14.770593,16.3757823 13.4581934,17 12,17 C9.23857625,17 7,14.7614237 7,12 C7,9.23857625 9.23857625,7 12,7 C14.6887547,7 16.8818181,9.12230671 16.9953805,11.7831104 L17,12 L17,13 C17,14.1407877 17.7160103,15 18.5,15 C19.2447902,15 19.928229,14.2245609 19.9947109,13.1689341 L20,13 L20,12 C20,7.581722 16.418278,4 12,4 C7.581722,4 4,7.581722 4,12 C4,16.418278 7.581722,20 12,20 C13.1630948,20 14.2892822,19.7522618 15.3225159,19.2798331 C15.8247876,19.0501777 16.4181317,19.271177 16.647787,19.7734487 C16.8774423,20.2757205 16.656443,20.8690646 16.1541713,21.0987199 C14.861218,21.689901 13.4515463,22 12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 Z M12,9 C10.3431458,9 9,10.3431458 9,12 C9,13.6568542 10.3431458,15 12,15 C13.6568542,15 15,13.6568542 15,12 C15,10.3431458 13.6568542,9 12,9 Z\"/></symbol><symbol viewBox=\"0 0 32 32\" id=\"f-i-floppy-disk\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M28 0h-28v32h32v-28l-4-4zM16 4h4v8h-4v-8zM28 28h-24v-24h2v10h18v-10h2.343l1.657 1.657v22.343z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"aqprefix__metadata8\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><g transform=\"translate(0,-2)\" id=\"aqprefix__g4220\"><rect id=\"aqprefix__rect4191\" width=\"2\" height=\"2\" x=\"2\" y=\"7\"/><rect id=\"aqprefix__rect4191-2\" width=\"2\" height=\"2\" x=\"7\" y=\"7\"/><rect id=\"aqprefix__rect4191-4\" width=\"2\" height=\"2\" x=\"12\" y=\"7\"/></g><g transform=\"translate(0,2)\" id=\"aqprefix__g4220-6\"><rect id=\"aqprefix__rect4191-40\" width=\"2\" height=\"2\" x=\"2\" y=\"7\"/><rect id=\"aqprefix__rect4191-2-3\" width=\"2\" height=\"2\" x=\"7\" y=\"7\"/><rect id=\"aqprefix__rect4191-4-9\" width=\"2\" height=\"2\" x=\"12\" y=\"7\"/></g></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-column\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2 7h2v2H2zM7 7h2v2H7zM12 7h2v2h-2zM2 12h2v2H2zM7 12h2v2H7zM12 12h2v2h-2z\" transform=\"rotate(90 9.25 9.25)\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-field\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.5-6.5h2v2h-2zm-5 0h2v2h-2zm5-5h2v2h-2zm-5 0h2v2h-2z\" transform=\"rotate(90)\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-row\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 9.5h2v2h-2zm-5 0h2v2H7Zm-5 0h2v2H2Zm10-5h2v2h-2zm-5 0h2v2H7Zm-5 0h2v2H2Z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-handle-stage\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2 4.5h2v2H2zM7 4.5h2v2H7zM12 4.5h2v2h-2zM2 9.5h2v2H2zM7 9.5h2v2H7zM12 9.5h2v2h-2zM2-.5h2v2H2zM7-.5h2v2H7zM12-.5h2v2h-2z\" transform=\"translate(0 2.5)\"/></symbol><symbol viewBox=\"0 0 448 512\" id=\"f-i-hash\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"arprefix__icomoon-ignore\"/><path d=\"M448 192v-64h-80.064l16-128h-64l-16 128h-127.968l16-128h-64l-16 128h-111.968v64h103.968l-15.968 128h-88v64h80l-16 128h64l16-128h127.968l-16 128h64.032l16-128h112v-64h-104l15.936-128h88.064zM279.968 320h-127.968l15.968-128h127.968l-15.968 128z\"/></symbol><symbol viewBox=\"0 0 28 28\" id=\"f-i-header\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M26.281 26q-0.688 0-2.070-0.055t-2.086-0.055q-0.688 0-2.063 0.055t-2.063 0.055q-0.375 0-0.578-0.32t-0.203-0.711q0-0.484 0.266-0.719t0.609-0.266 0.797-0.109 0.703-0.234q0.516-0.328 0.516-2.188l-0.016-6.109q0-0.328-0.016-0.484-0.203-0.063-0.781-0.063h-10.547q-0.594 0-0.797 0.063-0.016 0.156-0.016 0.484l-0.016 5.797q0 2.219 0.578 2.562 0.25 0.156 0.75 0.203t0.891 0.055 0.703 0.234 0.313 0.711q0 0.406-0.195 0.75t-0.57 0.344q-0.734 0-2.18-0.055t-2.164-0.055q-0.672 0-2 0.055t-1.984 0.055q-0.359 0-0.555-0.328t-0.195-0.703q0-0.469 0.242-0.703t0.562-0.273 0.742-0.117 0.656-0.234q0.516-0.359 0.516-2.234l-0.016-0.891v-12.703q0-0.047 0.008-0.406t0-0.57-0.023-0.602-0.055-0.656-0.102-0.57-0.172-0.492-0.25-0.281q-0.234-0.156-0.703-0.187t-0.828-0.031-0.641-0.219-0.281-0.703q0-0.406 0.187-0.75t0.562-0.344q0.719 0 2.164 0.055t2.164 0.055q0.656 0 1.977-0.055t1.977-0.055q0.391 0 0.586 0.344t0.195 0.75q0 0.469-0.266 0.68t-0.602 0.227-0.773 0.063-0.672 0.203q-0.547 0.328-0.547 2.5l0.016 5q0 0.328 0.016 0.5 0.203 0.047 0.609 0.047h10.922q0.391 0 0.594-0.047 0.016-0.172 0.016-0.5l0.016-5q0-2.172-0.547-2.5-0.281-0.172-0.914-0.195t-1.031-0.203-0.398-0.773q0-0.406 0.195-0.75t0.586-0.344q0.688 0 2.063 0.055t2.063 0.055q0.672 0 2.016-0.055t2.016-0.055q0.391 0 0.586 0.344t0.195 0.75q0 0.469-0.273 0.688t-0.625 0.227-0.805 0.047-0.688 0.195q-0.547 0.359-0.547 2.516l0.016 14.734q0 1.859 0.531 2.188 0.25 0.156 0.719 0.211t0.836 0.070 0.648 0.242 0.281 0.695q0 0.406-0.187 0.75t-0.562 0.344z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-hidden\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 12h1v-1H0Zm15-7h1V4h-1zm-1 7h1v-1h-1zm-2 0h1v-1h-1zm-2 0h1v-1h-1Zm-2 0h1v-1H8Zm-2 0h1v-1H6Zm-2 0h1v-1H4Zm-2 0h1v-1H2Zm13-1h1v-1h-1ZM0 10h1V9H0Zm15-1h1V8h-1ZM0 8h1V7H0Zm15-1h1V6h-1ZM0 6h1V5H0Zm13-1h1V4h-1zm-2 0h1V4h-1ZM9 5h1V4H9ZM7 5h1V4H7ZM5 5h1V4H5ZM3 5h1V4H3ZM1 5h1V4H1Z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 32 32\" id=\"f-i-info-circle\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m17.962 24.725 1.806.096v2.531h-7.534v-2.406l1.045-.094c.568-.063.916-.254.916-1.014v-8.801c0-.699-.188-.92-.791-.92l-1.106-.062v-2.626h5.666zM15.747 4.648c1.394 0 2.405 1.047 2.405 2.374 0 1.331-1.014 2.313-2.438 2.313-1.454 0-2.404-.982-2.404-2.313 0-1.327.95-2.374 2.437-2.374M16 32C7.178 32 0 24.822 0 16S7.178 0 16 0c8.82 0 16 7.178 16 16s-7.18 16-16 16m0-29C8.832 3 3 8.832 3 16s5.832 13 13 13 13-5.832 13-13S23.168 3 16 3\"/></symbol><symbol viewBox=\"0 0 384 512\" id=\"f-i-menu\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"avprefix__icomoon-ignore\"/><path d=\"M0 96v64h384v-64h-384zM0 288h384v-64h-384v64zM0 416h384v-64h-384v64z\"/></symbol><symbol viewBox=\"0 0 24 24\" fill=\"none\" id=\"f-i-minus\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 12L18 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-move\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M287.744 94.736v129.008h128v-64l96.256 96.256-96.256 96.24v-65.488h-128v129.008h64.496l-96.24 96.24-96.256-96.24h64v-129.008h-128v64.992l-95.744-95.744 95.744-95.744v63.488h128v-129.008h-62.496l94.752-94.736 94.752 94.736h-63.008z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-move-vertical\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m 287.744,94.736 0,321.024 64.496,0 L 256,512 l -96.256,-96.24 64,0 0,-321.024 -62.496,0 L 256,0 350.752,94.736 Z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-page-move\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M96 32h224l96 96v96h-48v-64h-80v-80h-192v384h192v48h-240v-480zM352 288l128 96-128 96v-64h-128v-64h128v-64z\"/></symbol><symbol viewBox=\"0 0 20 28\" id=\"f-i-paragraph\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M19.969 2.953v1.141q0 0.453-0.289 0.953t-0.664 0.5q-0.781 0-0.844 0.016-0.406 0.094-0.5 0.484-0.047 0.172-0.047 1v18q0 0.391-0.281 0.672t-0.672 0.281h-1.687q-0.391 0-0.672-0.281t-0.281-0.672v-19.031h-2.234v19.031q0 0.391-0.273 0.672t-0.68 0.281h-1.687q-0.406 0-0.68-0.281t-0.273-0.672v-7.75q-2.297-0.187-3.828-0.922-1.969-0.906-3-2.797-1-1.828-1-4.047 0-2.594 1.375-4.469 1.375-1.844 3.266-2.484 1.734-0.578 6.516-0.578h7.484q0.391 0 0.672 0.281t0.281 0.672z\"/></symbol><symbol id=\"f-i-phone-receiver\" viewBox=\"0 0 578.106 578.106\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><g><g><path d=\"M577.83,456.128c1.225,9.385-1.635,17.545-8.568,24.48l-81.396,80.781 c-3.672,4.08-8.465,7.551-14.381,10.404c-5.916,2.857-11.729,4.693-17.439,5.508c-0.408,0-1.635,0.105-3.676,0.309 c-2.037,0.203-4.689,0.307-7.953,0.307c-7.754,0-20.301-1.326-37.641-3.979s-38.555-9.182-63.645-19.584 c-25.096-10.404-53.553-26.012-85.376-46.818c-31.823-20.805-65.688-49.367-101.592-85.68 c-28.56-28.152-52.224-55.08-70.992-80.783c-18.768-25.705-33.864-49.471-45.288-71.299 c-11.425-21.828-19.993-41.616-25.705-59.364S4.59,177.362,2.55,164.51s-2.856-22.95-2.448-30.294 c0.408-7.344,0.612-11.424,0.612-12.24c0.816-5.712,2.652-11.526,5.508-17.442s6.324-10.71,10.404-14.382L98.022,8.756 c5.712-5.712,12.24-8.568,19.584-8.568c5.304,0,9.996,1.53,14.076,4.59s7.548,6.834,10.404,11.322l65.484,124.236 c3.672,6.528,4.692,13.668,3.06,21.42c-1.632,7.752-5.1,14.28-10.404,19.584l-29.988,29.988c-0.816,0.816-1.53,2.142-2.142,3.978 s-0.918,3.366-0.918,4.59c1.632,8.568,5.304,18.36,11.016,29.376c4.896,9.792,12.444,21.726,22.644,35.802 s24.684,30.293,43.452,48.653c18.36,18.77,34.68,33.354,48.96,43.76c14.277,10.4,26.215,18.053,35.803,22.949 c9.588,4.896,16.932,7.854,22.031,8.871l7.648,1.531c0.816,0,2.145-0.307,3.979-0.918c1.836-0.613,3.162-1.326,3.979-2.143 l34.883-35.496c7.348-6.527,15.912-9.791,25.705-9.791c6.938,0,12.443,1.223,16.523,3.672h0.611l118.115,69.768 C571.098,441.238,576.197,447.968,577.83,456.128z\"/></g></g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></symbol><symbol viewBox=\"0 0 24 24\" fill=\"none\" id=\"f-i-plus\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 12H18M12 6V18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></symbol><symbol id=\"f-i-radio-group\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0,1h16V0H0V1z M0,3h16V2H0V3z M5,6h10V5H5V6z M15,9H5v1h10V9z M15,14v-1H5v1H15z M1.5,7C0.7,7,0,6.3,0,5.5S0.7,4,1.5,4 S3,4.7,3,5.5S2.3,7,1.5,7z M1.5,5C1.2,5,1,5.2,1,5.5S1.2,6,1.5,6S2,5.8,2,5.5S1.8,5,1.5,5z M1.5,11.1C0.7,11.1,0,10.4,0,9.6 s0.7-1.5,1.5-1.5S3,8.7,3,9.6S2.3,11.1,1.5,11.1z M1.5,9.1C1.2,9.1,1,9.3,1,9.6s0.2,0.5,0.5,0.5S2,9.8,2,9.6S1.8,9.1,1.5,9.1z M1.5,15C0.7,15,0,14.3,0,13.5S0.7,12,1.5,12S3,12.7,3,13.5S2.3,15,1.5,15z M1.5,13C1.2,13,1,13.2,1,13.5S1.2,14,1.5,14 S2,13.8,2,13.5S1.8,13,1.5,13z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-remove\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M193.694-139.2h87.322v510.916h-87.322zM-18.103 159.92V72.597h510.915v87.322z\" transform=\"rotate(45 77.994 208.636)\"/></symbol><symbol id=\"f-i-rich-text\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15,1H1C0.4,1,0,1.4,0,2v12c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1V2C16,1.4,15.6,1,15,1z M1,3.1h0.8v0.3H1V3.1z M1,3.6h0.8 v0.3H1V3.6z M15,14H1V5.1h14V14z M15,4.9H1V4.6h14V4.9z M15,4.4H1V4.1h0.8v0.2h1.5V4.1h1.3v0.2H6V4.1h1.3v0.2h1.5V4.1H10v0.2h1.5 V4.1h1.3v0.2h1.5V4.1H15V4.4z M4.5,3.6v0.3H3.3V3.6H4.5z M3.3,3.4V3.1h1.3v0.3H3.3z M7.3,3.6v0.3H6V3.6H7.3z M6,3.4V3.1h1.3v0.3H6z M10,3.6v0.3H8.8V3.6H10z M8.8,3.4V3.1H10v0.3H8.8z M12.8,3.6v0.3h-1.3V3.6H12.8z M11.5,3.4V3.1h1.3v0.3H11.5z M15,3.9h-0.8V3.6H15 V3.9z M15,3.4h-0.8V3.1H15V3.4z M15,2.9h-0.8V2.8h-1.5v0.2h-1.3V2.8H10v0.2H8.8V2.8H7.3v0.2H6V2.8H4.5v0.2H3.3V2.8H1.8v0.2H1V2.6h14 V2.9z M15,2.4H1V2.1h14V2.4z M3,12v-1h10v1H3z M13,10H3V9h10V10z M11,8H3V7h8V8z\"/></symbol><symbol xml:space=\"preserve\" viewBox=\"0 0 16 16\" id=\"f-i-rows\" xmlns=\"http://www.w3.org/2000/svg\"><metadata id=\"bgprefix__metadata4318\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><cc:Work rdf:about=\"\" xmlns:cc=\"http://creativecommons.org/ns#\"><dc:format xmlns:dc=\"http://purl.org/dc/elements/1.1/\">image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/><dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\"/></cc:Work></rdf:RDF></metadata><g transform=\"matrix(0,1,-1,0,3.0984025,11.835155)\" id=\"bgprefix__g7209\"><path id=\"bgprefix__rect4860-3-5\" d=\"m 4.1640625,-12.402344 a 0.50004997,0.50004997 0 0 0 -0.5,-0.5 l -5,0 -5,0 -5.0000005,0 a 0.50004997,0.50004997 0 0 0 -0.5,0.5 l 0,15.0000002 a 0.50004997,0.50004997 0 0 0 0.5,0.5 l 4.9648442,0 a 0.50004997,0.50004997 0 0 0 0.035156,0 l 4.9648437,0 a 0.50004997,0.50004997 0 0 0 0.035156,0 l 5,0 a 0.50004997,0.50004997 0 0 0 0.5,-0.5 l 0,-15.0000002 z m -1,0.5 0,14.0000002 -4,0 0,-14.0000002 4,0 z m -5,0 0,14.0000002 -4,0 0,-14.0000002 4,0 z m -5,0 0,14.0000002 -4.0000005,0 0,-14.0000002 4.0000005,0 z\"/></g></symbol><symbol id=\"f-i-select\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path id=\"bhprefix__XMLID_1_\" d=\"M0,0v14h0c0,0.6,0.4,1,1,1h10c0.6,0,1-0.4,1-1h0V5h4V0H0z M1,1h10v3H1V1z M1,7h10v3H1V7z M1,14v-3h10v3H1z M15,4h-3V1h3V4z M2,2h1v1H2V2z M2,12h1v1H2V12z M4,12h1v1H4V12z M6,12h1v1H6V12z M9,12v1H8v-1H9z M2,8h1v1H2V8z M4,8h1v1H4V8z M6,8 h1v1H6V8z M13.5,3.1l-1-1.1h1.9L13.5,3.1z M2,6V5h1v1H2L2,6z M4,6V5h1v1H4L4,6z\"/></symbol><symbol viewBox=\"0 0 448 512\" id=\"f-i-settings\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"biprefix__icomoon-ignore\"/><path d=\"M223.969 175c-44.703 0-80.969 36.266-80.969 81 0 44.688 36.266 81.031 80.969 81.031 44.719 0 80.719-36.344 80.719-81.031-0-44.734-36-81-80.719-81zM386.313 302.531l-14.594 35.156 29.469 57.875-36.094 36.094-59.218-27.969-35.156 14.438-17.844 54.625-2.281 7.25h-51.016l-22.078-61.656-35.156-14.5-57.952 29.344-36.078-36.063 27.938-59.25-14.484-35.125-61.767-20.156v-50.984l61.703-22.109 14.485-35.094-25.953-51.234-3.422-6.719 36.031-36.031 59.297 27.922 35.109-14.516 17.828-54.594 2.297-7.234h51l22.094 61.734 35.063 14.516 58.031-29.406 36.063 36.031-27.938 59.203 14.438 35.172 61.875 20.125v50.969l-61.688 22.187z\"/></symbol><symbol id=\"f-i-text-input\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path id=\"bjprefix__XMLID_10_\" d=\"M15,4H4.5V3H6V2H4.5h-1H2v1h1.5v1H1C0.4,4,0,4.5,0,5v6c0,0.6,0.4,1,1,1h2.5v1H2v1h4v-1H4.5v-1H15 c0.6,0,1-0.4,1-1V5C16,4.5,15.6,4,15,4z M1,11V5h2.5v6H1z M15,11H4.5V5H15V11z\"/></symbol><symbol id=\"f-i-textarea\" viewBox=\"0 0 16 16\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"><path id=\"bkprefix__XMLID_1_\" d=\"M3,11v-1h8v1H3L3,11z M3,7h10V6H3V7L3,7z M3,8v1h10V8H3L3,8z M13,4H3v1h10V4L13,4z M16,14V2c0-0.6-0.4-1-1-1 H1C0.4,1,0,1.4,0,2v12c0,0.6,0.4,1,1,1h14C15.6,15,16,14.6,16,14z M15,2v12H1V2H15z\"/></symbol><symbol viewBox=\"0 0 24 32\" id=\"f-i-triangle-down\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 12l11.992 11.992 11.992-11.992h-23.984z\"/></symbol><symbol viewBox=\"0 0 12 32\" id=\"f-i-triangle-left\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 15.996l11.992 11.992v-23.984l-11.992 11.992z\"/></symbol><symbol viewBox=\"0 0 12 32\" id=\"f-i-triangle-right\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.002 4.008l11.992 11.992-11.992 11.992v-23.984z\"/></symbol><symbol viewBox=\"0 0 24 32\" id=\"f-i-triangle-up\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.992 8l-11.992 11.992h23.984l-11.992-11.992z\"/></symbol><symbol viewBox=\"0 0 512 512\" id=\"f-i-upload\" xmlns=\"http://www.w3.org/2000/svg\"><g id=\"bpprefix__icomoon-ignore\"/><path d=\"M240 352h-240v128h480v-128h-240zM448 416h-64v-32h64v32zM112 160l128-128 128 128h-80v160h-96v-160z\"/></symbol></svg>";
8442
+ })), name, version$1, PACKAGE_NAME, formeoSpriteId, FALLBACK_SVG_SPRITE_URL, CSS_URL, FALLBACK_CSS_URL, PANEL_CLASSNAME, CONTROL_GROUP_CLASSNAME, STAGE_CLASSNAME, ROW_CLASSNAME, COLUMN_CLASSNAME, FIELD_CLASSNAME, HIDDEN_BY_CONDITION_SELECTOR, CUSTOM_COLUMN_OPTION_CLASSNAME, COLUMN_PRESET_CLASSNAME, COLUMN_RESIZE_CLASSNAME, CHILD_CLASSNAME_MAP, INTERNAL_COMPONENT_TYPES, INTERNAL_COMPONENT_INDEX_TYPES, INTERNAL_COMPONENT_INDEX_REGEX, COMPONENT_TYPES, COMPONENT_INDEX_TYPES, COMPONENT_INDEX_TYPE_MAP, COMPONENT_TYPE_MAP, COMPONENT_TYPE_CONFIGS, COMPONENT_TYPE_CLASSNAMES, COMPONENT_TYPE_CLASSNAMES_LOOKUP, COMPONENT_TYPE_CLASSNAMES_ARRAY, COMPONENT_TYPE_CLASSNAMES_REGEXP, childTypeMapVals, childTypeIndexMapVals, parentTypeMap, CHILD_TYPE_MAP, CHILD_TYPE_INDEX_MAP, PARENT_TYPE_MAP, columnTemplates, COLUMN_TEMPLATES, SESSION_FORMDATA_KEY, SESSION_LOCALE_KEY, ANIMATION_SPEED_FAST, ANIMATION_SPEED_SLOW, EVENT_FORMEO_SAVED, EVENT_FORMEO_UPDATED, EVENT_FORMEO_CHANGED, EVENT_FORMEO_UPDATED_STAGE, EVENT_FORMEO_UPDATED_ROW, EVENT_FORMEO_UPDATED_COLUMN, EVENT_FORMEO_UPDATED_FIELD, EVENT_FORMEO_CLEARED, EVENT_FORMEO_ON_RENDER, EVENT_FORMEO_CONDITION_UPDATED, EVENT_FORMEO_ADDED_ROW, EVENT_FORMEO_ADDED_COLUMN, EVENT_FORMEO_ADDED_FIELD, EVENT_FORMEO_REMOVED_ROW, EVENT_FORMEO_REMOVED_COLUMN, EVENT_FORMEO_REMOVED_FIELD, EVENT_FORMEO_ADDED_STAGE, EVENT_FORMEO_REMOVED_STAGE, EVENT_FORMEO_PAGE_CHANGED, COMPARISON_OPERATORS, LOGICAL_OPERATORS, ASSIGNMENT_OPERATORS, CONDITION_INPUT_ORDER, CHECKABLE_OPTIONS, VISIBLE_OPTIONS, PROPERTY_OPTIONS, OPERATORS, conditionTypeThen, CONDITION_TEMPLATE, UUID_REGEXP, bsColRegExp, iconPrefix, DEFAULT_FORMDATA, CHECKED_TYPES, REVERSED_CHECKED_TYPES, FILTERED_PANEL_DATA_KEYS;
8437
8443
  var init_constants = __esmMin((() => {
8438
8444
  init_package();
8439
8445
  init_utils();
@@ -8601,6 +8607,9 @@ var init_constants = __esmMin((() => {
8601
8607
  EVENT_FORMEO_REMOVED_ROW = "formeoRemovedRow";
8602
8608
  EVENT_FORMEO_REMOVED_COLUMN = "formeoRemovedColumn";
8603
8609
  EVENT_FORMEO_REMOVED_FIELD = "formeoRemovedField";
8610
+ EVENT_FORMEO_ADDED_STAGE = "formeoAddedStage";
8611
+ EVENT_FORMEO_REMOVED_STAGE = "formeoRemovedStage";
8612
+ EVENT_FORMEO_PAGE_CHANGED = "formeoPageChanged";
8604
8613
  COMPARISON_OPERATORS = {
8605
8614
  equals: "==",
8606
8615
  notEquals: "!=",
@@ -8651,7 +8660,7 @@ var init_constants = __esmMin((() => {
8651
8660
  iconPrefix = "f-i-";
8652
8661
  DEFAULT_FORMDATA = () => ({
8653
8662
  id: uuid(),
8654
- stages: { [uuid()]: {} },
8663
+ stages: { [nonIndexId()]: {} },
8655
8664
  rows: {},
8656
8665
  columns: {},
8657
8666
  fields: {}
@@ -10692,19 +10701,19 @@ var init_helpers = __esmMin((() => {
10692
10701
  field.set("options", updatedOptions);
10693
10702
  }
10694
10703
  field.set(dataKey, target.checked);
10695
- field.updatePreview();
10704
+ field.updatePreview?.();
10696
10705
  } }),
10697
10706
  string: (dataKey, field) => ({ input: ({ target: { value } }) => {
10698
10707
  field.set(dataKey, value);
10699
- field.debouncedUpdatePreview();
10708
+ field.debouncedUpdatePreview?.();
10700
10709
  } }),
10701
10710
  number: (dataKey, field) => ({ input: ({ target: { value } }) => {
10702
10711
  field.set(dataKey, Number(value));
10703
- field.debouncedUpdatePreview();
10712
+ field.debouncedUpdatePreview?.();
10704
10713
  } }),
10705
10714
  array: (dataKey, field) => ({ change: ({ target: { value } }) => {
10706
10715
  field.set(dataKey, value);
10707
- field.debouncedUpdatePreview();
10716
+ field.debouncedUpdatePreview?.();
10708
10717
  } }),
10709
10718
  object: () => ({})
10710
10719
  };
@@ -10945,9 +10954,29 @@ var init_dialog = __esmMin((() => {
10945
10954
  };
10946
10955
  }));
10947
10956
  //#endregion
10957
+ //#region src/lib/js/components/stages/page-text.mjs
10958
+ var PAGE_TEXT, fill, pageText;
10959
+ var init_page_text = __esmMin((() => {
10960
+ init_i18n_es_min();
10961
+ PAGE_TEXT = Object.freeze({
10962
+ "pages.label": "Pages",
10963
+ "pages.add": "Add page",
10964
+ "pages.untitled": "Page {n}",
10965
+ "pages.rename": "Rename page",
10966
+ "pages.remove": "Remove page \"{title}\"",
10967
+ "pages.removeConfirm": "Remove \"{title}\" and everything on it?",
10968
+ "pages.moveTo": "Move to page",
10969
+ "pages.move": "Move",
10970
+ "pages.moved": "Moved to {title}"
10971
+ });
10972
+ fill = (text, vars) => text.replace(/\{(\w+)\}/g, (token, name) => name in vars ? String(vars[name]) : token);
10973
+ pageText = (key, vars = {}) => fill(s.get(key) || PAGE_TEXT[key] || key, vars);
10974
+ }));
10975
+ //#endregion
10948
10976
  //#region src/lib/js/common/actions.js
10949
10977
  init_i18n_es_min();
10950
10978
  init_dialog();
10979
+ init_page_text();
10951
10980
  init_constants();
10952
10981
  init_utils();
10953
10982
  var ATTRIBUTE_NAME = /^[A-Za-z_:][-A-Za-z0-9_:]*$/;
@@ -10996,6 +11025,24 @@ var openAddAttributeDialog = (evt) => new Dialog({
10996
11025
  if (attr && !attributeProblem(attr, evt)) evt.addAction(attr, String(formData.get("attrValue") ?? ""));
10997
11026
  }
10998
11027
  }).open();
11028
+ /**
11029
+ * Default page removal (#122): an empty page goes at once, a page with content asks first
11030
+ * @param {Object} evt { stage, stageId, index, title, isEmpty, removeAction }
11031
+ * @return {Dialog|*}
11032
+ */
11033
+ var removePage = (evt) => {
11034
+ if (evt.isEmpty) return evt.removeAction();
11035
+ return new Dialog({
11036
+ className: "remove-page-dialog",
11037
+ content: {
11038
+ tag: "p",
11039
+ className: "remove-page-message",
11040
+ textContent: pageText("pages.removeConfirm", { title: evt.title })
11041
+ },
11042
+ confirmText: () => s.get("remove") || "Remove",
11043
+ onConfirm: () => evt.removeAction()
11044
+ }).open();
11045
+ };
10999
11046
  var defaultActions = {
11000
11047
  add: {
11001
11048
  attr: (evt) => openAddAttributeDialog(evt),
@@ -11018,7 +11065,8 @@ var defaultActions = {
11018
11065
  },
11019
11066
  conditions: (evt) => {
11020
11067
  evt.removeAction();
11021
- }
11068
+ },
11069
+ page: removePage
11022
11070
  },
11023
11071
  click: { btn: (evt) => {
11024
11072
  evt.action();
@@ -11076,6 +11124,9 @@ var Actions = class {
11076
11124
  },
11077
11125
  conditions: (evt) => {
11078
11126
  return this.opts.remove.conditions(evt);
11127
+ },
11128
+ page: (evt) => {
11129
+ return (this.opts?.remove?.page || defaultActions.remove.page)(evt);
11079
11130
  }
11080
11131
  };
11081
11132
  click = { btn: (evt) => {
@@ -11102,12 +11153,15 @@ var EVENT_CALLBACKS = new Map([
11102
11153
  [EVENT_FORMEO_UPDATED_ROW, ["onUpdate", "onUpdateRow"]],
11103
11154
  [EVENT_FORMEO_UPDATED_COLUMN, ["onUpdate", "onUpdateColumn"]],
11104
11155
  [EVENT_FORMEO_UPDATED_FIELD, ["onUpdate", "onUpdateField"]],
11156
+ [EVENT_FORMEO_ADDED_STAGE, ["onAdd", "onAddStage"]],
11105
11157
  [EVENT_FORMEO_ADDED_ROW, ["onAdd", "onAddRow"]],
11106
11158
  [EVENT_FORMEO_ADDED_COLUMN, ["onAdd", "onAddColumn"]],
11107
11159
  [EVENT_FORMEO_ADDED_FIELD, ["onAdd", "onAddField"]],
11160
+ [EVENT_FORMEO_REMOVED_STAGE, ["onRemove", "onRemoveStage"]],
11108
11161
  [EVENT_FORMEO_REMOVED_ROW, ["onRemove", "onRemoveRow"]],
11109
11162
  [EVENT_FORMEO_REMOVED_COLUMN, ["onRemove", "onRemoveColumn"]],
11110
11163
  [EVENT_FORMEO_REMOVED_FIELD, ["onRemove", "onRemoveField"]],
11164
+ [EVENT_FORMEO_PAGE_CHANGED, ["onPageChange"]],
11111
11165
  [EVENT_FORMEO_ON_RENDER, ["onRender"]]
11112
11166
  ]);
11113
11167
  var reachesDocument = (evt) => evt.target === document || Boolean(evt.bubbles && evt.target?.isConnected);
@@ -11117,9 +11171,11 @@ var reachesDocument = (evt) => evt.target === document || Boolean(evt.bubbles &&
11117
11171
  */
11118
11172
  var Events = class {
11119
11173
  components = null;
11174
+ destroyed = false;
11120
11175
  constructor() {
11121
11176
  this.opts = this.defaults();
11122
11177
  this.formeoUpdatedThrottled = throttle$1(() => {
11178
+ if (this.destroyed) return;
11123
11179
  const eventData = {
11124
11180
  timeStamp: globalThis.performance.now(),
11125
11181
  type: EVENT_FORMEO_UPDATED,
@@ -11143,13 +11199,16 @@ var Events = class {
11143
11199
  onUpdateRow: log,
11144
11200
  onUpdateColumn: log,
11145
11201
  onUpdateField: log,
11202
+ onAddStage: log,
11146
11203
  onAddRow: log,
11147
11204
  onAddColumn: log,
11148
11205
  onAddField: log,
11206
+ onRemoveStage: log,
11149
11207
  onRemoveRow: log,
11150
11208
  onRemoveColumn: log,
11151
11209
  onRemoveField: log,
11152
11210
  onRender: log,
11211
+ onPageChange: () => {},
11153
11212
  onSave: (_evt) => {},
11154
11213
  confirmClearAll: (evt) => {
11155
11214
  if (globalThis.confirm(evt.confirmationMessage)) evt.clearAllAction(evt);
@@ -11175,6 +11234,7 @@ var Events = class {
11175
11234
  return evt;
11176
11235
  }
11177
11236
  runCallbacks({ type, timeStamp, detail }) {
11237
+ if (this.destroyed) return;
11178
11238
  if (type === "formeoUpdated") return this.formeoUpdatedThrottled();
11179
11239
  if (type === "formeoSaved") return this.opts.onSave({
11180
11240
  timeStamp,
@@ -11192,16 +11252,20 @@ var Events = class {
11192
11252
  formeoCleared = (evt) => this.dispatch(EVENT_FORMEO_CLEARED, evt);
11193
11253
  formeoOnRender = (evt) => this.dispatch(EVENT_FORMEO_ON_RENDER, evt);
11194
11254
  formeoConditionUpdated = (evt) => this.dispatch(EVENT_FORMEO_CONDITION_UPDATED, evt);
11255
+ formeoAddedStage = (evt) => this.dispatch(EVENT_FORMEO_ADDED_STAGE, evt);
11195
11256
  formeoAddedRow = (evt) => this.dispatch(EVENT_FORMEO_ADDED_ROW, evt);
11196
11257
  formeoAddedColumn = (evt) => this.dispatch(EVENT_FORMEO_ADDED_COLUMN, evt);
11197
11258
  formeoAddedField = (evt) => this.dispatch(EVENT_FORMEO_ADDED_FIELD, evt);
11259
+ formeoRemovedStage = (evt) => this.dispatch(EVENT_FORMEO_REMOVED_STAGE, evt);
11198
11260
  formeoRemovedRow = (evt) => this.dispatch(EVENT_FORMEO_REMOVED_ROW, evt);
11199
11261
  formeoRemovedColumn = (evt) => this.dispatch(EVENT_FORMEO_REMOVED_COLUMN, evt);
11200
11262
  formeoRemovedField = (evt) => this.dispatch(EVENT_FORMEO_REMOVED_FIELD, evt);
11263
+ formeoPageChanged = (evt) => this.dispatch(EVENT_FORMEO_PAGE_CHANGED, evt);
11201
11264
  /** detail: { confirmationMessage, clearAllAction, btnCoords } */
11202
11265
  confirmClearAll = (detail) => {
11203
11266
  const evt = new globalThis.CustomEvent("confirmClearAll", { detail });
11204
11267
  document.dispatchEvent(evt);
11268
+ if (this.destroyed) return;
11205
11269
  this.opts.confirmClearAll({
11206
11270
  timeStamp: evt.timeStamp,
11207
11271
  type: evt.type,
@@ -11210,7 +11274,7 @@ var Events = class {
11210
11274
  };
11211
11275
  formeoLoaded = (formeo) => {
11212
11276
  document.dispatchEvent(new globalThis.CustomEvent("formeoLoaded", { detail: { formeo } }));
11213
- this.opts.formeoLoaded(formeo);
11277
+ if (!this.destroyed) this.opts.formeoLoaded(formeo);
11214
11278
  };
11215
11279
  columnResized = (detail) => document.dispatchEvent(new globalThis.CustomEvent("columnResized", { detail }));
11216
11280
  /**
@@ -11220,7 +11284,7 @@ var Events = class {
11220
11284
  */
11221
11285
  onResizeWindow = () => {
11222
11286
  const { columns, controls } = this.components || {};
11223
- if (!columns || !controls?.dom?.isConnected || this.resizeFrame) return;
11287
+ if (this.destroyed || !columns || !controls?.dom?.isConnected || this.resizeFrame) return;
11224
11288
  this.resizeFrame = window.requestAnimationFrame(() => {
11225
11289
  this.resizeFrame = null;
11226
11290
  for (const column of Object.values(columns.data)) {
@@ -11235,6 +11299,18 @@ var Events = class {
11235
11299
  }
11236
11300
  });
11237
11301
  };
11302
+ /**
11303
+ * Stop calling this editor's option callbacks, including a trailing onUpdate/onChange that is
11304
+ * already scheduled, and cancel a pending resize frame. FormeoEditor#destroy (#166) calls it.
11305
+ * DOM events are still dispatched, so page listeners are unaffected.
11306
+ */
11307
+ destroy() {
11308
+ this.destroyed = true;
11309
+ if (this.resizeFrame) {
11310
+ window.cancelAnimationFrame(this.resizeFrame);
11311
+ this.resizeFrame = null;
11312
+ }
11313
+ }
11238
11314
  };
11239
11315
  var events = new Events();
11240
11316
  //#endregion
@@ -13107,6 +13183,24 @@ var init_sortable_esm = __esmMin((() => {
13107
13183
  Sortable.mount(Remove, Revert);
13108
13184
  }));
13109
13185
  //#endregion
13186
+ //#region src/lib/js/common/sortable.js
13187
+ var destroySortables;
13188
+ var init_sortable = __esmMin((() => {
13189
+ init_sortable_esm();
13190
+ destroySortables = (root) => {
13191
+ if (!root) return 0;
13192
+ let count = 0;
13193
+ for (const el of [root, ...root.querySelectorAll("*")]) {
13194
+ const sortable = Sortable.get(el);
13195
+ if (sortable) {
13196
+ sortable.destroy();
13197
+ count++;
13198
+ }
13199
+ }
13200
+ return count;
13201
+ };
13202
+ }));
13203
+ //#endregion
13110
13204
  //#region src/lib/js/components/panels.js
13111
13205
  var defaults$1, getTransition, Panels;
13112
13206
  var init_panels = __esmMin((() => {
@@ -13136,18 +13230,25 @@ var init_panels = __esmMin((() => {
13136
13230
  const panelsWrap = this.createPanelsWrap();
13137
13231
  this.nav = this.navActions();
13138
13232
  this.nav.groupChange(this.activePanelIndex);
13139
- const resizeObserver = new window.ResizeObserver(([{ contentRect: { width } }]) => {
13233
+ this.resizeObserver = new window.ResizeObserver(([{ contentRect: { width } }]) => {
13140
13234
  if (this.currentWidth !== width) {
13141
13235
  this.toggleTabbedLayout();
13142
13236
  this.currentWidth = width;
13143
13237
  this.nav.setTranslateX(this.activePanelIndex, false);
13144
13238
  }
13145
13239
  });
13146
- const observeTimeout = window.setTimeout(() => {
13147
- resizeObserver.observe(panelsWrap);
13148
- window.clearTimeout(observeTimeout);
13240
+ this.observeTimeout = window.setTimeout(() => {
13241
+ this.resizeObserver?.observe(panelsWrap);
13149
13242
  }, ANIMATION_SPEED_SLOW);
13150
13243
  }
13244
+ /**
13245
+ * Stop watching the panels' size
13246
+ */
13247
+ destroy() {
13248
+ window.clearTimeout(this.observeTimeout);
13249
+ this.resizeObserver?.disconnect();
13250
+ this.resizeObserver = null;
13251
+ }
13151
13252
  getPanelDisplay() {
13152
13253
  const column = this.panelsWrap;
13153
13254
  const autoDisplayType = Number.parseInt(dom.getStyle(column, "width"), 10) > 390 ? "tabbed" : "slider";
@@ -13446,7 +13547,7 @@ var init_control = __esmMin((() => {
13446
13547
  }));
13447
13548
  //#endregion
13448
13549
  //#region src/lib/js/components/controls/options.js
13449
- init_sortable_esm();
13550
+ init_sortable();
13450
13551
  init_panels();
13451
13552
  init_control();
13452
13553
  var defaultOptions = Object.freeze({
@@ -14764,6 +14865,7 @@ var init_edit_panel_item = __esmMin((() => {
14764
14865
  var addAttributeActions, defaultConfigOptions, defaultConfigValues, EditPanel;
14765
14866
  var init_edit_panel = __esmMin((() => {
14766
14867
  init_i18n_es_min();
14868
+ init_sortable_esm();
14767
14869
  init_dom();
14768
14870
  init_helpers$2();
14769
14871
  init_string();
@@ -14836,6 +14938,14 @@ var init_edit_panel = __esmMin((() => {
14836
14938
  };
14837
14939
  }
14838
14940
  /**
14941
+ * A stage's config.title is its page title (#122): editable only while the editor's page tabs are on
14942
+ * @param {String} keyBase
14943
+ * @return {Boolean}
14944
+ */
14945
+ isPageTitle(keyBase) {
14946
+ return this.name === "config" && keyBase === "title" && this.component.name === "stage" && Boolean(this.component.components?.opts?.pages);
14947
+ }
14948
+ /**
14839
14949
  * Generates the edit panel for attrs, meta and options for a fields(s)
14840
14950
  * @param {String} panelName
14841
14951
  * @param {Object} dataObj field config object
@@ -14849,7 +14959,8 @@ var init_edit_panel = __esmMin((() => {
14849
14959
  const val = isArray ? dataVal : { [dataVal[0]]: dataVal[1] };
14850
14960
  const itemKey = `${this.name}${key}`;
14851
14961
  const isDisabledProp = this.component.isDisabledProp(itemKey, this.name);
14852
- const isEditableProp = FILTERED_PANEL_DATA_KEYS.get(this.name)?.has(keyBase) ?? true;
14962
+ const allowedKeys = FILTERED_PANEL_DATA_KEYS.get(this.name);
14963
+ const isEditableProp = !allowedKeys || allowedKeys.has(keyBase) || this.isPageTitle(keyBase);
14853
14964
  if (isDisabledProp || !isEditableProp) return null;
14854
14965
  return new EditPanelItem({
14855
14966
  key: itemKey,
@@ -15089,6 +15200,7 @@ var init_edit_panel = __esmMin((() => {
15089
15200
  //#region src/lib/js/components/component.js
15090
15201
  var propertyOptions, Component;
15091
15202
  var init_component = __esmMin((() => {
15203
+ init_sortable_esm();
15092
15204
  init_animation();
15093
15205
  init_dom();
15094
15206
  init_helpers$2();
@@ -15098,6 +15210,7 @@ var init_component = __esmMin((() => {
15098
15210
  init_constants();
15099
15211
  init_data();
15100
15212
  init_edit_panel();
15213
+ init_page_text();
15101
15214
  propertyOptions = objectFromStringArray(PROPERTY_OPTIONS);
15102
15215
  Component = class extends Data {
15103
15216
  /**
@@ -15231,7 +15344,7 @@ var init_component = __esmMin((() => {
15231
15344
  }
15232
15345
  return parent;
15233
15346
  }
15234
- if (this.name === "stage") return null;
15347
+ if (this.name === "stage") return this.removeStage();
15235
15348
  const parent = this.parent;
15236
15349
  const children = this.children;
15237
15350
  const siblingsPath = `${parent.name}s.${parent.id}.children`;
@@ -15243,6 +15356,8 @@ var init_component = __esmMin((() => {
15243
15356
  });
15244
15357
  forEach(children, (child) => child.remove());
15245
15358
  this.dom.remove();
15359
+ this.panels?.destroy();
15360
+ this.releaseSortables();
15246
15361
  remove(this.components.getAddress(siblingsPath), this.id);
15247
15362
  if (!parent.children.length) parent.emptyClass();
15248
15363
  if (parent.name === "row") parent.autoColumnWidths();
@@ -15404,10 +15519,29 @@ var init_component = __esmMin((() => {
15404
15519
  if (this.name === "column") this.parent.autoColumnWidths();
15405
15520
  } }
15406
15521
  };
15407
- }
15522
+ },
15523
+ page: (icon = "page-move") => ({
15524
+ ...dom.btnTemplate({
15525
+ content: dom.icon(icon),
15526
+ title: pageText("pages.moveTo")
15527
+ }),
15528
+ className: ["item-page"],
15529
+ meta: { id: "page" },
15530
+ action: { click: () => this.components.pages?.openMoveDialog(this) }
15531
+ })
15408
15532
  };
15409
15533
  const { buttons, disabled } = this.config.actionButtons;
15410
- const actionButtonsConfigs = buttons.filter((btn) => !disabled.includes(btn)).map((btn) => buttonConfig[btn]?.() || btn);
15534
+ const pagesOn = Boolean(this.components.opts?.pages);
15535
+ let rowButtons = buttons;
15536
+ if (pagesOn && this.name === "row" && !buttons.includes("page")) {
15537
+ const at = buttons.indexOf("remove");
15538
+ rowButtons = at === -1 ? [...buttons, "page"] : [
15539
+ ...buttons.slice(0, at),
15540
+ "page",
15541
+ ...buttons.slice(at)
15542
+ ];
15543
+ }
15544
+ const actionButtonsConfigs = rowButtons.filter((btn) => !disabled.includes(btn) && (btn !== "page" || pagesOn && this.name === "row")).map((btn) => buttonConfig[btn]?.() || btn);
15411
15545
  this.actionButtons = actionButtonsConfigs;
15412
15546
  return this.actionButtons;
15413
15547
  }
@@ -15591,6 +15725,20 @@ var init_component = __esmMin((() => {
15591
15725
  return this.saveChildOrder();
15592
15726
  };
15593
15727
  /**
15728
+ * Destroy the Sortables of this removed component and its descendants, so Sortable's page-wide
15729
+ * list stops holding them (and through them the editor). A column emptied by a drag is removed
15730
+ * from inside Sortable's drop handler; destroying that Sortable there would end the drop early,
15731
+ * so during a drag it is released once the drop has finished.
15732
+ */
15733
+ releaseSortables() {
15734
+ const { dom: removedDom } = this;
15735
+ if (Sortable.active) {
15736
+ queueMicrotask(() => destroySortables(removedDom));
15737
+ return;
15738
+ }
15739
+ destroySortables(removedDom);
15740
+ }
15741
+ /**
15594
15742
  * Handler for removing content from a sortable component
15595
15743
  * @param {Object} evt
15596
15744
  * @return {Array} updated child order
@@ -15816,6 +15964,7 @@ var init_component = __esmMin((() => {
15816
15964
  id: this.id,
15817
15965
  displayType: "auto"
15818
15966
  };
15967
+ this.panels?.destroy();
15819
15968
  this.panels = new Panels(panelsData);
15820
15969
  if (this.dom) {
15821
15970
  this.dom.querySelector(".panel-nav").replaceWith(this.panels.panelNav);
@@ -16594,6 +16743,7 @@ init_i18n_es_min();
16594
16743
  init_sortable_esm();
16595
16744
  init_dom();
16596
16745
  init_helpers$2();
16746
+ init_sortable();
16597
16747
  init_utils();
16598
16748
  init_object();
16599
16749
  init_constants();
@@ -16883,6 +17033,22 @@ var Controls = class {
16883
17033
  if (group === "layout") return this.layoutTypes[metaId.replace("layout-", "")]();
16884
17034
  return this.layoutTypes.field(elementData);
16885
17035
  };
17036
+ /**
17037
+ * Remove the controls from the page and release their Sortables and Panels. A control drag in
17038
+ * progress in these controls is ended: its ghost is removed and the page overflow it hid is
17039
+ * restored. Safe to call more than once, and before init().
17040
+ */
17041
+ destroy() {
17042
+ const element = this.dom;
17043
+ if (element && Sortable.active?.el && element.contains(Sortable.active.el)) Sortable.ghost?.remove();
17044
+ if (this.originalDocumentOverflow != null) {
17045
+ document.documentElement.style.overflow = this.originalDocumentOverflow;
17046
+ this.originalDocumentOverflow = null;
17047
+ }
17048
+ destroySortables(element);
17049
+ this.panels?.destroy();
17050
+ element?.remove();
17051
+ }
16886
17052
  applyOptions = async (controlOptions = {}) => {
16887
17053
  const { container, elements, groupOrder, ...options } = merge(defaultOptions, controlOptions);
16888
17054
  this.container = dom.resolveContainer(container);
@@ -16928,6 +17094,13 @@ var ComponentData = class extends Data {
16928
17094
  */
16929
17095
  get = (path) => path ? get(this.data, path) : this.add();
16930
17096
  /**
17097
+ * Generates an id for a new component when none is given. Stores where key order is meaningful (Stages: page
17098
+ * order is `Object.keys(this.data)` order, #122) override this, since JS objects always list an integer-like
17099
+ * key ("1", "2") before any string key, regardless of insertion order.
17100
+ * @returns {String}
17101
+ */
17102
+ generateId = () => uuid();
17103
+ /**
16931
17104
  * Adds a new component with the given id and data.
16932
17105
  *
16933
17106
  * @param {string} id - The unique identifier for the component. If not provided, a new UUID will be generated.
@@ -16937,7 +17110,7 @@ var ComponentData = class extends Data {
16937
17110
  * @returns {Object} The newly created component.
16938
17111
  */
16939
17112
  add = (id, data = Object.create(null), { silent = false } = {}) => {
16940
- const elemId = id || uuid();
17113
+ const elemId = id || this.generateId();
16941
17114
  const component = this.Component({
16942
17115
  ...data,
16943
17116
  id: elemId
@@ -16945,6 +17118,7 @@ var ComponentData = class extends Data {
16945
17118
  this.data[elemId] = component;
16946
17119
  this.active = component;
16947
17120
  const addEvent = {
17121
+ stages: EVENT_FORMEO_ADDED_STAGE,
16948
17122
  rows: EVENT_FORMEO_ADDED_ROW,
16949
17123
  columns: EVENT_FORMEO_ADDED_COLUMN,
16950
17124
  fields: EVENT_FORMEO_ADDED_FIELD
@@ -17721,9 +17895,47 @@ var Stage = class extends Component {
17721
17895
  const component = super.onAdd(...args);
17722
17896
  if (component?.name === "column") component.parent.autoColumnWidths();
17723
17897
  }
17898
+ /**
17899
+ * Removes this stage, a page with the editor's `pages` option (#122), with everything on it.
17900
+ * formData always keeps one stage, so the last one is never removed.
17901
+ * @return {String|null} the removed id, or null when nothing was removed
17902
+ */
17903
+ removeStage() {
17904
+ const { stages, events } = this.components;
17905
+ if (stages.size <= 1) return null;
17906
+ const previousValue = Object.keys(stages.data);
17907
+ const children = [...this.children];
17908
+ this.dispatchComponentEvent("onRemove", {
17909
+ parent: null,
17910
+ children
17911
+ });
17912
+ for (const row of children) row.remove();
17913
+ this.dom.remove();
17914
+ this.panels?.destroy();
17915
+ this.releaseSortables();
17916
+ stages.delete(this.id);
17917
+ if (stages.active === this) stages.active = Object.values(stages.data)[0];
17918
+ events.formeoRemovedStage({
17919
+ componentId: this.id,
17920
+ componentType: this.name
17921
+ });
17922
+ events.formeoUpdated({
17923
+ entity: this,
17924
+ componentId: this.id,
17925
+ componentType: this.name,
17926
+ dataPath: "stages",
17927
+ changePath: "stages",
17928
+ value: Object.keys(stages.data),
17929
+ previousValue,
17930
+ changeType: "removed"
17931
+ });
17932
+ return this.id;
17933
+ }
17724
17934
  };
17725
17935
  //#endregion
17726
17936
  //#region src/lib/js/components/stages/index.js
17937
+ init_utils();
17938
+ init_page_text();
17727
17939
  var DEFAULT_CONFIG = () => ({
17728
17940
  actionButtons: {
17729
17941
  buttons: ["edit"],
@@ -17744,7 +17956,67 @@ var Stages = class extends ComponentData {
17744
17956
  this.config = { all: DEFAULT_CONFIG() };
17745
17957
  }
17746
17958
  Component(data) {
17747
- return new Stage(data, this.components);
17959
+ return new Stage(this.withPageTitle(data), this.components);
17960
+ }
17961
+ /**
17962
+ * A fresh id that never looks like an array index: page order is this store's key order, and an integer-like
17963
+ * key would jump to the front regardless of when it was added (#122).
17964
+ * @returns {String}
17965
+ */
17966
+ generateId = () => nonIndexId();
17967
+ /**
17968
+ * With the editor's `pages` option every stage carries a string `config.title` (#122), so its edit panel always
17969
+ * offers one. An empty title shows as "Page {n}".
17970
+ * @param {Object} data stage data
17971
+ * @return {Object}
17972
+ */
17973
+ withPageTitle(data) {
17974
+ const title = data.config?.title;
17975
+ if (!this.components?.opts?.pages || typeof title === "string") return data;
17976
+ return {
17977
+ ...data,
17978
+ config: {
17979
+ ...data.config,
17980
+ title: title == null ? "" : String(title)
17981
+ }
17982
+ };
17983
+ }
17984
+ /**
17985
+ * A page's title: its config.title, or "Page {n}" (1-based) when that is empty
17986
+ * @param {Stage} stage
17987
+ * @param {Number} [index] the page's 0-based position, when the caller already knows it
17988
+ * @return {String}
17989
+ */
17990
+ pageTitle(stage, index = Object.keys(this.data).indexOf(stage.id)) {
17991
+ const title = stage.get("config.title");
17992
+ return typeof title === "string" && title.trim() ? title : pageText("pages.untitled", { n: index + 1 });
17993
+ }
17994
+ /**
17995
+ * Puts the stages (pages) in a new order. Page order is the key order of this store's data, the same object as
17996
+ * the editor's formData.stages, so the keys are re-inserted in place.
17997
+ * @param {String[]} ids stage ids in the new order; unknown ids are ignored, missing ones keep their order at the end
17998
+ * @return {Boolean} whether the order changed
17999
+ */
18000
+ reorder(ids) {
18001
+ const current = Object.keys(this.data);
18002
+ const wanted = unique([...ids.filter((id) => Object.hasOwn(this.data, id)), ...current]);
18003
+ if (wanted.every((id, i) => id === current[i])) return false;
18004
+ if (wanted.some(looksLikeArrayIndex)) {
18005
+ console.warn("formeo: pages whose ids look like array indexes (\"1\", \"2\") keep their order; use other ids to reorder them.");
18006
+ return false;
18007
+ }
18008
+ const entries = wanted.map((id) => [id, this.data[id]]);
18009
+ for (const id of current) delete this.data[id];
18010
+ for (const [id, stage] of entries) this.data[id] = stage;
18011
+ this.events?.formeoUpdated({
18012
+ entity: this,
18013
+ dataPath: "stages",
18014
+ changePath: "stages",
18015
+ value: wanted,
18016
+ previousValue: current,
18017
+ changeType: "reordered"
18018
+ });
18019
+ return true;
17748
18020
  }
17749
18021
  };
17750
18022
  var stages = new Stages();
@@ -17896,6 +18168,603 @@ new Components({
17896
18168
  });
17897
18169
  actions.events = events;
17898
18170
  //#endregion
18171
+ //#region src/lib/js/components/stages/pages.js
18172
+ init_sortable_esm();
18173
+ init_dom();
18174
+ init_sortable();
18175
+ init_dialog();
18176
+ init_page_text();
18177
+ /** How long a tab stays highlighted after content moves to its page, in ms */
18178
+ var FLASH_DURATION = 1e3;
18179
+ /**
18180
+ * Creates an element with attributes, text and children. Titles are user data, so text is never parsed as HTML.
18181
+ * @param {String} tag
18182
+ * @param {Object} [props] className, text, and attributes to set
18183
+ * @param {Array<Node>} [children]
18184
+ * @return {HTMLElement}
18185
+ */
18186
+ var el = (tag, { className, text, ...attrs } = {}, children = []) => {
18187
+ const node = document.createElement(tag);
18188
+ if (className) node.className = className;
18189
+ if (text !== void 0) node.textContent = text;
18190
+ for (const [name, value] of Object.entries(attrs)) node.setAttribute(name, value);
18191
+ node.append(...children);
18192
+ return node;
18193
+ };
18194
+ /**
18195
+ * Page tabs for one editor (#122): each stage is a page. Created by FormeoEditor when its `pages` option is on.
18196
+ * Holds no page-wide state, so every editor on a page has its own tabs.
18197
+ */
18198
+ var EditorPages = class {
18199
+ /**
18200
+ * @param {Components} components the editor's Components
18201
+ */
18202
+ constructor(components) {
18203
+ this.components = components;
18204
+ this.activeId = null;
18205
+ this.activeIndex = -1;
18206
+ this.wrapper = null;
18207
+ this.tablist = null;
18208
+ this.status = null;
18209
+ this.renaming = null;
18210
+ this.flashTimers = /* @__PURE__ */ new Map();
18211
+ this.announceTimer = null;
18212
+ this.stageListeners = /* @__PURE__ */ new Map();
18213
+ }
18214
+ get stages() {
18215
+ return this.components.stages;
18216
+ }
18217
+ /** @return {String[]} stage ids in page order */
18218
+ get ids() {
18219
+ return Object.keys(this.stages.data);
18220
+ }
18221
+ get count() {
18222
+ return this.ids.length;
18223
+ }
18224
+ /** @return {Number} 0-based index of the active page */
18225
+ get index() {
18226
+ return Math.max(0, this.ids.indexOf(this.activeId));
18227
+ }
18228
+ tabId(stageId) {
18229
+ return `${this.components.instanceId}-page-tab-${stageId}`;
18230
+ }
18231
+ wrapFor(stageId) {
18232
+ return [...this.tablist?.children || []].find((wrap) => wrap.dataset.stageId === stageId);
18233
+ }
18234
+ tabFor(stageId) {
18235
+ return this.wrapFor(stageId)?.querySelector(".formeo-page-tab");
18236
+ }
18237
+ titleOf(stageId) {
18238
+ return this.stages.pageTitle(this.stages.get(stageId), this.ids.indexOf(stageId));
18239
+ }
18240
+ stageAt(stageIdOrIndex) {
18241
+ const id = typeof stageIdOrIndex === "number" ? this.ids[stageIdOrIndex] : stageIdOrIndex;
18242
+ return id && Object.hasOwn(this.stages.data, id) ? this.stages.get(id) : void 0;
18243
+ }
18244
+ isRtl() {
18245
+ return this.tablist?.closest("[dir]")?.getAttribute("dir") === "rtl";
18246
+ }
18247
+ /**
18248
+ * Builds the tab bar and a wrapper holding it and every stage. Called by FormeoEditor#render; keeps the active
18249
+ * page when it still exists, otherwise starts on the first page. Never fires onPageChange.
18250
+ * @return {HTMLElement} .formeo-pages-editor
18251
+ */
18252
+ render() {
18253
+ this.teardown();
18254
+ const ids = this.ids;
18255
+ if (!ids.includes(this.activeId)) this.activeId = ids[0] ?? null;
18256
+ for (const [id, { stage }] of [...this.stageListeners]) if (!ids.includes(id) || this.stages.get(id) !== stage) this.unwatchStage(id);
18257
+ for (const id of ids) this.watchStage(this.stages.get(id));
18258
+ this.tablist = el("div", {
18259
+ className: "formeo-page-tabs",
18260
+ role: "tablist",
18261
+ "aria-label": pageText("pages.label")
18262
+ });
18263
+ this.tablist.addEventListener("click", this.onClick);
18264
+ this.tablist.addEventListener("dblclick", this.onDblClick);
18265
+ this.tablist.addEventListener("keydown", this.onKeydown);
18266
+ const addLabel = pageText("pages.add");
18267
+ const addButton = el("button", {
18268
+ className: "formeo-page-add",
18269
+ type: "button",
18270
+ "aria-label": addLabel,
18271
+ title: addLabel
18272
+ });
18273
+ addButton.innerHTML = dom.icon("plus");
18274
+ addButton.addEventListener("click", () => this.add());
18275
+ this.status = el("span", {
18276
+ className: "formeo-pages-status",
18277
+ "aria-live": "polite"
18278
+ });
18279
+ const bar = el("div", { className: "formeo-pages-bar" }, [
18280
+ this.tablist,
18281
+ addButton,
18282
+ this.status
18283
+ ]);
18284
+ this.wrapper = el("div", { className: "formeo-pages-editor" }, [bar, ...ids.map((id) => this.stages.get(id).dom)]);
18285
+ this.createTabSorter();
18286
+ this.rebuildTabs();
18287
+ if (this.activeId) this.stages.active = this.stages.get(this.activeId);
18288
+ return this.wrapper;
18289
+ }
18290
+ renderTab(stageId, index) {
18291
+ const title = this.stages.pageTitle(this.stages.get(stageId), index);
18292
+ const tab = el("button", {
18293
+ className: "formeo-page-tab",
18294
+ type: "button",
18295
+ role: "tab",
18296
+ id: this.tabId(stageId),
18297
+ "aria-controls": stageId,
18298
+ text: title
18299
+ });
18300
+ const wrap = el("div", {
18301
+ className: "formeo-page-tab-wrap",
18302
+ role: "presentation",
18303
+ "data-stage-id": stageId
18304
+ }, [tab]);
18305
+ if (this.count > 1) {
18306
+ const label = pageText("pages.remove", { title });
18307
+ const remove = el("button", {
18308
+ className: "formeo-page-remove",
18309
+ type: "button",
18310
+ tabindex: "-1",
18311
+ "aria-label": label,
18312
+ title: label
18313
+ });
18314
+ remove.innerHTML = dom.icon("remove");
18315
+ wrap.append(remove);
18316
+ }
18317
+ return wrap;
18318
+ }
18319
+ /** Re-creates every tab (after an add or a removal) */
18320
+ rebuildTabs() {
18321
+ this.commitRename();
18322
+ for (const wrap of this.tablist.children) destroySortables(wrap);
18323
+ this.tablist.replaceChildren(...this.ids.map((id, index) => this.renderTab(id, index)));
18324
+ for (const wrap of this.tablist.children) this.createDropTarget(wrap, wrap.dataset.stageId);
18325
+ this.sync();
18326
+ }
18327
+ /** Shows the active stage, hides the rest, and updates the tabs' selection state */
18328
+ sync() {
18329
+ const ids = this.ids;
18330
+ this.activeIndex = ids.indexOf(this.activeId);
18331
+ for (const id of ids) {
18332
+ const selected = id === this.activeId;
18333
+ const { dom: stageDom } = this.stages.get(id);
18334
+ stageDom.hidden = !selected;
18335
+ stageDom.setAttribute("role", "tabpanel");
18336
+ stageDom.setAttribute("aria-labelledby", this.tabId(id));
18337
+ const tab = this.tabFor(id);
18338
+ if (tab) {
18339
+ tab.setAttribute("aria-selected", String(selected));
18340
+ tab.tabIndex = selected ? 0 : -1;
18341
+ }
18342
+ }
18343
+ this.wrapper?.setAttribute("data-page-count", String(ids.length));
18344
+ }
18345
+ /** Re-titles every tab, e.g. after a rename, or renumbers untitled pages after a move */
18346
+ refreshLabels() {
18347
+ this.ids.forEach((id, index) => {
18348
+ const title = this.stages.pageTitle(this.stages.get(id), index);
18349
+ const tab = this.tabFor(id);
18350
+ if (tab) tab.textContent = title;
18351
+ const remove = this.wrapFor(id)?.querySelector(".formeo-page-remove");
18352
+ if (remove) {
18353
+ const label = pageText("pages.remove", { title });
18354
+ remove.setAttribute("aria-label", label);
18355
+ remove.title = label;
18356
+ }
18357
+ });
18358
+ }
18359
+ /**
18360
+ * Shows a page
18361
+ * @param {String|Number} stageIdOrIndex
18362
+ * @param {Object} [options]
18363
+ * @param {Boolean} [options.focus] move focus to its tab
18364
+ */
18365
+ activate(stageIdOrIndex, { focus = false } = {}) {
18366
+ const stage = this.stageAt(stageIdOrIndex);
18367
+ if (!stage) return;
18368
+ this.commitRename();
18369
+ const previousStageId = this.activeId;
18370
+ const previousPage = this.activeIndex;
18371
+ this.activeId = stage.id;
18372
+ this.stages.active = stage;
18373
+ this.sync();
18374
+ if (focus) this.tabFor(stage.id)?.focus();
18375
+ if (previousStageId && previousStageId !== stage.id) this.components.events.formeoPageChanged({
18376
+ src: this.tablist?.isConnected ? this.tablist : void 0,
18377
+ page: this.activeIndex,
18378
+ previousPage,
18379
+ stageId: stage.id,
18380
+ previousStageId
18381
+ });
18382
+ }
18383
+ /**
18384
+ * Appends a page and switches to it
18385
+ * @param {Object} [options]
18386
+ * @param {String} [options.title] its config.title; empty shows "Page {n}"
18387
+ * @return {Stage}
18388
+ */
18389
+ add({ title = "" } = {}) {
18390
+ const previousValue = this.ids;
18391
+ const stage = this.stages.add(null, { config: { title } });
18392
+ this.components.events.formeoUpdated({
18393
+ entity: stage,
18394
+ componentId: stage.id,
18395
+ componentType: stage.name,
18396
+ dataPath: "stages",
18397
+ changePath: "stages",
18398
+ value: this.ids,
18399
+ previousValue,
18400
+ changeType: "added"
18401
+ });
18402
+ this.watchStage(stage);
18403
+ this.wrapper?.append(stage.dom);
18404
+ if (this.tablist) this.rebuildTabs();
18405
+ this.activate(stage.id, { focus: true });
18406
+ return stage;
18407
+ }
18408
+ /** Relabels a tab when its stage's config.title changes, from its tab or from the edit panel */
18409
+ watchStage(stage) {
18410
+ if (!stage || this.stageListeners.has(stage.id)) return;
18411
+ const listener = ({ path }) => {
18412
+ const changed = Array.isArray(path) ? path.join(".") : String(path);
18413
+ if (changed === "config" || changed === "config.title") this.refreshLabels();
18414
+ };
18415
+ stage.addEventListener("onUpdate", listener);
18416
+ this.stageListeners.set(stage.id, {
18417
+ stage,
18418
+ listener
18419
+ });
18420
+ }
18421
+ unwatchStage(stageId) {
18422
+ const watched = this.stageListeners.get(stageId);
18423
+ if (watched) {
18424
+ watched.stage.removeEventListener("onUpdate", watched.listener);
18425
+ this.stageListeners.delete(stageId);
18426
+ }
18427
+ }
18428
+ /**
18429
+ * Says something to screen readers through the bar's live region
18430
+ * @param {String} text
18431
+ */
18432
+ announce(text) {
18433
+ const { status } = this;
18434
+ if (!status) return;
18435
+ clearTimeout(this.announceTimer);
18436
+ status.textContent = "";
18437
+ this.announceTimer = setTimeout(() => {
18438
+ this.announceTimer = null;
18439
+ status.textContent = text;
18440
+ }, 100);
18441
+ }
18442
+ onClick = ({ target }) => {
18443
+ const remove = target.closest(".formeo-page-remove");
18444
+ if (remove) return this.requestRemove(remove.closest(".formeo-page-tab-wrap").dataset.stageId);
18445
+ const tab = target.closest(".formeo-page-tab");
18446
+ if (tab) this.activate(tab.closest(".formeo-page-tab-wrap").dataset.stageId, { focus: true });
18447
+ };
18448
+ onDblClick = ({ target }) => {
18449
+ const tab = target.closest(".formeo-page-tab");
18450
+ if (tab) this.startRename(tab.closest(".formeo-page-tab-wrap").dataset.stageId);
18451
+ };
18452
+ onKeydown = (evt) => {
18453
+ const tab = evt.target.closest?.(".formeo-page-tab");
18454
+ if (!tab) return;
18455
+ const stageId = tab.closest(".formeo-page-tab-wrap").dataset.stageId;
18456
+ const ids = this.ids;
18457
+ const index = ids.indexOf(stageId);
18458
+ const rtl = this.isRtl();
18459
+ const step = {
18460
+ ArrowRight: rtl ? -1 : 1,
18461
+ ArrowLeft: rtl ? 1 : -1
18462
+ }[evt.key];
18463
+ const handled = () => {
18464
+ evt.preventDefault();
18465
+ evt.stopPropagation();
18466
+ };
18467
+ if (step && evt.altKey) {
18468
+ handled();
18469
+ return this.movePage(stageId, index + step);
18470
+ }
18471
+ const target = {
18472
+ ArrowRight: () => ids[(index + step + ids.length) % ids.length],
18473
+ ArrowLeft: () => ids[(index + step + ids.length) % ids.length],
18474
+ Home: () => ids[0],
18475
+ End: () => ids.at(-1)
18476
+ }[evt.key]?.();
18477
+ if (target) {
18478
+ handled();
18479
+ return this.activate(target, { focus: true });
18480
+ }
18481
+ if (evt.key === "F2") {
18482
+ handled();
18483
+ return this.startRename(stageId);
18484
+ }
18485
+ if (evt.key === "Delete") {
18486
+ handled();
18487
+ return this.requestRemove(stageId);
18488
+ }
18489
+ };
18490
+ /**
18491
+ * Swaps a tab for a text input holding the page's title
18492
+ * @param {String} stageId
18493
+ */
18494
+ startRename(stageId) {
18495
+ this.commitRename();
18496
+ const tab = this.tabFor(stageId);
18497
+ if (!tab) return;
18498
+ const stage = this.stages.get(stageId);
18499
+ const input = el("input", {
18500
+ className: "formeo-page-title-input",
18501
+ type: "text",
18502
+ "aria-label": pageText("pages.rename"),
18503
+ placeholder: this.titleOf(stageId)
18504
+ });
18505
+ input.value = stage.get("config.title") || "";
18506
+ input.addEventListener("keydown", (evt) => {
18507
+ if (evt.key === "Enter" || evt.key === "Escape") {
18508
+ evt.preventDefault();
18509
+ evt.stopPropagation();
18510
+ this.commitRename({
18511
+ save: evt.key === "Enter",
18512
+ focus: true
18513
+ });
18514
+ }
18515
+ });
18516
+ input.addEventListener("blur", () => this.commitRename());
18517
+ tab.hidden = true;
18518
+ tab.after(input);
18519
+ this.renaming = {
18520
+ stageId,
18521
+ input,
18522
+ tab
18523
+ };
18524
+ input.focus();
18525
+ input.select();
18526
+ }
18527
+ /**
18528
+ * Ends a rename in progress
18529
+ * @param {Object} [options]
18530
+ * @param {Boolean} [options.save] keep the typed title (false on Escape)
18531
+ * @param {Boolean} [options.focus] focus the tab afterwards
18532
+ */
18533
+ commitRename({ save = true, focus = false } = {}) {
18534
+ const renaming = this.renaming;
18535
+ if (!renaming) return;
18536
+ this.renaming = null;
18537
+ const stage = this.stages.get(renaming.stageId);
18538
+ const title = renaming.input.value.trim();
18539
+ if (save && stage && title !== (stage.get("config.title") || "")) stage.set("config.title", title);
18540
+ renaming.input.remove();
18541
+ renaming.tab.hidden = false;
18542
+ this.refreshLabels();
18543
+ if (focus) renaming.tab.focus();
18544
+ }
18545
+ /**
18546
+ * Asks the editor's actions.remove.page to remove a page; the last page is never offered
18547
+ * @param {String} stageId
18548
+ */
18549
+ requestRemove(stageId) {
18550
+ const stage = this.stageAt(stageId);
18551
+ if (!stage || this.count <= 1) return;
18552
+ this.commitRename();
18553
+ const index = this.ids.indexOf(stageId);
18554
+ this.components.actions.remove.page({
18555
+ stage,
18556
+ stageId,
18557
+ index,
18558
+ title: this.titleOf(stageId),
18559
+ isEmpty: !stage.children.length,
18560
+ removeAction: () => this.removePage(stageId)
18561
+ });
18562
+ }
18563
+ /**
18564
+ * Removes a page with everything on it, then shows its neighbour
18565
+ * @param {String} stageId
18566
+ * @return {Boolean} whether it was removed
18567
+ */
18568
+ removePage(stageId) {
18569
+ const stage = this.stageAt(stageId);
18570
+ if (!stage || this.count <= 1) return false;
18571
+ const index = this.ids.indexOf(stageId);
18572
+ const wasActive = this.activeId === stageId;
18573
+ const previousPage = this.activeIndex;
18574
+ this.unwatchStage(stageId);
18575
+ stage.remove();
18576
+ const remaining = this.ids;
18577
+ this.rebuildTabs();
18578
+ if (wasActive) {
18579
+ this.activeIndex = previousPage;
18580
+ this.activate(remaining[Math.max(0, index - 1)], { focus: true });
18581
+ } else this.tabFor(this.activeId)?.focus();
18582
+ return true;
18583
+ }
18584
+ /** Tabs can be dragged along the tablist to reorder pages */
18585
+ createTabSorter() {
18586
+ Sortable.create(this.tablist, {
18587
+ animation: 150,
18588
+ direction: "horizontal",
18589
+ draggable: ".formeo-page-tab-wrap",
18590
+ handle: ".formeo-page-tab",
18591
+ filter: ".formeo-page-title-input",
18592
+ preventOnFilter: false,
18593
+ forceFallback: true,
18594
+ fallbackTolerance: 5,
18595
+ group: {
18596
+ name: `page-tabs-${this.components.instanceId}`,
18597
+ pull: false,
18598
+ put: false
18599
+ },
18600
+ onEnd: () => this.reorderFromDom()
18601
+ });
18602
+ }
18603
+ /** Puts the pages in the order their tabs now have; a rename in progress on another tab is committed first */
18604
+ reorderFromDom() {
18605
+ this.commitRename();
18606
+ const ids = [...this.tablist.children].map((wrap) => wrap.dataset.stageId);
18607
+ if (this.stages.reorder(ids)) this.afterReorder();
18608
+ else this.orderTabs();
18609
+ }
18610
+ /**
18611
+ * Moves a page to a new position (Alt+ArrowLeft/Right)
18612
+ * @param {String} stageId
18613
+ * @param {Number} toIndex
18614
+ */
18615
+ movePage(stageId, toIndex) {
18616
+ const ids = this.ids;
18617
+ if (toIndex < 0 || toIndex >= ids.length || ids.indexOf(stageId) === toIndex) return;
18618
+ const order = ids.filter((id) => id !== stageId);
18619
+ order.splice(toIndex, 0, stageId);
18620
+ if (this.stages.reorder(order)) {
18621
+ this.afterReorder();
18622
+ this.tabFor(stageId)?.focus();
18623
+ }
18624
+ }
18625
+ /** Puts the tabs back in page order, e.g. when a reorder was refused */
18626
+ orderTabs() {
18627
+ for (const id of this.ids) {
18628
+ const wrap = this.wrapFor(id);
18629
+ if (wrap) this.tablist.append(wrap);
18630
+ }
18631
+ }
18632
+ afterReorder() {
18633
+ this.orderTabs();
18634
+ for (const id of this.ids) this.wrapper?.append(this.stages.get(id).dom);
18635
+ this.refreshLabels();
18636
+ this.sync();
18637
+ }
18638
+ /**
18639
+ * Makes a tab accept rows, columns, fields and controls from this editor; what lands on it goes to the end
18640
+ * of its page, and the page on screen stays the same
18641
+ * @param {HTMLElement} wrap .formeo-page-tab-wrap
18642
+ * @param {String} stageId
18643
+ */
18644
+ createDropTarget(wrap, stageId) {
18645
+ const group = (name) => `${name}-${this.components.instanceId}`;
18646
+ Sortable.create(wrap, {
18647
+ group: {
18648
+ name: group("page-tab"),
18649
+ pull: false,
18650
+ put: [
18651
+ "stage",
18652
+ "row",
18653
+ "column",
18654
+ "controls"
18655
+ ].map(group)
18656
+ },
18657
+ sort: false,
18658
+ draggable: ".formeo-page-drop-item",
18659
+ onAdd: (evt) => this.onTabDrop(evt, stageId)
18660
+ });
18661
+ }
18662
+ /**
18663
+ * Moves what was dropped on a tab to the end of that tab's page. The target stage's own onAdd sorts out
18664
+ * what it becomes: a row moves, a column gets a new row, a field a new row and column, a control its field.
18665
+ */
18666
+ onTabDrop({ item, from }, stageId) {
18667
+ const stage = this.stageAt(stageId);
18668
+ if (!stage) return;
18669
+ const children = stage.dom.querySelector(".children");
18670
+ children.appendChild(item);
18671
+ stage.onAdd({
18672
+ from,
18673
+ to: children,
18674
+ item,
18675
+ newIndex: children.children.length - 1
18676
+ });
18677
+ this.afterMove(stageId);
18678
+ }
18679
+ /**
18680
+ * Moves a row to the end of another page ("Move to page")
18681
+ * @param {Row} row
18682
+ * @param {String} stageId
18683
+ * @return {Boolean} whether it moved
18684
+ */
18685
+ moveToPage(row, stageId) {
18686
+ const stage = this.stageAt(stageId);
18687
+ const source = row?.parent;
18688
+ if (row?.name !== "row" || !stage || !source || source === stage) return false;
18689
+ stage.dom.querySelector(".children").appendChild(row.dom);
18690
+ for (const changed of [stage, source]) {
18691
+ changed.saveChildOrder();
18692
+ changed.emptyClass();
18693
+ }
18694
+ this.afterMove(stageId);
18695
+ return true;
18696
+ }
18697
+ /**
18698
+ * Asks which page a row should move to, then moves it there
18699
+ * @param {Row} row
18700
+ */
18701
+ openMoveDialog(row) {
18702
+ const currentId = row?.parent?.id;
18703
+ const targets = this.ids.filter((id) => id !== currentId);
18704
+ if (row?.name !== "row" || !targets.length) return;
18705
+ const label = pageText("pages.moveTo");
18706
+ new Dialog({
18707
+ title: label,
18708
+ className: "move-to-page-dialog",
18709
+ content: el("select", {
18710
+ name: "page",
18711
+ className: "move-to-page-select",
18712
+ "aria-label": label
18713
+ }, targets.map((id) => el("option", {
18714
+ value: id,
18715
+ text: this.titleOf(id)
18716
+ }))),
18717
+ confirmText: () => pageText("pages.move"),
18718
+ onConfirm: (formData) => this.moveToPage(row, String(formData.get("page")))
18719
+ }).open();
18720
+ }
18721
+ /**
18722
+ * Highlights a page's tab for a moment and announces "Moved to {title}"
18723
+ * @param {String} stageId
18724
+ */
18725
+ afterMove(stageId) {
18726
+ const wrap = this.wrapFor(stageId);
18727
+ if (wrap) {
18728
+ clearTimeout(this.flashTimers.get(stageId));
18729
+ wrap.classList.add("formeo-page-tab-flash");
18730
+ this.flashTimers.set(stageId, setTimeout(() => {
18731
+ wrap.classList.remove("formeo-page-tab-flash");
18732
+ this.flashTimers.delete(stageId);
18733
+ }, FLASH_DURATION));
18734
+ }
18735
+ this.announce(pageText("pages.moved", { title: this.titleOf(stageId) }));
18736
+ }
18737
+ /** Releases the bar's Sortables (the tab sorter and every tab's drop target) and timers; the stages keep their DOM */
18738
+ teardown() {
18739
+ this.commitRename();
18740
+ if (this.tablist) destroySortables(this.tablist);
18741
+ for (const timer of this.flashTimers.values()) clearTimeout(timer);
18742
+ this.flashTimers.clear();
18743
+ clearTimeout(this.announceTimer);
18744
+ this.announceTimer = null;
18745
+ }
18746
+ /**
18747
+ * Releases everything this editor's page tabs hold. FormeoEditor#destroy calls it, after the editor's events are
18748
+ * gone, so an open rename is discarded rather than saved: nothing may change the form while it is torn down.
18749
+ */
18750
+ destroy() {
18751
+ this.commitRename({ save: false });
18752
+ this.teardown();
18753
+ for (const id of [...this.stageListeners.keys()]) this.unwatchStage(id);
18754
+ for (const id of this.ids) {
18755
+ const stageDom = this.stages.get(id)?.dom;
18756
+ if (stageDom?.getAttribute("aria-labelledby") === this.tabId(id)) {
18757
+ stageDom.hidden = false;
18758
+ stageDom.removeAttribute("role");
18759
+ stageDom.removeAttribute("aria-labelledby");
18760
+ }
18761
+ }
18762
+ this.wrapper = null;
18763
+ this.tablist = null;
18764
+ this.status = null;
18765
+ }
18766
+ };
18767
+ //#endregion
17899
18768
  //#region src/lib/js/config.js
17900
18769
  init_constants();
17901
18770
  var defaults = { get editor() {
@@ -17905,6 +18774,7 @@ var defaults = { get editor() {
17905
18774
  dataType: "json",
17906
18775
  debug: false,
17907
18776
  sessionStorage: false,
18777
+ pages: false,
17908
18778
  editorContainer: null,
17909
18779
  svgSprite: null,
17910
18780
  style: CSS_URL,
@@ -17922,6 +18792,7 @@ var defaults = { get editor() {
17922
18792
  init_i18n_es_min();
17923
18793
  init_dom();
17924
18794
  init_loaders();
18795
+ init_sortable();
17925
18796
  init_utils();
17926
18797
  init_constants();
17927
18798
  /**
@@ -17932,9 +18803,11 @@ var INIT_STATES = {
17932
18803
  LOADING_RESOURCES: "loading",
17933
18804
  INITIALIZING: "initializing",
17934
18805
  READY: "ready",
17935
- ERROR: "error"
18806
+ ERROR: "error",
18807
+ DESTROYED: "destroyed"
17936
18808
  };
17937
18809
  var storageKeyHolders = /* @__PURE__ */ new Map();
18810
+ var pageTooltip = null;
17938
18811
  /**
17939
18812
  * Whether an editor is still on the page, or still on its way there. An editor whose container
17940
18813
  * left the page or no longer holds its DOM (a remount, a demo switch) no longer owns its key.
@@ -17942,7 +18815,7 @@ var storageKeyHolders = /* @__PURE__ */ new Map();
17942
18815
  * @return {Boolean}
17943
18816
  */
17944
18817
  var isLiveEditor = (editor) => {
17945
- if (editor.initState === INIT_STATES.ERROR) return false;
18818
+ if (editor.initState === INIT_STATES.ERROR || editor.initState === INIT_STATES.DESTROYED) return false;
17946
18819
  if (!editor.editor) return !editor.editorContainer || editor.editorContainer.isConnected;
17947
18820
  return Boolean(editor.editorContainer?.isConnected && editor.editorContainer.contains(editor.editor));
17948
18821
  };
@@ -17954,6 +18827,7 @@ var FormeoEditor$1 = class {
17954
18827
  #initPromise = null;
17955
18828
  #lockedFormData = null;
17956
18829
  #dataLoadedOnce = false;
18830
+ #onDOMContentLoaded = () => this.loadResources();
17957
18831
  /**
17958
18832
  * @param {Object} options formeo options
17959
18833
  * @param {String|Object} userFormData loaded formData
@@ -17983,13 +18857,15 @@ var FormeoEditor$1 = class {
17983
18857
  actions: this.actions
17984
18858
  });
17985
18859
  this.Components.config = config;
18860
+ this.pages = opts.pages ? new EditorPages(this.Components) : null;
18861
+ this.Components.pages = this.pages;
17986
18862
  if (opts.sessionStorage) {
17987
18863
  const key = formDataStorageKey(opts.sessionStorage);
17988
18864
  const holder = storageKeyHolders.get(key);
17989
18865
  if (holder && isLiveEditor(holder)) console.warn(`formeo: another editor on this page already saves to sessionStorage key "${key}". Give each editor its own key, e.g. sessionStorage: 'orders-form'.`);
17990
18866
  storageKeyHolders.set(key, this);
17991
18867
  }
17992
- if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", this.loadResources.bind(this));
18868
+ if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", this.#onDOMContentLoaded, { once: true });
17993
18869
  else this.loadResources();
17994
18870
  }
17995
18871
  get formData() {
@@ -18012,6 +18888,7 @@ var FormeoEditor$1 = class {
18012
18888
  * @return {void}
18013
18889
  */
18014
18890
  clear() {
18891
+ if (this.isDestroyed) return;
18015
18892
  const defaultData = DEFAULT_FORMDATA();
18016
18893
  this.#lockedFormData = defaultData;
18017
18894
  this.userFormData = defaultData;
@@ -18023,7 +18900,8 @@ var FormeoEditor$1 = class {
18023
18900
  * @return {Promise} asynchronously loaded remote resources
18024
18901
  */
18025
18902
  async loadResources() {
18026
- document.removeEventListener("DOMContentLoaded", this.loadResources);
18903
+ document.removeEventListener("DOMContentLoaded", this.#onDOMContentLoaded);
18904
+ if (this.isDestroyed) return;
18027
18905
  this.#initState = INIT_STATES.LOADING_RESOURCES;
18028
18906
  const promises = [
18029
18907
  fetchIcons(this.opts.svgSprite),
@@ -18036,8 +18914,10 @@ var FormeoEditor$1 = class {
18036
18914
  ].filter(Boolean);
18037
18915
  try {
18038
18916
  await Promise.all(promises);
18917
+ if (this.isDestroyed) return;
18039
18918
  if (this.opts.allowEdit) this.init();
18040
18919
  } catch (error) {
18920
+ if (this.isDestroyed) return;
18041
18921
  this.#initState = INIT_STATES.ERROR;
18042
18922
  console.error("Failed to load resources:", error);
18043
18923
  throw error;
@@ -18049,10 +18929,15 @@ var FormeoEditor$1 = class {
18049
18929
  * dom elements, actions events and more.
18050
18930
  */
18051
18931
  init() {
18932
+ if (this.isDestroyed) return Promise.resolve(this);
18052
18933
  if (this.#initState === INIT_STATES.INITIALIZING) return this.#initPromise;
18053
18934
  if (this.#initState === INIT_STATES.READY) return this.#refreshUI();
18054
18935
  this.#initState = INIT_STATES.INITIALIZING;
18055
18936
  this.#initPromise = new Controls(this.Components).init(this.opts.controls, this.opts.stickyControls).then((controls) => {
18937
+ if (this.isDestroyed) {
18938
+ controls.destroy();
18939
+ return this;
18940
+ }
18056
18941
  this.controls = controls;
18057
18942
  this.Components.controls = controls;
18058
18943
  if (!this.#dataLoadedOnce) {
@@ -18062,13 +18947,17 @@ var FormeoEditor$1 = class {
18062
18947
  this.formId = this.Components.get("id");
18063
18948
  this.i18n = { setLang: this.#setLanguage.bind(this) };
18064
18949
  this.render();
18950
+ if (this.isDestroyed) return this;
18065
18951
  this.onResize = this.events.onResizeWindow;
18066
18952
  window.addEventListener("resize", this.onResize);
18067
18953
  this.#initState = INIT_STATES.READY;
18068
18954
  this.opts.onLoad?.(this);
18955
+ if (this.isDestroyed) return this;
18069
18956
  this.tooltipInstance = new SmartTooltip();
18957
+ pageTooltip = this.tooltipInstance;
18070
18958
  return this;
18071
18959
  }).catch((error) => {
18960
+ if (this.isDestroyed) return this;
18072
18961
  this.#initState = INIT_STATES.ERROR;
18073
18962
  console.error("Failed to initialize editor:", error);
18074
18963
  throw error;
@@ -18090,7 +18979,13 @@ var FormeoEditor$1 = class {
18090
18979
  * @return {Promise}
18091
18980
  */
18092
18981
  async #refreshUI() {
18093
- this.controls = await new Controls(this.Components).init(this.opts.controls, this.opts.stickyControls);
18982
+ if (this.isDestroyed) return this;
18983
+ const controls = await new Controls(this.Components).init(this.opts.controls, this.opts.stickyControls);
18984
+ if (this.isDestroyed) {
18985
+ controls.destroy();
18986
+ return this;
18987
+ }
18988
+ this.controls = controls;
18094
18989
  this.Components.controls = this.controls;
18095
18990
  this.render();
18096
18991
  return this;
@@ -18118,6 +19013,7 @@ var FormeoEditor$1 = class {
18118
19013
  return DEFAULT_FORMDATA();
18119
19014
  }
18120
19015
  load(formData = this.userFormData, opts = this.opts) {
19016
+ if (this.isDestroyed) return;
18121
19017
  this.Components.load(formData, opts);
18122
19018
  this.render();
18123
19019
  }
@@ -18136,16 +19032,28 @@ var FormeoEditor$1 = class {
18136
19032
  return this.#initState === INIT_STATES.READY;
18137
19033
  }
18138
19034
  /**
19035
+ * Check if destroy() was called
19036
+ * @return {boolean}
19037
+ */
19038
+ get isDestroyed() {
19039
+ return this.#initState === INIT_STATES.DESTROYED;
19040
+ }
19041
+ /**
18139
19042
  * Wait for the editor to be ready
18140
19043
  * @return {Promise} resolves when editor is ready
18141
19044
  */
18142
19045
  async whenReady() {
18143
19046
  if (this.#initState === INIT_STATES.READY) return this;
19047
+ if (this.isDestroyed) return Promise.reject(/* @__PURE__ */ new Error("Editor was destroyed"));
18144
19048
  if (this.#initState === INIT_STATES.ERROR) return Promise.reject(/* @__PURE__ */ new Error("Editor initialization failed"));
18145
- if (this.#initPromise) return this.#initPromise;
19049
+ if (this.#initPromise) return this.#initPromise.then((editor) => {
19050
+ if (this.isDestroyed) throw new Error("Editor was destroyed");
19051
+ return editor;
19052
+ });
18146
19053
  return new Promise((resolve, reject) => {
18147
19054
  const checkReady = () => {
18148
19055
  if (this.#initState === INIT_STATES.READY) resolve(this);
19056
+ else if (this.isDestroyed) reject(/* @__PURE__ */ new Error("Editor was destroyed"));
18149
19057
  else if (this.#initState === INIT_STATES.ERROR) reject(/* @__PURE__ */ new Error("Editor initialization failed"));
18150
19058
  else globalThis.requestAnimationFrame(checkReady);
18151
19059
  };
@@ -18157,15 +19065,17 @@ var FormeoEditor$1 = class {
18157
19065
  * @return {void}
18158
19066
  */
18159
19067
  render() {
19068
+ if (this.isDestroyed) return;
18160
19069
  if (!this.controls) return globalThis.requestAnimationFrame(() => this.render());
18161
19070
  this.stages = Object.values(this.Components.get("stages"));
18162
- if (this.opts.controlOnLeft) for (const stage of this.stages) stage.dom.style.order = 1;
19071
+ const stageArea = this.pages ? [this.pages.render()] : this.stages.map(({ dom }) => dom);
19072
+ if (this.opts.controlOnLeft) for (const element of stageArea) element.style.order = 1;
18163
19073
  const elemConfig = {
18164
19074
  attrs: {
18165
19075
  className: "formeo formeo-editor",
18166
19076
  id: this.formId
18167
19077
  },
18168
- content: [this.stages.map(({ dom }) => dom)]
19078
+ content: [stageArea]
18169
19079
  };
18170
19080
  if (s.current.dir) {
18171
19081
  elemConfig.attrs.dir = s.current.dir;
@@ -18187,6 +19097,47 @@ var FormeoEditor$1 = class {
18187
19097
  }
18188
19098
  this.events.formeoLoaded(this);
18189
19099
  }
19100
+ /**
19101
+ * Remove the editor from the page and release what it holds: its Sortable instances, resize
19102
+ * observers, window resize listener, pending callbacks and loaded components. Other editors on
19103
+ * the page keep working, and a new editor can mount in the same container.
19104
+ * Safe to call more than once, and before the editor is ready.
19105
+ * @return {void}
19106
+ */
19107
+ destroy() {
19108
+ if (this.isDestroyed) return;
19109
+ this.#initState = INIT_STATES.DESTROYED;
19110
+ document.removeEventListener("DOMContentLoaded", this.#onDOMContentLoaded);
19111
+ window.removeEventListener("resize", this.onResize);
19112
+ this.events.destroy();
19113
+ this.controls?.destroy();
19114
+ this.pages?.destroy();
19115
+ if (this.opts.sessionStorage) {
19116
+ const key = formDataStorageKey(this.opts.sessionStorage);
19117
+ if (storageKeyHolders.get(key) === this) storageKeyHolders.delete(key);
19118
+ }
19119
+ destroySortables(this.editor);
19120
+ for (const type of [
19121
+ "stages",
19122
+ "rows",
19123
+ "columns",
19124
+ "fields"
19125
+ ]) {
19126
+ for (const component of Object.values(this.Components[type]?.data || {})) component.panels?.destroy();
19127
+ this.Components[type]?.empty();
19128
+ }
19129
+ this.editor?.remove();
19130
+ this.Components.empty();
19131
+ if (pageTooltip && !document.querySelector(".formeo-editor")) {
19132
+ pageTooltip.destroy();
19133
+ pageTooltip = null;
19134
+ }
19135
+ this.tooltipInstance = null;
19136
+ this.editor = null;
19137
+ this.controls = null;
19138
+ this.Components.controls = null;
19139
+ this.stages = [];
19140
+ }
18190
19141
  };
18191
19142
  //#endregion
18192
19143
  //#region src/lib/js/renderer/helpers.js
@@ -18468,7 +19419,7 @@ var focusFirst = (page) => {
18468
19419
  * `progress` only affects the wizard, adding a clickable step list above the pages
18469
19420
  * @param {Array<Object>} stages stage data in render order, for page titles
18470
19421
  * @param {Function} [onChange] called with (page, previousPage) whenever the page changes
18471
- * @return {{show: Function, index: Number, count: Number}|null} null when there is only one page
19422
+ * @return {{show: Function, index: Number, count: Number, destroy: Function}|null} null when there is only one page
18472
19423
  */
18473
19424
  var paginate = (form, { type, progress, labels }, stages, onChange) => {
18474
19425
  const pages = Array.from(form.children).filter((elem) => elem.classList.contains(STAGE_CLASSNAME));
@@ -18661,14 +19612,16 @@ var paginate = (form, { type, progress, labels }, stages, onChange) => {
18661
19612
  }
18662
19613
  };
18663
19614
  const ownerDocument = form.ownerDocument;
18664
- ownerDocument.addEventListener("click", ({ target }) => {
19615
+ const onDocumentClick = ({ target }) => {
18665
19616
  const control = target.closest?.("button, input");
18666
19617
  if (control?.form !== form) return;
18667
19618
  if (control?.type === "submit" || control?.tagName === "INPUT" && control.type === "image") markReported();
18668
- }, true);
18669
- ownerDocument.addEventListener("keydown", ({ key, target }) => {
19619
+ };
19620
+ const onDocumentKeydown = ({ key, target }) => {
18670
19621
  if (key === "Enter" && target.tagName === "INPUT" && target.form === form) markReported();
18671
- }, true);
19622
+ };
19623
+ ownerDocument.addEventListener("click", onDocumentClick, true);
19624
+ ownerDocument.addEventListener("keydown", onDocumentKeydown, true);
18672
19625
  for (const method of ["requestSubmit", "reportValidity"]) {
18673
19626
  const native = HTMLFormElement.prototype[method];
18674
19627
  if (typeof native !== "function") continue;
@@ -18688,7 +19641,11 @@ var paginate = (form, { type, progress, labels }, stages, onChange) => {
18688
19641
  get index() {
18689
19642
  return current;
18690
19643
  },
18691
- count
19644
+ count,
19645
+ destroy() {
19646
+ ownerDocument.removeEventListener("click", onDocumentClick, true);
19647
+ ownerDocument.removeEventListener("keydown", onDocumentKeydown, true);
19648
+ }
18692
19649
  };
18693
19650
  };
18694
19651
  //#endregion
@@ -18815,8 +19772,21 @@ var FormeoRenderer$1 = class {
18815
19772
  formData: this.form
18816
19773
  });
18817
19774
  }
19775
+ /**
19776
+ * Remove the rendered form from the page and stop its pagination. render() can be called again afterwards.
19777
+ * @return {void}
19778
+ */
19779
+ destroy() {
19780
+ this.pager?.destroy();
19781
+ this.pager = null;
19782
+ this.renderedForm?.remove();
19783
+ this.renderedForm = null;
19784
+ this.components = Object.create(null);
19785
+ }
18818
19786
  getRenderedForm(formData = this.form) {
18819
19787
  this.form = cleanFormData(formData);
19788
+ this.pager?.destroy();
19789
+ this.pager = null;
18820
19790
  const renderCount = document.getElementsByClassName("formeo-render").length;
18821
19791
  const config = {
18822
19792
  ...this.config,