formeo 4.2.5 → 5.0.1

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,12 +1,13 @@
1
1
 
2
2
  /**
3
3
  formeo - https://formeo.io
4
- Version: 4.2.4
4
+ Version: 5.0.0
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
8
8
  "use strict";
9
9
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
10
+ const e = { "en-US": { "en-US": "English", dir: "ltr", "af-ZA": "Afrikaans (South Africa)", "ar-TN": "Arabic (Tunisia)", "cs-CZ": "Czech (Czechia)", "de-DE": "German (Germany)", "es-ES": "European Spanish", "fa-IR": "Persian (Iran)", "fi-FI": "Finnish (Finland)", "fr-FR": "French (France)", "hu-HU": "Hungarian (Hungary)", "it-IT": "Italian (Italy)", "ja-JP": "Japanese (Japan)", "nb-NO": "Norwegian Bokmål (Norway)", "pl-PL": "Polish (Poland)", "pt-BR": "Brazilian Portuguese", "pt-PT": "European Portuguese", "ro-RO": "Romanian (Romania)", "ru-RU": "Russian (Russia)", "th-TH": "Thai (Thailand)", "tr-TR": "Turkish (Türkiye)", "zh-CN": "Chinese (China)", "zh-HK": "Chinese (Hong Kong SAR China)", "action.add.attrs.attr": "What attribute would you like to add?", "action.add.attrs.value": "Default Value", addOption: "Add Option", allFieldsRemoved: "All fields were removed.", allowSelect: "Allow Select", and: "and", attribute: "Attribute", attributeNotPermitted: 'Attribute "{attribute}" is not permitted, please choose another.', attributes: "Attributes", "attrs.class": "Class", "attrs.className": "Class", "attrs.dir": "Direction", "attrs.id": "Id", "attrs.required": "Required", "attrs.style": "Style", "attrs.title": "Title", "attrs.type": "Type", "attrs.value": "Value", autocomplete: "Autocomplete", button: "Button", cannotBeEmpty: "This field cannot be empty", cannotClearFields: "There are no fields to clear", checkbox: "Checkbox", checkboxes: "Checkboxes", class: "Class", clear: "Clear", clearAllMessage: "Are you sure you want to clear all fields?", close: "Close", column: "Column", "condition.target.placeholder": "target", "condition.type.and": "And", "condition.type.if": "If", "condition.type.or": "Or", "condition.type.then": "Then", "condition.value.placeholder": "value", confirmClearAll: "Are you sure you want to remove all fields?", content: "Content", control: "Control", "controlGroups.nextGroup": "Next Group", "controlGroups.prevGroup": "Previous Group", "controls.filteringTerm": 'Filtering "{term}"', "controls.form.button": "Button", "controls.form.checkbox-group": "Checkbox Group", "controls.form.input.date": "Date", "controls.form.input.email": "Email", "controls.form.input.file": "File Upload", "controls.form.input.hidden": "Hidden Input", "controls.form.input.number": "Number", "controls.form.input.text": "Text Input", "controls.form.radio-group": "Radio Group", "controls.form.select": "Select", "controls.form.textarea": "TextArea", "controls.groups.form": "Form Fields", "controls.groups.html": "HTML Elements", "controls.groups.layout": "Layout", "controls.html.divider": "Divider", "controls.html.header": "Header", "controls.html.paragraph": "Paragraph", "controls.layout.column": "Column", "controls.layout.row": "Row", copy: "Copy To Clipboard", danger: "Danger", defineColumnLayout: "Define a column layout", defineColumnWidths: "Define column widths", description: "Help Text", descriptionField: "Description", "editing.row": "Editing Row", editorTitle: "Form Elements", field: "Field", "field.property.invalid": "not valid", "field.property.isChecked": "is checked", "field.property.isNotVisible": "is not visible", "field.property.isVisible": "is visible", "field.property.label": "label", "field.property.valid": "valid", "field.property.value": "value", fieldNonEditable: "This field cannot be edited.", fieldRemoveWarning: "Are you sure you want to remove this field?", fileUpload: "File Upload", formUpdated: "Form Updated", getStarted: "Drag a field from the right to get started.", group: "Group", grouped: "Grouped", hidden: "Hidden Input", hide: "Edit", htmlElements: "HTML Elements", if: "If", "if.condition.source.placeholder": "source", "if.condition.target.placeholder": "target / value", info: "Info", "input.date": "Date", "input.text": "Text", label: "Label", labelCount: "{label} {count}", labelEmpty: "Field Label cannot be empty", "lang.af": "Afrikaans", "lang.ar": "Arabic", "lang.cs": "Czech", "lang.de": "German", "lang.en": "English", "lang.es": "Spanish", "lang.fa": "Persian", "lang.fi": "Finnish", "lang.fr": "French", "lang.hu": "Hungarian", "lang.it": "Italian", "lang.ja": "Japanese", "lang.nb": "Norwegian Bokmål", "lang.pl": "Polish", "lang.pt": "Portuguese", "lang.ro": "Romanian", "lang.ru": "Russian", "lang.th": "Thai", "lang.tr": "Turkish", "lang.zh": "Chinese", layout: "Layout", limitRole: "Limit access to one or more of the following roles:", mandatory: "Mandatory", maxlength: "Max Length", "meta.group": "Group", "meta.icon": "Ico", "meta.label": "Label", minOptionMessage: "This field requires a minimum of 2 options", name: "Name", newOptionLabel: "New {type}", no: "No", number: "Number", off: "Off", on: "On", "operator.contains": "contains", "operator.equals": "equals", "operator.notContains": "not contains", "operator.notEquals": "not equal", "operator.notVisible": "not visible", "operator.visible": "visible", option: "Option", optional: "optional", optionEmpty: "Option value required", optionLabel: "Option {count}", options: "Options", or: "or", order: "Order", "panel.label.attrs": "Attributes", "panel.label.conditions": "Conditions", "panel.label.config": "Configuration", "panel.label.meta": "Meta", "panel.label.options": "Options", "panelEditButtons.attrs": "+ Attribute", "panelEditButtons.conditions": "+ Condition", "panelEditButtons.options": "+ Option", placeholder: "Placeholder", "placeholder.className": "space separated classes", "placeholder.email": "Enter you email", "placeholder.label": "Label", "placeholder.password": "Enter your password", "placeholder.placeholder": "Placeholder", "placeholder.text": "Enter some Text", "placeholder.textarea": "Enter a lot of text", "placeholder.value": "Value", preview: "Preview", primary: "Primary", remove: "Remove", removeMessage: "Remove Element", removeType: "Remove {type}", required: "Required", reset: "Reset", richText: "Rich Text Editor", roles: "Access", row: "Row", "row.makeInputGroup": "Make this row an input group.", "row.makeInputGroupDesc": "Input Groups enable users to add sets of inputs at a time.", "row.settings.fieldsetWrap": "Wrap row in a <fieldset> tag", "row.settings.fieldsetWrap.aria": "Wrap Row in Fieldset", save: "Save", secondary: "Secondary", select: "Select", selectColor: "Select Color", selectionsMessage: "Allow Multiple Selections", selectOptions: "Options", separator: "Separator", settings: "Settings", size: "Size", sizes: "Sizes", "sizes.lg": "Large", "sizes.m": "Default", "sizes.sm": "Small", "sizes.xs": "Extra Small", style: "Style", styles: "Styles", "styles.btn": "Button Style", "styles.btn.danger": "Danger", "styles.btn.default": "Default", "styles.btn.info": "Info", "styles.btn.primary": "Primary", "styles.btn.success": "Success", "styles.btn.warning": "Warning", subtype: "Type", success: "Success", text: "Text Field", then: "Then", "then.condition.target.placeholder": "target", toggle: "Toggle", ungrouped: "Un-Grouped", warning: "Warning", yes: "Yes" } }, i = e["en-US"];
10
11
  async function fetchData(url) {
11
12
  try {
12
13
  const response = await fetch(url);
@@ -51,8 +52,8 @@ class I18N {
51
52
  this.config = { location: parsedLocation, ...restOptions };
52
53
  const { override, preloaded = {} } = this.config;
53
54
  const allLangs = Object.entries(this.langs).concat(Object.entries(override || preloaded));
54
- this.langs = allLangs.reduce((acc, [locale2, lang]) => {
55
- acc[locale2] = this.applyLanguage(locale2, lang);
55
+ this.langs = allLangs.reduce((acc, [locale, lang]) => {
56
+ acc[locale] = this.applyLanguage(locale, lang);
56
57
  return acc;
57
58
  }, {});
58
59
  this.locale = this.config.locale || this.config.langs[0];
@@ -71,9 +72,9 @@ class I18N {
71
72
  * @param {String} locale
72
73
  * @param {String|Object} lang
73
74
  */
74
- addLanguage(locale2, lang = {}) {
75
+ addLanguage(locale, lang = {}) {
75
76
  lang = typeof lang === "string" ? I18N.processFile(lang) : lang;
76
- this.applyLanguage(locale2, lang);
77
+ this.applyLanguage(locale, lang);
77
78
  this.config.langs.push("locale");
78
79
  }
79
80
  /**
@@ -82,9 +83,9 @@ class I18N {
82
83
  * @param {String} locale - locale to check for value
83
84
  * @return {String} language string or undefined
84
85
  */
85
- getValue(key, locale2 = this.locale) {
86
+ getValue(key, locale = this.locale) {
86
87
  var _a;
87
- const value = (_a = this.langs[locale2]) == null ? void 0 : _a[key];
88
+ const value = (_a = this.langs[locale]) == null ? void 0 : _a[key];
88
89
  return value || this.getFallbackValue(key);
89
90
  }
90
91
  /**
@@ -176,22 +177,22 @@ class I18N {
176
177
  * @param {Boolean} useCache
177
178
  * @return {Promise} resolves response
178
179
  */
179
- loadLang(locale2, useCache = true) {
180
+ loadLang(locale, useCache = true) {
180
181
  const _this = this;
181
182
  return new Promise(function(resolve, reject) {
182
- if (_this.loaded.indexOf(locale2) !== -1 && useCache) {
183
- _this.applyLanguage(_this.langs[locale2]);
184
- return resolve(_this.langs[locale2]);
183
+ if (_this.loaded.indexOf(locale) !== -1 && useCache) {
184
+ _this.applyLanguage(_this.langs[locale]);
185
+ return resolve(_this.langs[locale]);
185
186
  } else {
186
- const langFile = [_this.config.location, locale2, _this.config.extension].join("");
187
+ const langFile = [_this.config.location, locale, _this.config.extension].join("");
187
188
  return fetchData(langFile).then((lang) => {
188
189
  const processedFile = I18N.processFile(lang);
189
- _this.applyLanguage(locale2, processedFile);
190
- _this.loaded.push(locale2);
191
- return resolve(_this.langs[locale2]);
190
+ _this.applyLanguage(locale, processedFile);
191
+ _this.loaded.push(locale);
192
+ return resolve(_this.langs[locale]);
192
193
  }).catch((err) => {
193
194
  console.error(err);
194
- const lang = _this.applyLanguage(locale2);
195
+ const lang = _this.applyLanguage(locale);
195
196
  resolve(lang);
196
197
  });
197
198
  }
@@ -203,11 +204,11 @@ class I18N {
203
204
  * @param {Object} lang
204
205
  * @return {Object} overriden language
205
206
  */
206
- applyLanguage(locale2, lang = {}) {
207
- const override = this.config.override[locale2] || {};
208
- const existingLang = this.langs[locale2] || {};
209
- this.langs[locale2] = { ...existingLang, ...lang, ...override };
210
- return this.langs[locale2];
207
+ applyLanguage(locale, lang = {}) {
208
+ const override = this.config.override[locale] || {};
209
+ const existingLang = this.langs[locale] || {};
210
+ this.langs[locale] = { ...existingLang, ...lang, ...override };
211
+ return this.langs[locale];
211
212
  }
212
213
  /**
213
214
  * return currently available languages
@@ -221,10 +222,10 @@ class I18N {
221
222
  * @param {String} locale
222
223
  * @return {Promise} language
223
224
  */
224
- async setCurrent(locale2 = "en-US") {
225
- await this.loadLang(locale2);
226
- this.locale = locale2;
227
- this.current = this.langs[locale2];
225
+ async setCurrent(locale = "en-US") {
226
+ await this.loadLang(locale);
227
+ this.locale = locale;
228
+ this.current = this.langs[locale];
228
229
  return this.current;
229
230
  }
230
231
  }
@@ -433,7 +434,7 @@ if (window !== void 0) {
433
434
  window.SmartTooltip = SmartTooltip;
434
435
  }
435
436
  const name$1 = "formeo";
436
- const version$2 = "4.2.4";
437
+ const version$2 = "5.0.0";
437
438
  const pkg = {
438
439
  name: name$1,
439
440
  version: version$2
@@ -2168,7 +2169,7 @@ function buildFlatDataStructure(data, componentId, componentType2, result = {})
2168
2169
  }
2169
2170
  return result;
2170
2171
  }
2171
- const BUNDLED_SVG_SPRITE = '<?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 fill="#000000" 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 fill="#000" 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 fill="#444" 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 viewBox="0 0 384 512" id="f-i-menu" xmlns="http://www.w3.org/2000/svg"><g id="auprefix__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="#000000" 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"><metadata id="awprefix__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><sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="3440" inkscape:window-height="1416" id="awprefix__namedview6" showgrid="false" inkscape:zoom="1.84375" inkscape:cx="421.4312" inkscape:cy="218.56484" inkscape:window-x="0" inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg2" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"/><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" id="awprefix__path4" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:connector-curvature="0" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" sodipodi:nodetypes="ccccccccccc"/></symbol><symbol viewBox="0 0 20 28" id="f-i-paragraph" xmlns="http://www.w3.org/2000/svg"><path fill="#444" 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="#000000" 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="beprefix__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="beprefix__g7209"><path id="beprefix__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="bfprefix__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="bgprefix__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="bhprefix__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="biprefix__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 fill="#444" 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 fill="#444" 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 fill="#444" 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 fill="#444" 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="bnprefix__icomoon-ignore"/><path d="M240 352h-240v128h480v-128h-240zM448 416h-64v-32h64v32zM112 160l128-128 128 128h-80v160h-96v-160z"/></symbol></svg>';
2172
+ const BUNDLED_SVG_SPRITE = '<?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 fill="#000000" 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 fill="#000" 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 fill="#444" 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="#000000" 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"><metadata id="axprefix__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><sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="3440" inkscape:window-height="1416" id="axprefix__namedview6" showgrid="false" inkscape:zoom="1.84375" inkscape:cx="421.4312" inkscape:cy="218.56484" inkscape:window-x="0" inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg2" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"/><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" id="axprefix__path4" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:connector-curvature="0" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" sodipodi:nodetypes="ccccccccccc"/></symbol><symbol viewBox="0 0 20 28" id="f-i-paragraph" xmlns="http://www.w3.org/2000/svg"><path fill="#444" 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="#000000" 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 fill="#444" 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 fill="#444" 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 fill="#444" 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 fill="#444" 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>';
2172
2173
  const name = pkg.name;
2173
2174
  const version$1 = pkg.version;
2174
2175
  const PACKAGE_NAME = name;
@@ -2352,8 +2353,11 @@ const DEFAULT_FORMDATA = () => ({
2352
2353
  });
2353
2354
  const CHECKED_TYPES = ["selected", "checked"];
2354
2355
  const REVERSED_CHECKED_TYPES = CHECKED_TYPES.toReversed();
2355
- const toTitleCaseLowers = "a an and as at but by for for from in into near nor of on onto or the to with".split(" ").map((lower) => `\\s${lower}\\s`);
2356
- const toTitleCaseRegex = new RegExp(`(?!${toTitleCaseLowers.join("|")})\\w\\S*`, "g");
2356
+ const FILTERED_PANEL_DATA_KEYS = /* @__PURE__ */ new Map([
2357
+ ["config", /* @__PURE__ */ new Set(["label", "helpText", "hideLabel", "labelAfter", "disableHtmlLabel", "tooltip"])]
2358
+ ]);
2359
+ const toTitleCaseLowers = "a an and as at but by for for from in into near nor of on onto or the to with".split(" ").map((lower) => String.raw`\s${lower}\s`);
2360
+ const toTitleCaseRegex = new RegExp(String.raw`(?!${toTitleCaseLowers.join("|")})\w\S*`, "g");
2357
2361
  const regexSpace = /\s+/g;
2358
2362
  function toTitleCase(str) {
2359
2363
  if (typeof str !== "string") {
@@ -2405,6 +2409,10 @@ const truncateByWord = (str, maxLength, tail = "…") => {
2405
2409
  }
2406
2410
  return truncatedWord;
2407
2411
  };
2412
+ const keyPrefixRegex = /^attrs\.|^meta\.|^options\.|^config\./g;
2413
+ function trimKeyPrefix(key) {
2414
+ return key.replaceAll(keyPrefixRegex, "");
2415
+ }
2408
2416
  var isSymbol_1;
2409
2417
  var hasRequiredIsSymbol;
2410
2418
  function requireIsSymbol() {
@@ -3975,14 +3983,14 @@ function calculateRealTime(animatingRect, fromRect, toRect, options) {
3975
3983
  return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;
3976
3984
  }
3977
3985
  var plugins = [];
3978
- var defaults$3 = {
3986
+ var defaults$4 = {
3979
3987
  initializeByDefault: true
3980
3988
  };
3981
3989
  var PluginManager = {
3982
3990
  mount: function mount(plugin) {
3983
- for (var option2 in defaults$3) {
3984
- if (defaults$3.hasOwnProperty(option2) && !(option2 in plugin)) {
3985
- plugin[option2] = defaults$3[option2];
3991
+ for (var option2 in defaults$4) {
3992
+ if (defaults$4.hasOwnProperty(option2) && !(option2 in plugin)) {
3993
+ plugin[option2] = defaults$4[option2];
3986
3994
  }
3987
3995
  }
3988
3996
  plugins.forEach(function(p) {
@@ -5782,7 +5790,7 @@ const insertStyle = (srcs) => {
5782
5790
  },
5783
5791
  action: {
5784
5792
  load: () => onLoadStylesheet(styleLink, resolve),
5785
- error: () => reject(new Error(`${(void 0).src} failed to load.`))
5793
+ error: () => reject(new Error(`${src} failed to load.`))
5786
5794
  }
5787
5795
  });
5788
5796
  document.head.appendChild(styleLink);
@@ -5827,9 +5835,9 @@ const fetchDependencies = (dependencies) => {
5827
5835
  return Promise.all(promises);
5828
5836
  };
5829
5837
  const fetchFormeoStyle = async (cssUrl) => {
5830
- if (!loaded.css.has(cssUrl)) {
5838
+ if (cssUrl && !loaded.css.has(cssUrl)) {
5831
5839
  await insertStyle(cssUrl);
5832
- if (!loaded.css.has(FALLBACK_CSS_URL)) {
5840
+ if (!loaded.css.has(cssUrl) && !loaded.css.has(FALLBACK_CSS_URL)) {
5833
5841
  return await insertStyle(FALLBACK_CSS_URL);
5834
5842
  }
5835
5843
  }
@@ -6139,7 +6147,11 @@ class DOM {
6139
6147
  const safeAttrName2 = helpers.safeAttrName(attr);
6140
6148
  const value = this.processAttrValue(attrs[attr]);
6141
6149
  if (value !== false) {
6142
- element.setAttribute(safeAttrName2, value);
6150
+ try {
6151
+ element.setAttribute(safeAttrName2, value);
6152
+ } catch (e2) {
6153
+ console.warn(`Could not set attribute ${safeAttrName2} with value ${value}`, e2);
6154
+ }
6143
6155
  }
6144
6156
  }
6145
6157
  }
@@ -6299,7 +6311,7 @@ class DOM {
6299
6311
  * @return {Boolean} holdsContent
6300
6312
  */
6301
6313
  holdsContent(element) {
6302
- return element.outerHTML.indexOf("/") !== -1;
6314
+ return element.outerHTML.includes("/");
6303
6315
  }
6304
6316
  /**
6305
6317
  * Is this a textarea, select or other block input
@@ -6341,13 +6353,26 @@ class DOM {
6341
6353
  const type = helpers.get(elem, "attrs.type");
6342
6354
  const labelAfter = helpers.get(elem, "config.labelAfter");
6343
6355
  const isCB = type === "checkbox" || type === "radio";
6344
- return labelAfter !== void 0 ? labelAfter : isCB;
6356
+ return labelAfter === void 0 ? isCB : labelAfter;
6345
6357
  }
6346
6358
  requiredMark = () => ({
6347
6359
  tag: "span",
6348
6360
  className: "text-error",
6349
6361
  children: "*"
6350
6362
  });
6363
+ tooltip = (tooltip2) => ({
6364
+ tag: "span",
6365
+ className: "f-tooltip",
6366
+ dataset: {
6367
+ tooltip: tooltip2
6368
+ },
6369
+ content: dom.icon("info-circle")
6370
+ });
6371
+ helpText = (helpText) => ({
6372
+ tag: "small",
6373
+ className: "f-help-text",
6374
+ children: helpText
6375
+ });
6351
6376
  /**
6352
6377
  * Generate a label
6353
6378
  * @param {Object} elem config object
@@ -6357,7 +6382,7 @@ class DOM {
6357
6382
  label(elem, fMap) {
6358
6383
  const required = helpers.get(elem, "attrs.required");
6359
6384
  let {
6360
- config: { label: labelText = "" }
6385
+ config: { label: labelText = "", helpText = "", tooltip: tooltip2 = null }
6361
6386
  } = elem;
6362
6387
  const { id: elemId, attrs } = elem;
6363
6388
  if (typeof labelText === "function") {
@@ -6369,7 +6394,12 @@ class DOM {
6369
6394
  for: elemId || attrs?.id
6370
6395
  },
6371
6396
  className: [],
6372
- children: [labelText, required && this.requiredMark()],
6397
+ children: [
6398
+ labelText,
6399
+ required && this.requiredMark(),
6400
+ tooltip2 && this.tooltip(tooltip2),
6401
+ helpText && this.helpText(helpText)
6402
+ ],
6373
6403
  action: {}
6374
6404
  };
6375
6405
  if (fMap) {
@@ -7083,15 +7113,21 @@ class Autocomplete {
7083
7113
  this.onChange?.({ target: this.hiddenField });
7084
7114
  }
7085
7115
  }
7116
+ const keyToPlaceHolder = (key) => mi18n.get(`${key}.placeholder`) || toTitleCase(trimKeyPrefix(key));
7117
+ const keyToClassName = (key) => key.replaceAll(".", "-");
7118
+ const stringInputTypeMap = /* @__PURE__ */ new Map([
7119
+ ["config.helpText", (...args) => largeTextInputConfigBase(...args)],
7120
+ ["config.tooltip", (...args) => largeTextInputConfigBase(...args)]
7121
+ ]);
7086
7122
  function inputConfigBase({ key, value, type = "text", checked }) {
7087
7123
  const config = {
7088
7124
  tag: "input",
7089
7125
  attrs: {
7090
7126
  type,
7091
7127
  value,
7092
- placeholder: mi18n.get(`${key}.placeholder`) || toTitleCase(key)
7128
+ placeholder: keyToPlaceHolder(key)
7093
7129
  },
7094
- className: [key.replace(/\./g, "-")],
7130
+ className: [keyToClassName(key)],
7095
7131
  config: {}
7096
7132
  };
7097
7133
  if (checked) {
@@ -7099,17 +7135,33 @@ function inputConfigBase({ key, value, type = "text", checked }) {
7099
7135
  }
7100
7136
  return config;
7101
7137
  }
7138
+ function largeTextInputConfigBase({ key, value }) {
7139
+ return {
7140
+ tag: "textarea",
7141
+ attrs: {
7142
+ placeholder: keyToPlaceHolder(key)
7143
+ },
7144
+ className: [keyToClassName(key)],
7145
+ config: {},
7146
+ textContent: value
7147
+ };
7148
+ }
7102
7149
  function labelHelper(key) {
7103
7150
  const labelText = mi18n.get(key);
7104
7151
  if (labelText) {
7105
7152
  return labelText;
7106
7153
  }
7107
- const splitKey = key.split(".");
7108
- return mi18n.get(splitKey[splitKey.length - 1]);
7154
+ const trimmedKey = trimKeyPrefix(key);
7155
+ return mi18n.get(trimmedKey) || toTitleCase(trimmedKey);
7109
7156
  }
7110
7157
  const ITEM_INPUT_TYPE_MAP = {
7111
7158
  autocomplete: (...args) => new Autocomplete(...args).createProxy(),
7112
- string: ({ key, value }) => inputConfigBase({ key, value }),
7159
+ string: ({ key, value }) => {
7160
+ if (stringInputTypeMap.has(key)) {
7161
+ return stringInputTypeMap.get(key)({ key, value });
7162
+ }
7163
+ return inputConfigBase({ key, value });
7164
+ },
7113
7165
  boolean: ({ key, value }) => {
7114
7166
  const type = key === "selected" ? "radio" : "checkbox";
7115
7167
  return inputConfigBase({ key, value, type, checked: !!value });
@@ -7121,7 +7173,7 @@ const ITEM_INPUT_TYPE_MAP = {
7121
7173
  attrs: {
7122
7174
  placeholder: labelHelper(`placeholder.${key}`)
7123
7175
  },
7124
- className: [key.replace(/\./g, "-")],
7176
+ className: [keyToClassName(key)],
7125
7177
  options: value
7126
7178
  };
7127
7179
  },
@@ -7162,6 +7214,265 @@ const INPUT_TYPE_ACTION = {
7162
7214
  }),
7163
7215
  object: () => ({})
7164
7216
  };
7217
+ const defaults$3 = Object.freeze({
7218
+ title: "",
7219
+ content: null,
7220
+ confirmText: () => labelHelper("save"),
7221
+ cancelText: () => labelHelper("cancel"),
7222
+ onConfirm: () => {
7223
+ },
7224
+ onCancel: () => {
7225
+ },
7226
+ className: "",
7227
+ closeOnEscape: true,
7228
+ position: "top",
7229
+ // 'top' | 'center' | 'trigger'
7230
+ triggerElement: null,
7231
+ // Element that triggered the dialog (for position: 'trigger')
7232
+ triggerCoords: null
7233
+ // Or manual coords { x, y } (for position: 'trigger')
7234
+ });
7235
+ class Dialog {
7236
+ /**
7237
+ * Creates a new Dialog instance
7238
+ * @param {Object} options - Dialog configuration options
7239
+ * @param {string} [options.title] - Dialog title
7240
+ * @param {Object|Array} [options.content] - DOM config for dialog body content
7241
+ * @param {Function} [options.onConfirm] - Callback when form is submitted (receives FormData)
7242
+ * @param {Function} [options.onCancel] - Callback when dialog is cancelled
7243
+ * @param {string|Function} [options.confirmText] - Confirm button text
7244
+ * @param {string|Function} [options.cancelText] - Cancel button text
7245
+ * @param {string} [options.className] - Additional CSS class name(s)
7246
+ * @param {boolean} [options.closeOnEscape] - Whether Escape key closes dialog
7247
+ * @param {string} [options.position] - Positioning mode: 'top' (upper center), 'center', or 'trigger' (near trigger element)
7248
+ * @param {HTMLElement} [options.triggerElement] - Element that triggered dialog (for position: 'trigger')
7249
+ * @param {Object} [options.triggerCoords] - Manual coordinates {x, y} (for position: 'trigger')
7250
+ */
7251
+ constructor(options) {
7252
+ this.opts = merge(defaults$3, options);
7253
+ this.dialog = null;
7254
+ }
7255
+ /**
7256
+ * Creates the dialog DOM structure
7257
+ * @returns {HTMLDialogElement} The created dialog element
7258
+ */
7259
+ createDialog() {
7260
+ const { title, content, confirmText, cancelText, className, closeOnEscape, position } = this.opts;
7261
+ const positionClass = `dialog-position-${position}`;
7262
+ const formChildren = [];
7263
+ if (title) {
7264
+ formChildren.push({
7265
+ tag: "h3",
7266
+ className: "dialog-title",
7267
+ textContent: title
7268
+ });
7269
+ }
7270
+ if (content) {
7271
+ formChildren.push({
7272
+ tag: "div",
7273
+ className: "dialog-body",
7274
+ children: Array.isArray(content) ? content : [content]
7275
+ });
7276
+ }
7277
+ formChildren.push({
7278
+ tag: "div",
7279
+ className: "dialog-actions",
7280
+ children: [
7281
+ {
7282
+ tag: "button",
7283
+ type: "button",
7284
+ className: "btn btn-sm btn-secondary",
7285
+ textContent: typeof cancelText === "function" ? cancelText() : cancelText,
7286
+ action: {
7287
+ click: () => this.handleCancel()
7288
+ }
7289
+ },
7290
+ {
7291
+ tag: "button",
7292
+ type: "submit",
7293
+ className: "btn btn-sm btn-primary",
7294
+ textContent: typeof confirmText === "function" ? confirmText() : confirmText
7295
+ }
7296
+ ]
7297
+ });
7298
+ const dialogElement = dom.create({
7299
+ tag: "dialog",
7300
+ className: ["formeo-dialog", "formeo", positionClass, className],
7301
+ children: [
7302
+ {
7303
+ tag: "form",
7304
+ className: "dialog-form",
7305
+ method: "dialog",
7306
+ children: formChildren,
7307
+ action: {
7308
+ submit: (e2) => this.handleSubmit(e2)
7309
+ }
7310
+ }
7311
+ ],
7312
+ action: {
7313
+ cancel: (e2) => {
7314
+ if (closeOnEscape) {
7315
+ this.handleCancel();
7316
+ } else {
7317
+ e2.preventDefault();
7318
+ }
7319
+ }
7320
+ }
7321
+ });
7322
+ return dialogElement;
7323
+ }
7324
+ /**
7325
+ * Handles form submission
7326
+ * @param {Event} e - Submit event
7327
+ */
7328
+ handleSubmit(e2) {
7329
+ e2.preventDefault();
7330
+ const formData = new FormData(e2.target);
7331
+ this.opts.onConfirm(formData, this);
7332
+ this.close();
7333
+ }
7334
+ /**
7335
+ * Handles dialog cancellation
7336
+ */
7337
+ handleCancel() {
7338
+ this.opts.onCancel(this);
7339
+ this.close();
7340
+ }
7341
+ /**
7342
+ * Sets dialog position based on trigger element or coordinates
7343
+ */
7344
+ setPosition() {
7345
+ const { position, triggerElement, triggerCoords } = this.opts;
7346
+ if (position !== "trigger" || !this.dialog) return;
7347
+ let coords = triggerCoords;
7348
+ if (!coords && triggerElement) {
7349
+ const rect = triggerElement.getBoundingClientRect();
7350
+ coords = {
7351
+ x: rect.left + rect.width / 2,
7352
+ y: rect.bottom + 8
7353
+ // 8px gap below trigger
7354
+ };
7355
+ }
7356
+ if (coords) {
7357
+ const dialogRect = this.dialog.getBoundingClientRect();
7358
+ const viewportWidth = window.innerWidth;
7359
+ const viewportHeight = window.innerHeight;
7360
+ let left = coords.x - dialogRect.width / 2;
7361
+ let top = coords.y;
7362
+ const padding = 16;
7363
+ left = Math.max(padding, Math.min(left, viewportWidth - dialogRect.width - padding));
7364
+ top = Math.max(padding, Math.min(top, viewportHeight - dialogRect.height - padding));
7365
+ this.dialog.style.left = `${left}px`;
7366
+ this.dialog.style.top = `${top}px`;
7367
+ this.dialog.style.transform = "none";
7368
+ }
7369
+ }
7370
+ /**
7371
+ * Opens the dialog
7372
+ * @returns {Dialog} This dialog instance for chaining
7373
+ */
7374
+ open() {
7375
+ if (!this.dialog) {
7376
+ this.dialog = this.createDialog();
7377
+ }
7378
+ document.body.appendChild(this.dialog);
7379
+ this.dialog.showModal();
7380
+ if (this.opts.position === "trigger") {
7381
+ const setTimeoutId = setTimeout(() => {
7382
+ this.setPosition();
7383
+ clearTimeout(setTimeoutId);
7384
+ }, 0);
7385
+ }
7386
+ return this;
7387
+ }
7388
+ /**
7389
+ * Closes and removes the dialog
7390
+ */
7391
+ close() {
7392
+ if (this.dialog) {
7393
+ this.dialog.close();
7394
+ this.dialog.remove();
7395
+ this.dialog = null;
7396
+ }
7397
+ }
7398
+ /**
7399
+ * Static shorthand for simple alert dialog
7400
+ * @param {string} message - Alert message
7401
+ * @param {Function} [onConfirm] - Optional callback when confirmed
7402
+ * @returns {Dialog} Dialog instance
7403
+ */
7404
+ static alert(message, onConfirm = () => {
7405
+ }) {
7406
+ return new Dialog({
7407
+ content: {
7408
+ tag: "p",
7409
+ className: "dialog-message",
7410
+ textContent: message
7411
+ },
7412
+ confirmText: () => mi18n.get("ok") || "OK",
7413
+ cancelText: "",
7414
+ // Hide cancel button by returning empty string
7415
+ onConfirm: () => onConfirm()
7416
+ });
7417
+ }
7418
+ /**
7419
+ * Static shorthand for confirmation dialog
7420
+ * @param {string} message - Confirmation question
7421
+ * @param {Function} [onConfirm] - Callback when confirmed
7422
+ * @param {Function} [onCancel] - Callback when cancelled
7423
+ * @returns {Dialog} Dialog instance
7424
+ */
7425
+ static confirm(message, onConfirm = () => {
7426
+ }, onCancel = () => {
7427
+ }) {
7428
+ return new Dialog({
7429
+ content: {
7430
+ tag: "p",
7431
+ className: "dialog-message",
7432
+ textContent: message
7433
+ },
7434
+ confirmText: () => mi18n.get("confirm") || "Confirm",
7435
+ onConfirm: () => onConfirm(),
7436
+ onCancel: () => onCancel()
7437
+ });
7438
+ }
7439
+ /**
7440
+ * Static shorthand for prompt dialog
7441
+ * @param {string} message - Prompt message
7442
+ * @param {Function} onSubmit - Callback with user input value
7443
+ * @param {string} [defaultValue] - Default input value
7444
+ * @returns {Dialog} Dialog instance
7445
+ */
7446
+ static prompt(message, onSubmit = () => {
7447
+ }, defaultValue = "") {
7448
+ return new Dialog({
7449
+ content: [
7450
+ {
7451
+ tag: "label",
7452
+ className: "dialog-prompt-label",
7453
+ children: [
7454
+ {
7455
+ tag: "p",
7456
+ className: "dialog-message",
7457
+ textContent: message
7458
+ },
7459
+ {
7460
+ tag: "input",
7461
+ type: "text",
7462
+ name: "prompt-value",
7463
+ className: "dialog-prompt-input",
7464
+ value: defaultValue
7465
+ }
7466
+ ]
7467
+ }
7468
+ ],
7469
+ onConfirm: (formData) => {
7470
+ const value = formData.get("prompt-value");
7471
+ onSubmit(value);
7472
+ }
7473
+ });
7474
+ }
7475
+ }
7165
7476
  const hiddenPropertyClassname = "hidden-property";
7166
7477
  const hiddenOptionClassname = "hidden-option";
7167
7478
  const optionsAddressRegex = /\.options\[\d+\]$/;
@@ -7549,7 +7860,7 @@ class EditPanelItem {
7549
7860
  const conditionTypeWrap = this.conditionTypeWrap.get(conditionType);
7550
7861
  const conditionField = conditionTypeWrap.children[index2];
7551
7862
  conditionField.destroy();
7552
- conditionTypeWrap.removeChild(conditionField.dom);
7863
+ conditionField.dom.remove();
7553
7864
  };
7554
7865
  generateConditionFields = (conditionType, conditionVals) => {
7555
7866
  this.conditions = /* @__PURE__ */ new Map();
@@ -7600,24 +7911,52 @@ class EditPanelItem {
7600
7911
  };
7601
7912
  return controls;
7602
7913
  }
7914
+ /**
7915
+ * Get config-provided options for an attribute
7916
+ * @param {String} attrKey - The attribute key (e.g., 'attrs.type')
7917
+ * @returns {Array|null} Array of options if config provides them, null otherwise
7918
+ */
7919
+ getConfigAttrOptions(attrKey) {
7920
+ const attrName = attrKey.split(".").pop();
7921
+ const configValue = this.field.config?.attrs?.[attrName];
7922
+ if (Array.isArray(configValue)) {
7923
+ return configValue;
7924
+ }
7925
+ return null;
7926
+ }
7603
7927
  itemInput(key, value) {
7604
- const valType = dom.childType(value) || "string";
7928
+ if (this.isDisabled) {
7929
+ return null;
7930
+ }
7931
+ let valType = dom.childType(value) || "string";
7932
+ let effectiveValue = value;
7933
+ if (this.panelName === "attrs") {
7934
+ const configAttrOptions = this.getConfigAttrOptions(key);
7935
+ if (configAttrOptions) {
7936
+ effectiveValue = configAttrOptions.map((opt) => ({
7937
+ ...opt,
7938
+ selected: opt.value === value
7939
+ }));
7940
+ valType = "array";
7941
+ }
7942
+ }
7605
7943
  const dataKey = panelDataKeyMap.get(this.panelName)?.({ itemKey: this.itemKey, key }) || this.itemKey;
7606
7944
  const labelKey = dataKey.split(".").filter(Number.isNaN).join(".") || key;
7607
- const baseConfig = ITEM_INPUT_TYPE_MAP[valType]({ key, value });
7608
- const name2 = `${this.field.shortId}-${slugifyAddress(dataKey).replace(/-\d+-(selected)/g, "-$1")}`;
7945
+ const baseConfig = ITEM_INPUT_TYPE_MAP[valType]({ key, value: effectiveValue });
7946
+ const name2 = `${this.field.shortId}-${slugifyAddress(dataKey).replaceAll(/-\d+-(selected)/g, "-$1")}`;
7609
7947
  const config = {
7610
- label: this.panelName !== "options" && (labelHelper(labelKey) || toTitleCase(labelKey)),
7611
- labelAfter: false
7948
+ label: this.panelName !== "options" && labelHelper(labelKey),
7949
+ labelAfter: false,
7950
+ inputWrap: ["f-input-wrap", this.isLocked && "locked-prop", this.isDisabled && "disabled-prop"].filter(Boolean).join(" ")
7612
7951
  };
7613
7952
  const attrs = {
7614
7953
  name: baseConfig.attrs.type === "checkbox" ? `${name2}[]` : name2
7615
7954
  };
7616
7955
  attrs.disabled = this.isDisabled;
7617
- attrs.locked = this.isLocked;
7956
+ attrs.readonly = this.isLocked;
7618
7957
  const itemInputAction = itemInputActions.get(this.itemSlug)?.(this);
7619
7958
  const action = mergeActions(INPUT_TYPE_ACTION[valType](dataKey, this.field), itemInputAction || {});
7620
- const inputConfig = merge(ITEM_INPUT_TYPE_MAP[valType]({ key, value }), { action, attrs, config });
7959
+ const inputConfig = merge(ITEM_INPUT_TYPE_MAP[valType]({ key, value: effectiveValue }), { action, attrs, config });
7621
7960
  if (CHECKED_TYPES.includes(key)) {
7622
7961
  return {
7623
7962
  className: "f-addon",
@@ -7632,6 +7971,22 @@ const addAttributeActions = {
7632
7971
  toggleOptionMultiSelect(!!val, field2);
7633
7972
  }
7634
7973
  };
7974
+ const defaultConfigOptions = [
7975
+ { label: labelHelper("config.label"), value: "label" },
7976
+ { label: labelHelper("config.hideLabel"), value: "hideLabel" },
7977
+ { label: labelHelper("config.helpText"), value: "helpText" },
7978
+ { label: labelHelper("config.labelAfter"), value: "labelAfter" },
7979
+ { label: labelHelper("config.disableHtmlLabel"), value: "disableHtmlLabel" },
7980
+ { label: labelHelper("config.tooltip"), value: "tooltip" }
7981
+ ];
7982
+ const defaultConfigValues = {
7983
+ label: "New Field",
7984
+ hideLabel: false,
7985
+ helpText: "",
7986
+ labelAfter: false,
7987
+ disableHtmlLabel: false,
7988
+ tooltip: ""
7989
+ };
7635
7990
  class EditPanel {
7636
7991
  /**
7637
7992
  * Set defaults and load panelData
@@ -7672,16 +8027,23 @@ class EditPanel {
7672
8027
  createProps(data = this.data) {
7673
8028
  this.editPanelItems = Array.from(data).map((dataVal, index2) => {
7674
8029
  const isArray = this.type === "array";
8030
+ const keyBase = dataVal[0];
7675
8031
  const key = isArray ? `[${index2}]` : `.${dataVal[0]}`;
7676
8032
  const val = isArray ? dataVal : { [dataVal[0]]: dataVal[1] };
8033
+ const itemKey = `${this.name}${key}`;
8034
+ const isDisabledProp = this.component.isDisabledProp(itemKey, this.name);
8035
+ const isEditableProp = FILTERED_PANEL_DATA_KEYS.get(this.name)?.has(keyBase) ?? true;
8036
+ if (isDisabledProp || !isEditableProp) {
8037
+ return null;
8038
+ }
7677
8039
  return new EditPanelItem({
7678
- key: `${this.name}${key}`,
8040
+ key: itemKey,
7679
8041
  data: val,
7680
8042
  field: this.component,
7681
8043
  index: index2,
7682
8044
  panel: this
7683
8045
  });
7684
- });
8046
+ }).filter(Boolean);
7685
8047
  const editGroupConfig = {
7686
8048
  tag: "ul",
7687
8049
  attrs: {
@@ -7704,11 +8066,11 @@ class EditPanel {
7704
8066
  */
7705
8067
  createEditButtons() {
7706
8068
  const type = this.name;
7707
- const btnTitle = mi18n.get(`panelEditButtons.${type}`);
7708
8069
  const addActions = {
7709
8070
  attrs: this.addAttribute,
7710
8071
  options: this.addOption,
7711
- conditions: this.addCondition
8072
+ conditions: this.addCondition,
8073
+ config: this.addConfiguration
7712
8074
  };
7713
8075
  const editPanelButtons = [];
7714
8076
  if (type === "conditions") {
@@ -7729,8 +8091,9 @@ class EditPanel {
7729
8091
  };
7730
8092
  editPanelButtons.push(clearAllBtn);
7731
8093
  }
8094
+ const addBtnTitle = mi18n.get(`panelEditButtons.${type}`) || `+ Add ${toTitleCase(type)}`;
7732
8095
  const addBtn = {
7733
- ...dom.btnTemplate({ content: btnTitle, title: btnTitle }),
8096
+ ...dom.btnTemplate({ content: addBtnTitle, title: addBtnTitle }),
7734
8097
  className: `add-${type}`,
7735
8098
  action: {
7736
8099
  click: (evt) => {
@@ -7747,7 +8110,7 @@ class EditPanel {
7747
8110
  };
7748
8111
  }
7749
8112
  const eventType = toTitleCase(type);
7750
- const customEvt = new window.CustomEvent(`onAdd${eventType}`, {
8113
+ const customEvt = new globalThis.CustomEvent(`onAdd${eventType}`, {
7751
8114
  detail: addEvt
7752
8115
  });
7753
8116
  actions.add[type](addEvt);
@@ -7828,6 +8191,37 @@ class EditPanel {
7828
8191
  this.component.set(itemKey, evt.template);
7829
8192
  this.component.resizePanelWrap();
7830
8193
  };
8194
+ addConfiguration = () => {
8195
+ const configData = this.component.get("config");
8196
+ const dialog = new Dialog({
8197
+ className: "config-item-dialog",
8198
+ content: [
8199
+ {
8200
+ tag: "select",
8201
+ config: { label: mi18n.get("selectConfigKey") || "Select Configuration Key" },
8202
+ attrs: { name: "selectConfigKey", required: true, className: "config-key-select" },
8203
+ options: defaultConfigOptions.filter((opt) => !(opt.value in configData))
8204
+ }
8205
+ ],
8206
+ onConfirm: (formData) => {
8207
+ const configKey = formData.get("selectConfigKey").trim();
8208
+ const itemKey = `config.${configKey}`;
8209
+ if (configKey) {
8210
+ const newConfig = new EditPanelItem({
8211
+ key: itemKey,
8212
+ data: defaultConfigValues[configKey],
8213
+ field: this.component,
8214
+ panel: this
8215
+ });
8216
+ this.editPanelItems.push(newConfig);
8217
+ this.props.appendChild(newConfig.dom);
8218
+ this.component.debouncedUpdatePreview();
8219
+ this.component.resizePanelWrap();
8220
+ }
8221
+ }
8222
+ });
8223
+ dialog.open();
8224
+ };
7831
8225
  /**
7832
8226
  * Clears all items from the component property based on its type.
7833
8227
  * Sets the property to an empty array for 'array' type or empty object for other types.
@@ -7848,7 +8242,7 @@ class EditPanel {
7848
8242
  };
7849
8243
  actions.remove[this.name](removeEvt);
7850
8244
  const eventType = toTitleCase(this.name);
7851
- const customEvt = new window.CustomEvent(`onRemove${eventType}`, {
8245
+ const customEvt = new globalThis.CustomEvent(`onRemove${eventType}`, {
7852
8246
  detail: removeEvt
7853
8247
  });
7854
8248
  document.dispatchEvent(customEvt);
@@ -8003,10 +8397,6 @@ class Panels {
8003
8397
  title: mi18n.get("controlGroups.nextGroup"),
8004
8398
  type: "button"
8005
8399
  },
8006
- dataset: {
8007
- toggle: "tooltip",
8008
- placement: "top"
8009
- },
8010
8400
  action: {
8011
8401
  click: (e2) => this.nav.nextGroup(e2)
8012
8402
  },
@@ -8019,10 +8409,6 @@ class Panels {
8019
8409
  title: mi18n.get("controlGroups.prevGroup"),
8020
8410
  type: "button"
8021
8411
  },
8022
- dataset: {
8023
- toggle: "tooltip",
8024
- placement: "top"
8025
- },
8026
8412
  action: {
8027
8413
  click: (e2) => this.nav.prevGroup(e2)
8028
8414
  },
@@ -8153,8 +8539,7 @@ class Component extends Data {
8153
8539
  this.shortId = this.id.slice(0, this.id.indexOf("-"));
8154
8540
  this.name = name2;
8155
8541
  this.indexName = `${name2}s`;
8156
- this.config = components[`${this.name}s`].config;
8157
- merge(this.config, data.config);
8542
+ this.config = { ...data.config, ...components[`${this.name}s`].config };
8158
8543
  this.address = `${this.name}s.${this.id}`;
8159
8544
  this.dataPath = `${this.address}.`;
8160
8545
  this.editPanels = /* @__PURE__ */ new Map();
@@ -8284,7 +8669,7 @@ class Component extends Data {
8284
8669
  // copy array since children will be modified
8285
8670
  });
8286
8671
  forEach(children, (child) => child.remove());
8287
- this.dom.parentElement.removeChild(this.dom);
8672
+ this.dom.remove();
8288
8673
  remove(components.getAddress(`${parent.name}s.${parent.id}.children`), this.id);
8289
8674
  if (!parent.children.length) {
8290
8675
  parent.emptyClass();
@@ -8855,12 +9240,18 @@ class Component extends Data {
8855
9240
  * @return {Boolean}
8856
9241
  */
8857
9242
  isDisabledProp = (propName, kind = "attrs") => {
8858
- const propKind = this.config.panels[kind];
8859
- if (!propKind) {
9243
+ if (get(this.config, propName)) {
8860
9244
  return false;
8861
9245
  }
8862
- const disabledAttrs = propKind.disabled.concat(this.get("config.disabled"));
8863
- return disabledAttrs.includes(propName);
9246
+ const disabledConfigProps = this.config?.disabled || [];
9247
+ const isDisabledConfigProp = disabledConfigProps.includes(propName);
9248
+ if (isDisabledConfigProp) {
9249
+ return true;
9250
+ }
9251
+ const basePropName = trimKeyPrefix(propName);
9252
+ const disabledPanelProps = this.config?.panels[kind]?.disabled || [];
9253
+ const isDisabledPanelProp = disabledPanelProps.includes(basePropName);
9254
+ return isDisabledPanelProp;
8864
9255
  };
8865
9256
  /**
8866
9257
  * Checks if property can be removed
@@ -8868,12 +9259,18 @@ class Component extends Data {
8868
9259
  * @return {Boolean}
8869
9260
  */
8870
9261
  isLockedProp = (propName, kind = "attrs") => {
8871
- const propKind = this.config.panels[kind];
8872
- if (!propKind) {
8873
- return false;
9262
+ const lockedConfigProps = this.config?.locked || [];
9263
+ const isLockedConfigProp = lockedConfigProps.includes(propName);
9264
+ if (isLockedConfigProp) {
9265
+ return true;
8874
9266
  }
8875
- const lockedAttrs = propKind.locked.concat(this.get("config.locked"));
8876
- return lockedAttrs.includes(propName);
9267
+ const basePropName = trimKeyPrefix(propName);
9268
+ const lockedPanelProps = this.config?.panels[kind]?.locked || [];
9269
+ const isLockedPanelProp = lockedPanelProps.includes(basePropName);
9270
+ if (isLockedPanelProp) {
9271
+ return true;
9272
+ }
9273
+ return false;
8877
9274
  };
8878
9275
  /**
8879
9276
  * Generate the markup for field edit mode
@@ -8909,14 +9306,14 @@ class Component extends Data {
8909
9306
  if (!this.config) {
8910
9307
  return null;
8911
9308
  }
8912
- const editable = ["object", "array"];
9309
+ const editable = /* @__PURE__ */ new Set(["object", "array"]);
8913
9310
  const panelOrder = unique([...this.config.panels.order, ...Object.keys(this.data)]);
8914
- const noPanels = ["children", "config", "meta", "action", "events", ...this.config.panels.disabled];
8915
- const allowedPanels = panelOrder.filter((panelName) => !noPanels.includes(panelName));
9311
+ const noPanels = /* @__PURE__ */ new Set(["children", "meta", "action", "events", ...this.config.panels.disabled]);
9312
+ const allowedPanels = panelOrder.filter((panelName) => !noPanels.has(panelName));
8916
9313
  for (const panelName of allowedPanels) {
8917
9314
  const panelData = this.get(panelName);
8918
9315
  const propType = dom.childType(panelData);
8919
- if (editable.includes(propType)) {
9316
+ if (editable.has(propType)) {
8920
9317
  const editPanel = new EditPanel(panelData, panelName, this);
8921
9318
  this.editPanels.set(editPanel.name, editPanel);
8922
9319
  }
@@ -9098,7 +9495,7 @@ class ResizeColumn {
9098
9495
  return value;
9099
9496
  }
9100
9497
  }
9101
- const DEFAULT_DATA$3 = () => Object.freeze({
9498
+ const DEFAULT_DATA$2 = () => Object.freeze({
9102
9499
  config: {
9103
9500
  width: "100%"
9104
9501
  },
@@ -9124,7 +9521,7 @@ class Column extends Component {
9124
9521
  * @return {Object} Column config object
9125
9522
  */
9126
9523
  constructor(columnData) {
9127
- super("column", { ...DEFAULT_DATA$3(), ...columnData });
9524
+ super("column", { ...DEFAULT_DATA$2(), ...columnData });
9128
9525
  const childWrap = this.createChildWrap();
9129
9526
  this.dom = dom.create({
9130
9527
  tag: "li",
@@ -9223,7 +9620,7 @@ let Columns$1 = class Columns extends ComponentData {
9223
9620
  }
9224
9621
  };
9225
9622
  const columns = new Columns$1();
9226
- const DEFAULT_DATA$2 = () => Object.freeze({
9623
+ const DEFAULT_DATA$1 = () => Object.freeze({
9227
9624
  config: {
9228
9625
  fieldset: false,
9229
9626
  // wrap contents of row in fieldset
@@ -9242,7 +9639,7 @@ class Row extends Component {
9242
9639
  * @return {Object}
9243
9640
  */
9244
9641
  constructor(rowData) {
9245
- super("row", { ...DEFAULT_DATA$2(), ...rowData });
9642
+ super("row", { ...DEFAULT_DATA$1(), ...rowData });
9246
9643
  const children = this.createChildWrap();
9247
9644
  this.dom = dom.create({
9248
9645
  tag: "li",
@@ -9505,7 +9902,7 @@ let Rows$1 = class Rows extends ComponentData {
9505
9902
  }
9506
9903
  };
9507
9904
  const rows = new Rows$1();
9508
- const DEFAULT_DATA$1 = () => ({ conditions: [CONDITION_TEMPLATE()], children: [] });
9905
+ const DEFAULT_DATA = () => ({ conditions: [CONDITION_TEMPLATE()], children: [] });
9509
9906
  class Stage extends Component {
9510
9907
  /**
9511
9908
  * Process options and load existing fields from data to the stage
@@ -9514,7 +9911,7 @@ class Stage extends Component {
9514
9911
  * @return {Object} DOM element
9515
9912
  */
9516
9913
  constructor(stageData) {
9517
- super("stage", { ...DEFAULT_DATA$1(), ...stageData });
9914
+ super("stage", { ...DEFAULT_DATA(), ...stageData });
9518
9915
  this.updateEditPanels();
9519
9916
  this.debouncedUpdateEditPanels = debounce(this.updateEditPanels);
9520
9917
  ({
@@ -9697,9 +10094,9 @@ class Control {
9697
10094
  * @return {String} the translated label
9698
10095
  */
9699
10096
  i18n(lookup, args) {
9700
- const locale2 = mi18n.locale;
10097
+ const locale = mi18n.locale;
9701
10098
  const controlTranslations = this.definition?.i18n;
9702
- const localeTranslations = controlTranslations?.[locale2] || {};
10099
+ const localeTranslations = controlTranslations?.[locale] || {};
9703
10100
  return (localeTranslations[lookup]?.() ?? localeTranslations[lookup]) || mi18n.get(lookup, args);
9704
10101
  }
9705
10102
  }
@@ -10049,9 +10446,6 @@ const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10049
10446
  Controls: Controls$1,
10050
10447
  default: Controls$2
10051
10448
  }, Symbol.toStringTag, { value: "Module" }));
10052
- const DEFAULT_DATA = () => ({
10053
- // conditions: [CONDITION_TEMPLATE()],
10054
- });
10055
10449
  const checkableTypes = /* @__PURE__ */ new Set(["checkbox", "radio"]);
10056
10450
  const isSelectableType = /* @__PURE__ */ new Set(["radio", "checkbox", "select-one", "select-multiple"]);
10057
10451
  class Field extends Component {
@@ -10061,7 +10455,7 @@ class Field extends Component {
10061
10455
  * @return {Object} field object
10062
10456
  */
10063
10457
  constructor(fieldData = /* @__PURE__ */ Object.create(null)) {
10064
- super("field", { ...DEFAULT_DATA(), ...fieldData });
10458
+ super("field", fieldData);
10065
10459
  this.debouncedUpdateEditPanels = debounce(this.updateEditPanels);
10066
10460
  this.debouncedUpdatePreview = debounce(this.updatePreview);
10067
10461
  this.label = dom.create(this.labelConfig);
@@ -10097,34 +10491,41 @@ class Field extends Component {
10097
10491
  if (hideLabel) {
10098
10492
  return null;
10099
10493
  }
10100
- const labelVal = this.get("config.editorLabel") || this.get("config.label");
10101
- const required = this.get("attrs.required");
10102
- const disableHTML = this.config.label.disableHTML;
10103
- const labelConfig = () => {
10104
- const config = {
10105
- tag: "label",
10106
- attrs: {}
10107
- };
10108
- if (disableHTML) {
10109
- config.tag = "input";
10110
- config.attrs.value = labelVal;
10111
- return config;
10112
- }
10113
- config.attrs.contenteditable = true;
10114
- config.children = labelVal;
10115
- return config;
10494
+ const { label, editorLabel, disableHtmlLabel, helpText, tooltip: tooltip2 } = this.get("config");
10495
+ const { required: isRequired } = this.get("attrs") || {};
10496
+ const labelVal = editorLabel || label;
10497
+ const labelBase = {
10498
+ tag: "label",
10499
+ attrs: {}
10116
10500
  };
10117
- const label = {
10118
- ...labelConfig(),
10501
+ if (disableHtmlLabel) {
10502
+ labelBase.tag = "input";
10503
+ labelBase.attrs.value = labelVal;
10504
+ } else {
10505
+ labelBase.attrs.contenteditable = true;
10506
+ labelBase.children = labelVal;
10507
+ }
10508
+ const labelObj = {
10509
+ ...labelBase,
10119
10510
  action: {
10120
- input: ({ target: { innerHTML, innerText } }) => {
10121
- super.set("config.label", disableHTML ? innerText : innerHTML);
10511
+ input: ({ target: { innerHTML, value } }) => {
10512
+ const labelVal2 = disableHtmlLabel ? value : innerHTML;
10513
+ super.set("config.label", labelVal2);
10514
+ const configPanelLabelInput = this.dom.querySelector(".config-label");
10515
+ if (configPanelLabelInput) {
10516
+ configPanelLabelInput.value = labelVal2;
10517
+ }
10122
10518
  }
10123
10519
  }
10124
10520
  };
10125
10521
  const labelWrap = {
10126
10522
  className: "prev-label",
10127
- children: [label, required && dom.requiredMark()]
10523
+ children: [
10524
+ labelObj,
10525
+ isRequired && dom.requiredMark(),
10526
+ tooltip2 && dom.tooltip(tooltip2),
10527
+ helpText && dom.helpText(helpText)
10528
+ ]
10128
10529
  };
10129
10530
  return labelWrap;
10130
10531
  }
@@ -10136,18 +10537,23 @@ class Field extends Component {
10136
10537
  */
10137
10538
  set(path, value) {
10138
10539
  const data = this.setData(path, value);
10139
- this.debouncedUpdatePreview();
10140
10540
  return data;
10141
10541
  }
10142
10542
  /**
10143
10543
  * Update the label dom when label data changes
10144
10544
  */
10145
10545
  updateLabel() {
10146
- if (!this.label) {
10147
- return null;
10148
- }
10149
10546
  const newLabel = dom.create(this.labelConfig);
10150
- this.label.replaceWith(newLabel);
10547
+ if (this.label || !newLabel) {
10548
+ this.label.remove();
10549
+ }
10550
+ if (newLabel) {
10551
+ if (this.data.config?.labelAfter) {
10552
+ this.dom.append(newLabel);
10553
+ } else {
10554
+ this.dom.prepend(newLabel);
10555
+ }
10556
+ }
10151
10557
  this.label = newLabel;
10152
10558
  }
10153
10559
  /**
@@ -10168,7 +10574,7 @@ class Field extends Component {
10168
10574
  if (isSelectableType.has(type)) {
10169
10575
  const selectedOptions = this.preview.querySelectorAll(":checked");
10170
10576
  const optionsData = this.get("options");
10171
- const checkedType = optionsData?.[0]?.selected !== void 0 ? "selected" : "checked";
10577
+ const checkedType = optionsData?.[0]?.selected === void 0 ? "checked" : "selected";
10172
10578
  const optionsDataMap = optionsData.reduce((acc, option2) => {
10173
10579
  acc[option2.value] = option2;
10174
10580
  acc[option2.value][checkedType] = false;
@@ -10310,11 +10716,25 @@ const Columns2 = columns;
10310
10716
  const Fields2 = fields;
10311
10717
  const Controls2 = Controls$2;
10312
10718
  const getFormData = (formData, useSessionStorage = false) => {
10313
- if (formData) {
10314
- return clone$1(parseData(formData));
10719
+ if (formData !== void 0 && formData !== null) {
10720
+ const parsed = parseData(formData);
10721
+ if (parsed && typeof parsed === "object") {
10722
+ const cloned = clone$1(parsed);
10723
+ return {
10724
+ id: cloned.id || DEFAULT_FORMDATA().id,
10725
+ stages: cloned.stages || DEFAULT_FORMDATA().stages,
10726
+ rows: cloned.rows || {},
10727
+ columns: cloned.columns || {},
10728
+ fields: cloned.fields || {}
10729
+ };
10730
+ }
10731
+ console.warn("Formeo: Invalid formData provided, using default");
10315
10732
  }
10316
10733
  if (useSessionStorage) {
10317
- return sessionStorage.get(SESSION_FORMDATA_KEY) || DEFAULT_FORMDATA();
10734
+ const sessionData = sessionStorage.get(SESSION_FORMDATA_KEY);
10735
+ if (sessionData) {
10736
+ return sessionData;
10737
+ }
10318
10738
  }
10319
10739
  return DEFAULT_FORMDATA();
10320
10740
  };
@@ -10419,6 +10839,7 @@ const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10419
10839
  Columns: Columns2,
10420
10840
  Components,
10421
10841
  Controls: Controls2,
10842
+ Dialog,
10422
10843
  Fields: Fields2,
10423
10844
  Rows: Rows2,
10424
10845
  Stages: Stages2,
@@ -10450,19 +10871,19 @@ const defaults$1 = {
10450
10871
  onSave: (_evt) => {
10451
10872
  },
10452
10873
  confirmClearAll: (evt) => {
10453
- if (window.confirm(evt.confirmationMessage)) {
10874
+ if (globalThis.confirm(evt.confirmationMessage)) {
10454
10875
  evt.clearAllAction(evt);
10455
10876
  }
10456
10877
  }
10457
10878
  };
10458
10879
  const defaultCustomEvent = ({ src, ...evtData }, type = EVENT_FORMEO_UPDATED) => {
10459
- const evt = new window.CustomEvent(type, {
10880
+ const evt = new globalThis.CustomEvent(type, {
10460
10881
  detail: evtData,
10461
10882
  bubbles: events.opts?.debug || events.opts?.bubbles
10462
10883
  });
10463
10884
  evt.data = (src || document).dispatchEvent(evt);
10464
10885
  if (type === EVENT_FORMEO_UPDATED) {
10465
- const changedEvt = new window.CustomEvent(EVENT_FORMEO_CHANGED, {
10886
+ const changedEvt = new globalThis.CustomEvent(EVENT_FORMEO_CHANGED, {
10466
10887
  detail: evtData,
10467
10888
  bubbles: events.opts?.debug || events.opts?.bubbles
10468
10889
  });
@@ -10489,7 +10910,7 @@ const events = {
10489
10910
  };
10490
10911
  const formeoUpdatedThrottled = throttle$1(() => {
10491
10912
  const eventData = {
10492
- timeStamp: window.performance.now(),
10913
+ timeStamp: globalThis.performance.now(),
10493
10914
  type: EVENT_FORMEO_UPDATED,
10494
10915
  detail: components.formData
10495
10916
  };
@@ -10598,14 +11019,14 @@ window.addEventListener("resize", onResizeWindow);
10598
11019
  const defaultActions = {
10599
11020
  add: {
10600
11021
  attr: (evt) => {
10601
- const attr = window.prompt(evt.message.attr);
11022
+ const attr = globalThis.prompt(evt.message.attr);
10602
11023
  if (attr && evt.isDisabled(attr)) {
10603
- window.alert(mi18n.get("attributeNotPermitted", attr || ""));
11024
+ globalThis.alert(mi18n.get("attributeNotPermitted", attr));
10604
11025
  return actions.add.attrs(evt);
10605
11026
  }
10606
11027
  let val;
10607
11028
  if (attr) {
10608
- val = String(window.prompt(evt.message.value, ""));
11029
+ val = String(globalThis.prompt(evt.message.value, ""));
10609
11030
  evt.addAction(attr, val);
10610
11031
  }
10611
11032
  },
@@ -10614,6 +11035,9 @@ const defaultActions = {
10614
11035
  },
10615
11036
  condition: (evt) => {
10616
11037
  evt.addAction(evt);
11038
+ },
11039
+ config: (evt) => {
11040
+ evt.addAction(evt);
10617
11041
  }
10618
11042
  },
10619
11043
  remove: {
@@ -10655,6 +11079,9 @@ const actions = {
10655
11079
  conditions: (evt) => {
10656
11080
  evt.template = evt.template || CONDITION_TEMPLATE();
10657
11081
  return actions.opts.add.condition(evt);
11082
+ },
11083
+ config: (evt) => {
11084
+ return actions.opts.add.config(evt);
10658
11085
  }
10659
11086
  },
10660
11087
  remove: {
@@ -10683,10 +11110,6 @@ const actions = {
10683
11110
  }
10684
11111
  }
10685
11112
  };
10686
- const e = { "en-US": { "en-US": "English", dir: "ltr", "af-ZA": "Afrikaans (South Africa)", "ar-TN": "Arabic (Tunisia)", "cs-CZ": "Czech (Czechia)", "de-DE": "German (Germany)", "es-ES": "European Spanish", "fa-IR": "Persian (Iran)", "fi-FI": "Finnish (Finland)", "fr-FR": "French (France)", "hu-HU": "Hungarian (Hungary)", "it-IT": "Italian (Italy)", "ja-JP": "Japanese (Japan)", "nb-NO": "Norwegian Bokmål (Norway)", "pl-PL": "Polish (Poland)", "pt-BR": "Brazilian Portuguese", "pt-PT": "European Portuguese", "ro-RO": "Romanian (Romania)", "ru-RU": "Russian (Russia)", "th-TH": "Thai (Thailand)", "tr-TR": "Turkish (Türkiye)", "zh-CN": "Chinese (China)", "zh-HK": "Chinese (Hong Kong SAR China)", "action.add.attrs.attr": "What attribute would you like to add?", "action.add.attrs.value": "Default Value", addOption: "Add Option", allFieldsRemoved: "All fields were removed.", allowSelect: "Allow Select", and: "and", attribute: "Attribute", attributeNotPermitted: 'Attribute "{attribute}" is not permitted, please choose another.', attributes: "Attributes", "attrs.class": "Class", "attrs.className": "Class", "attrs.dir": "Direction", "attrs.id": "Id", "attrs.required": "Required", "attrs.style": "Style", "attrs.title": "Title", "attrs.type": "Type", "attrs.value": "Value", autocomplete: "Autocomplete", button: "Button", cannotBeEmpty: "This field cannot be empty", cannotClearFields: "There are no fields to clear", checkbox: "Checkbox", checkboxes: "Checkboxes", class: "Class", clear: "Clear", clearAllMessage: "Are you sure you want to clear all fields?", close: "Close", column: "Column", "condition.target.placeholder": "target", "condition.type.and": "And", "condition.type.if": "If", "condition.type.or": "Or", "condition.type.then": "Then", "condition.value.placeholder": "value", confirmClearAll: "Are you sure you want to remove all fields?", content: "Content", control: "Control", "controlGroups.nextGroup": "Next Group", "controlGroups.prevGroup": "Previous Group", "controls.filteringTerm": 'Filtering "{term}"', "controls.form.button": "Button", "controls.form.checkbox-group": "Checkbox Group", "controls.form.input.date": "Date", "controls.form.input.email": "Email", "controls.form.input.file": "File Upload", "controls.form.input.hidden": "Hidden Input", "controls.form.input.number": "Number", "controls.form.input.text": "Text Input", "controls.form.radio-group": "Radio Group", "controls.form.select": "Select", "controls.form.textarea": "TextArea", "controls.groups.form": "Form Fields", "controls.groups.html": "HTML Elements", "controls.groups.layout": "Layout", "controls.html.divider": "Divider", "controls.html.header": "Header", "controls.html.paragraph": "Paragraph", "controls.layout.column": "Column", "controls.layout.row": "Row", copy: "Copy To Clipboard", danger: "Danger", defineColumnLayout: "Define a column layout", defineColumnWidths: "Define column widths", description: "Help Text", descriptionField: "Description", "editing.row": "Editing Row", editorTitle: "Form Elements", field: "Field", "field.property.invalid": "not valid", "field.property.isChecked": "is checked", "field.property.isNotVisible": "is not visible", "field.property.isVisible": "is visible", "field.property.label": "label", "field.property.valid": "valid", "field.property.value": "value", fieldNonEditable: "This field cannot be edited.", fieldRemoveWarning: "Are you sure you want to remove this field?", fileUpload: "File Upload", formUpdated: "Form Updated", getStarted: "Drag a field from the right to get started.", group: "Group", grouped: "Grouped", hidden: "Hidden Input", hide: "Edit", htmlElements: "HTML Elements", if: "If", "if.condition.source.placeholder": "source", "if.condition.target.placeholder": "target / value", info: "Info", "input.date": "Date", "input.text": "Text", label: "Label", labelCount: "{label} {count}", labelEmpty: "Field Label cannot be empty", "lang.af": "Afrikaans", "lang.ar": "Arabic", "lang.cs": "Czech", "lang.de": "German", "lang.en": "English", "lang.es": "Spanish", "lang.fa": "Persian", "lang.fi": "Finnish", "lang.fr": "French", "lang.hu": "Hungarian", "lang.it": "Italian", "lang.ja": "Japanese", "lang.nb": "Norwegian Bokmål", "lang.pl": "Polish", "lang.pt": "Portuguese", "lang.ro": "Romanian", "lang.ru": "Russian", "lang.th": "Thai", "lang.tr": "Turkish", "lang.zh": "Chinese", layout: "Layout", limitRole: "Limit access to one or more of the following roles:", mandatory: "Mandatory", maxlength: "Max Length", "meta.group": "Group", "meta.icon": "Ico", "meta.label": "Label", minOptionMessage: "This field requires a minimum of 2 options", name: "Name", newOptionLabel: "New {type}", no: "No", number: "Number", off: "Off", on: "On", "operator.contains": "contains", "operator.equals": "equals", "operator.notContains": "not contains", "operator.notEquals": "not equal", "operator.notVisible": "not visible", "operator.visible": "visible", option: "Option", optional: "optional", optionEmpty: "Option value required", optionLabel: "Option {count}", options: "Options", or: "or", order: "Order", "panel.label.attrs": "Attributes", "panel.label.conditions": "Conditions", "panel.label.config": "Configuration", "panel.label.meta": "Meta", "panel.label.options": "Options", "panelEditButtons.attrs": "+ Attribute", "panelEditButtons.conditions": "+ Condition", "panelEditButtons.options": "+ Option", placeholder: "Placeholder", "placeholder.className": "space separated classes", "placeholder.email": "Enter you email", "placeholder.label": "Label", "placeholder.password": "Enter your password", "placeholder.placeholder": "Placeholder", "placeholder.text": "Enter some Text", "placeholder.textarea": "Enter a lot of text", "placeholder.value": "Value", preview: "Preview", primary: "Primary", remove: "Remove", removeMessage: "Remove Element", removeType: "Remove {type}", required: "Required", reset: "Reset", richText: "Rich Text Editor", roles: "Access", row: "Row", "row.makeInputGroup": "Make this row an input group.", "row.makeInputGroupDesc": "Input Groups enable users to add sets of inputs at a time.", "row.settings.fieldsetWrap": "Wrap row in a &lt;fieldset&gt; tag", "row.settings.fieldsetWrap.aria": "Wrap Row in Fieldset", save: "Save", secondary: "Secondary", select: "Select", selectColor: "Select Color", selectionsMessage: "Allow Multiple Selections", selectOptions: "Options", separator: "Separator", settings: "Settings", size: "Size", sizes: "Sizes", "sizes.lg": "Large", "sizes.m": "Default", "sizes.sm": "Small", "sizes.xs": "Extra Small", style: "Style", styles: "Styles", "styles.btn": "Button Style", "styles.btn.danger": "Danger", "styles.btn.default": "Default", "styles.btn.info": "Info", "styles.btn.primary": "Primary", "styles.btn.success": "Success", "styles.btn.warning": "Warning", subtype: "Type", success: "Success", text: "Text Field", then: "Then", "then.condition.target.placeholder": "target", toggle: "Toggle", ungrouped: "Un-Grouped", warning: "Warning", yes: "Yes" } }, i = e["en-US"];
10687
- const locale = "en-US";
10688
- mi18n.addLanguage(locale, i);
10689
- mi18n.setCurrent(locale);
10690
11113
  const defaults = {
10691
11114
  get editor() {
10692
11115
  return {
@@ -10700,7 +11123,6 @@ const defaults = {
10700
11123
  svgSprite: null,
10701
11124
  // null = use bundled sprite, or provide custom URL
10702
11125
  style: CSS_URL,
10703
- // change to null
10704
11126
  iconFont: null,
10705
11127
  // 'glyphicons' || 'font-awesome' || 'fontello'
10706
11128
  config: {},
@@ -10716,8 +11138,18 @@ const defaults = {
10716
11138
  };
10717
11139
  }
10718
11140
  };
10719
- new SmartTooltip();
11141
+ const INIT_STATES = {
11142
+ CREATED: "created",
11143
+ LOADING_RESOURCES: "loading",
11144
+ INITIALIZING: "initializing",
11145
+ READY: "ready",
11146
+ ERROR: "error"
11147
+ };
10720
11148
  let FormeoEditor$1 = class FormeoEditor {
11149
+ #initState = INIT_STATES.CREATED;
11150
+ #initPromise = null;
11151
+ #lockedFormData = null;
11152
+ #dataLoadedOnce = false;
10721
11153
  /**
10722
11154
  * @param {Object} options formeo options
10723
11155
  * @param {String|Object} userFormData loaded formData
@@ -10732,7 +11164,9 @@ let FormeoEditor$1 = class FormeoEditor {
10732
11164
  this.opts = opts;
10733
11165
  dom.setOptions = opts;
10734
11166
  components.config = config;
10735
- this.userFormData = userFormData || formData;
11167
+ const providedData = userFormData || formData;
11168
+ this.#lockedFormData = providedData ? cleanFormData(providedData) : null;
11169
+ this.userFormData = this.#lockedFormData;
10736
11170
  this.Components = components;
10737
11171
  this.dom = dom;
10738
11172
  events.init({ debug, ...events$1 });
@@ -10747,7 +11181,9 @@ let FormeoEditor$1 = class FormeoEditor {
10747
11181
  return this.Components.formData;
10748
11182
  }
10749
11183
  set formData(data = {}) {
10750
- this.userFormData = cleanFormData(data);
11184
+ const cleaned = cleanFormData(data);
11185
+ this.#lockedFormData = cleaned;
11186
+ this.userFormData = cleaned;
10751
11187
  this.load(this.userFormData, this.opts);
10752
11188
  }
10753
11189
  loadData(data = {}) {
@@ -10761,7 +11197,9 @@ let FormeoEditor$1 = class FormeoEditor {
10761
11197
  * @return {void}
10762
11198
  */
10763
11199
  clear() {
10764
- this.userFormData = DEFAULT_FORMDATA();
11200
+ const defaultData = DEFAULT_FORMDATA();
11201
+ this.#lockedFormData = defaultData;
11202
+ this.userFormData = defaultData;
10765
11203
  this.Components.load(this.userFormData, this.opts);
10766
11204
  this.render();
10767
11205
  }
@@ -10771,50 +11209,159 @@ let FormeoEditor$1 = class FormeoEditor {
10771
11209
  */
10772
11210
  async loadResources() {
10773
11211
  document.removeEventListener("DOMContentLoaded", this.loadResources);
10774
- const promises = [];
10775
- promises.push(
11212
+ this.#initState = INIT_STATES.LOADING_RESOURCES;
11213
+ const promises = [
10776
11214
  fetchIcons(this.opts.svgSprite),
10777
11215
  fetchFormeoStyle(this.opts.style),
10778
- mi18n.init({ ...this.opts.i18n, locale: globalThis.sessionStorage?.getItem(SESSION_LOCALE_KEY) })
10779
- );
10780
- await Promise.all(promises);
10781
- if (this.opts.allowEdit) {
10782
- this.init();
11216
+ mi18n.init({
11217
+ preloaded: { "en-US": i },
11218
+ ...this.opts.i18n,
11219
+ locale: globalThis.sessionStorage?.getItem(SESSION_LOCALE_KEY)
11220
+ })
11221
+ ].filter(Boolean);
11222
+ try {
11223
+ await Promise.all(promises);
11224
+ if (this.opts.allowEdit) {
11225
+ this.init();
11226
+ }
11227
+ } catch (error) {
11228
+ this.#initState = INIT_STATES.ERROR;
11229
+ console.error("Failed to load resources:", error);
11230
+ throw error;
10783
11231
  }
10784
11232
  }
10785
11233
  /**
10786
11234
  * Formeo initializer
10787
- * @return {Object} References to formeo instance,
11235
+ * @return {Promise} References to formeo instance,
10788
11236
  * dom elements, actions events and more.
10789
11237
  */
10790
11238
  init() {
10791
- return Controls$2.init(this.opts.controls, this.opts.stickyControls).then((controls) => {
11239
+ if (this.#initState === INIT_STATES.INITIALIZING) {
11240
+ return this.#initPromise;
11241
+ }
11242
+ if (this.#initState === INIT_STATES.READY) {
11243
+ return this.#refreshUI();
11244
+ }
11245
+ this.#initState = INIT_STATES.INITIALIZING;
11246
+ this.#initPromise = Controls$2.init(this.opts.controls, this.opts.stickyControls).then((controls) => {
10792
11247
  this.controls = controls;
10793
- this.load(this.userFormData, this.opts);
11248
+ if (!this.#dataLoadedOnce) {
11249
+ this.#loadInitialData();
11250
+ this.#dataLoadedOnce = true;
11251
+ }
10794
11252
  this.formId = components.get("id");
10795
11253
  this.i18n = {
10796
- setLang: (formeoLocale) => {
10797
- window.sessionStorage?.setItem(SESSION_LOCALE_KEY, formeoLocale);
10798
- const loadLang = mi18n.setCurrent(formeoLocale);
10799
- loadLang.then(() => {
10800
- this.init();
10801
- }, console.error);
10802
- }
11254
+ setLang: this.#setLanguage.bind(this)
10803
11255
  };
11256
+ this.render();
11257
+ this.#initState = INIT_STATES.READY;
10804
11258
  this.opts.onLoad?.(this);
11259
+ this.tooltipInstance = new SmartTooltip();
11260
+ return this;
11261
+ }).catch((error) => {
11262
+ this.#initState = INIT_STATES.ERROR;
11263
+ console.error("Failed to initialize editor:", error);
11264
+ throw error;
10805
11265
  });
11266
+ return this.#initPromise;
11267
+ }
11268
+ /**
11269
+ * Set language without reloading form data (fixes race condition)
11270
+ * @param {string} formeoLocale - locale code
11271
+ * @return {Promise}
11272
+ */
11273
+ async #setLanguage(formeoLocale) {
11274
+ globalThis.sessionStorage?.setItem(SESSION_LOCALE_KEY, formeoLocale);
11275
+ await mi18n.setCurrent(formeoLocale);
11276
+ await this.#refreshUI();
11277
+ }
11278
+ /**
11279
+ * Refresh UI without reloading data (used for language changes)
11280
+ * @return {Promise}
11281
+ */
11282
+ async #refreshUI() {
11283
+ this.controls = await Controls$2.init(this.opts.controls, this.opts.stickyControls);
11284
+ this.render();
11285
+ return this;
11286
+ }
11287
+ /**
11288
+ * Load initial data with proper priority
11289
+ */
11290
+ #loadInitialData() {
11291
+ const dataToLoad = this.#getDataWithPriority();
11292
+ this.Components.load(dataToLoad, this.opts);
11293
+ }
11294
+ /**
11295
+ * Get form data with proper priority:
11296
+ * 1. User-provided data (locked at construction)
11297
+ * 2. SessionStorage (if enabled)
11298
+ * 3. Default empty form
11299
+ * @return {Object} form data to load
11300
+ */
11301
+ #getDataWithPriority() {
11302
+ if (this.#lockedFormData) {
11303
+ return clone$1(this.#lockedFormData);
11304
+ }
11305
+ if (this.opts.sessionStorage) {
11306
+ const sessionData = sessionStorage.get(SESSION_FORMDATA_KEY);
11307
+ if (sessionData) {
11308
+ return sessionData;
11309
+ }
11310
+ }
11311
+ return DEFAULT_FORMDATA();
10806
11312
  }
10807
11313
  load(formData = this.userFormData, opts = this.opts) {
10808
11314
  this.Components.load(formData, opts);
10809
11315
  this.render();
10810
11316
  }
11317
+ /**
11318
+ * Get current initialization state
11319
+ * @return {string} current state
11320
+ */
11321
+ get initState() {
11322
+ return this.#initState;
11323
+ }
11324
+ /**
11325
+ * Check if the editor is ready
11326
+ * @return {boolean}
11327
+ */
11328
+ get isReady() {
11329
+ return this.#initState === INIT_STATES.READY;
11330
+ }
11331
+ /**
11332
+ * Wait for the editor to be ready
11333
+ * @return {Promise} resolves when editor is ready
11334
+ */
11335
+ async whenReady() {
11336
+ if (this.#initState === INIT_STATES.READY) {
11337
+ return this;
11338
+ }
11339
+ if (this.#initState === INIT_STATES.ERROR) {
11340
+ return Promise.reject(new Error("Editor initialization failed"));
11341
+ }
11342
+ if (this.#initPromise) {
11343
+ return this.#initPromise;
11344
+ }
11345
+ return new Promise((resolve, reject) => {
11346
+ const checkReady = () => {
11347
+ if (this.#initState === INIT_STATES.READY) {
11348
+ resolve(this);
11349
+ } else if (this.#initState === INIT_STATES.ERROR) {
11350
+ reject(new Error("Editor initialization failed"));
11351
+ } else {
11352
+ globalThis.requestAnimationFrame(checkReady);
11353
+ }
11354
+ };
11355
+ checkReady();
11356
+ });
11357
+ }
10811
11358
  /**
10812
11359
  * Render the formeo sections
10813
11360
  * @return {void}
10814
11361
  */
10815
11362
  render() {
10816
11363
  if (!this.controls) {
10817
- return window.requestAnimationFrame(() => this.render());
11364
+ return globalThis.requestAnimationFrame(() => this.render());
10818
11365
  }
10819
11366
  this.stages = Object.values(components.get("stages"));
10820
11367
  if (this.opts.controlOnLeft) {
@@ -11503,7 +12050,8 @@ class TextControl extends Control {
11503
12050
  className: ""
11504
12051
  },
11505
12052
  config: {
11506
- label: mi18n.get("controls.form.input.text")
12053
+ label: mi18n.get("controls.form.input.text"),
12054
+ hideLabel: false
11507
12055
  },
11508
12056
  meta: {
11509
12057
  group: "common",