/**
 * Copyright schukai GmbH and contributors 2023. All Rights Reserved.
 * Node module: @schukai/monster
 * This file is licensed under the AGPLv3 License.
 * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
 */

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_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,
    objectUpdaterLinkSymbol,
    customElementUpdaterLinkSymbol,
    optionCallbackName,
    ATTRIBUTE_SCRIPT_HOST,
    ATTRIBUTE_OPTION_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_OPTION_CALLBACK = `${ATTRIBUTE_PREFIX}option-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 optionCallbackName = `initCustomControlOptionsCallback`;

/**
 * @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 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";