@dialpad/dialtone 9.84.0 → 9.84.2
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.
- package/dist/tokens/doc.json +11941 -11941
- package/dist/vue2/common/emoji.cjs +6 -0
- package/dist/vue2/common/emoji.cjs.map +1 -1
- package/dist/vue2/common/emoji.js +6 -0
- package/dist/vue2/common/emoji.js.map +1 -1
- package/dist/vue2/components/emoji_text_wrapper/emoji_text_wrapper.vue.cjs +7 -5
- package/dist/vue2/components/emoji_text_wrapper/emoji_text_wrapper.vue.cjs.map +1 -1
- package/dist/vue2/components/emoji_text_wrapper/emoji_text_wrapper.vue.js +8 -6
- package/dist/vue2/components/emoji_text_wrapper/emoji_text_wrapper.vue.js.map +1 -1
- package/dist/vue2/dialtone-vue.cjs +1 -0
- package/dist/vue2/dialtone-vue.cjs.map +1 -1
- package/dist/vue2/dialtone-vue.js +2 -1
- package/dist/vue2/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.cjs +2 -1
- package/dist/vue2/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.cjs.map +1 -1
- package/dist/vue2/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.js +2 -1
- package/dist/vue2/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.js.map +1 -1
- package/dist/vue2/style.css +9 -9
- package/dist/vue2/types/common/emoji/index.d.ts +1 -0
- package/dist/vue2/types/common/emoji/index.d.ts.map +1 -1
- package/dist/vue2/types/components/emoji_text_wrapper/emoji_text_wrapper.vue.d.ts.map +1 -1
- package/dist/vue3/common/emoji.cjs +6 -0
- package/dist/vue3/common/emoji.cjs.map +1 -1
- package/dist/vue3/common/emoji.js +6 -0
- package/dist/vue3/common/emoji.js.map +1 -1
- package/dist/vue3/components/emoji_text_wrapper/emoji_text_wrapper.vue.cjs +7 -5
- package/dist/vue3/components/emoji_text_wrapper/emoji_text_wrapper.vue.cjs.map +1 -1
- package/dist/vue3/components/emoji_text_wrapper/emoji_text_wrapper.vue.js +8 -6
- package/dist/vue3/components/emoji_text_wrapper/emoji_text_wrapper.vue.js.map +1 -1
- package/dist/vue3/dialtone-vue.cjs +1 -0
- package/dist/vue3/dialtone-vue.cjs.map +1 -1
- package/dist/vue3/dialtone-vue.js +2 -1
- package/dist/vue3/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.cjs +2 -1
- package/dist/vue3/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.cjs.map +1 -1
- package/dist/vue3/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.js +2 -1
- package/dist/vue3/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.js.map +1 -1
- package/dist/vue3/style.css +9 -9
- package/dist/vue3/types/common/emoji/index.d.ts +1 -0
- package/dist/vue3/types/common/emoji/index.d.ts.map +1 -1
- package/dist/vue3/types/components/emoji_text_wrapper/emoji_text_wrapper.vue.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji.js","sources":["../../common/emoji/index.js"],"sourcesContent":["import { emojiPattern } from 'regex-combined-emojis';\nimport emojiJsonLocal from 'emoji-toolkit/emoji_strategy.json' with { type: 'json' };\n\nexport const emojiRegex = new RegExp(emojiPattern, 'g');\nexport const emojiVersion = '8.0';\nexport const defaultEmojiAssetUrl = 'https://cdn.jsdelivr.net/joypixels/assets/' + emojiVersion + '/png/unicode/32/';\nexport let customEmojiAssetUrl = null;\n\n// Used for emoji 16px and smaller\nexport let emojiImageUrlSmall = defaultEmojiAssetUrl;\nexport let emojiFileExtensionSmall = '.png';\n\n// Used for emoji larger than 16px\nexport let emojiImageUrlLarge = defaultEmojiAssetUrl;\nexport let emojiFileExtensionLarge = '.png';\n\nexport const emojiJson = emojiJsonLocal;\n\nexport const emojiShortCodeRegex = /(^| |(?<=:))(:\\w+:)/g;\n\nexport function getEmojiData () {\n return emojiJson;\n}\n\nexport function setEmojiAssetUrlSmall (url, fileExtension = '.png') {\n if (!url.endsWith('/')) {\n url = url + '/';\n }\n emojiImageUrlSmall = url;\n emojiFileExtensionSmall = fileExtension;\n}\n\nexport function setEmojiAssetUrlLarge (url, fileExtension = '.svg') {\n if (!url.endsWith('/')) {\n url = url + '/';\n }\n emojiImageUrlLarge = url;\n emojiFileExtensionLarge = fileExtension;\n}\n\nexport function setCustomEmojiUrl (url) {\n customEmojiAssetUrl = url;\n}\n\nexport function setCustomEmojiJson (json) {\n validateCustomEmojiJson(json);\n}\n\n/**\n * Validate custom emoji json\n */\nexport function validateCustomEmojiJson (json) {\n const customEmojiProps = ['extension', 'custom'];\n const customEmojiRequiredProps = [\n 'name',\n 'category',\n 'shortname',\n 'extension',\n 'custom',\n ];\n\n /**\n * Update single emoji properties.\n * If the property exists in emojiData, it'll add the values if the property is an array, otherwise will overwrite.\n * If not exists, will add the property to the emojiData object.\n */\n const _updateNativeEmojiData = (emojiData, propName, propValue) => {\n if (emojiData[propName] === undefined) {\n if (!customEmojiProps.includes(propName)) {\n return;\n }\n\n // new property to add\n emojiData[propName] = propValue;\n } else {\n if (Array.isArray(emojiData[propName])) {\n emojiData[propName] = emojiData[propName].concat(propValue);\n } else {\n emojiData[propName] = propValue;\n }\n }\n };\n\n Object.entries(json).forEach((item) => {\n const [customEmojiKey, customEmojiValue] = item;\n\n if (customEmojiKey in emojiJson) {\n // custom emoji exists in emoji json which means to update some data in the native emoji\n const emojiData = emojiJson[customEmojiKey];\n\n for (const customEmojiPropertyName in customEmojiValue) {\n const customEmojiPropertyValue = customEmojiValue[customEmojiPropertyName];\n\n _updateNativeEmojiData(emojiData, customEmojiPropertyName, customEmojiPropertyValue);\n }\n } else {\n // new custom emoji\n const _validateRequiredProps = () =>\n customEmojiRequiredProps.every((val) => {\n return customEmojiValue[val] !== undefined;\n });\n\n if (_validateRequiredProps()) {\n emojiJson[customEmojiKey] = customEmojiValue;\n } else {\n console.error(\n 'The following custom emoji doesn\\'t contain the required properties:',\n customEmojiValue,\n );\n }\n }\n });\n}\n\n// recursively searches the emoji data object containing data for all emojis\n// and returns the object with the specified shortcode.\nexport function shortcodeToEmojiData (shortcode) {\n // eslint-disable-next-line complexity\n function f (o, key) {\n if (!o || typeof o !== 'object') {\n return;\n }\n if ('shortname' in o) {\n if (o.shortname === shortcode || o.shortname_alternates.includes(shortcode)) {\n o.key = key;\n reference = o;\n return true;\n }\n }\n Object.keys(o).some(function (k) {\n return f(o[k], k);\n });\n }\n\n let reference;\n f(getEmojiData(), null);\n return reference;\n}\n\n// Takes in an emoji unicode character(s) and converts it to an emoji string in the format the emoji data object expects\n// as a key. There can be multiple unicode characters in an emoji to denote the emoji itself, skin tone, gender\n// and such. Note that this function does NOT return variation selectors (fe0f) or zero width joiners (200d), as these\n// are not included as part of the key in the emoji.json.\n//\n// Example:\n// return value for smile emoji (no skin tone): 1f600\n// return value for left facing fist (light skin tone): 1f91b-1f3fb\nexport function unicodeToString (emoji) {\n let key = '';\n for (const codePoint of emoji) {\n const codepoint = codePoint.codePointAt(0).toString(16).padStart(4, '0');\n\n // skip 200d and fe0f as these are not included in emoji_strategy.json keys\n if (['200d', 'fe0f'].includes(codepoint)) continue;\n if (key !== '') { key = key + '-'; }\n key = key + codepoint;\n }\n return key;\n}\n\n// Takes in unicode in string form ex: '1f91b-1f3fb' and converts it to an actual unicode character.\nexport function stringToUnicode (str) {\n const uChars = str.split('-');\n let result = '';\n uChars.forEach((uChar) => {\n result = result + String.fromCodePoint(parseInt(uChar, 16));\n });\n return result;\n}\n\n// Takes in a code (which could be unicode or shortcode) and returns the emoji data for it.\nexport function codeToEmojiData (code) {\n code = code?.trim();\n if (code.startsWith(':') && code.endsWith(':')) {\n return shortcodeToEmojiData(code);\n } else {\n const unicodeString = unicodeToString(code);\n const result = emojiJson[unicodeString];\n if (result) result.key = unicodeString;\n return result;\n }\n}\n\n// Finds every shortcode in slot text\n// filters only the existing codes in emojiJson\n// removes duplicates.\n// @returns {string[]}\nexport function findShortCodes (textContent) {\n const shortcodes = (\n textContent.match(emojiShortCodeRegex) || []\n ).map(code => code.trim());\n return filterValidShortCodes(shortcodes);\n}\n\nexport function filterValidShortCodes (shortcodes) {\n const filtered = shortcodes ? shortcodes.filter(code => shortcodeToEmojiData(code)) : [];\n return new Set(filtered);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"emoji.js","sources":["../../common/emoji/index.js"],"sourcesContent":["import { emojiPattern } from 'regex-combined-emojis';\nimport emojiJsonLocal from 'emoji-toolkit/emoji_strategy.json' with { type: 'json' };\n\nexport const emojiRegex = new RegExp(emojiPattern, 'g');\nexport const emojiVersion = '8.0';\nexport const defaultEmojiAssetUrl = 'https://cdn.jsdelivr.net/joypixels/assets/' + emojiVersion + '/png/unicode/32/';\nexport let customEmojiAssetUrl = null;\n\n// Used for emoji 16px and smaller\nexport let emojiImageUrlSmall = defaultEmojiAssetUrl;\nexport let emojiFileExtensionSmall = '.png';\n\n// Used for emoji larger than 16px\nexport let emojiImageUrlLarge = defaultEmojiAssetUrl;\nexport let emojiFileExtensionLarge = '.png';\n\nexport const emojiJson = emojiJsonLocal;\n\nexport const emojiShortCodeRegex = /(^| |(?<=:))(:\\w+:)/g;\n\nexport function getEmojiData () {\n return emojiJson;\n}\n\nexport function setEmojiAssetUrlSmall (url, fileExtension = '.png') {\n if (!url.endsWith('/')) {\n url = url + '/';\n }\n emojiImageUrlSmall = url;\n emojiFileExtensionSmall = fileExtension;\n}\n\nexport function setEmojiAssetUrlLarge (url, fileExtension = '.svg') {\n if (!url.endsWith('/')) {\n url = url + '/';\n }\n emojiImageUrlLarge = url;\n emojiFileExtensionLarge = fileExtension;\n}\n\nexport function setCustomEmojiUrl (url) {\n customEmojiAssetUrl = url;\n}\n\nexport function setCustomEmojiJson (json) {\n validateCustomEmojiJson(json);\n}\n\n/**\n * Validate custom emoji json\n */\nexport function validateCustomEmojiJson (json) {\n const customEmojiProps = ['extension', 'custom'];\n const customEmojiRequiredProps = [\n 'name',\n 'category',\n 'shortname',\n 'extension',\n 'custom',\n ];\n\n /**\n * Update single emoji properties.\n * If the property exists in emojiData, it'll add the values if the property is an array, otherwise will overwrite.\n * If not exists, will add the property to the emojiData object.\n */\n const _updateNativeEmojiData = (emojiData, propName, propValue) => {\n if (emojiData[propName] === undefined) {\n if (!customEmojiProps.includes(propName)) {\n return;\n }\n\n // new property to add\n emojiData[propName] = propValue;\n } else {\n if (Array.isArray(emojiData[propName])) {\n emojiData[propName] = emojiData[propName].concat(propValue);\n } else {\n emojiData[propName] = propValue;\n }\n }\n };\n\n Object.entries(json).forEach((item) => {\n const [customEmojiKey, customEmojiValue] = item;\n\n if (customEmojiKey in emojiJson) {\n // custom emoji exists in emoji json which means to update some data in the native emoji\n const emojiData = emojiJson[customEmojiKey];\n\n for (const customEmojiPropertyName in customEmojiValue) {\n const customEmojiPropertyValue = customEmojiValue[customEmojiPropertyName];\n\n _updateNativeEmojiData(emojiData, customEmojiPropertyName, customEmojiPropertyValue);\n }\n } else {\n // new custom emoji\n const _validateRequiredProps = () =>\n customEmojiRequiredProps.every((val) => {\n return customEmojiValue[val] !== undefined;\n });\n\n if (_validateRequiredProps()) {\n emojiJson[customEmojiKey] = customEmojiValue;\n } else {\n console.error(\n 'The following custom emoji doesn\\'t contain the required properties:',\n customEmojiValue,\n );\n }\n }\n });\n}\n\n// recursively searches the emoji data object containing data for all emojis\n// and returns the object with the specified shortcode.\nexport function shortcodeToEmojiData (shortcode) {\n // eslint-disable-next-line complexity\n function f (o, key) {\n if (!o || typeof o !== 'object') {\n return;\n }\n if ('shortname' in o) {\n if (o.shortname === shortcode || o.shortname_alternates.includes(shortcode)) {\n o.key = key;\n reference = o;\n return true;\n }\n }\n Object.keys(o).some(function (k) {\n return f(o[k], k);\n });\n }\n\n let reference;\n f(getEmojiData(), null);\n return reference;\n}\n\n// Takes in an emoji unicode character(s) and converts it to an emoji string in the format the emoji data object expects\n// as a key. There can be multiple unicode characters in an emoji to denote the emoji itself, skin tone, gender\n// and such. Note that this function does NOT return variation selectors (fe0f) or zero width joiners (200d), as these\n// are not included as part of the key in the emoji.json.\n//\n// Example:\n// return value for smile emoji (no skin tone): 1f600\n// return value for left facing fist (light skin tone): 1f91b-1f3fb\nexport function unicodeToString (emoji) {\n let key = '';\n for (const codePoint of emoji) {\n const codepoint = codePoint.codePointAt(0).toString(16).padStart(4, '0');\n\n // skip 200d and fe0f as these are not included in emoji_strategy.json keys\n if (['200d', 'fe0f'].includes(codepoint)) continue;\n if (key !== '') { key = key + '-'; }\n key = key + codepoint;\n }\n return key;\n}\n\n// Takes in unicode in string form ex: '1f91b-1f3fb' and converts it to an actual unicode character.\nexport function stringToUnicode (str) {\n const uChars = str.split('-');\n let result = '';\n uChars.forEach((uChar) => {\n result = result + String.fromCodePoint(parseInt(uChar, 16));\n });\n return result;\n}\n\n// Takes in a code (which could be unicode or shortcode) and returns the emoji data for it.\nexport function codeToEmojiData (code) {\n code = code?.trim();\n if (code.startsWith(':') && code.endsWith(':')) {\n return shortcodeToEmojiData(code);\n } else {\n const unicodeString = unicodeToString(code);\n const result = emojiJson[unicodeString];\n if (result) result.key = unicodeString;\n return result;\n }\n}\n\n// Finds every shortcode in slot text\n// filters only the existing codes in emojiJson\n// removes duplicates.\n// @returns {string[]}\nexport function findShortCodes (textContent) {\n const shortcodes = (\n textContent.match(emojiShortCodeRegex) || []\n ).map(code => code.trim());\n return filterValidShortCodes(shortcodes);\n}\n\nexport function filterValidShortCodes (shortcodes) {\n const filtered = shortcodes ? shortcodes.filter(code => shortcodeToEmojiData(code)) : [];\n return new Set(filtered);\n}\n\n// Finds every emoji in slot text\n// removes duplicates\n// @returns {string[]}\nexport function findEmojis (textContent) {\n const matches = [...textContent.matchAll(emojiRegex)];\n const emojis = matches.length ? matches.map(match => match[0]) : [];\n return new Set(emojis);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
const common_emoji = require("../../common/emoji.cjs");
|
|
4
4
|
const vue = require("vue");
|
|
5
5
|
const icon_constants = require("../icon/icon_constants.cjs");
|
|
6
|
-
const regexCombinedEmojis = require("regex-combined-emojis");
|
|
7
6
|
const emoji = require("../emoji/emoji.vue.cjs");
|
|
8
7
|
const _sfc_main = {
|
|
9
8
|
name: "DtEmojiTextWrapper",
|
|
@@ -42,11 +41,13 @@ const _sfc_main = {
|
|
|
42
41
|
*/
|
|
43
42
|
replaceDtEmojis(replaceList, textContent) {
|
|
44
43
|
if (!replaceList.length) return textContent;
|
|
45
|
-
const
|
|
44
|
+
const escapedReplaceList = replaceList.map(
|
|
45
|
+
(item) => item.replace(/\*/g, "\\*")
|
|
46
|
+
);
|
|
47
|
+
const regexp = new RegExp(`(${escapedReplaceList.join("|")})`, "g");
|
|
46
48
|
const items = textContent.split(regexp);
|
|
47
49
|
return items.filter((item) => item.trim() !== "").map((item) => {
|
|
48
|
-
|
|
49
|
-
if (replaceList.includes(item) || regexp.test(item)) {
|
|
50
|
+
if (replaceList.includes(item)) {
|
|
50
51
|
return vue.h(emoji.default, { code: item, size: this.size });
|
|
51
52
|
}
|
|
52
53
|
return vue.h("span", { class: "d-emoji-text-wrapper__text" }, item);
|
|
@@ -75,7 +76,8 @@ const _sfc_main = {
|
|
|
75
76
|
*/
|
|
76
77
|
searchCodes(textContent) {
|
|
77
78
|
const shortcodes = common_emoji.findShortCodes(textContent);
|
|
78
|
-
const
|
|
79
|
+
const emojis = common_emoji.findEmojis(textContent);
|
|
80
|
+
const replaceList = [...shortcodes, ...emojis];
|
|
79
81
|
if (replaceList.length === 0) return textContent;
|
|
80
82
|
return this.replaceDtEmojis(replaceList, textContent);
|
|
81
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji_text_wrapper.vue.cjs","sources":["../../../components/emoji_text_wrapper/emoji_text_wrapper.vue"],"sourcesContent":["<script>\nimport { DtEmoji } from '../emoji';\nimport { findShortCodes } from '@/common/emoji';\nimport { h } from 'vue';\nimport { ICON_SIZE_MODIFIERS } from '@/components/icon/icon_constants';\
|
|
1
|
+
{"version":3,"file":"emoji_text_wrapper.vue.cjs","sources":["../../../components/emoji_text_wrapper/emoji_text_wrapper.vue"],"sourcesContent":["<script>\nimport { DtEmoji } from '../emoji';\nimport { findEmojis, findShortCodes } from '@/common/emoji';\nimport { h } from 'vue';\nimport { ICON_SIZE_MODIFIERS } from '@/components/icon/icon_constants';\n\n/**\n * Wrapper to find and replace shortcodes like :smile: or unicode chars such as 😄 with our custom Emojis implementation.\n * @see https://dialtone.dialpad.com/components/emoji_text_wrapper.html\n */\nexport default {\n name: 'DtEmojiTextWrapper',\n\n components: {\n DtEmoji,\n },\n\n props: {\n /**\n * Element type (tag name) to use for the wrapper.\n */\n elementType: {\n type: String,\n default: 'div',\n },\n\n /**\n * The icon size to render the emojis at: 100 to 800\n */\n size: {\n type: String,\n default: '500',\n validator: (t) => Object.keys(ICON_SIZE_MODIFIERS).includes(t),\n },\n },\n\n data () {\n return {\n loadingEmojiJson: true,\n };\n },\n\n async created () {\n this.loadingEmojiJson = false;\n },\n\n methods: {\n /**\n * Replaces the valid codes from the text content with a DtEmoji component.\n * @returns {Array<VNode|string>}\n */\n replaceDtEmojis (replaceList, textContent) {\n if (!replaceList.length) return textContent;\n // Escape the asterisk to avoid breaking the regex for the asterisk emoji\n const escapedReplaceList = replaceList.map(item =>\n item.replace(/\\*/g, '\\\\*'),\n );\n\n const regexp = new RegExp(`(${escapedReplaceList.join('|')})`, 'g');\n const items = textContent.split(regexp);\n\n return items\n .filter(item => item.trim() !== '')\n .map((item) => {\n if (replaceList.includes(item)) {\n return h(DtEmoji, { code: item, size: this.size });\n }\n return h('span', { class: 'd-emoji-text-wrapper__text' }, item);\n });\n },\n\n /**\n * Recursively search the Vue virtual DOM to find text\n * @param VNode\n * @returns {VNode|*}\n */\n searchVNodes (VNode) {\n if (typeof VNode === 'string') return this.searchCodes(VNode);\n if (typeof VNode.type === 'symbol') return this.searchCodes(VNode.children);\n if (VNode.props?.innerHTML) return this.searchVNodes(VNode.props.innerHTML);\n\n const children = Array.isArray(VNode.children) ? VNode.children : [VNode.children];\n return h(VNode.type, VNode.props, children.map(VNodeChild => this.searchVNodes(VNodeChild)));\n },\n\n // TODO: Find a way to crawl vue components\n replaceVueComponentVNodeContent (VNode) {\n //\n },\n\n /**\n * Find codes in text.\n * @param textContent string\n * @returns {Array<VNode|string>|string}\n */\n searchCodes (textContent) {\n const shortcodes = findShortCodes(textContent);\n const emojis = findEmojis(textContent);\n\n const replaceList = [...shortcodes, ...emojis];\n if (replaceList.length === 0) return textContent;\n return this.replaceDtEmojis(replaceList, textContent);\n },\n },\n\n render () {\n const defaultSlotContent = this.$slots.default ? this.$slots.default() : [];\n return h(\n this.elementType,\n {\n 'data-qa': 'emoji-text-wrapper',\n class: 'd-emoji-text-wrapper',\n },\n this.loadingEmojiJson\n ? defaultSlotContent\n : defaultSlotContent.map(VNode => this.searchVNodes(VNode)),\n );\n },\n};\n</script>\n"],"names":["DtEmoji","ICON_SIZE_MODIFIERS","h","findShortCodes","findEmojis"],"mappings":";;;;;;AAUA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EAEN,YAAY;AAAA,IACV,SAAAA,MAAO;AAAA,EACR;AAAA,EAED,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW,CAAC,MAAM,OAAO,KAAKC,kCAAmB,EAAE,SAAS,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAED,OAAQ;AACN,WAAO;AAAA,MACL,kBAAkB;AAAA;EAErB;AAAA,EAED,MAAM,UAAW;AACf,SAAK,mBAAmB;AAAA,EACzB;AAAA,EAED,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKP,gBAAiB,aAAa,aAAa;AACzC,UAAI,CAAC,YAAY,OAAQ,QAAO;AAEhC,YAAM,qBAAqB,YAAY;AAAA,QAAI,UACzC,KAAK,QAAQ,OAAO,KAAK;AAAA;AAG3B,YAAM,SAAS,IAAI,OAAO,IAAI,mBAAmB,KAAK,GAAG,CAAC,KAAK,GAAG;AAClE,YAAM,QAAQ,YAAY,MAAM,MAAM;AAEtC,aAAO,MACJ,OAAO,UAAQ,KAAK,KAAI,MAAO,EAAE,EACjC,IAAI,CAAC,SAAS;AACb,YAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,iBAAOC,IAAC,EAACF,MAAO,SAAE,EAAE,MAAM,MAAM,MAAM,KAAK,KAAG,CAAG;AAAA,QACnD;AACA,eAAOE,IAAAA,EAAE,QAAQ,EAAE,OAAO,6BAA2B,GAAK,IAAI;AAAA,MAChE,CAAC;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,aAAc,OAAO;;AACnB,UAAI,OAAO,UAAU,SAAU,QAAO,KAAK,YAAY,KAAK;AAC5D,UAAI,OAAO,MAAM,SAAS,SAAU,QAAO,KAAK,YAAY,MAAM,QAAQ;AAC1E,WAAI,WAAM,UAAN,mBAAa,UAAW,QAAO,KAAK,aAAa,MAAM,MAAM,SAAS;AAE1E,YAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC,MAAM,QAAQ;AACjF,aAAOA,IAAC,EAAC,MAAM,MAAM,MAAM,OAAO,SAAS,IAAI,gBAAc,KAAK,aAAa,UAAU,CAAC,CAAC;AAAA,IAC5F;AAAA;AAAA,IAGD,gCAAiC,OAAO;AAAA,IAEvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,YAAa,aAAa;AACxB,YAAM,aAAaC,4BAAe,WAAW;AAC7C,YAAM,SAASC,wBAAW,WAAW;AAErC,YAAM,cAAc,CAAC,GAAG,YAAY,GAAG,MAAM;AAC7C,UAAI,YAAY,WAAW,EAAG,QAAO;AACrC,aAAO,KAAK,gBAAgB,aAAa,WAAW;AAAA,IACrD;AAAA,EACF;AAAA,EAED,SAAU;AACR,UAAM,qBAAqB,KAAK,OAAO,UAAU,KAAK,OAAO,QAAU,IAAE;AACzE,WAAOF,IAAC;AAAA,MACN,KAAK;AAAA,MACL;AAAA,QACE,WAAW;AAAA,QACX,OAAO;AAAA,MACR;AAAA,MACD,KAAK,mBACD,qBACA,mBAAmB,IAAI,WAAS,KAAK,aAAa,KAAK,CAAC;AAAA;EAE/D;AACH;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { findShortCodes } from "../../common/emoji.js";
|
|
1
|
+
import { findShortCodes, findEmojis } from "../../common/emoji.js";
|
|
2
2
|
import { h } from "vue";
|
|
3
3
|
import { ICON_SIZE_MODIFIERS } from "../icon/icon_constants.js";
|
|
4
|
-
import { emojiPattern } from "regex-combined-emojis";
|
|
5
4
|
import DtEmoji from "../emoji/emoji.vue.js";
|
|
6
5
|
const _sfc_main = {
|
|
7
6
|
name: "DtEmojiTextWrapper",
|
|
@@ -40,11 +39,13 @@ const _sfc_main = {
|
|
|
40
39
|
*/
|
|
41
40
|
replaceDtEmojis(replaceList, textContent) {
|
|
42
41
|
if (!replaceList.length) return textContent;
|
|
43
|
-
const
|
|
42
|
+
const escapedReplaceList = replaceList.map(
|
|
43
|
+
(item) => item.replace(/\*/g, "\\*")
|
|
44
|
+
);
|
|
45
|
+
const regexp = new RegExp(`(${escapedReplaceList.join("|")})`, "g");
|
|
44
46
|
const items = textContent.split(regexp);
|
|
45
47
|
return items.filter((item) => item.trim() !== "").map((item) => {
|
|
46
|
-
|
|
47
|
-
if (replaceList.includes(item) || regexp.test(item)) {
|
|
48
|
+
if (replaceList.includes(item)) {
|
|
48
49
|
return h(DtEmoji, { code: item, size: this.size });
|
|
49
50
|
}
|
|
50
51
|
return h("span", { class: "d-emoji-text-wrapper__text" }, item);
|
|
@@ -73,7 +74,8 @@ const _sfc_main = {
|
|
|
73
74
|
*/
|
|
74
75
|
searchCodes(textContent) {
|
|
75
76
|
const shortcodes = findShortCodes(textContent);
|
|
76
|
-
const
|
|
77
|
+
const emojis = findEmojis(textContent);
|
|
78
|
+
const replaceList = [...shortcodes, ...emojis];
|
|
77
79
|
if (replaceList.length === 0) return textContent;
|
|
78
80
|
return this.replaceDtEmojis(replaceList, textContent);
|
|
79
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji_text_wrapper.vue.js","sources":["../../../components/emoji_text_wrapper/emoji_text_wrapper.vue"],"sourcesContent":["<script>\nimport { DtEmoji } from '../emoji';\nimport { findShortCodes } from '@/common/emoji';\nimport { h } from 'vue';\nimport { ICON_SIZE_MODIFIERS } from '@/components/icon/icon_constants';\
|
|
1
|
+
{"version":3,"file":"emoji_text_wrapper.vue.js","sources":["../../../components/emoji_text_wrapper/emoji_text_wrapper.vue"],"sourcesContent":["<script>\nimport { DtEmoji } from '../emoji';\nimport { findEmojis, findShortCodes } from '@/common/emoji';\nimport { h } from 'vue';\nimport { ICON_SIZE_MODIFIERS } from '@/components/icon/icon_constants';\n\n/**\n * Wrapper to find and replace shortcodes like :smile: or unicode chars such as 😄 with our custom Emojis implementation.\n * @see https://dialtone.dialpad.com/components/emoji_text_wrapper.html\n */\nexport default {\n name: 'DtEmojiTextWrapper',\n\n components: {\n DtEmoji,\n },\n\n props: {\n /**\n * Element type (tag name) to use for the wrapper.\n */\n elementType: {\n type: String,\n default: 'div',\n },\n\n /**\n * The icon size to render the emojis at: 100 to 800\n */\n size: {\n type: String,\n default: '500',\n validator: (t) => Object.keys(ICON_SIZE_MODIFIERS).includes(t),\n },\n },\n\n data () {\n return {\n loadingEmojiJson: true,\n };\n },\n\n async created () {\n this.loadingEmojiJson = false;\n },\n\n methods: {\n /**\n * Replaces the valid codes from the text content with a DtEmoji component.\n * @returns {Array<VNode|string>}\n */\n replaceDtEmojis (replaceList, textContent) {\n if (!replaceList.length) return textContent;\n // Escape the asterisk to avoid breaking the regex for the asterisk emoji\n const escapedReplaceList = replaceList.map(item =>\n item.replace(/\\*/g, '\\\\*'),\n );\n\n const regexp = new RegExp(`(${escapedReplaceList.join('|')})`, 'g');\n const items = textContent.split(regexp);\n\n return items\n .filter(item => item.trim() !== '')\n .map((item) => {\n if (replaceList.includes(item)) {\n return h(DtEmoji, { code: item, size: this.size });\n }\n return h('span', { class: 'd-emoji-text-wrapper__text' }, item);\n });\n },\n\n /**\n * Recursively search the Vue virtual DOM to find text\n * @param VNode\n * @returns {VNode|*}\n */\n searchVNodes (VNode) {\n if (typeof VNode === 'string') return this.searchCodes(VNode);\n if (typeof VNode.type === 'symbol') return this.searchCodes(VNode.children);\n if (VNode.props?.innerHTML) return this.searchVNodes(VNode.props.innerHTML);\n\n const children = Array.isArray(VNode.children) ? VNode.children : [VNode.children];\n return h(VNode.type, VNode.props, children.map(VNodeChild => this.searchVNodes(VNodeChild)));\n },\n\n // TODO: Find a way to crawl vue components\n replaceVueComponentVNodeContent (VNode) {\n //\n },\n\n /**\n * Find codes in text.\n * @param textContent string\n * @returns {Array<VNode|string>|string}\n */\n searchCodes (textContent) {\n const shortcodes = findShortCodes(textContent);\n const emojis = findEmojis(textContent);\n\n const replaceList = [...shortcodes, ...emojis];\n if (replaceList.length === 0) return textContent;\n return this.replaceDtEmojis(replaceList, textContent);\n },\n },\n\n render () {\n const defaultSlotContent = this.$slots.default ? this.$slots.default() : [];\n return h(\n this.elementType,\n {\n 'data-qa': 'emoji-text-wrapper',\n class: 'd-emoji-text-wrapper',\n },\n this.loadingEmojiJson\n ? defaultSlotContent\n : defaultSlotContent.map(VNode => this.searchVNodes(VNode)),\n );\n },\n};\n</script>\n"],"names":[],"mappings":";;;;AAUA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EAEN,YAAY;AAAA,IACV;AAAA,EACD;AAAA,EAED,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW,CAAC,MAAM,OAAO,KAAK,mBAAmB,EAAE,SAAS,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAED,OAAQ;AACN,WAAO;AAAA,MACL,kBAAkB;AAAA;EAErB;AAAA,EAED,MAAM,UAAW;AACf,SAAK,mBAAmB;AAAA,EACzB;AAAA,EAED,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKP,gBAAiB,aAAa,aAAa;AACzC,UAAI,CAAC,YAAY,OAAQ,QAAO;AAEhC,YAAM,qBAAqB,YAAY;AAAA,QAAI,UACzC,KAAK,QAAQ,OAAO,KAAK;AAAA;AAG3B,YAAM,SAAS,IAAI,OAAO,IAAI,mBAAmB,KAAK,GAAG,CAAC,KAAK,GAAG;AAClE,YAAM,QAAQ,YAAY,MAAM,MAAM;AAEtC,aAAO,MACJ,OAAO,UAAQ,KAAK,KAAI,MAAO,EAAE,EACjC,IAAI,CAAC,SAAS;AACb,YAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,iBAAO,EAAE,SAAS,EAAE,MAAM,MAAM,MAAM,KAAK,KAAG,CAAG;AAAA,QACnD;AACA,eAAO,EAAE,QAAQ,EAAE,OAAO,6BAA2B,GAAK,IAAI;AAAA,MAChE,CAAC;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,aAAc,OAAO;;AACnB,UAAI,OAAO,UAAU,SAAU,QAAO,KAAK,YAAY,KAAK;AAC5D,UAAI,OAAO,MAAM,SAAS,SAAU,QAAO,KAAK,YAAY,MAAM,QAAQ;AAC1E,WAAI,WAAM,UAAN,mBAAa,UAAW,QAAO,KAAK,aAAa,MAAM,MAAM,SAAS;AAE1E,YAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC,MAAM,QAAQ;AACjF,aAAO,EAAE,MAAM,MAAM,MAAM,OAAO,SAAS,IAAI,gBAAc,KAAK,aAAa,UAAU,CAAC,CAAC;AAAA,IAC5F;AAAA;AAAA,IAGD,gCAAiC,OAAO;AAAA,IAEvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,YAAa,aAAa;AACxB,YAAM,aAAa,eAAe,WAAW;AAC7C,YAAM,SAAS,WAAW,WAAW;AAErC,YAAM,cAAc,CAAC,GAAG,YAAY,GAAG,MAAM;AAC7C,UAAI,YAAY,WAAW,EAAG,QAAO;AACrC,aAAO,KAAK,gBAAgB,aAAa,WAAW;AAAA,IACrD;AAAA,EACF;AAAA,EAED,SAAU;AACR,UAAM,qBAAqB,KAAK,OAAO,UAAU,KAAK,OAAO,QAAU,IAAE;AACzE,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,QACE,WAAW;AAAA,QACX,OAAO;AAAA,MACR;AAAA,MACD,KAAK,mBACD,qBACA,mBAAmB,IAAI,WAAS,KAAK,aAAa,KAAK,CAAC;AAAA;EAE/D;AACH;;"}
|
|
@@ -178,6 +178,7 @@ exports.emojiRegex = common_emoji.emojiRegex;
|
|
|
178
178
|
exports.emojiShortCodeRegex = common_emoji.emojiShortCodeRegex;
|
|
179
179
|
exports.emojiVersion = common_emoji.emojiVersion;
|
|
180
180
|
exports.filterValidShortCodes = common_emoji.filterValidShortCodes;
|
|
181
|
+
exports.findEmojis = common_emoji.findEmojis;
|
|
181
182
|
exports.findShortCodes = common_emoji.findShortCodes;
|
|
182
183
|
exports.getEmojiData = common_emoji.getEmojiData;
|
|
183
184
|
exports.setCustomEmojiJson = common_emoji.setCustomEmojiJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialtone-vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dialtone-vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,7 @@ import { DEFAULT_VALIDATION_MESSAGE_TYPE, DESCRIPTION_SIZE_TYPES, VALIDATION_MES
|
|
|
2
2
|
import { validationMessageValidator } from "./common/validators.js";
|
|
3
3
|
import { disableRootScrolling, enableRootScrolling, filterFormattedMessages, formatMessages, getUniqueString, getValidationState } from "./common/utils.js";
|
|
4
4
|
import { durationInHHMM, getDateMedium, relativeDate, setDateLocale } from "./common/dates.js";
|
|
5
|
-
import { codeToEmojiData, customEmojiAssetUrl, defaultEmojiAssetUrl, emojiFileExtensionLarge, emojiFileExtensionSmall, emojiImageUrlLarge, emojiImageUrlSmall, emojiJson, emojiRegex, emojiShortCodeRegex, emojiVersion, filterValidShortCodes, findShortCodes, getEmojiData, setCustomEmojiJson, setCustomEmojiUrl, setEmojiAssetUrlLarge, setEmojiAssetUrlSmall, shortcodeToEmojiData, stringToUnicode, unicodeToString, validateCustomEmojiJson } from "./common/emoji.js";
|
|
5
|
+
import { codeToEmojiData, customEmojiAssetUrl, defaultEmojiAssetUrl, emojiFileExtensionLarge, emojiFileExtensionSmall, emojiImageUrlLarge, emojiImageUrlSmall, emojiJson, emojiRegex, emojiShortCodeRegex, emojiVersion, filterValidShortCodes, findEmojis, findShortCodes, getEmojiData, setCustomEmojiJson, setCustomEmojiUrl, setEmojiAssetUrlLarge, setEmojiAssetUrlSmall, shortcodeToEmojiData, stringToUnicode, unicodeToString, validateCustomEmojiJson } from "./common/emoji.js";
|
|
6
6
|
import { CheckableMixin, GroupableMixin, InputMixin } from "./common/mixins/input.js";
|
|
7
7
|
import { InputGroupMixin } from "./common/mixins/input_group.js";
|
|
8
8
|
import { default as default2 } from "./common/mixins/keyboard_list_navigation.js";
|
|
@@ -361,6 +361,7 @@ export {
|
|
|
361
361
|
enableRootScrolling,
|
|
362
362
|
filterFormattedMessages,
|
|
363
363
|
filterValidShortCodes,
|
|
364
|
+
findEmojis,
|
|
364
365
|
findShortCodes,
|
|
365
366
|
formatLong,
|
|
366
367
|
formatMedium,
|
|
@@ -377,6 +377,7 @@ const _sfc_main = {
|
|
|
377
377
|
(_a = this.$refs.input) == null ? void 0 : _a.focus();
|
|
378
378
|
},
|
|
379
379
|
onComboboxSelect(i) {
|
|
380
|
+
if (this.loading) return;
|
|
380
381
|
this.value = "";
|
|
381
382
|
this.$emit("select", i);
|
|
382
383
|
},
|
|
@@ -653,6 +654,6 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
653
654
|
} : void 0
|
|
654
655
|
]), 1032, ["label", "show-list", "max-height", "max-width", "popover-offset", "has-suggestion-list", "visually-hidden-close-label", "visually-hidden-close", "append-to", "transition", "onSelect", "onHighlight"]);
|
|
655
656
|
}
|
|
656
|
-
const combobox_multi_select = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-
|
|
657
|
+
const combobox_multi_select = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-489217f9"]]);
|
|
657
658
|
exports.default = combobox_multi_select;
|
|
658
659
|
//# sourceMappingURL=combobox_multi_select.vue.cjs.map
|
package/dist/vue3/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox_multi_select.vue.cjs","sources":["../../../../recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue"],"sourcesContent":["<!-- eslint-disable vue/no-static-inline-styles -->\n<template>\n <dt-recipe-combobox-with-popover\n ref=\"comboboxWithPopover\"\n :label=\"label\"\n :show-list=\"showList\"\n :max-height=\"listMaxHeight\"\n :max-width=\"listMaxWidth\"\n :popover-offset=\"popoverOffset\"\n :has-suggestion-list=\"hasSuggestionList\"\n :visually-hidden-close-label=\"visuallyHiddenCloseLabel\"\n :visually-hidden-close=\"visuallyHiddenClose\"\n content-width=\"anchor\"\n :append-to=\"appendTo\"\n :transition=\"transition\"\n @select=\"onComboboxSelect\"\n @highlight=\"comboboxHighlight\"\n >\n <template #input=\"{ onInput }\">\n <span\n ref=\"inputSlotWrapper\"\n class=\"combobox__input-wrapper\"\n @focusin=\"handleInputFocusIn\"\n @focusout=\"handleInputFocusOut\"\n >\n <span\n ref=\"chipsWrapper\"\n :class=\"['combobox__chip-wrapper', chipWrapperClass]\"\n >\n <dt-chip\n v-for=\"item in selectedItems\"\n ref=\"chips\"\n :key=\"item\"\n :label-class=\"['d-chip__label']\"\n :class=\"['combobox__chip', { 'combobox__chip--truncate': !!chipMaxWidth }]\"\n :style=\"{ maxWidth: chipMaxWidth }\"\n :close-button-props=\"{ ariaLabel: 'close' }\"\n :size=\"CHIP_SIZES[size]\"\n v-on=\"chipListeners\"\n @keyup.backspace=\"onChipRemove(item)\"\n @close=\"onChipRemove(item)\"\n >\n {{ item }}\n </dt-chip>\n </span>\n\n <dt-input\n ref=\"input\"\n v-model=\"value\"\n class=\"combobox__input\"\n :input-class=\"[inputClass, { 'd-fc-transparent': hideInputText }]\"\n :input-wrapper-class=\"inputWrapperClass\"\n :aria-label=\"label\"\n :label=\"labelVisible ? label : ''\"\n :description=\"description\"\n :placeholder=\"inputPlaceHolder\"\n :show-messages=\"showInputMessages\"\n :messages=\"inputMessages\"\n :size=\"size\"\n v-on=\"inputListeners\"\n @input=\"onInput\"\n />\n\n <dt-validation-messages\n :validation-messages=\"maxSelectedMessage\"\n :show-messages=\"showValidationMessages\"\n />\n </span>\n </template>\n\n <!-- @slot slot for popover header -->\n <template\n v-if=\"hasSlotContent($slots.header)\"\n #header\n >\n <div ref=\"header\">\n <slot name=\"header\" />\n </div>\n </template>\n\n <!-- @slot slot for popover list -->\n <template #list>\n <div\n ref=\"list\"\n @mousedown.prevent\n >\n <slot\n v-if=\"!loading\"\n name=\"list\"\n />\n <div\n v-else\n class=\"combobox__list--loading\"\n >\n {{ loadingMessage }}\n </div>\n </div>\n </template>\n\n <!-- @slot slot for popover footer -->\n <template\n v-if=\"hasSlotContent($slots.footer)\"\n #footer\n >\n <div ref=\"footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </dt-recipe-combobox-with-popover>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport DtRecipeComboboxWithPopover from '@/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue';\nimport DtInput from '@/components/input/input.vue';\nimport DtChip from '@/components/chip/chip.vue';\nimport DtValidationMessages from '@/components/validation_messages/validation_messages.vue';\nimport { validationMessageValidator } from '@/common/validators';\nimport { hasSlotContent } from '@/common/utils';\nimport {\n POPOVER_APPEND_TO_VALUES,\n} from '@/components/popover/popover_constants';\nimport {\n MULTI_SELECT_SIZES,\n CHIP_SIZES,\n CHIP_TOP_POSITION,\n} from './combobox_multi_select_constants';\nimport SrOnlyCloseButtonMixin from '@/common/mixins/sr_only_close_button';\n\nexport default {\n name: 'DtRecipeComboboxMultiSelect',\n\n components: {\n DtRecipeComboboxWithPopover,\n DtInput,\n DtChip,\n DtValidationMessages,\n },\n\n mixins: [SrOnlyCloseButtonMixin],\n\n props: {\n /**\n * String to use for the input label.\n */\n label: {\n type: String,\n required: true,\n },\n\n /**\n * Determines visibility of input label.\n * @values true, false\n */\n labelVisible: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Description for the input\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Input placeholder\n */\n placeholder: {\n type: String,\n default: 'Select one or start typing',\n },\n\n /**\n * Input validation messages\n */\n inputMessages: {\n type: Array,\n default: () => [],\n validator: inputMessages => {\n return validationMessageValidator(inputMessages);\n },\n },\n\n /**\n * Show input validation message\n */\n showInputMessages: {\n type: Boolean,\n default: true,\n },\n\n // @TODO: https://dialpad.atlassian.net/browse/DP-52324\n // type: {\n // type: String,\n // values: ['input', 'select'],\n // default: 'select',\n // },\n\n /**\n * Determines if the list is loading\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The message when the list is loading\n */\n loadingMessage: {\n type: String,\n default: 'loading...',\n },\n\n /**\n * Determines when to show the list element and also controls the aria-expanded attribute.\n * Leaving this null will have the combobox trigger on input focus by default.\n * If you set this value, the default trigger behavior will be disabled and you can\n * control it as you need.\n */\n showList: {\n type: Boolean,\n default: null,\n },\n\n /**\n * Determines maximum height for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxHeight: {\n type: String,\n default: '300px',\n },\n\n /**\n * The selected items\n */\n selectedItems: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Would be the maximum number of selections you can make. 0 is unlimited\n */\n maxSelected: {\n type: Number,\n default: 0,\n },\n\n /**\n * Max select message when the max selections is exceeded with the structure:\n * `[{\"message\": string, \"type\": VALIDATION_MESSAGE_TYPES }]`\n */\n maxSelectedMessage: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Displays the list when the combobox is focused, before the user has typed anything.\n * When this is enabled the list will not close after selection.\n */\n hasSuggestionList: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Size of the chip, one of `xs`, `sm`, `md`\n */\n size: {\n type: String,\n default: 'md',\n validator: (t) => Object.values(MULTI_SELECT_SIZES).includes(t),\n },\n\n /**\n * Sets the element to which the popover is going to append to.\n * 'body' will append to the nearest body (supports shadow DOM).\n * @values 'body', 'parent', HTMLElement,\n */\n appendTo: {\n type: [HTMLElement, String],\n default: 'body',\n validator: appendTo => {\n return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||\n (appendTo instanceof HTMLElement);\n },\n },\n\n /**\n * Named transition when the content display is toggled.\n * @see DtLazyShow\n */\n transition: {\n type: String,\n default: 'fade',\n },\n\n /**\n * Determines whether the combobox should collapse to a single when losing focus.\n * @type {boolean}\n */\n collapseOnFocusOut: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines maximum width for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Amount of reserved space (in px) on the right side of the input\n * before the chips and the input caret jump to the next line.\n * default is 64\n */\n reservedRightSpace: {\n type: Number,\n default: 64,\n },\n\n /**\n * Determines the maximum width of a single chip. If the text within this chip exceeds the value\n * it will be truncated with ellipses.\n * Possible units rem|px|em\n */\n chipMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Additional class name for the input element.\n * Can accept String, Object, and Array, i.e. has the\n * same API as Vue's built-in handling of the class attribute.\n */\n inputClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the input wrapper element.\n * Can accept all of String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n inputWrapperClass: {\n type: [String, Object, Array],\n default: '',\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String }\n */\n 'input',\n\n /**\n * Event fired when item selected\n *\n * @event select\n * @type {Number}\n */\n 'select',\n\n /**\n * Event fired when item removed\n *\n * @event remove\n * @type {String}\n */\n 'remove',\n\n /**\n * Event fired when max selected items limit is reached\n *\n * @event max-selected\n * @type {Object}\n */\n 'max-selected',\n\n /**\n * Native keyup event\n *\n * @event keyup\n * @type {KeyboardEvent}\n */\n 'keyup',\n\n /**\n * Event fired when combobox item is highlighted\n *\n * @event combobox-highlight\n * @type {Object}\n */\n 'combobox-highlight',\n ],\n\n data () {\n return {\n value: '',\n popoverOffset: [0, 4],\n showValidationMessages: false,\n resizeWindowObserver: null,\n initialInputHeight: null,\n CHIP_SIZES,\n hasSlotContent,\n inputFocused: false,\n hideInputText: false,\n };\n },\n\n computed: {\n inputPlaceHolder () {\n return this.selectedItems?.length > 0 ? '' : this.placeholder;\n },\n\n chipListeners () {\n return {\n keyup: event => {\n this.onChipKeyup(event);\n this.$emit('keyup', event);\n },\n };\n },\n\n inputListeners () {\n return {\n input: event => {\n this.$emit('input', event);\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n\n keyup: event => {\n this.onInputKeyup(event);\n this.$emit('keyup', event);\n },\n\n click: event => {\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n };\n },\n\n chipWrapperClass () {\n return {\n [`combobox__chip-wrapper-${this.size}--collapsed`]: !this.inputFocused && this.collapseOnFocusOut,\n };\n },\n },\n\n watch: {\n selectedItems: {\n deep: true,\n handler: async function () {\n this.initSelectedItems();\n },\n },\n\n chipMaxWidth: {\n async handler () {\n this.initSelectedItems();\n },\n },\n\n async label () {\n await this.$nextTick();\n // Adjust the chips position if label changed\n this.setChipsTopPosition();\n },\n\n async description () {\n await this.$nextTick();\n // Adjust the chips position if description changed\n this.setChipsTopPosition();\n },\n\n size: {\n async handler () {\n await this.$nextTick();\n const input = this.getInput();\n this.revertInputPadding(input);\n this.initialInputHeight = input.getBoundingClientRect().height;\n this.setInputPadding();\n this.setChipsTopPosition();\n },\n },\n },\n\n mounted () {\n this.setInitialInputHeight();\n // Recalculate chip position and input padding when resizing window\n this.resizeWindowObserver = new ResizeObserver(async () => {\n this.setChipsTopPosition();\n this.setInputPadding();\n });\n this.resizeWindowObserver.observe(document.body);\n\n this.initSelectedItems();\n },\n\n beforeUnmount () {\n this.resizeWindowObserver?.unobserve(document.body);\n },\n\n methods: {\n comboboxHighlight (highlightIndex) {\n this.$emit('combobox-highlight', highlightIndex);\n },\n\n async initSelectedItems () {\n await this.$nextTick();\n this.setInputPadding();\n this.setChipsTopPosition();\n this.setInputMinWidth();\n this.checkMaxSelected();\n },\n\n onChipRemove (item) {\n this.$emit('remove', item);\n this.$refs.input?.focus();\n },\n\n onComboboxSelect (i) {\n this.value = '';\n this.$emit('select', i);\n },\n\n showComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.showComboboxList();\n },\n\n closeComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.closeComboboxList();\n },\n\n getChipButtons () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el.querySelector('button'));\n },\n\n getChips () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el);\n },\n\n getLastChipButton () {\n return this.$refs.chips && this.getChipButtons()[this.getChipButtons().length - 1];\n },\n\n getLastChip () {\n return this.$refs.chips && this.getChips()[this.getChips().length - 1];\n },\n\n getFirstChip () {\n return this.$refs.chips && this.getChips()[0];\n },\n\n getInput () {\n return this.$refs.input?.$refs.input;\n },\n\n onChipKeyup (event) {\n const key = event.code?.toLowerCase();\n if (key === 'arrowleft') {\n // Move to the previous chip\n this.navigateBetweenChips(event.target, true);\n } else if (key === 'arrowright') {\n if (event.target.id === this.getLastChipButton().id) {\n // Move to the input if it's the last chip\n this.moveFromChipToInput();\n } else {\n // Move to the next chip\n this.navigateBetweenChips(event.target, false);\n }\n }\n },\n\n onInputKeyup (event) {\n const key = event.code?.toLowerCase();\n // If the cursor is at the start of the text,\n // press 'backspace' or 'left' focuses the last chip\n if (this.selectedItems.length > 0 && event.target.selectionStart === 0) {\n if (key === 'backspace' || key === 'arrowleft') {\n this.moveFromInputToChip();\n }\n }\n },\n\n moveFromInputToChip () {\n this.getLastChipButton().focus();\n this.$refs.input?.blur();\n this.closeComboboxList();\n },\n\n moveFromChipToInput () {\n this.getLastChipButton().blur();\n this.$refs.input?.focus();\n this.showComboboxList();\n },\n\n navigateBetweenChips (target, toLeft) {\n const from = this.getChipButtons().indexOf(target);\n const to = toLeft ? from - 1 : from + 1;\n if (to < 0 || to >= this.$refs.chips?.length) {\n return;\n }\n this.getChipButtons()[from].blur();\n this.getChipButtons()[to].focus();\n this.closeComboboxList();\n },\n\n setChipsTopPosition () {\n // To place the chips in the input box\n // The chip \"top\" position should be the same line as the input box\n const input = this.getInput();\n if (!input) return;\n const inputSlotWrapper = this.$refs.inputSlotWrapper;\n const top = input.getBoundingClientRect().top -\n inputSlotWrapper.getBoundingClientRect().top;\n const chipsWrapper = this.$refs.chipsWrapper;\n chipsWrapper.style.top = (top - CHIP_TOP_POSITION[this.size]) + 'px';\n },\n\n setInputPadding () {\n const lastChip = this.getLastChip();\n const input = this.getInput();\n const chipsWrapper = this.$refs.chipsWrapper;\n if (!input) return;\n this.revertInputPadding(input);\n this.popoverOffset = [0, 4];\n if (!lastChip) return;\n // Avoid adding extra padding when the input is not focused if collapseOnFocusOut is true\n // This ensures the input returns to its original state when resizing\n if (this.collapseOnFocusOut && !this.inputFocused) return;\n\n // Get the position of the last chip\n // The input cursor should be the same \"top\" as that chip and next besides it\n const left = lastChip.offsetLeft + this.getFullWidth(lastChip);\n const spaceLeft = input.getBoundingClientRect().width - left;\n // input.style.paddingLeft = left + 'px';\n\n if (spaceLeft > this.reservedRightSpace) {\n input.style.paddingLeft = left + 'px';\n } else {\n input.style.paddingLeft = '4px';\n }\n\n // Get the chip wrapper height minus the 4px padding\n const chipsWrapperHeight = chipsWrapper.getBoundingClientRect().height - 4;\n const lastChipHeight = lastChip.getBoundingClientRect().height - 4;\n\n // Get lastChip offsetTop plus 2px of the input padding.\n const top = spaceLeft > this.reservedRightSpace\n ? lastChip.offsetTop + 2\n : (chipsWrapperHeight + lastChipHeight - 9);\n\n input.style.paddingTop = `${top}px`;\n },\n\n revertInputPadding (input) {\n input.style.paddingLeft = '';\n input.style.paddingTop = '';\n input.style.paddingBottom = '';\n },\n\n getFullWidth (el) {\n const styles = window.getComputedStyle(el);\n return el.offsetWidth + parseInt(styles.marginLeft) + parseInt(styles.marginRight);\n },\n\n setInputMinWidth () {\n // Ensure the width of the input is \"slightly bigger\" than the width of a single chip\n const firstChip = this.getFirstChip();\n const input = this.getInput();\n if (!input) return;\n if (firstChip) {\n // Add 4px buffer for typing room\n input.style.minWidth = (this.getFullWidth(firstChip) + 4) + 'px';\n } else {\n input.style.minWidth = '';\n }\n },\n\n checkMaxSelected () {\n if (this.maxSelected === 0) return;\n if (this.selectedItems.length > this.maxSelected) {\n this.showValidationMessages = true;\n this.$emit('max-selected');\n } else {\n this.showValidationMessages = false;\n }\n },\n\n setInitialInputHeight () {\n const input = this.getInput();\n if (!input) return;\n this.initialInputHeight = input.getBoundingClientRect().height;\n },\n\n async handleInputFocusIn () {\n this.inputFocused = true;\n if (this.collapseOnFocusOut) {\n await this.$nextTick();\n this.setInputPadding();\n this.hideInputText = false;\n }\n },\n\n async handleInputFocusOut () {\n this.inputFocused = false;\n if (this.collapseOnFocusOut) {\n const input = this.getInput();\n if (!input) return;\n // Hide the input text when is not on first line\n if (!input.style.paddingTop) {\n return;\n }\n this.hideInputText = true;\n this.revertInputPadding(input);\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"less\">\n.combobox__input-wrapper {\n position: relative;\n display: block;\n}\n\n.combobox__chip-wrapper {\n position: absolute;\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n padding-left: var(--dt-space-100);\n max-width: calc(var(--dt-size-100-percent) - var(--dt-space-400));\n max-height: initial;\n overflow-y: visible;\n}\n\n.combobox__chip-wrapper-md--collapsed {\n max-height: 2.8rem;\n overflow-y: hidden;\n}\n\n.combobox__chip-wrapper-sm--collapsed,\n.combobox__chip-wrapper-xs--collapsed {\n max-height: 2.5rem;\n overflow-y: hidden;\n}\n\n.combobox__chip {\n margin-top: var(--dt-space-300);\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n z-index: var(--zi-base1);\n max-width: var(--dt-size-100-percent);\n}\n\n.combobox__input {\n flex-grow: 1;\n}\n\n.combobox__list--loading {\n text-align: center;\n padding-top: var(--dt-space-500);\n padding-bottom: var(--dt-space-500);\n}\n\n.combobox__chip--truncate {\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n</style>\n"],"names":["DtRecipeComboboxWithPopover","DtInput","DtChip","DtValidationMessages","SrOnlyCloseButtonMixin","validationMessageValidator","MULTI_SELECT_SIZES","POPOVER_APPEND_TO_VALUES","CHIP_SIZES","hasSlotContent","input","chip","CHIP_TOP_POSITION","_createBlock","_createSlots","_withCtx","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_Fragment","_renderList","_mergeProps","_toHandlers","_withKeys","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","_renderSlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combobox_multi_select.vue.cjs","sources":["../../../../recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue"],"sourcesContent":["<!-- eslint-disable vue/no-static-inline-styles -->\n<template>\n <dt-recipe-combobox-with-popover\n ref=\"comboboxWithPopover\"\n :label=\"label\"\n :show-list=\"showList\"\n :max-height=\"listMaxHeight\"\n :max-width=\"listMaxWidth\"\n :popover-offset=\"popoverOffset\"\n :has-suggestion-list=\"hasSuggestionList\"\n :visually-hidden-close-label=\"visuallyHiddenCloseLabel\"\n :visually-hidden-close=\"visuallyHiddenClose\"\n content-width=\"anchor\"\n :append-to=\"appendTo\"\n :transition=\"transition\"\n @select=\"onComboboxSelect\"\n @highlight=\"comboboxHighlight\"\n >\n <template #input=\"{ onInput }\">\n <span\n ref=\"inputSlotWrapper\"\n class=\"combobox__input-wrapper\"\n @focusin=\"handleInputFocusIn\"\n @focusout=\"handleInputFocusOut\"\n >\n <span\n ref=\"chipsWrapper\"\n :class=\"['combobox__chip-wrapper', chipWrapperClass]\"\n >\n <dt-chip\n v-for=\"item in selectedItems\"\n ref=\"chips\"\n :key=\"item\"\n :label-class=\"['d-chip__label']\"\n :class=\"['combobox__chip', { 'combobox__chip--truncate': !!chipMaxWidth }]\"\n :style=\"{ maxWidth: chipMaxWidth }\"\n :close-button-props=\"{ ariaLabel: 'close' }\"\n :size=\"CHIP_SIZES[size]\"\n v-on=\"chipListeners\"\n @keyup.backspace=\"onChipRemove(item)\"\n @close=\"onChipRemove(item)\"\n >\n {{ item }}\n </dt-chip>\n </span>\n\n <dt-input\n ref=\"input\"\n v-model=\"value\"\n class=\"combobox__input\"\n :input-class=\"[inputClass, { 'd-fc-transparent': hideInputText }]\"\n :input-wrapper-class=\"inputWrapperClass\"\n :aria-label=\"label\"\n :label=\"labelVisible ? label : ''\"\n :description=\"description\"\n :placeholder=\"inputPlaceHolder\"\n :show-messages=\"showInputMessages\"\n :messages=\"inputMessages\"\n :size=\"size\"\n v-on=\"inputListeners\"\n @input=\"onInput\"\n />\n\n <dt-validation-messages\n :validation-messages=\"maxSelectedMessage\"\n :show-messages=\"showValidationMessages\"\n />\n </span>\n </template>\n\n <!-- @slot slot for popover header -->\n <template\n v-if=\"hasSlotContent($slots.header)\"\n #header\n >\n <div ref=\"header\">\n <slot name=\"header\" />\n </div>\n </template>\n\n <!-- @slot slot for popover list -->\n <template #list>\n <div\n ref=\"list\"\n @mousedown.prevent\n >\n <slot\n v-if=\"!loading\"\n name=\"list\"\n />\n <div\n v-else\n class=\"combobox__list--loading\"\n >\n {{ loadingMessage }}\n </div>\n </div>\n </template>\n\n <!-- @slot slot for popover footer -->\n <template\n v-if=\"hasSlotContent($slots.footer)\"\n #footer\n >\n <div ref=\"footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </dt-recipe-combobox-with-popover>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport DtRecipeComboboxWithPopover from '@/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue';\nimport DtInput from '@/components/input/input.vue';\nimport DtChip from '@/components/chip/chip.vue';\nimport DtValidationMessages from '@/components/validation_messages/validation_messages.vue';\nimport { validationMessageValidator } from '@/common/validators';\nimport { hasSlotContent } from '@/common/utils';\nimport {\n POPOVER_APPEND_TO_VALUES,\n} from '@/components/popover/popover_constants';\nimport {\n MULTI_SELECT_SIZES,\n CHIP_SIZES,\n CHIP_TOP_POSITION,\n} from './combobox_multi_select_constants';\nimport SrOnlyCloseButtonMixin from '@/common/mixins/sr_only_close_button';\n\nexport default {\n name: 'DtRecipeComboboxMultiSelect',\n\n components: {\n DtRecipeComboboxWithPopover,\n DtInput,\n DtChip,\n DtValidationMessages,\n },\n\n mixins: [SrOnlyCloseButtonMixin],\n\n props: {\n /**\n * String to use for the input label.\n */\n label: {\n type: String,\n required: true,\n },\n\n /**\n * Determines visibility of input label.\n * @values true, false\n */\n labelVisible: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Description for the input\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Input placeholder\n */\n placeholder: {\n type: String,\n default: 'Select one or start typing',\n },\n\n /**\n * Input validation messages\n */\n inputMessages: {\n type: Array,\n default: () => [],\n validator: inputMessages => {\n return validationMessageValidator(inputMessages);\n },\n },\n\n /**\n * Show input validation message\n */\n showInputMessages: {\n type: Boolean,\n default: true,\n },\n\n // @TODO: https://dialpad.atlassian.net/browse/DP-52324\n // type: {\n // type: String,\n // values: ['input', 'select'],\n // default: 'select',\n // },\n\n /**\n * Determines if the list is loading\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The message when the list is loading\n */\n loadingMessage: {\n type: String,\n default: 'loading...',\n },\n\n /**\n * Determines when to show the list element and also controls the aria-expanded attribute.\n * Leaving this null will have the combobox trigger on input focus by default.\n * If you set this value, the default trigger behavior will be disabled and you can\n * control it as you need.\n */\n showList: {\n type: Boolean,\n default: null,\n },\n\n /**\n * Determines maximum height for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxHeight: {\n type: String,\n default: '300px',\n },\n\n /**\n * The selected items\n */\n selectedItems: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Would be the maximum number of selections you can make. 0 is unlimited\n */\n maxSelected: {\n type: Number,\n default: 0,\n },\n\n /**\n * Max select message when the max selections is exceeded with the structure:\n * `[{\"message\": string, \"type\": VALIDATION_MESSAGE_TYPES }]`\n */\n maxSelectedMessage: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Displays the list when the combobox is focused, before the user has typed anything.\n * When this is enabled the list will not close after selection.\n */\n hasSuggestionList: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Size of the chip, one of `xs`, `sm`, `md`\n */\n size: {\n type: String,\n default: 'md',\n validator: (t) => Object.values(MULTI_SELECT_SIZES).includes(t),\n },\n\n /**\n * Sets the element to which the popover is going to append to.\n * 'body' will append to the nearest body (supports shadow DOM).\n * @values 'body', 'parent', HTMLElement,\n */\n appendTo: {\n type: [HTMLElement, String],\n default: 'body',\n validator: appendTo => {\n return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||\n (appendTo instanceof HTMLElement);\n },\n },\n\n /**\n * Named transition when the content display is toggled.\n * @see DtLazyShow\n */\n transition: {\n type: String,\n default: 'fade',\n },\n\n /**\n * Determines whether the combobox should collapse to a single when losing focus.\n * @type {boolean}\n */\n collapseOnFocusOut: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines maximum width for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Amount of reserved space (in px) on the right side of the input\n * before the chips and the input caret jump to the next line.\n * default is 64\n */\n reservedRightSpace: {\n type: Number,\n default: 64,\n },\n\n /**\n * Determines the maximum width of a single chip. If the text within this chip exceeds the value\n * it will be truncated with ellipses.\n * Possible units rem|px|em\n */\n chipMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Additional class name for the input element.\n * Can accept String, Object, and Array, i.e. has the\n * same API as Vue's built-in handling of the class attribute.\n */\n inputClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the input wrapper element.\n * Can accept all of String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n inputWrapperClass: {\n type: [String, Object, Array],\n default: '',\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String }\n */\n 'input',\n\n /**\n * Event fired when item selected\n *\n * @event select\n * @type {Number}\n */\n 'select',\n\n /**\n * Event fired when item removed\n *\n * @event remove\n * @type {String}\n */\n 'remove',\n\n /**\n * Event fired when max selected items limit is reached\n *\n * @event max-selected\n * @type {Object}\n */\n 'max-selected',\n\n /**\n * Native keyup event\n *\n * @event keyup\n * @type {KeyboardEvent}\n */\n 'keyup',\n\n /**\n * Event fired when combobox item is highlighted\n *\n * @event combobox-highlight\n * @type {Object}\n */\n 'combobox-highlight',\n ],\n\n data () {\n return {\n value: '',\n popoverOffset: [0, 4],\n showValidationMessages: false,\n resizeWindowObserver: null,\n initialInputHeight: null,\n CHIP_SIZES,\n hasSlotContent,\n inputFocused: false,\n hideInputText: false,\n };\n },\n\n computed: {\n inputPlaceHolder () {\n return this.selectedItems?.length > 0 ? '' : this.placeholder;\n },\n\n chipListeners () {\n return {\n keyup: event => {\n this.onChipKeyup(event);\n this.$emit('keyup', event);\n },\n };\n },\n\n inputListeners () {\n return {\n input: event => {\n this.$emit('input', event);\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n\n keyup: event => {\n this.onInputKeyup(event);\n this.$emit('keyup', event);\n },\n\n click: event => {\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n };\n },\n\n chipWrapperClass () {\n return {\n [`combobox__chip-wrapper-${this.size}--collapsed`]: !this.inputFocused && this.collapseOnFocusOut,\n };\n },\n },\n\n watch: {\n selectedItems: {\n deep: true,\n handler: async function () {\n this.initSelectedItems();\n },\n },\n\n chipMaxWidth: {\n async handler () {\n this.initSelectedItems();\n },\n },\n\n async label () {\n await this.$nextTick();\n // Adjust the chips position if label changed\n this.setChipsTopPosition();\n },\n\n async description () {\n await this.$nextTick();\n // Adjust the chips position if description changed\n this.setChipsTopPosition();\n },\n\n size: {\n async handler () {\n await this.$nextTick();\n const input = this.getInput();\n this.revertInputPadding(input);\n this.initialInputHeight = input.getBoundingClientRect().height;\n this.setInputPadding();\n this.setChipsTopPosition();\n },\n },\n },\n\n mounted () {\n this.setInitialInputHeight();\n // Recalculate chip position and input padding when resizing window\n this.resizeWindowObserver = new ResizeObserver(async () => {\n this.setChipsTopPosition();\n this.setInputPadding();\n });\n this.resizeWindowObserver.observe(document.body);\n\n this.initSelectedItems();\n },\n\n beforeUnmount () {\n this.resizeWindowObserver?.unobserve(document.body);\n },\n\n methods: {\n comboboxHighlight (highlightIndex) {\n this.$emit('combobox-highlight', highlightIndex);\n },\n\n async initSelectedItems () {\n await this.$nextTick();\n this.setInputPadding();\n this.setChipsTopPosition();\n this.setInputMinWidth();\n this.checkMaxSelected();\n },\n\n onChipRemove (item) {\n this.$emit('remove', item);\n this.$refs.input?.focus();\n },\n\n onComboboxSelect (i) {\n if (this.loading) return;\n this.value = '';\n this.$emit('select', i);\n },\n\n showComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.showComboboxList();\n },\n\n closeComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.closeComboboxList();\n },\n\n getChipButtons () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el.querySelector('button'));\n },\n\n getChips () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el);\n },\n\n getLastChipButton () {\n return this.$refs.chips && this.getChipButtons()[this.getChipButtons().length - 1];\n },\n\n getLastChip () {\n return this.$refs.chips && this.getChips()[this.getChips().length - 1];\n },\n\n getFirstChip () {\n return this.$refs.chips && this.getChips()[0];\n },\n\n getInput () {\n return this.$refs.input?.$refs.input;\n },\n\n onChipKeyup (event) {\n const key = event.code?.toLowerCase();\n if (key === 'arrowleft') {\n // Move to the previous chip\n this.navigateBetweenChips(event.target, true);\n } else if (key === 'arrowright') {\n if (event.target.id === this.getLastChipButton().id) {\n // Move to the input if it's the last chip\n this.moveFromChipToInput();\n } else {\n // Move to the next chip\n this.navigateBetweenChips(event.target, false);\n }\n }\n },\n\n onInputKeyup (event) {\n const key = event.code?.toLowerCase();\n // If the cursor is at the start of the text,\n // press 'backspace' or 'left' focuses the last chip\n if (this.selectedItems.length > 0 && event.target.selectionStart === 0) {\n if (key === 'backspace' || key === 'arrowleft') {\n this.moveFromInputToChip();\n }\n }\n },\n\n moveFromInputToChip () {\n this.getLastChipButton().focus();\n this.$refs.input?.blur();\n this.closeComboboxList();\n },\n\n moveFromChipToInput () {\n this.getLastChipButton().blur();\n this.$refs.input?.focus();\n this.showComboboxList();\n },\n\n navigateBetweenChips (target, toLeft) {\n const from = this.getChipButtons().indexOf(target);\n const to = toLeft ? from - 1 : from + 1;\n if (to < 0 || to >= this.$refs.chips?.length) {\n return;\n }\n this.getChipButtons()[from].blur();\n this.getChipButtons()[to].focus();\n this.closeComboboxList();\n },\n\n setChipsTopPosition () {\n // To place the chips in the input box\n // The chip \"top\" position should be the same line as the input box\n const input = this.getInput();\n if (!input) return;\n const inputSlotWrapper = this.$refs.inputSlotWrapper;\n const top = input.getBoundingClientRect().top -\n inputSlotWrapper.getBoundingClientRect().top;\n const chipsWrapper = this.$refs.chipsWrapper;\n chipsWrapper.style.top = (top - CHIP_TOP_POSITION[this.size]) + 'px';\n },\n\n setInputPadding () {\n const lastChip = this.getLastChip();\n const input = this.getInput();\n const chipsWrapper = this.$refs.chipsWrapper;\n if (!input) return;\n this.revertInputPadding(input);\n this.popoverOffset = [0, 4];\n if (!lastChip) return;\n // Avoid adding extra padding when the input is not focused if collapseOnFocusOut is true\n // This ensures the input returns to its original state when resizing\n if (this.collapseOnFocusOut && !this.inputFocused) return;\n\n // Get the position of the last chip\n // The input cursor should be the same \"top\" as that chip and next besides it\n const left = lastChip.offsetLeft + this.getFullWidth(lastChip);\n const spaceLeft = input.getBoundingClientRect().width - left;\n // input.style.paddingLeft = left + 'px';\n\n if (spaceLeft > this.reservedRightSpace) {\n input.style.paddingLeft = left + 'px';\n } else {\n input.style.paddingLeft = '4px';\n }\n\n // Get the chip wrapper height minus the 4px padding\n const chipsWrapperHeight = chipsWrapper.getBoundingClientRect().height - 4;\n const lastChipHeight = lastChip.getBoundingClientRect().height - 4;\n\n // Get lastChip offsetTop plus 2px of the input padding.\n const top = spaceLeft > this.reservedRightSpace\n ? lastChip.offsetTop + 2\n : (chipsWrapperHeight + lastChipHeight - 9);\n\n input.style.paddingTop = `${top}px`;\n },\n\n revertInputPadding (input) {\n input.style.paddingLeft = '';\n input.style.paddingTop = '';\n input.style.paddingBottom = '';\n },\n\n getFullWidth (el) {\n const styles = window.getComputedStyle(el);\n return el.offsetWidth + parseInt(styles.marginLeft) + parseInt(styles.marginRight);\n },\n\n setInputMinWidth () {\n // Ensure the width of the input is \"slightly bigger\" than the width of a single chip\n const firstChip = this.getFirstChip();\n const input = this.getInput();\n if (!input) return;\n if (firstChip) {\n // Add 4px buffer for typing room\n input.style.minWidth = (this.getFullWidth(firstChip) + 4) + 'px';\n } else {\n input.style.minWidth = '';\n }\n },\n\n checkMaxSelected () {\n if (this.maxSelected === 0) return;\n if (this.selectedItems.length > this.maxSelected) {\n this.showValidationMessages = true;\n this.$emit('max-selected');\n } else {\n this.showValidationMessages = false;\n }\n },\n\n setInitialInputHeight () {\n const input = this.getInput();\n if (!input) return;\n this.initialInputHeight = input.getBoundingClientRect().height;\n },\n\n async handleInputFocusIn () {\n this.inputFocused = true;\n if (this.collapseOnFocusOut) {\n await this.$nextTick();\n this.setInputPadding();\n this.hideInputText = false;\n }\n },\n\n async handleInputFocusOut () {\n this.inputFocused = false;\n if (this.collapseOnFocusOut) {\n const input = this.getInput();\n if (!input) return;\n // Hide the input text when is not on first line\n if (!input.style.paddingTop) {\n return;\n }\n this.hideInputText = true;\n this.revertInputPadding(input);\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"less\">\n.combobox__input-wrapper {\n position: relative;\n display: block;\n}\n\n.combobox__chip-wrapper {\n position: absolute;\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n padding-left: var(--dt-space-100);\n max-width: calc(var(--dt-size-100-percent) - var(--dt-space-400));\n max-height: initial;\n overflow-y: visible;\n}\n\n.combobox__chip-wrapper-md--collapsed {\n max-height: 2.8rem;\n overflow-y: hidden;\n}\n\n.combobox__chip-wrapper-sm--collapsed,\n.combobox__chip-wrapper-xs--collapsed {\n max-height: 2.5rem;\n overflow-y: hidden;\n}\n\n.combobox__chip {\n margin-top: var(--dt-space-300);\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n z-index: var(--zi-base1);\n max-width: var(--dt-size-100-percent);\n}\n\n.combobox__input {\n flex-grow: 1;\n}\n\n.combobox__list--loading {\n text-align: center;\n padding-top: var(--dt-space-500);\n padding-bottom: var(--dt-space-500);\n}\n\n.combobox__chip--truncate {\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n</style>\n"],"names":["DtRecipeComboboxWithPopover","DtInput","DtChip","DtValidationMessages","SrOnlyCloseButtonMixin","validationMessageValidator","MULTI_SELECT_SIZES","POPOVER_APPEND_TO_VALUES","CHIP_SIZES","hasSlotContent","input","chip","CHIP_TOP_POSITION","_createBlock","_createSlots","_withCtx","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_Fragment","_renderList","_mergeProps","_toHandlers","_withKeys","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","_renderSlot"],"mappings":"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"}
|
|
@@ -375,6 +375,7 @@ const _sfc_main = {
|
|
|
375
375
|
(_a = this.$refs.input) == null ? void 0 : _a.focus();
|
|
376
376
|
},
|
|
377
377
|
onComboboxSelect(i) {
|
|
378
|
+
if (this.loading) return;
|
|
378
379
|
this.value = "";
|
|
379
380
|
this.$emit("select", i);
|
|
380
381
|
},
|
|
@@ -651,7 +652,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
651
652
|
} : void 0
|
|
652
653
|
]), 1032, ["label", "show-list", "max-height", "max-width", "popover-offset", "has-suggestion-list", "visually-hidden-close-label", "visually-hidden-close", "append-to", "transition", "onSelect", "onHighlight"]);
|
|
653
654
|
}
|
|
654
|
-
const combobox_multi_select = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-
|
|
655
|
+
const combobox_multi_select = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-489217f9"]]);
|
|
655
656
|
export {
|
|
656
657
|
combobox_multi_select as default
|
|
657
658
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox_multi_select.vue.js","sources":["../../../../recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue"],"sourcesContent":["<!-- eslint-disable vue/no-static-inline-styles -->\n<template>\n <dt-recipe-combobox-with-popover\n ref=\"comboboxWithPopover\"\n :label=\"label\"\n :show-list=\"showList\"\n :max-height=\"listMaxHeight\"\n :max-width=\"listMaxWidth\"\n :popover-offset=\"popoverOffset\"\n :has-suggestion-list=\"hasSuggestionList\"\n :visually-hidden-close-label=\"visuallyHiddenCloseLabel\"\n :visually-hidden-close=\"visuallyHiddenClose\"\n content-width=\"anchor\"\n :append-to=\"appendTo\"\n :transition=\"transition\"\n @select=\"onComboboxSelect\"\n @highlight=\"comboboxHighlight\"\n >\n <template #input=\"{ onInput }\">\n <span\n ref=\"inputSlotWrapper\"\n class=\"combobox__input-wrapper\"\n @focusin=\"handleInputFocusIn\"\n @focusout=\"handleInputFocusOut\"\n >\n <span\n ref=\"chipsWrapper\"\n :class=\"['combobox__chip-wrapper', chipWrapperClass]\"\n >\n <dt-chip\n v-for=\"item in selectedItems\"\n ref=\"chips\"\n :key=\"item\"\n :label-class=\"['d-chip__label']\"\n :class=\"['combobox__chip', { 'combobox__chip--truncate': !!chipMaxWidth }]\"\n :style=\"{ maxWidth: chipMaxWidth }\"\n :close-button-props=\"{ ariaLabel: 'close' }\"\n :size=\"CHIP_SIZES[size]\"\n v-on=\"chipListeners\"\n @keyup.backspace=\"onChipRemove(item)\"\n @close=\"onChipRemove(item)\"\n >\n {{ item }}\n </dt-chip>\n </span>\n\n <dt-input\n ref=\"input\"\n v-model=\"value\"\n class=\"combobox__input\"\n :input-class=\"[inputClass, { 'd-fc-transparent': hideInputText }]\"\n :input-wrapper-class=\"inputWrapperClass\"\n :aria-label=\"label\"\n :label=\"labelVisible ? label : ''\"\n :description=\"description\"\n :placeholder=\"inputPlaceHolder\"\n :show-messages=\"showInputMessages\"\n :messages=\"inputMessages\"\n :size=\"size\"\n v-on=\"inputListeners\"\n @input=\"onInput\"\n />\n\n <dt-validation-messages\n :validation-messages=\"maxSelectedMessage\"\n :show-messages=\"showValidationMessages\"\n />\n </span>\n </template>\n\n <!-- @slot slot for popover header -->\n <template\n v-if=\"hasSlotContent($slots.header)\"\n #header\n >\n <div ref=\"header\">\n <slot name=\"header\" />\n </div>\n </template>\n\n <!-- @slot slot for popover list -->\n <template #list>\n <div\n ref=\"list\"\n @mousedown.prevent\n >\n <slot\n v-if=\"!loading\"\n name=\"list\"\n />\n <div\n v-else\n class=\"combobox__list--loading\"\n >\n {{ loadingMessage }}\n </div>\n </div>\n </template>\n\n <!-- @slot slot for popover footer -->\n <template\n v-if=\"hasSlotContent($slots.footer)\"\n #footer\n >\n <div ref=\"footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </dt-recipe-combobox-with-popover>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport DtRecipeComboboxWithPopover from '@/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue';\nimport DtInput from '@/components/input/input.vue';\nimport DtChip from '@/components/chip/chip.vue';\nimport DtValidationMessages from '@/components/validation_messages/validation_messages.vue';\nimport { validationMessageValidator } from '@/common/validators';\nimport { hasSlotContent } from '@/common/utils';\nimport {\n POPOVER_APPEND_TO_VALUES,\n} from '@/components/popover/popover_constants';\nimport {\n MULTI_SELECT_SIZES,\n CHIP_SIZES,\n CHIP_TOP_POSITION,\n} from './combobox_multi_select_constants';\nimport SrOnlyCloseButtonMixin from '@/common/mixins/sr_only_close_button';\n\nexport default {\n name: 'DtRecipeComboboxMultiSelect',\n\n components: {\n DtRecipeComboboxWithPopover,\n DtInput,\n DtChip,\n DtValidationMessages,\n },\n\n mixins: [SrOnlyCloseButtonMixin],\n\n props: {\n /**\n * String to use for the input label.\n */\n label: {\n type: String,\n required: true,\n },\n\n /**\n * Determines visibility of input label.\n * @values true, false\n */\n labelVisible: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Description for the input\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Input placeholder\n */\n placeholder: {\n type: String,\n default: 'Select one or start typing',\n },\n\n /**\n * Input validation messages\n */\n inputMessages: {\n type: Array,\n default: () => [],\n validator: inputMessages => {\n return validationMessageValidator(inputMessages);\n },\n },\n\n /**\n * Show input validation message\n */\n showInputMessages: {\n type: Boolean,\n default: true,\n },\n\n // @TODO: https://dialpad.atlassian.net/browse/DP-52324\n // type: {\n // type: String,\n // values: ['input', 'select'],\n // default: 'select',\n // },\n\n /**\n * Determines if the list is loading\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The message when the list is loading\n */\n loadingMessage: {\n type: String,\n default: 'loading...',\n },\n\n /**\n * Determines when to show the list element and also controls the aria-expanded attribute.\n * Leaving this null will have the combobox trigger on input focus by default.\n * If you set this value, the default trigger behavior will be disabled and you can\n * control it as you need.\n */\n showList: {\n type: Boolean,\n default: null,\n },\n\n /**\n * Determines maximum height for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxHeight: {\n type: String,\n default: '300px',\n },\n\n /**\n * The selected items\n */\n selectedItems: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Would be the maximum number of selections you can make. 0 is unlimited\n */\n maxSelected: {\n type: Number,\n default: 0,\n },\n\n /**\n * Max select message when the max selections is exceeded with the structure:\n * `[{\"message\": string, \"type\": VALIDATION_MESSAGE_TYPES }]`\n */\n maxSelectedMessage: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Displays the list when the combobox is focused, before the user has typed anything.\n * When this is enabled the list will not close after selection.\n */\n hasSuggestionList: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Size of the chip, one of `xs`, `sm`, `md`\n */\n size: {\n type: String,\n default: 'md',\n validator: (t) => Object.values(MULTI_SELECT_SIZES).includes(t),\n },\n\n /**\n * Sets the element to which the popover is going to append to.\n * 'body' will append to the nearest body (supports shadow DOM).\n * @values 'body', 'parent', HTMLElement,\n */\n appendTo: {\n type: [HTMLElement, String],\n default: 'body',\n validator: appendTo => {\n return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||\n (appendTo instanceof HTMLElement);\n },\n },\n\n /**\n * Named transition when the content display is toggled.\n * @see DtLazyShow\n */\n transition: {\n type: String,\n default: 'fade',\n },\n\n /**\n * Determines whether the combobox should collapse to a single when losing focus.\n * @type {boolean}\n */\n collapseOnFocusOut: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines maximum width for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Amount of reserved space (in px) on the right side of the input\n * before the chips and the input caret jump to the next line.\n * default is 64\n */\n reservedRightSpace: {\n type: Number,\n default: 64,\n },\n\n /**\n * Determines the maximum width of a single chip. If the text within this chip exceeds the value\n * it will be truncated with ellipses.\n * Possible units rem|px|em\n */\n chipMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Additional class name for the input element.\n * Can accept String, Object, and Array, i.e. has the\n * same API as Vue's built-in handling of the class attribute.\n */\n inputClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the input wrapper element.\n * Can accept all of String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n inputWrapperClass: {\n type: [String, Object, Array],\n default: '',\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String }\n */\n 'input',\n\n /**\n * Event fired when item selected\n *\n * @event select\n * @type {Number}\n */\n 'select',\n\n /**\n * Event fired when item removed\n *\n * @event remove\n * @type {String}\n */\n 'remove',\n\n /**\n * Event fired when max selected items limit is reached\n *\n * @event max-selected\n * @type {Object}\n */\n 'max-selected',\n\n /**\n * Native keyup event\n *\n * @event keyup\n * @type {KeyboardEvent}\n */\n 'keyup',\n\n /**\n * Event fired when combobox item is highlighted\n *\n * @event combobox-highlight\n * @type {Object}\n */\n 'combobox-highlight',\n ],\n\n data () {\n return {\n value: '',\n popoverOffset: [0, 4],\n showValidationMessages: false,\n resizeWindowObserver: null,\n initialInputHeight: null,\n CHIP_SIZES,\n hasSlotContent,\n inputFocused: false,\n hideInputText: false,\n };\n },\n\n computed: {\n inputPlaceHolder () {\n return this.selectedItems?.length > 0 ? '' : this.placeholder;\n },\n\n chipListeners () {\n return {\n keyup: event => {\n this.onChipKeyup(event);\n this.$emit('keyup', event);\n },\n };\n },\n\n inputListeners () {\n return {\n input: event => {\n this.$emit('input', event);\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n\n keyup: event => {\n this.onInputKeyup(event);\n this.$emit('keyup', event);\n },\n\n click: event => {\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n };\n },\n\n chipWrapperClass () {\n return {\n [`combobox__chip-wrapper-${this.size}--collapsed`]: !this.inputFocused && this.collapseOnFocusOut,\n };\n },\n },\n\n watch: {\n selectedItems: {\n deep: true,\n handler: async function () {\n this.initSelectedItems();\n },\n },\n\n chipMaxWidth: {\n async handler () {\n this.initSelectedItems();\n },\n },\n\n async label () {\n await this.$nextTick();\n // Adjust the chips position if label changed\n this.setChipsTopPosition();\n },\n\n async description () {\n await this.$nextTick();\n // Adjust the chips position if description changed\n this.setChipsTopPosition();\n },\n\n size: {\n async handler () {\n await this.$nextTick();\n const input = this.getInput();\n this.revertInputPadding(input);\n this.initialInputHeight = input.getBoundingClientRect().height;\n this.setInputPadding();\n this.setChipsTopPosition();\n },\n },\n },\n\n mounted () {\n this.setInitialInputHeight();\n // Recalculate chip position and input padding when resizing window\n this.resizeWindowObserver = new ResizeObserver(async () => {\n this.setChipsTopPosition();\n this.setInputPadding();\n });\n this.resizeWindowObserver.observe(document.body);\n\n this.initSelectedItems();\n },\n\n beforeUnmount () {\n this.resizeWindowObserver?.unobserve(document.body);\n },\n\n methods: {\n comboboxHighlight (highlightIndex) {\n this.$emit('combobox-highlight', highlightIndex);\n },\n\n async initSelectedItems () {\n await this.$nextTick();\n this.setInputPadding();\n this.setChipsTopPosition();\n this.setInputMinWidth();\n this.checkMaxSelected();\n },\n\n onChipRemove (item) {\n this.$emit('remove', item);\n this.$refs.input?.focus();\n },\n\n onComboboxSelect (i) {\n this.value = '';\n this.$emit('select', i);\n },\n\n showComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.showComboboxList();\n },\n\n closeComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.closeComboboxList();\n },\n\n getChipButtons () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el.querySelector('button'));\n },\n\n getChips () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el);\n },\n\n getLastChipButton () {\n return this.$refs.chips && this.getChipButtons()[this.getChipButtons().length - 1];\n },\n\n getLastChip () {\n return this.$refs.chips && this.getChips()[this.getChips().length - 1];\n },\n\n getFirstChip () {\n return this.$refs.chips && this.getChips()[0];\n },\n\n getInput () {\n return this.$refs.input?.$refs.input;\n },\n\n onChipKeyup (event) {\n const key = event.code?.toLowerCase();\n if (key === 'arrowleft') {\n // Move to the previous chip\n this.navigateBetweenChips(event.target, true);\n } else if (key === 'arrowright') {\n if (event.target.id === this.getLastChipButton().id) {\n // Move to the input if it's the last chip\n this.moveFromChipToInput();\n } else {\n // Move to the next chip\n this.navigateBetweenChips(event.target, false);\n }\n }\n },\n\n onInputKeyup (event) {\n const key = event.code?.toLowerCase();\n // If the cursor is at the start of the text,\n // press 'backspace' or 'left' focuses the last chip\n if (this.selectedItems.length > 0 && event.target.selectionStart === 0) {\n if (key === 'backspace' || key === 'arrowleft') {\n this.moveFromInputToChip();\n }\n }\n },\n\n moveFromInputToChip () {\n this.getLastChipButton().focus();\n this.$refs.input?.blur();\n this.closeComboboxList();\n },\n\n moveFromChipToInput () {\n this.getLastChipButton().blur();\n this.$refs.input?.focus();\n this.showComboboxList();\n },\n\n navigateBetweenChips (target, toLeft) {\n const from = this.getChipButtons().indexOf(target);\n const to = toLeft ? from - 1 : from + 1;\n if (to < 0 || to >= this.$refs.chips?.length) {\n return;\n }\n this.getChipButtons()[from].blur();\n this.getChipButtons()[to].focus();\n this.closeComboboxList();\n },\n\n setChipsTopPosition () {\n // To place the chips in the input box\n // The chip \"top\" position should be the same line as the input box\n const input = this.getInput();\n if (!input) return;\n const inputSlotWrapper = this.$refs.inputSlotWrapper;\n const top = input.getBoundingClientRect().top -\n inputSlotWrapper.getBoundingClientRect().top;\n const chipsWrapper = this.$refs.chipsWrapper;\n chipsWrapper.style.top = (top - CHIP_TOP_POSITION[this.size]) + 'px';\n },\n\n setInputPadding () {\n const lastChip = this.getLastChip();\n const input = this.getInput();\n const chipsWrapper = this.$refs.chipsWrapper;\n if (!input) return;\n this.revertInputPadding(input);\n this.popoverOffset = [0, 4];\n if (!lastChip) return;\n // Avoid adding extra padding when the input is not focused if collapseOnFocusOut is true\n // This ensures the input returns to its original state when resizing\n if (this.collapseOnFocusOut && !this.inputFocused) return;\n\n // Get the position of the last chip\n // The input cursor should be the same \"top\" as that chip and next besides it\n const left = lastChip.offsetLeft + this.getFullWidth(lastChip);\n const spaceLeft = input.getBoundingClientRect().width - left;\n // input.style.paddingLeft = left + 'px';\n\n if (spaceLeft > this.reservedRightSpace) {\n input.style.paddingLeft = left + 'px';\n } else {\n input.style.paddingLeft = '4px';\n }\n\n // Get the chip wrapper height minus the 4px padding\n const chipsWrapperHeight = chipsWrapper.getBoundingClientRect().height - 4;\n const lastChipHeight = lastChip.getBoundingClientRect().height - 4;\n\n // Get lastChip offsetTop plus 2px of the input padding.\n const top = spaceLeft > this.reservedRightSpace\n ? lastChip.offsetTop + 2\n : (chipsWrapperHeight + lastChipHeight - 9);\n\n input.style.paddingTop = `${top}px`;\n },\n\n revertInputPadding (input) {\n input.style.paddingLeft = '';\n input.style.paddingTop = '';\n input.style.paddingBottom = '';\n },\n\n getFullWidth (el) {\n const styles = window.getComputedStyle(el);\n return el.offsetWidth + parseInt(styles.marginLeft) + parseInt(styles.marginRight);\n },\n\n setInputMinWidth () {\n // Ensure the width of the input is \"slightly bigger\" than the width of a single chip\n const firstChip = this.getFirstChip();\n const input = this.getInput();\n if (!input) return;\n if (firstChip) {\n // Add 4px buffer for typing room\n input.style.minWidth = (this.getFullWidth(firstChip) + 4) + 'px';\n } else {\n input.style.minWidth = '';\n }\n },\n\n checkMaxSelected () {\n if (this.maxSelected === 0) return;\n if (this.selectedItems.length > this.maxSelected) {\n this.showValidationMessages = true;\n this.$emit('max-selected');\n } else {\n this.showValidationMessages = false;\n }\n },\n\n setInitialInputHeight () {\n const input = this.getInput();\n if (!input) return;\n this.initialInputHeight = input.getBoundingClientRect().height;\n },\n\n async handleInputFocusIn () {\n this.inputFocused = true;\n if (this.collapseOnFocusOut) {\n await this.$nextTick();\n this.setInputPadding();\n this.hideInputText = false;\n }\n },\n\n async handleInputFocusOut () {\n this.inputFocused = false;\n if (this.collapseOnFocusOut) {\n const input = this.getInput();\n if (!input) return;\n // Hide the input text when is not on first line\n if (!input.style.paddingTop) {\n return;\n }\n this.hideInputText = true;\n this.revertInputPadding(input);\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"less\">\n.combobox__input-wrapper {\n position: relative;\n display: block;\n}\n\n.combobox__chip-wrapper {\n position: absolute;\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n padding-left: var(--dt-space-100);\n max-width: calc(var(--dt-size-100-percent) - var(--dt-space-400));\n max-height: initial;\n overflow-y: visible;\n}\n\n.combobox__chip-wrapper-md--collapsed {\n max-height: 2.8rem;\n overflow-y: hidden;\n}\n\n.combobox__chip-wrapper-sm--collapsed,\n.combobox__chip-wrapper-xs--collapsed {\n max-height: 2.5rem;\n overflow-y: hidden;\n}\n\n.combobox__chip {\n margin-top: var(--dt-space-300);\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n z-index: var(--zi-base1);\n max-width: var(--dt-size-100-percent);\n}\n\n.combobox__input {\n flex-grow: 1;\n}\n\n.combobox__list--loading {\n text-align: center;\n padding-top: var(--dt-space-500);\n padding-bottom: var(--dt-space-500);\n}\n\n.combobox__chip--truncate {\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n</style>\n"],"names":["_createBlock","_createSlots","_withCtx","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_Fragment","_renderList","_mergeProps","_toHandlers","_withKeys","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","_renderSlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combobox_multi_select.vue.js","sources":["../../../../recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue"],"sourcesContent":["<!-- eslint-disable vue/no-static-inline-styles -->\n<template>\n <dt-recipe-combobox-with-popover\n ref=\"comboboxWithPopover\"\n :label=\"label\"\n :show-list=\"showList\"\n :max-height=\"listMaxHeight\"\n :max-width=\"listMaxWidth\"\n :popover-offset=\"popoverOffset\"\n :has-suggestion-list=\"hasSuggestionList\"\n :visually-hidden-close-label=\"visuallyHiddenCloseLabel\"\n :visually-hidden-close=\"visuallyHiddenClose\"\n content-width=\"anchor\"\n :append-to=\"appendTo\"\n :transition=\"transition\"\n @select=\"onComboboxSelect\"\n @highlight=\"comboboxHighlight\"\n >\n <template #input=\"{ onInput }\">\n <span\n ref=\"inputSlotWrapper\"\n class=\"combobox__input-wrapper\"\n @focusin=\"handleInputFocusIn\"\n @focusout=\"handleInputFocusOut\"\n >\n <span\n ref=\"chipsWrapper\"\n :class=\"['combobox__chip-wrapper', chipWrapperClass]\"\n >\n <dt-chip\n v-for=\"item in selectedItems\"\n ref=\"chips\"\n :key=\"item\"\n :label-class=\"['d-chip__label']\"\n :class=\"['combobox__chip', { 'combobox__chip--truncate': !!chipMaxWidth }]\"\n :style=\"{ maxWidth: chipMaxWidth }\"\n :close-button-props=\"{ ariaLabel: 'close' }\"\n :size=\"CHIP_SIZES[size]\"\n v-on=\"chipListeners\"\n @keyup.backspace=\"onChipRemove(item)\"\n @close=\"onChipRemove(item)\"\n >\n {{ item }}\n </dt-chip>\n </span>\n\n <dt-input\n ref=\"input\"\n v-model=\"value\"\n class=\"combobox__input\"\n :input-class=\"[inputClass, { 'd-fc-transparent': hideInputText }]\"\n :input-wrapper-class=\"inputWrapperClass\"\n :aria-label=\"label\"\n :label=\"labelVisible ? label : ''\"\n :description=\"description\"\n :placeholder=\"inputPlaceHolder\"\n :show-messages=\"showInputMessages\"\n :messages=\"inputMessages\"\n :size=\"size\"\n v-on=\"inputListeners\"\n @input=\"onInput\"\n />\n\n <dt-validation-messages\n :validation-messages=\"maxSelectedMessage\"\n :show-messages=\"showValidationMessages\"\n />\n </span>\n </template>\n\n <!-- @slot slot for popover header -->\n <template\n v-if=\"hasSlotContent($slots.header)\"\n #header\n >\n <div ref=\"header\">\n <slot name=\"header\" />\n </div>\n </template>\n\n <!-- @slot slot for popover list -->\n <template #list>\n <div\n ref=\"list\"\n @mousedown.prevent\n >\n <slot\n v-if=\"!loading\"\n name=\"list\"\n />\n <div\n v-else\n class=\"combobox__list--loading\"\n >\n {{ loadingMessage }}\n </div>\n </div>\n </template>\n\n <!-- @slot slot for popover footer -->\n <template\n v-if=\"hasSlotContent($slots.footer)\"\n #footer\n >\n <div ref=\"footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </dt-recipe-combobox-with-popover>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport DtRecipeComboboxWithPopover from '@/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue';\nimport DtInput from '@/components/input/input.vue';\nimport DtChip from '@/components/chip/chip.vue';\nimport DtValidationMessages from '@/components/validation_messages/validation_messages.vue';\nimport { validationMessageValidator } from '@/common/validators';\nimport { hasSlotContent } from '@/common/utils';\nimport {\n POPOVER_APPEND_TO_VALUES,\n} from '@/components/popover/popover_constants';\nimport {\n MULTI_SELECT_SIZES,\n CHIP_SIZES,\n CHIP_TOP_POSITION,\n} from './combobox_multi_select_constants';\nimport SrOnlyCloseButtonMixin from '@/common/mixins/sr_only_close_button';\n\nexport default {\n name: 'DtRecipeComboboxMultiSelect',\n\n components: {\n DtRecipeComboboxWithPopover,\n DtInput,\n DtChip,\n DtValidationMessages,\n },\n\n mixins: [SrOnlyCloseButtonMixin],\n\n props: {\n /**\n * String to use for the input label.\n */\n label: {\n type: String,\n required: true,\n },\n\n /**\n * Determines visibility of input label.\n * @values true, false\n */\n labelVisible: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Description for the input\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Input placeholder\n */\n placeholder: {\n type: String,\n default: 'Select one or start typing',\n },\n\n /**\n * Input validation messages\n */\n inputMessages: {\n type: Array,\n default: () => [],\n validator: inputMessages => {\n return validationMessageValidator(inputMessages);\n },\n },\n\n /**\n * Show input validation message\n */\n showInputMessages: {\n type: Boolean,\n default: true,\n },\n\n // @TODO: https://dialpad.atlassian.net/browse/DP-52324\n // type: {\n // type: String,\n // values: ['input', 'select'],\n // default: 'select',\n // },\n\n /**\n * Determines if the list is loading\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The message when the list is loading\n */\n loadingMessage: {\n type: String,\n default: 'loading...',\n },\n\n /**\n * Determines when to show the list element and also controls the aria-expanded attribute.\n * Leaving this null will have the combobox trigger on input focus by default.\n * If you set this value, the default trigger behavior will be disabled and you can\n * control it as you need.\n */\n showList: {\n type: Boolean,\n default: null,\n },\n\n /**\n * Determines maximum height for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxHeight: {\n type: String,\n default: '300px',\n },\n\n /**\n * The selected items\n */\n selectedItems: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Would be the maximum number of selections you can make. 0 is unlimited\n */\n maxSelected: {\n type: Number,\n default: 0,\n },\n\n /**\n * Max select message when the max selections is exceeded with the structure:\n * `[{\"message\": string, \"type\": VALIDATION_MESSAGE_TYPES }]`\n */\n maxSelectedMessage: {\n type: Array,\n default: function () { return []; },\n },\n\n /**\n * Displays the list when the combobox is focused, before the user has typed anything.\n * When this is enabled the list will not close after selection.\n */\n hasSuggestionList: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Size of the chip, one of `xs`, `sm`, `md`\n */\n size: {\n type: String,\n default: 'md',\n validator: (t) => Object.values(MULTI_SELECT_SIZES).includes(t),\n },\n\n /**\n * Sets the element to which the popover is going to append to.\n * 'body' will append to the nearest body (supports shadow DOM).\n * @values 'body', 'parent', HTMLElement,\n */\n appendTo: {\n type: [HTMLElement, String],\n default: 'body',\n validator: appendTo => {\n return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||\n (appendTo instanceof HTMLElement);\n },\n },\n\n /**\n * Named transition when the content display is toggled.\n * @see DtLazyShow\n */\n transition: {\n type: String,\n default: 'fade',\n },\n\n /**\n * Determines whether the combobox should collapse to a single when losing focus.\n * @type {boolean}\n */\n collapseOnFocusOut: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines maximum width for the popover before overflow.\n * Possible units rem|px|em\n */\n listMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Amount of reserved space (in px) on the right side of the input\n * before the chips and the input caret jump to the next line.\n * default is 64\n */\n reservedRightSpace: {\n type: Number,\n default: 64,\n },\n\n /**\n * Determines the maximum width of a single chip. If the text within this chip exceeds the value\n * it will be truncated with ellipses.\n * Possible units rem|px|em\n */\n chipMaxWidth: {\n type: String,\n default: '',\n },\n\n /**\n * Additional class name for the input element.\n * Can accept String, Object, and Array, i.e. has the\n * same API as Vue's built-in handling of the class attribute.\n */\n inputClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the input wrapper element.\n * Can accept all of String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n inputWrapperClass: {\n type: [String, Object, Array],\n default: '',\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String }\n */\n 'input',\n\n /**\n * Event fired when item selected\n *\n * @event select\n * @type {Number}\n */\n 'select',\n\n /**\n * Event fired when item removed\n *\n * @event remove\n * @type {String}\n */\n 'remove',\n\n /**\n * Event fired when max selected items limit is reached\n *\n * @event max-selected\n * @type {Object}\n */\n 'max-selected',\n\n /**\n * Native keyup event\n *\n * @event keyup\n * @type {KeyboardEvent}\n */\n 'keyup',\n\n /**\n * Event fired when combobox item is highlighted\n *\n * @event combobox-highlight\n * @type {Object}\n */\n 'combobox-highlight',\n ],\n\n data () {\n return {\n value: '',\n popoverOffset: [0, 4],\n showValidationMessages: false,\n resizeWindowObserver: null,\n initialInputHeight: null,\n CHIP_SIZES,\n hasSlotContent,\n inputFocused: false,\n hideInputText: false,\n };\n },\n\n computed: {\n inputPlaceHolder () {\n return this.selectedItems?.length > 0 ? '' : this.placeholder;\n },\n\n chipListeners () {\n return {\n keyup: event => {\n this.onChipKeyup(event);\n this.$emit('keyup', event);\n },\n };\n },\n\n inputListeners () {\n return {\n input: event => {\n this.$emit('input', event);\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n\n keyup: event => {\n this.onInputKeyup(event);\n this.$emit('keyup', event);\n },\n\n click: event => {\n if (this.hasSuggestionList) {\n this.showComboboxList();\n }\n },\n };\n },\n\n chipWrapperClass () {\n return {\n [`combobox__chip-wrapper-${this.size}--collapsed`]: !this.inputFocused && this.collapseOnFocusOut,\n };\n },\n },\n\n watch: {\n selectedItems: {\n deep: true,\n handler: async function () {\n this.initSelectedItems();\n },\n },\n\n chipMaxWidth: {\n async handler () {\n this.initSelectedItems();\n },\n },\n\n async label () {\n await this.$nextTick();\n // Adjust the chips position if label changed\n this.setChipsTopPosition();\n },\n\n async description () {\n await this.$nextTick();\n // Adjust the chips position if description changed\n this.setChipsTopPosition();\n },\n\n size: {\n async handler () {\n await this.$nextTick();\n const input = this.getInput();\n this.revertInputPadding(input);\n this.initialInputHeight = input.getBoundingClientRect().height;\n this.setInputPadding();\n this.setChipsTopPosition();\n },\n },\n },\n\n mounted () {\n this.setInitialInputHeight();\n // Recalculate chip position and input padding when resizing window\n this.resizeWindowObserver = new ResizeObserver(async () => {\n this.setChipsTopPosition();\n this.setInputPadding();\n });\n this.resizeWindowObserver.observe(document.body);\n\n this.initSelectedItems();\n },\n\n beforeUnmount () {\n this.resizeWindowObserver?.unobserve(document.body);\n },\n\n methods: {\n comboboxHighlight (highlightIndex) {\n this.$emit('combobox-highlight', highlightIndex);\n },\n\n async initSelectedItems () {\n await this.$nextTick();\n this.setInputPadding();\n this.setChipsTopPosition();\n this.setInputMinWidth();\n this.checkMaxSelected();\n },\n\n onChipRemove (item) {\n this.$emit('remove', item);\n this.$refs.input?.focus();\n },\n\n onComboboxSelect (i) {\n if (this.loading) return;\n this.value = '';\n this.$emit('select', i);\n },\n\n showComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.showComboboxList();\n },\n\n closeComboboxList () {\n if (this.showList != null) { return; }\n this.$refs.comboboxWithPopover?.closeComboboxList();\n },\n\n getChipButtons () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el.querySelector('button'));\n },\n\n getChips () {\n return this.$refs.chips && this.$refs.chips.map(chip => chip.$el);\n },\n\n getLastChipButton () {\n return this.$refs.chips && this.getChipButtons()[this.getChipButtons().length - 1];\n },\n\n getLastChip () {\n return this.$refs.chips && this.getChips()[this.getChips().length - 1];\n },\n\n getFirstChip () {\n return this.$refs.chips && this.getChips()[0];\n },\n\n getInput () {\n return this.$refs.input?.$refs.input;\n },\n\n onChipKeyup (event) {\n const key = event.code?.toLowerCase();\n if (key === 'arrowleft') {\n // Move to the previous chip\n this.navigateBetweenChips(event.target, true);\n } else if (key === 'arrowright') {\n if (event.target.id === this.getLastChipButton().id) {\n // Move to the input if it's the last chip\n this.moveFromChipToInput();\n } else {\n // Move to the next chip\n this.navigateBetweenChips(event.target, false);\n }\n }\n },\n\n onInputKeyup (event) {\n const key = event.code?.toLowerCase();\n // If the cursor is at the start of the text,\n // press 'backspace' or 'left' focuses the last chip\n if (this.selectedItems.length > 0 && event.target.selectionStart === 0) {\n if (key === 'backspace' || key === 'arrowleft') {\n this.moveFromInputToChip();\n }\n }\n },\n\n moveFromInputToChip () {\n this.getLastChipButton().focus();\n this.$refs.input?.blur();\n this.closeComboboxList();\n },\n\n moveFromChipToInput () {\n this.getLastChipButton().blur();\n this.$refs.input?.focus();\n this.showComboboxList();\n },\n\n navigateBetweenChips (target, toLeft) {\n const from = this.getChipButtons().indexOf(target);\n const to = toLeft ? from - 1 : from + 1;\n if (to < 0 || to >= this.$refs.chips?.length) {\n return;\n }\n this.getChipButtons()[from].blur();\n this.getChipButtons()[to].focus();\n this.closeComboboxList();\n },\n\n setChipsTopPosition () {\n // To place the chips in the input box\n // The chip \"top\" position should be the same line as the input box\n const input = this.getInput();\n if (!input) return;\n const inputSlotWrapper = this.$refs.inputSlotWrapper;\n const top = input.getBoundingClientRect().top -\n inputSlotWrapper.getBoundingClientRect().top;\n const chipsWrapper = this.$refs.chipsWrapper;\n chipsWrapper.style.top = (top - CHIP_TOP_POSITION[this.size]) + 'px';\n },\n\n setInputPadding () {\n const lastChip = this.getLastChip();\n const input = this.getInput();\n const chipsWrapper = this.$refs.chipsWrapper;\n if (!input) return;\n this.revertInputPadding(input);\n this.popoverOffset = [0, 4];\n if (!lastChip) return;\n // Avoid adding extra padding when the input is not focused if collapseOnFocusOut is true\n // This ensures the input returns to its original state when resizing\n if (this.collapseOnFocusOut && !this.inputFocused) return;\n\n // Get the position of the last chip\n // The input cursor should be the same \"top\" as that chip and next besides it\n const left = lastChip.offsetLeft + this.getFullWidth(lastChip);\n const spaceLeft = input.getBoundingClientRect().width - left;\n // input.style.paddingLeft = left + 'px';\n\n if (spaceLeft > this.reservedRightSpace) {\n input.style.paddingLeft = left + 'px';\n } else {\n input.style.paddingLeft = '4px';\n }\n\n // Get the chip wrapper height minus the 4px padding\n const chipsWrapperHeight = chipsWrapper.getBoundingClientRect().height - 4;\n const lastChipHeight = lastChip.getBoundingClientRect().height - 4;\n\n // Get lastChip offsetTop plus 2px of the input padding.\n const top = spaceLeft > this.reservedRightSpace\n ? lastChip.offsetTop + 2\n : (chipsWrapperHeight + lastChipHeight - 9);\n\n input.style.paddingTop = `${top}px`;\n },\n\n revertInputPadding (input) {\n input.style.paddingLeft = '';\n input.style.paddingTop = '';\n input.style.paddingBottom = '';\n },\n\n getFullWidth (el) {\n const styles = window.getComputedStyle(el);\n return el.offsetWidth + parseInt(styles.marginLeft) + parseInt(styles.marginRight);\n },\n\n setInputMinWidth () {\n // Ensure the width of the input is \"slightly bigger\" than the width of a single chip\n const firstChip = this.getFirstChip();\n const input = this.getInput();\n if (!input) return;\n if (firstChip) {\n // Add 4px buffer for typing room\n input.style.minWidth = (this.getFullWidth(firstChip) + 4) + 'px';\n } else {\n input.style.minWidth = '';\n }\n },\n\n checkMaxSelected () {\n if (this.maxSelected === 0) return;\n if (this.selectedItems.length > this.maxSelected) {\n this.showValidationMessages = true;\n this.$emit('max-selected');\n } else {\n this.showValidationMessages = false;\n }\n },\n\n setInitialInputHeight () {\n const input = this.getInput();\n if (!input) return;\n this.initialInputHeight = input.getBoundingClientRect().height;\n },\n\n async handleInputFocusIn () {\n this.inputFocused = true;\n if (this.collapseOnFocusOut) {\n await this.$nextTick();\n this.setInputPadding();\n this.hideInputText = false;\n }\n },\n\n async handleInputFocusOut () {\n this.inputFocused = false;\n if (this.collapseOnFocusOut) {\n const input = this.getInput();\n if (!input) return;\n // Hide the input text when is not on first line\n if (!input.style.paddingTop) {\n return;\n }\n this.hideInputText = true;\n this.revertInputPadding(input);\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"less\">\n.combobox__input-wrapper {\n position: relative;\n display: block;\n}\n\n.combobox__chip-wrapper {\n position: absolute;\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n padding-left: var(--dt-space-100);\n max-width: calc(var(--dt-size-100-percent) - var(--dt-space-400));\n max-height: initial;\n overflow-y: visible;\n}\n\n.combobox__chip-wrapper-md--collapsed {\n max-height: 2.8rem;\n overflow-y: hidden;\n}\n\n.combobox__chip-wrapper-sm--collapsed,\n.combobox__chip-wrapper-xs--collapsed {\n max-height: 2.5rem;\n overflow-y: hidden;\n}\n\n.combobox__chip {\n margin-top: var(--dt-space-300);\n margin-left: var(--dt-space-200);\n margin-right: var(--dt-space-200);\n z-index: var(--zi-base1);\n max-width: var(--dt-size-100-percent);\n}\n\n.combobox__input {\n flex-grow: 1;\n}\n\n.combobox__list--loading {\n text-align: center;\n padding-top: var(--dt-space-500);\n padding-bottom: var(--dt-space-500);\n}\n\n.combobox__chip--truncate {\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n</style>\n"],"names":["_createBlock","_createSlots","_withCtx","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_Fragment","_renderList","_mergeProps","_toHandlers","_withKeys","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","_renderSlot"],"mappings":";;;;;;;;;;;;AAiIA,MAAK,YAAU;AAAA,EACb,MAAM;AAAA,EAEN,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EAED,QAAQ,CAAC,sBAAsB;AAAA,EAE/B,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS,MAAM,CAAE;AAAA,MACjB,WAAW,mBAAiB;AAC1B,eAAO,2BAA2B,aAAa;AAAA,MAChD;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKD,mBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYD,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQD,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS,WAAY;AAAE,eAAO,CAAA;AAAA,MAAK;AAAA,IACpC;AAAA;AAAA;AAAA;AAAA,IAKD,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,WAAY;AAAE,eAAO,CAAA;AAAA,MAAK;AAAA,IACpC;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,mBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAKD,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW,CAAC,MAAM,OAAO,OAAO,kBAAkB,EAAE,SAAS,CAAC;AAAA,IAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,UAAU;AAAA,MACR,MAAM,CAAC,aAAa,MAAM;AAAA,MAC1B,SAAS;AAAA,MACT,WAAW,cAAY;AACrB,eAAO,yBAAyB,SAAS,QAAQ,KAC5C,oBAAoB;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,YAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA,IAMD,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,YAAY;AAAA,MACV,MAAM,CAAC,QAAQ,QAAQ,KAAK;AAAA,MAC5B,SAAS;AAAA,IACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOD,mBAAmB;AAAA,MACjB,MAAM,CAAC,QAAQ,QAAQ,KAAK;AAAA,MAC5B,SAAS;AAAA,IACV;AAAA,EACF;AAAA,EAED,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA,EACD;AAAA,EAED,OAAQ;AACN,WAAO;AAAA,MACL,OAAO;AAAA,MACP,eAAe,CAAC,GAAG,CAAC;AAAA,MACpB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,oBAAoB;AAAA,MACpB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA;EAElB;AAAA,EAED,UAAU;AAAA,IACR,mBAAoB;;AAClB,eAAO,UAAK,kBAAL,mBAAoB,UAAS,IAAI,KAAK,KAAK;AAAA,IACnD;AAAA,IAED,gBAAiB;AACf,aAAO;AAAA,QACL,OAAO,WAAS;AACd,eAAK,YAAY,KAAK;AACtB,eAAK,MAAM,SAAS,KAAK;AAAA,QAC1B;AAAA;IAEJ;AAAA,IAED,iBAAkB;AAChB,aAAO;AAAA,QACL,OAAO,WAAS;AACd,eAAK,MAAM,SAAS,KAAK;AACzB,cAAI,KAAK,mBAAmB;AAC1B,iBAAK,iBAAgB;AAAA,UACvB;AAAA,QACD;AAAA,QAED,OAAO,WAAS;AACd,eAAK,aAAa,KAAK;AACvB,eAAK,MAAM,SAAS,KAAK;AAAA,QAC1B;AAAA,QAED,OAAO,WAAS;AACd,cAAI,KAAK,mBAAmB;AAC1B,iBAAK,iBAAgB;AAAA,UACvB;AAAA,QACD;AAAA;IAEJ;AAAA,IAED,mBAAoB;AAClB,aAAO;AAAA,QACL,CAAC,0BAA0B,KAAK,IAAI,aAAa,GAAG,CAAC,KAAK,gBAAgB,KAAK;AAAA;IAElF;AAAA,EACF;AAAA,EAED,OAAO;AAAA,IACL,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS,iBAAkB;AACzB,aAAK,kBAAiB;AAAA,MACvB;AAAA,IACF;AAAA,IAED,cAAc;AAAA,MACZ,MAAM,UAAW;AACf,aAAK,kBAAiB;AAAA,MACvB;AAAA,IACF;AAAA,IAED,MAAM,QAAS;AACb,YAAM,KAAK;AAEX,WAAK,oBAAmB;AAAA,IACzB;AAAA,IAED,MAAM,cAAe;AACnB,YAAM,KAAK;AAEX,WAAK,oBAAmB;AAAA,IACzB;AAAA,IAED,MAAM;AAAA,MACJ,MAAM,UAAW;AACf,cAAM,KAAK;AACX,cAAM,QAAQ,KAAK;AACnB,aAAK,mBAAmB,KAAK;AAC7B,aAAK,qBAAqB,MAAM,sBAAqB,EAAG;AACxD,aAAK,gBAAe;AACpB,aAAK,oBAAmB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAED,UAAW;AACT,SAAK,sBAAqB;AAE1B,SAAK,uBAAuB,IAAI,eAAe,YAAY;AACzD,WAAK,oBAAmB;AACxB,WAAK,gBAAe;AAAA,IACtB,CAAC;AACD,SAAK,qBAAqB,QAAQ,SAAS,IAAI;AAE/C,SAAK,kBAAiB;AAAA,EACvB;AAAA,EAED,gBAAiB;;AACf,eAAK,yBAAL,mBAA2B,UAAU,SAAS;AAAA,EAC/C;AAAA,EAED,SAAS;AAAA,IACP,kBAAmB,gBAAgB;AACjC,WAAK,MAAM,sBAAsB,cAAc;AAAA,IAChD;AAAA,IAED,MAAM,oBAAqB;AACzB,YAAM,KAAK;AACX,WAAK,gBAAe;AACpB,WAAK,oBAAmB;AACxB,WAAK,iBAAgB;AACrB,WAAK,iBAAgB;AAAA,IACtB;AAAA,IAED,aAAc,MAAM;;AAClB,WAAK,MAAM,UAAU,IAAI;AACzB,iBAAK,MAAM,UAAX,mBAAkB;AAAA,IACnB;AAAA,IAED,iBAAkB,GAAG;AACnB,UAAI,KAAK,QAAS;AAClB,WAAK,QAAQ;AACb,WAAK,MAAM,UAAU,CAAC;AAAA,IACvB;AAAA,IAED,mBAAoB;;AAClB,UAAI,KAAK,YAAY,MAAM;AAAE;AAAA,MAAQ;AACrC,iBAAK,MAAM,wBAAX,mBAAgC;AAAA,IACjC;AAAA,IAED,oBAAqB;;AACnB,UAAI,KAAK,YAAY,MAAM;AAAE;AAAA,MAAQ;AACrC,iBAAK,MAAM,wBAAX,mBAAgC;AAAA,IACjC;AAAA,IAED,iBAAkB;AAChB,aAAO,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,IAAI,UAAQ,KAAK,IAAI,cAAc,QAAQ,CAAC;AAAA,IACzF;AAAA,IAED,WAAY;AACV,aAAO,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,IAAI,UAAQ,KAAK,GAAG;AAAA,IACjE;AAAA,IAED,oBAAqB;AACnB,aAAO,KAAK,MAAM,SAAS,KAAK,iBAAiB,KAAK,eAAc,EAAG,SAAS,CAAC;AAAA,IAClF;AAAA,IAED,cAAe;AACb,aAAO,KAAK,MAAM,SAAS,KAAK,WAAW,KAAK,SAAQ,EAAG,SAAS,CAAC;AAAA,IACtE;AAAA,IAED,eAAgB;AACd,aAAO,KAAK,MAAM,SAAS,KAAK,SAAQ,EAAG,CAAC;AAAA,IAC7C;AAAA,IAED,WAAY;;AACV,cAAO,UAAK,MAAM,UAAX,mBAAkB,MAAM;AAAA,IAChC;AAAA,IAED,YAAa,OAAO;;AAClB,YAAM,OAAM,WAAM,SAAN,mBAAY;AACxB,UAAI,QAAQ,aAAa;AAEvB,aAAK,qBAAqB,MAAM,QAAQ,IAAI;AAAA,iBACnC,QAAQ,cAAc;AAC/B,YAAI,MAAM,OAAO,OAAO,KAAK,kBAAmB,EAAC,IAAI;AAEnD,eAAK,oBAAmB;AAAA,eACnB;AAEL,eAAK,qBAAqB,MAAM,QAAQ,KAAK;AAAA,QAC/C;AAAA,MACF;AAAA,IACD;AAAA,IAED,aAAc,OAAO;;AACnB,YAAM,OAAM,WAAM,SAAN,mBAAY;AAGxB,UAAI,KAAK,cAAc,SAAS,KAAK,MAAM,OAAO,mBAAmB,GAAG;AACtE,YAAI,QAAQ,eAAe,QAAQ,aAAa;AAC9C,eAAK,oBAAmB;AAAA,QAC1B;AAAA,MACF;AAAA,IACD;AAAA,IAED,sBAAuB;;AACrB,WAAK,oBAAoB;AACzB,iBAAK,MAAM,UAAX,mBAAkB;AAClB,WAAK,kBAAiB;AAAA,IACvB;AAAA,IAED,sBAAuB;;AACrB,WAAK,oBAAoB;AACzB,iBAAK,MAAM,UAAX,mBAAkB;AAClB,WAAK,iBAAgB;AAAA,IACtB;AAAA,IAED,qBAAsB,QAAQ,QAAQ;;AACpC,YAAM,OAAO,KAAK,eAAgB,EAAC,QAAQ,MAAM;AACjD,YAAM,KAAK,SAAS,OAAO,IAAI,OAAO;AACtC,UAAI,KAAK,KAAK,QAAM,UAAK,MAAM,UAAX,mBAAkB,SAAQ;AAC5C;AAAA,MACF;AACA,WAAK,eAAgB,EAAC,IAAI,EAAE,KAAI;AAChC,WAAK,eAAgB,EAAC,EAAE,EAAE,MAAK;AAC/B,WAAK,kBAAiB;AAAA,IACvB;AAAA,IAED,sBAAuB;AAGrB,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAO;AACZ,YAAM,mBAAmB,KAAK,MAAM;AACpC,YAAM,MAAM,MAAM,sBAAqB,EAAG,MAC9B,iBAAiB,sBAAuB,EAAC;AACrD,YAAM,eAAe,KAAK,MAAM;AAChC,mBAAa,MAAM,MAAO,MAAM,kBAAkB,KAAK,IAAI,IAAK;AAAA,IACjE;AAAA,IAED,kBAAmB;AACjB,YAAM,WAAW,KAAK;AACtB,YAAM,QAAQ,KAAK;AACnB,YAAM,eAAe,KAAK,MAAM;AAChC,UAAI,CAAC,MAAO;AACZ,WAAK,mBAAmB,KAAK;AAC7B,WAAK,gBAAgB,CAAC,GAAG,CAAC;AAC1B,UAAI,CAAC,SAAU;AAGf,UAAI,KAAK,sBAAsB,CAAC,KAAK,aAAc;AAInD,YAAM,OAAO,SAAS,aAAa,KAAK,aAAa,QAAQ;AAC7D,YAAM,YAAY,MAAM,sBAAqB,EAAG,QAAQ;AAGxD,UAAI,YAAY,KAAK,oBAAoB;AACvC,cAAM,MAAM,cAAc,OAAO;AAAA,aAC5B;AACL,cAAM,MAAM,cAAc;AAAA,MAC5B;AAGA,YAAM,qBAAqB,aAAa,sBAAqB,EAAG,SAAS;AACzE,YAAM,iBAAiB,SAAS,sBAAqB,EAAG,SAAS;AAGjE,YAAM,MAAM,YAAY,KAAK,qBACzB,SAAS,YAAY,IACpB,qBAAqB,iBAAiB;AAE3C,YAAM,MAAM,aAAa,GAAG,GAAG;AAAA,IAChC;AAAA,IAED,mBAAoB,OAAO;AACzB,YAAM,MAAM,cAAc;AAC1B,YAAM,MAAM,aAAa;AACzB,YAAM,MAAM,gBAAgB;AAAA,IAC7B;AAAA,IAED,aAAc,IAAI;AAChB,YAAM,SAAS,OAAO,iBAAiB,EAAE;AACzC,aAAO,GAAG,cAAc,SAAS,OAAO,UAAU,IAAI,SAAS,OAAO,WAAW;AAAA,IAClF;AAAA,IAED,mBAAoB;AAElB,YAAM,YAAY,KAAK;AACvB,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAO;AACZ,UAAI,WAAW;AAEb,cAAM,MAAM,WAAY,KAAK,aAAa,SAAS,IAAI,IAAK;AAAA,aACvD;AACL,cAAM,MAAM,WAAW;AAAA,MACzB;AAAA,IACD;AAAA,IAED,mBAAoB;AAClB,UAAI,KAAK,gBAAgB,EAAG;AAC5B,UAAI,KAAK,cAAc,SAAS,KAAK,aAAa;AAChD,aAAK,yBAAyB;AAC9B,aAAK,MAAM,cAAc;AAAA,aACpB;AACL,aAAK,yBAAyB;AAAA,MAChC;AAAA,IACD;AAAA,IAED,wBAAyB;AACvB,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAO;AACZ,WAAK,qBAAqB,MAAM,sBAAqB,EAAG;AAAA,IACzD;AAAA,IAED,MAAM,qBAAsB;AAC1B,WAAK,eAAe;AACpB,UAAI,KAAK,oBAAoB;AAC3B,cAAM,KAAK;AACX,aAAK,gBAAe;AACpB,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACD;AAAA,IAED,MAAM,sBAAuB;AAC3B,WAAK,eAAe;AACpB,UAAI,KAAK,oBAAoB;AAC3B,cAAM,QAAQ,KAAK;AACnB,YAAI,CAAC,MAAO;AAEZ,YAAI,CAAC,MAAM,MAAM,YAAY;AAC3B;AAAA,QACF;AACA,aAAK,gBAAgB;AACrB,aAAK,mBAAmB,KAAK;AAAA,MAC/B;AAAA,IACD;AAAA,EACF;AACH;AA3pBW,MAAA,aAAA,EAAA,KAAI,SAAQ;;EA3EvB,KAAA;AAAA,EA4FU,OAAM;;AAYL,MAAA,aAAA,EAAA,KAAI,SAAQ;;;;;;sBAtGrBA,YA0GkC,4CAAA;AAAA,IAzGhC,KAAI;AAAA,IACH,OAAO,OAAK;AAAA,IACZ,aAAW,OAAQ;AAAA,IACnB,cAAY,OAAa;AAAA,IACzB,aAAW,OAAY;AAAA,IACvB,kBAAgB,MAAa;AAAA,IAC7B,uBAAqB,OAAiB;AAAA,IACtC,+BAA6B,KAAwB;AAAA,IACrD,yBAAuB,KAAmB;AAAA,IAC3C,iBAAc;AAAA,IACb,aAAW,OAAQ;AAAA,IACnB,YAAY,OAAU;AAAA,IACtB,UAAQ,SAAgB;AAAA,IACxB,aAAW,SAAiB;AAAA,EAhBjC,GAAAC,YAAA;AAAA,IAkBe,OAAKC,QACd,CAgDO,EAjDW,cAAO;AAAA,MACzBC,mBAgDO,QAAA;AAAA,QA/CL,KAAI;AAAA,QACJ,OAAM;AAAA,QACL,kDAAS,SAAkB,sBAAA,SAAA,mBAAA,GAAA,IAAA;AAAA,QAC3B,mDAAU,SAAmB,uBAAA,SAAA,oBAAA,GAAA,IAAA;AAAA;QAE9BA,mBAmBO,QAAA;AAAA,UAlBL,KAAI;AAAA,UACH,OA3BXC,0CA2B6C,SAAgB,gBAAA,CAAA;AAAA;WAEnDC,UAAA,IAAA,GAAAC,mBAcUC,UA3CpB,MAAAC,WA8B2B,OAAa,eA9BxC,CA8BmB,SAAI;AADb,mBAAAH,UAAA,GAAAL,YAcU,oBAdVS,WAcU;AAAA,cA3CpB,SAAA;AAAA,cA+BY,KAAI;AAAA,cACH,KAAK;AAAA,cACL,eAAa,CAAiB,eAAA;AAAA,cAC9B,0DAA0D,OAAY,cAAA;AAAA,cACtE,mBAAmB,OAAY,aAAA;AAAA,cAC/B,sBAAoB,EAAsB,WAAA,QAAA;AAAA,cAC1C,MAAM,MAAU,WAAC,OAAI,IAAA;AAAA,YACtB,GAAAC,WAAoB,SAAD,aAAA,GAAA;AAAA,cAClB,SAvCbC,SAAA,YAuC8B,SAAY,aAAC,IAAI,GAAA,CAAA,WAAA,CAAA;AAAA,cAClC,SAAK,YAAE,SAAY,aAAC,IAAI;AAAA;cAxCrC,SAAAT,QA0CY,MAAU;AAAA,gBA1CtBU,gBAAAC,gBA0Ce,IAAI,GAAA,CAAA;AAAA;cA1CnB,GAAA;AAAA;;;QA8CQC,YAeE,qBAfFL,WAeE;AAAA,UAdA,KAAI;AAAA,UA/Cd,YAgDmB,MAAK;AAAA,UAhDxB,uBAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,YAgDmB,MAAK,QAAA;AAAA,UACd,OAAM;AAAA,UACL,eAAW,CAAG,OAAU,YAAA,EAAA,oBAAwB,MAAa,eAAA;AAAA,UAC7D,uBAAqB,OAAiB;AAAA,UACtC,cAAY,OAAK;AAAA,UACjB,OAAO,OAAY,eAAG,OAAK,QAAA;AAAA,UAC3B,aAAa,OAAW;AAAA,UACxB,aAAa,SAAgB;AAAA,UAC7B,iBAAe,OAAiB;AAAA,UAChC,UAAU,OAAa;AAAA,UACvB,MAAM,OAAI;AAAA,QACX,GAAAC,WAAqB,SAAf,cAAc,GACnB,EAAA,SAAc,GAAA,MAAA,IAAA,CAAA,cAAA,eAAA,uBAAA,cAAA,SAAA,eAAA,eAAA,iBAAA,YAAA,QAAA,SAAA,CAAA;AAAA,QAGjBI,YAGE,mCAAA;AAAA,UAFC,uBAAqB,OAAkB;AAAA,UACvC,iBAAe,MAAsB;AAAA;;;IAgBjC,cACT,MAcM;AAAA,MAdNX,mBAcM,OAAA;AAAA,QAbJ,KAAI;AAAA,QACH,aAAS,OAAA,CAAA,MAAA,OAAA,CAAA,IApFlBY,cAoFQ,MAAkB;AAAA,QAAA,GAAA,CAAA,SAAA,CAAA;AAAA;SAGT,OAAO,UADhBC,WAGE,uBAzFV,KAAA,EAAA,GAAA,QAAA,IAAA,kBA0FQV,mBAKM,OALN,YAKMO,gBADD,OAAc,cAAA,GAAA,CAAA;AAAA;;IA9F3B,GAAA;AAAA;IAwEY,MAAc,eAAC,KAAM,OAAC,MAAM;MAxExC,MAyEO;AAAA,MAzEP,IAAAX,QA2EM,MAEM;AAAA,QAFNC,mBAEM,OAFN,YAEM;AAAA,UADJa,WAAsB,KAAA,QAAA,UAAA,CAAA,GAAA,QAAA,IAAA;AAAA;;MA5E9B,KAAA;AAAA,QAAA;AAAA,IAqGY,MAAc,eAAC,KAAM,OAAC,MAAM;MArGxC,MAsGO;AAAA,MAtGP,IAAAd,QAwGM,MAEM;AAAA,QAFNC,mBAEM,OAFN,YAEM;AAAA,UADJa,WAAsB,KAAA,QAAA,UAAA,CAAA,GAAA,QAAA,IAAA;AAAA;;MAzG9B,KAAA;AAAA,QAAA;AAAA;;;"}
|