/**
 * Copyright © schukai GmbH and all contributing authors, {{copyRightYear}}. All rights reserved.
 * Node module: @schukai/monster
 *
 * This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3).
 * The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html
 *
 * For those who do not wish to adhere to the AGPLv3, a commercial license is available.
 * Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms.
 * For more information about purchasing a commercial license, please contact schukai GmbH.
 *
 * SPDX-License-Identifier: AGPL-3.0
 */

export {
	DEFAULT_THEME,
	ATTRIBUTE_PREFIX,
	ATTRIBUTE_OPTIONS,
	ATTRIBUTE_OPTIONS_SELECTOR,
	ATTRIBUTE_THEME_PREFIX,
	ATTRIBUTE_THEME_NAME,
	ATTRIBUTE_UPDATER_ATTRIBUTES,
	ATTRIBUTE_UPDATER_SELECT_THIS,
	ATTRIBUTE_UPDATER_REPLACE,
	ATTRIBUTE_UPDATER_INSERT,
	ATTRIBUTE_UPDATER_INSERT_REFERENCE,
	ATTRIBUTE_UPDATER_REMOVE,
	ATTRIBUTE_UPDATER_BIND,
	ATTRIBUTE_UPDATER_BIND_TYPE,
	ATTRIBUTE_TEMPLATE_PREFIX,
	ATTRIBUTE_ROLE,
	ATTRIBUTE_DISABLED,
	ATTRIBUTE_VALUE,
	ATTRIBUTE_OBJECTLINK,
	ATTRIBUTE_ERRORMESSAGE,
	TAG_SCRIPT,
	TAG_STYLE,
	TAG_LINK,
	ATTRIBUTE_ID,
	ATTRIBUTE_CLASS,
	ATTRIBUTE_TITLE,
	ATTRIBUTE_SRC,
	ATTRIBUTE_HREF,
	ATTRIBUTE_TYPE,
	ATTRIBUTE_NONCE,
	ATTRIBUTE_TRANSLATE,
	ATTRIBUTE_TABINDEX,
	ATTRIBUTE_SPELLCHECK,
	ATTRIBUTE_SLOT,
	ATTRIBUTE_PART,
	ATTRIBUTE_LANG,
	ATTRIBUTE_ITEMTYPE,
	ATTRIBUTE_ITEMSCOPE,
	ATTRIBUTE_ITEMREF,
	ATTRIBUTE_ITEMID,
	ATTRIBUTE_ITEMPROP,
	ATTRIBUTE_IS,
	ATTRIBUTE_INPUTMODE,
	ATTRIBUTE_ACCESSKEY,
	ATTRIBUTE_AUTOCAPITALIZE,
	ATTRIBUTE_AUTOFOCUS,
	ATTRIBUTE_CONTENTEDITABLE,
	ATTRIBUTE_DIR,
	ATTRIBUTE_DRAGGABLE,
	ATTRIBUTE_ENTERKEYHINT,
	ATTRIBUTE_EXPORTPARTS,
	ATTRIBUTE_HIDDEN,
	ATTRIBUTE_FORM_BIND,
	ATTRIBUTE_FORM_BIND_TYPE,
	objectUpdaterLinkSymbol,
	customElementUpdaterLinkSymbol,
	initControlCallbackName,
	ATTRIBUTE_SCRIPT_HOST,
	ATTRIBUTE_INIT_CALLBACK,
};

/**
 * default theme
 * @memberOf Monster.DOM
 * @type {string}
 */
const DEFAULT_THEME = "monster";

/**
 * @memberOf Monster.DOM
 * @license AGPLv3
 * @since 1.8.0
 * @type {string}
 */
const ATTRIBUTE_PREFIX = "data-monster-";

/**
 * This is the name of the attribute to pass options to a control
 *
 * @memberOf Monster.DOM
 * @license AGPLv3
 * @since 1.8.0
 * @type {string}
 */
const ATTRIBUTE_OPTIONS = `${ATTRIBUTE_PREFIX}options`;

/**
 * This is name of the attribute to pass the script host to a control
 *
 * @memberOf Monster.DOM
 * @license AGPLv3
 * @since 3.48.0
 * @type {string}
 */
const ATTRIBUTE_SCRIPT_HOST = `${ATTRIBUTE_PREFIX}script-host`;

/**
 * This is the name of the attribute to pass options to a control
 *
 * @memberOf Monster.DOM
 * @license AGPLv3
 * @since 1.30.0
 * @type {string}
 */
const ATTRIBUTE_OPTIONS_SELECTOR = `${ATTRIBUTE_PREFIX}options-selector`;

/**
 * This is the name of the attribute to pass the callback to a control
 *
 * @memberOf Monster.DOM
 * @license AGPLv3
 * @since 3.48.0
 * @type {string}
 */
const ATTRIBUTE_INIT_CALLBACK = `${ATTRIBUTE_PREFIX}init-callback`;

/**
 * This is the name of the callback to pass the callback to a control
 *
 * @memberOf Monster.DOM
 * @license AGPLv3
 * @since 3.48.0
 * @type {string}
 */
const initControlCallbackName = `initCustomControlCallback`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.8.0
 */
const ATTRIBUTE_THEME_PREFIX = `${ATTRIBUTE_PREFIX}theme-`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 */
const ATTRIBUTE_THEME_NAME = `${ATTRIBUTE_THEME_PREFIX}name`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.8.0
 */
const ATTRIBUTE_UPDATER_ATTRIBUTES = `${ATTRIBUTE_PREFIX}attributes`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.27.1
 */
const ATTRIBUTE_UPDATER_SELECT_THIS = `${ATTRIBUTE_PREFIX}select-this`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.8.0
 */
const ATTRIBUTE_UPDATER_REPLACE = `${ATTRIBUTE_PREFIX}replace`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.8.0
 */
const ATTRIBUTE_UPDATER_INSERT = `${ATTRIBUTE_PREFIX}insert`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.8.0
 */
const ATTRIBUTE_UPDATER_INSERT_REFERENCE = `${ATTRIBUTE_PREFIX}insert-reference`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.8.0
 */
const ATTRIBUTE_UPDATER_REMOVE = `${ATTRIBUTE_PREFIX}remove`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.9.0
 */
const ATTRIBUTE_UPDATER_BIND = `${ATTRIBUTE_PREFIX}bind`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 3.73.0
 */
const ATTRIBUTE_FORM_BIND = `${ATTRIBUTE_PREFIX}form-bind`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 3.73.0
 */
const ATTRIBUTE_FORM_BIND_TYPE = `${ATTRIBUTE_PREFIX}form-bind-type`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.9.0
 */
const ATTRIBUTE_UPDATER_BIND_TYPE = `${ATTRIBUTE_UPDATER_BIND}-type`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.27.0
 */
const ATTRIBUTE_TEMPLATE_PREFIX = `${ATTRIBUTE_PREFIX}template-prefix`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.14.0
 */
const ATTRIBUTE_ROLE = `${ATTRIBUTE_PREFIX}role`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.24.0
 */
const ATTRIBUTE_DISABLED = "disabled";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.24.0
 */
const ATTRIBUTE_VALUE = "value";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.9.0
 */
const ATTRIBUTE_OBJECTLINK = `${ATTRIBUTE_PREFIX}objectlink`;

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.24.0
 */
const ATTRIBUTE_ERRORMESSAGE = `${ATTRIBUTE_PREFIX}error`;

/**
 * @memberOf Monster.DOM
 * @type {symbol}
 * @license AGPLv3
 * @since 1.24.0
 */
const objectUpdaterLinkSymbol = Symbol.for(
	"@schukai/monster/dom/@@object-updater-link",
);

/**
 * @memberOf Monster.DOM
 * @type {symbol}
 * @license AGPLv3
 * @since 1.24.0
 */
const customElementUpdaterLinkSymbol = Symbol.for(
	"@schukai/monster/dom/custom-element@@options-updater-link",
);

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const TAG_SCRIPT = "script";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const TAG_STYLE = "style";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const TAG_LINK = "link";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */

const ATTRIBUTE_ID = "id";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */

const ATTRIBUTE_CLASS = "class";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_TITLE = "title";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_SRC = "src";
/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_HREF = "href";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_TYPE = "type";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_NONCE = "nonce";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_TRANSLATE = "translate";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_TABINDEX = "tabindex";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_SPELLCHECK = "spellcheck";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_SLOT = "slot";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_PART = "part";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_LANG = "lang";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ITEMTYPE = "itemtype";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ITEMSCOPE = "itemscope";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ITEMREF = "itemref";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ITEMID = "itemid";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ITEMPROP = "itemprop";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_IS = "is";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_INPUTMODE = "inputmode";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ACCESSKEY = "accesskey";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_AUTOCAPITALIZE = "autocapitalize";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_AUTOFOCUS = "autofocus";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_CONTENTEDITABLE = "contenteditable";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_DIR = "dir";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_DRAGGABLE = "draggable";

/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_ENTERKEYHINT = "enterkeyhint";
/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_EXPORTPARTS = "exportparts";
/**
 * @memberOf Monster.DOM
 * @type {string}
 * @license AGPLv3
 * @since 1.25.0
 */
const ATTRIBUTE_HIDDEN = "hidden";