quikchat 1.2.4 → 1.2.6

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.
Files changed (41) hide show
  1. package/README.md +2 -2
  2. package/dist/build-manifest.json +73 -80
  3. package/dist/quikchat-md-full.cjs.js +536 -255
  4. package/dist/quikchat-md-full.cjs.js.map +1 -1
  5. package/dist/quikchat-md-full.cjs.min.js +3 -3
  6. package/dist/quikchat-md-full.cjs.min.js.map +1 -1
  7. package/dist/quikchat-md-full.esm.js +536 -255
  8. package/dist/quikchat-md-full.esm.js.map +1 -1
  9. package/dist/quikchat-md-full.esm.min.js +3 -3
  10. package/dist/quikchat-md-full.esm.min.js.map +1 -1
  11. package/dist/quikchat-md-full.umd.js +536 -255
  12. package/dist/quikchat-md-full.umd.js.map +1 -1
  13. package/dist/quikchat-md-full.umd.min.js +3 -3
  14. package/dist/quikchat-md-full.umd.min.js.map +1 -1
  15. package/dist/quikchat-md.cjs.js +520 -245
  16. package/dist/quikchat-md.cjs.js.map +1 -1
  17. package/dist/quikchat-md.cjs.min.js +3 -3
  18. package/dist/quikchat-md.cjs.min.js.map +1 -1
  19. package/dist/quikchat-md.esm.js +520 -245
  20. package/dist/quikchat-md.esm.js.map +1 -1
  21. package/dist/quikchat-md.esm.min.js +3 -3
  22. package/dist/quikchat-md.esm.min.js.map +1 -1
  23. package/dist/quikchat-md.umd.js +520 -245
  24. package/dist/quikchat-md.umd.js.map +1 -1
  25. package/dist/quikchat-md.umd.min.js +3 -3
  26. package/dist/quikchat-md.umd.min.js.map +1 -1
  27. package/dist/quikchat.cjs.js +2 -2
  28. package/dist/quikchat.cjs.js.map +1 -1
  29. package/dist/quikchat.cjs.min.js +1 -1
  30. package/dist/quikchat.cjs.min.js.map +1 -1
  31. package/dist/quikchat.css +351 -120
  32. package/dist/quikchat.esm.js +2 -2
  33. package/dist/quikchat.esm.js.map +1 -1
  34. package/dist/quikchat.esm.min.js +1 -1
  35. package/dist/quikchat.esm.min.js.map +1 -1
  36. package/dist/quikchat.min.css +1 -1
  37. package/dist/quikchat.umd.js +2 -2
  38. package/dist/quikchat.umd.js.map +1 -1
  39. package/dist/quikchat.umd.min.js +1 -1
  40. package/dist/quikchat.umd.min.js.map +1 -1
  41. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"file":"quikchat.umd.min.js","sources":["../src/quikchat.js"],"sourcesContent":["\nclass quikchat {\n /**\n *\n * @param string or DOM element parentElement\n * @param {*} meta\n */\n constructor(parentElement, onSend = () => { }, options = {}) {\n const defaultOpts = {\n theme: 'quikchat-theme-light',\n trackHistory: true,\n showTimestamps: false,\n titleArea: { title: \"Chat\", show: false, align: \"center\" },\n messagesArea: { alternating: true },\n };\n const meta = { ...defaultOpts, ...options }; // merge options with defaults\n\n if (typeof parentElement === 'string') {\n parentElement = document.querySelector(parentElement);\n }\n this._parentElement = parentElement;\n this._theme = meta.theme;\n this._onSend = onSend ? onSend : () => { }; // call back function for onSend\n this._messageFormatter = meta.messageFormatter || null;\n this._sanitize = meta.sanitize || false;\n this._createWidget();\n // title area\n if (meta.titleArea) {\n this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);\n if (meta.titleArea.show === true) {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n // messages area\n if (meta.messagesArea) {\n this.messagesAreaAlternateColors(meta.messagesArea.alternating);\n }\n // timestamps\n if (meta.showTimestamps) {\n this.messagesAreaShowTimestamps(true);\n }\n // direction (ltr/rtl)\n if (meta.direction) {\n this.setDirection(meta.direction);\n }\n // plumbing\n this._attachEventListeners();\n this.trackHistory = meta.trackHistory !== false;\n this._historyLimit = 10000000;\n this._history = [];\n }\n\n _createWidget() {\n const widgetHTML =\n `\n <div class=\"quikchat-base ${this.theme}\">\n <div class=\"quikchat-title-area\"></div>\n <div class=\"quikchat-messages-wrapper\"><div class=\"quikchat-messages-area\" role=\"log\" aria-live=\"polite\" aria-label=\"Chat messages\"></div><button class=\"quikchat-scroll-bottom\" aria-label=\"Scroll to bottom\"></button></div>\n <div class=\"quikchat-input-area\">\n <textarea class=\"quikchat-input-textbox\" rows=\"1\" aria-label=\"Type a message\"></textarea>\n <button class=\"quikchat-input-send-btn\">Send</button>\n </div>\n </div>\n `;\n\n this._parentElement.innerHTML = widgetHTML;\n this._chatWidget = this._parentElement.querySelector('.quikchat-base');\n this._titleArea = this._chatWidget.querySelector('.quikchat-title-area');\n this._messagesWrapper = this._chatWidget.querySelector('.quikchat-messages-wrapper');\n this._messagesArea = this._chatWidget.querySelector('.quikchat-messages-area');\n this._scrollBottomBtn = this._messagesWrapper.querySelector('.quikchat-scroll-bottom');\n this._inputArea = this._chatWidget.querySelector('.quikchat-input-area');\n this._textEntry = this._inputArea.querySelector('.quikchat-input-textbox');\n this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');\n this.msgid = 0;\n }\n\n /**\n * Attach event listeners to the widget\n */\n _attachEventListeners() {\n this._sendButton.addEventListener('click', () => {\n const text = this._textEntry.value.trim();\n if (text === '') return;\n this._onSend(this, text);\n });\n this._textEntry.addEventListener('keydown', (event) => {\n // Check if Shift + Enter is pressed\n if (event.shiftKey && event.keyCode === 13) {\n event.preventDefault();\n const text = this._textEntry.value.trim();\n if (text === '') return;\n this._onSend(this, text);\n }\n });\n\n // Auto-grow textarea\n this._textEntry.addEventListener('input', () => this._autoGrowTextarea());\n\n this._messagesArea.addEventListener('scroll', () => {\n const { scrollTop, scrollHeight, clientHeight } = this._messagesArea;\n this.userScrolledUp = scrollTop + clientHeight < scrollHeight - 1;\n this._updateScrollBottomBtn();\n });\n\n // Scroll-to-bottom button\n this._scrollBottomBtn.addEventListener('click', () => this.scrollToBottom());\n\n // Ctrl+End to scroll to bottom\n this._chatWidget.addEventListener('keydown', (event) => {\n if (event.ctrlKey && event.key === 'End') {\n event.preventDefault();\n this.scrollToBottom();\n }\n });\n\n // Use ResizeObserver to detect parent container resize\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(() => this._handleContainerResize());\n this._resizeObserver.observe(this._parentElement);\n }\n }\n\n // set the onSend function callback.\n setCallbackOnSend(callback) {\n this._onSend = callback;\n }\n // set a callback for everytime a message is added (listener)\n setCallbackonMessageAdded(callback) {\n this._onMessageAdded = callback;\n }\n setCallbackonMessageAppend(callback) {\n this._onMessageAppend = callback;\n }\n setCallbackonMessageReplace(callback) {\n this._onMessageReplace = callback;\n }\n setCallbackonMessageDelete(callback) {\n this._onMessageDelete = callback;\n }\n\n // Public methods\n titleAreaToggle() {\n if (this._titleArea.style.display === 'none') {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n\n titleAreaShow() {\n this._titleArea.style.display = '';\n }\n\n titleAreaHide() {\n this._titleArea.style.display = 'none';\n }\n\n titleAreaSetContents(title, align = 'center') {\n this._titleArea.innerHTML = title;\n this._titleArea.style.textAlign = align;\n }\n\n titleAreaGetContents() {\n return this._titleArea.innerHTML;\n }\n\n inputAreaToggle() {\n if (this._inputArea.style.display === 'none') {\n this.inputAreaShow();\n } else {\n this.inputAreaHide();\n }\n }\n\n inputAreaShow() {\n this._inputArea.style.display = '';\n }\n\n inputAreaHide() {\n this._inputArea.style.display = 'none';\n }\n\n inputAreaSetEnabled(enabled) {\n this._textEntry.disabled = !enabled;\n this._sendButton.disabled = !enabled;\n }\n\n inputAreaSetButtonText(text) {\n this._sendButton.textContent = text;\n }\n\n inputAreaGetButtonText() {\n return this._sendButton.textContent;\n }\n\n setDirection(dir) {\n const d = dir === 'rtl' ? 'rtl' : 'ltr';\n this._chatWidget.setAttribute('dir', d);\n if (d === 'rtl') {\n this._chatWidget.classList.add('quikchat-rtl');\n } else {\n this._chatWidget.classList.remove('quikchat-rtl');\n }\n }\n\n getDirection() {\n return this._chatWidget.getAttribute('dir') || 'ltr';\n }\n\n _handleContainerResize() {\n // Layout is handled by CSS flexbox — no JS height calculation needed.\n // This hook exists for future use or custom resize callbacks.\n }\n\n scrollToBottom() {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n this.userScrolledUp = false;\n this._updateScrollBottomBtn();\n }\n\n _updateScrollBottomBtn() {\n if (this.userScrolledUp) {\n this._scrollBottomBtn.classList.add('quikchat-scroll-bottom-visible');\n } else {\n this._scrollBottomBtn.classList.remove('quikchat-scroll-bottom-visible');\n }\n }\n\n _autoGrowTextarea() {\n const el = this._textEntry;\n el.style.height = 'auto';\n const maxHeight = parseInt(getComputedStyle(el).getPropertyValue('--quikchat-input-max-height')) || 120;\n el.style.height = Math.min(el.scrollHeight, maxHeight) + 'px';\n el.style.overflowY = el.scrollHeight > maxHeight ? 'auto' : 'hidden';\n }\n\n _formatTimestamp(isoString) {\n const d = new Date(isoString);\n const h = d.getHours();\n const m = String(d.getMinutes()).padStart(2, '0');\n const ampm = h >= 12 ? 'PM' : 'AM';\n const h12 = h % 12 || 12;\n return h12 + ':' + m + ' ' + ampm;\n }\n\n messagesAreaShowTimestamps(show) {\n if (show) {\n this._messagesArea.classList.add('quikchat-show-timestamps');\n } else {\n this._messagesArea.classList.remove('quikchat-show-timestamps');\n }\n }\n\n messagesAreaShowTimestampsGet() {\n return this._messagesArea.classList.contains('quikchat-show-timestamps');\n }\n\n messagesAreaShowTimestampsToggle() {\n this._messagesArea.classList.toggle('quikchat-show-timestamps');\n }\n\n _escapeHTML(str) {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n _processContent(content) {\n if (this._sanitize === true) {\n content = this._escapeHTML(content);\n } else if (typeof this._sanitize === 'function') {\n content = this._sanitize(content);\n }\n if (this._messageFormatter) {\n content = this._messageFormatter(content);\n }\n return content;\n }\n\n //messagesArea functions\n messagesAreaAlternateColors(alt = true) {\n if (alt) {\n this._messagesArea.classList.add('quikchat-messages-area-alt');\n }\n else {\n this._messagesArea.classList.remove('quikchat-messages-area-alt');\n }\n return alt === true;\n }\n messagesAreaAlternateColorsToggle() {\n this._messagesArea.classList.toggle('quikchat-messages-area-alt');\n }\n messagesAreaAlternateColorsGet() {\n return this._messagesArea.classList.contains('quikchat-messages-area-alt');\n }\n // message functions\n messageAddFull(input = { content: \"\", userString: \"user\", align: \"right\", role: \"user\", userID: -1 }) {\n const msgid = this.msgid;\n const messageDiv = document.createElement('div');\n const msgidClass = 'quikchat-msgid-' + String(msgid).padStart(10, '0');\n messageDiv.classList.add('quikchat-message', msgidClass);\n messageDiv.classList.add('quikchat-role-' + (input.role || 'user'));\n messageDiv.classList.add('quikchat-align-' + (input.align || 'right'));\n this.msgid++;\n messageDiv.classList.add(this._messagesArea.children.length % 2 === 1 ? 'quikchat-message-1' : 'quikchat-message-2');\n\n // Visibility: default true, hidden messages get display:none\n const visible = input.visible !== false;\n if (!visible) {\n messageDiv.style.display = 'none';\n }\n\n // Tags: array of strings for group-based visibility control\n const tags = Array.isArray(input.tags) ? input.tags.slice() : [];\n\n const userDiv = document.createElement('div');\n userDiv.classList.add('quikchat-user-label');\n userDiv.style.textAlign = input.align;\n userDiv.innerHTML = input.userString;\n\n const contentDiv = document.createElement('div');\n contentDiv.classList.add('quikchat-message-content');\n contentDiv.style.textAlign = input.align;\n contentDiv.innerHTML = this._processContent(input.content);\n\n const timestamp = new Date().toISOString();\n const timestampSpan = document.createElement('span');\n timestampSpan.classList.add('quikchat-timestamp');\n timestampSpan.textContent = this._formatTimestamp(timestamp);\n\n messageDiv.appendChild(userDiv);\n messageDiv.appendChild(contentDiv);\n messageDiv.appendChild(timestampSpan);\n this._messagesArea.appendChild(messageDiv);\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n }\n\n this._textEntry.value = '';\n this._autoGrowTextarea();\n const updatedtime = timestamp;\n\n if (this.trackHistory) {\n this._history.push({ msgid, ...input, visible, tags, timestamp, updatedtime, messageDiv });\n if (this._history.length > this._historyLimit) {\n this._history.shift();\n }\n }\n\n if (this._onMessageAdded) {\n this._onMessageAdded(this, msgid);\n }\n\n return msgid;\n }\n\n\n messageAddNew(content = \"\", userString = \"user\", align = \"right\", role = \"user\") {\n return this.messageAddFull(\n { content: content, userString: userString, align: align, role: role }\n );\n }\n messageRemove(n) {\n let success = false;\n try {\n this._messagesArea.removeChild(this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`));\n success = true;\n }\n catch (_error) {\n // Message ID not found\n }\n if (success) {\n this._history.splice(this._history.findIndex((item) => item.msgid === n), 1);\n if (this._onMessageDelete) {\n this._onMessageDelete(this, n);\n }\n }\n return success;\n }\n /* returns the message html object from the DOM\n */\n messageGetDOMObject(n) {\n let msg = null;\n try {\n msg = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n }\n catch (_error) {\n // Message ID not found\n }\n return msg;\n }\n /* returns the message content only\n */\n messageGetContent(n) {\n let content = \"\";\n try {\n content = this._history.filter((item) => item.msgid === n)[0].content;\n }\n catch (_error) {\n // Message ID not found\n }\n return content;\n }\n\n messageSetVisible(n, visible) {\n const msgEl = this.messageGetDOMObject(n);\n if (!msgEl) return false;\n msgEl.style.display = visible ? '' : 'none';\n const item = this._history.find((entry) => entry.msgid === n);\n if (item) item.visible = visible;\n return true;\n }\n\n messageGetVisible(n) {\n const item = this._history.find((entry) => entry.msgid === n);\n return item ? item.visible !== false : false;\n }\n\n messageToggleVisible(n) {\n const current = this.messageGetVisible(n);\n return this.messageSetVisible(n, !current);\n }\n\n messageSetVisibleByTag(tag, visible) {\n let count = 0;\n for (const item of this._history) {\n if (item.tags && item.tags.includes(tag)) {\n this.messageSetVisible(item.msgid, visible);\n count++;\n }\n }\n return count;\n }\n\n messageGetTags(n) {\n const item = this._history.find((entry) => entry.msgid === n);\n return item && item.tags ? item.tags.slice() : [];\n }\n\n messageSetTags(n, tags) {\n const item = this._history.find((entry) => entry.msgid === n);\n if (!item) return false;\n item.tags = Array.isArray(tags) ? tags.slice() : [];\n return true;\n }\n\n /* append message to the message content\n */\n messageAppendContent(n, content) {\n let success = false;\n try {\n const msgEl = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n const item = this._history.filter((entry) => entry.msgid === n)[0];\n item.content += content;\n item.updatedtime = new Date().toISOString();\n msgEl.querySelector('.quikchat-message-content').innerHTML = this._processContent(item.content);\n msgEl.classList.remove('quikchat-typing');\n success = true;\n\n if (!this.userScrolledUp) {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n }\n if (this._onMessageAppend) {\n this._onMessageAppend(this, n, content);\n }\n } catch (_error) {\n // Message ID not found\n }\n return success;\n }\n\n /* replace message content\n */\n messageReplaceContent(n, content) {\n let success = false;\n try {\n const msgEl = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n const item = this._history.filter((entry) => entry.msgid === n)[0];\n item.content = content;\n item.updatedtime = new Date().toISOString();\n msgEl.querySelector('.quikchat-message-content').innerHTML = this._processContent(content);\n msgEl.classList.remove('quikchat-typing');\n success = true;\n\n if (!this.userScrolledUp) {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n }\n if (this._onMessageReplace) {\n this._onMessageReplace(this, n, content);\n }\n } catch (_error) {\n // Message ID not found\n }\n return success;\n }\n\n messageAddTypingIndicator(userString = '', align = 'left') {\n const msgid = this.messageAddFull({\n content: '',\n userString: userString,\n align: align,\n role: 'assistant',\n });\n const msgEl = this.messageGetDOMObject(msgid);\n msgEl.classList.add('quikchat-typing');\n const contentDiv = msgEl.querySelector('.quikchat-message-content');\n contentDiv.innerHTML = '<span class=\"quikchat-typing-dots\"><span>.</span><span>.</span><span>.</span></span>';\n return msgid;\n }\n\n setMessageFormatter(formatter) {\n this._messageFormatter = formatter;\n }\n\n setSanitize(sanitize) {\n this._sanitize = sanitize;\n }\n\n // history functions\n /**\n *\n * @param {*} n\n * @param {*} m\n * @returns array of history messages\n */\n historyGet(n, m) {\n if (n === undefined) {\n return this._history.slice();\n }\n if (m === undefined) {\n if (n < 0) {\n return this._history.slice(n);\n }\n return this._history.slice(n, n + 1);\n }\n return this._history.slice(n, m);\n }\n\n historyClear() {\n this.msgid = 0;\n this._history = [];\n }\n\n historyGetLength() {\n return this._history.length;\n }\n\n historyGetMessage(n) {\n if (n >= 0 && n < this._history.length) {\n return this._history[n];\n }\n return {};\n }\n\n historyGetMessageContent(n) {\n if (n >= 0 && n < this._history.length) {\n return this._history[n].content;\n }\n return \"\";\n }\n\n historyExport() {\n return this._history.map((item) => ({\n msgid: item.msgid,\n content: item.content,\n userString: item.userString,\n align: item.align,\n role: item.role,\n userID: item.userID,\n visible: item.visible,\n tags: item.tags ? item.tags.slice() : [],\n timestamp: item.timestamp,\n updatedtime: item.updatedtime,\n }));\n }\n\n historyImport(data) {\n // Clear existing messages from DOM and history\n this._messagesArea.innerHTML = '';\n this._history = [];\n this.msgid = 0;\n\n for (const entry of data) {\n this.messageAddFull({\n content: entry.content || '',\n userString: entry.userString || 'user',\n align: entry.align || 'right',\n role: entry.role || 'user',\n userID: entry.userID,\n visible: entry.visible,\n tags: entry.tags,\n });\n }\n }\n\n changeTheme(newTheme) {\n this._chatWidget.classList.remove(this._theme);\n this._chatWidget.classList.add(newTheme);\n this._theme = newTheme;\n }\n\n get theme() {\n return this._theme;\n }\n\n static version() {\n return { \"version\": \"1.2.4\", \"license\": \"BSD-2\", \"url\": \"https://github/deftio/quikchat\" };\n }\n\n /**\n * quikchat.loremIpsum() - Generate a simple string of Lorem Ipsum text (sample typographer's text) of numChars in length.\n * borrowed from github.com/deftio/bitwrench.js\n * @param {number} numChars - The number of characters to generate (random btw 25 and 150 if undefined).\n * @param {number} [startSpot=0] - The starting index in the Lorem Ipsum text. If undefined, a random startSpot will be generated.\n * @param {boolean} [startWithCapitalLetter=true] - If true, capitalize the first character or inject a capital letter if the first character isn't a capital letter.\n *\n * @returns {string} A string of Lorem Ipsum text.\n *\n * @example\n * // Returns 200 characters of Lorem Ipsum starting from index 50\n * loremIpsum(200, 50);\n *\n * @example\n * //Returns a 200 Lorem Ipsum characters starting from a random index\n * loremIpsum(200);\n */\n\n static loremIpsum(numChars, startSpot = undefined, startWithCapitalLetter = true) {\n const loremText = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \";\n\n if (typeof numChars !== \"number\") {\n numChars = Math.floor(Math.random() * 126) + 25;\n }\n\n if (startSpot === undefined) {\n startSpot = Math.floor(Math.random() * loremText.length);\n }\n\n startSpot = startSpot % loremText.length;\n\n // Move startSpot to the next non-whitespace and non-punctuation character\n while (loremText[startSpot] === ' ' || /[.,:;!?]/.test(loremText[startSpot])) {\n startSpot = (startSpot + 1) % loremText.length;\n }\n\n const l = loremText.substring(startSpot) + loremText.substring(0, startSpot);\n\n let s = \"\";\n while (numChars > 0) {\n s += numChars < l.length ? l.substring(0, numChars) : l;\n numChars -= l.length;\n }\n\n if (s[s.length - 1] === \" \") {\n s = s.substring(0, s.length - 1) + \".\"; // always end on non-whitespace. \".\" was chosen arbitrarily.\n }\n\n if (startWithCapitalLetter) {\n s = s[0].toUpperCase() + s.substring(1);\n }\n\n return s;\n };\n\n\n}\n\nexport default quikchat;\n"],"names":["quikchat","parentElement","onSend","arguments","length","undefined","options","_classCallCheck","meta","_objectSpread","theme","trackHistory","showTimestamps","titleArea","title","show","align","messagesArea","alternating","document","querySelector","this","_parentElement","_theme","_onSend","_messageFormatter","messageFormatter","_sanitize","sanitize","_createWidget","titleAreaSetContents","titleAreaShow","titleAreaHide","messagesAreaAlternateColors","messagesAreaShowTimestamps","direction","setDirection","_attachEventListeners","_historyLimit","_history","key","value","widgetHTML","concat","innerHTML","_chatWidget","_titleArea","_messagesWrapper","_messagesArea","_scrollBottomBtn","_inputArea","_textEntry","_sendButton","msgid","_this","addEventListener","text","trim","event","shiftKey","keyCode","preventDefault","_autoGrowTextarea","_this$_messagesArea","scrollTop","scrollHeight","clientHeight","userScrolledUp","_updateScrollBottomBtn","scrollToBottom","ctrlKey","ResizeObserver","_resizeObserver","_handleContainerResize","observe","callback","_onMessageAdded","_onMessageAppend","_onMessageReplace","_onMessageDelete","style","display","textAlign","inputAreaShow","inputAreaHide","enabled","disabled","textContent","dir","d","setAttribute","classList","add","remove","getAttribute","el","height","maxHeight","parseInt","getComputedStyle","getPropertyValue","Math","min","overflowY","isoString","Date","h","getHours","String","getMinutes","padStart","contains","toggle","str","div","createElement","content","_escapeHTML","alt","input","userString","role","userID","messageDiv","msgidClass","children","visible","tags","Array","isArray","slice","userDiv","contentDiv","_processContent","timestamp","toISOString","timestampSpan","_formatTimestamp","appendChild","updatedtime","push","shift","messageAddFull","n","success","removeChild","_error","splice","findIndex","item","msg","filter","msgEl","messageGetDOMObject","find","entry","current","messageGetVisible","messageSetVisible","tag","_step","count","_iterator","_createForOfIteratorHelper","s","done","includes","err","e","f","formatter","m","map","data","_step2","_iterator2","newTheme","get","version","license","url","numChars","startSpot","startWithCapitalLetter","loremText","floor","random","test","l","substring","toUpperCase"],"mappings":"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"}
1
+ {"version":3,"file":"quikchat.umd.min.js","sources":["../src/quikchat.js"],"sourcesContent":["\nclass quikchat {\n /**\n *\n * @param string or DOM element parentElement\n * @param {*} meta\n */\n constructor(parentElement, onSend = () => { }, options = {}) {\n const defaultOpts = {\n theme: 'quikchat-theme-light',\n trackHistory: true,\n showTimestamps: false,\n titleArea: { title: \"Chat\", show: false, align: \"center\" },\n messagesArea: { alternating: true },\n };\n const meta = { ...defaultOpts, ...options }; // merge options with defaults\n\n if (typeof parentElement === 'string') {\n parentElement = document.querySelector(parentElement);\n }\n this._parentElement = parentElement;\n this._theme = meta.theme;\n this._onSend = onSend ? onSend : () => { }; // call back function for onSend\n this._messageFormatter = meta.messageFormatter || null;\n this._sanitize = meta.sanitize || false;\n this._createWidget();\n // title area\n if (meta.titleArea) {\n this.titleAreaSetContents(meta.titleArea.title, meta.titleArea.align);\n if (meta.titleArea.show === true) {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n // messages area\n if (meta.messagesArea) {\n this.messagesAreaAlternateColors(meta.messagesArea.alternating);\n }\n // timestamps\n if (meta.showTimestamps) {\n this.messagesAreaShowTimestamps(true);\n }\n // direction (ltr/rtl)\n if (meta.direction) {\n this.setDirection(meta.direction);\n }\n // plumbing\n this._attachEventListeners();\n this.trackHistory = meta.trackHistory !== false;\n this._historyLimit = 10000000;\n this._history = [];\n }\n\n _createWidget() {\n const widgetHTML =\n `\n <div class=\"quikchat-base ${this.theme}\">\n <div class=\"quikchat-title-area\"></div>\n <div class=\"quikchat-messages-wrapper\"><div class=\"quikchat-messages-area\" role=\"log\" aria-live=\"polite\" aria-label=\"Chat messages\"></div><button class=\"quikchat-scroll-bottom\" aria-label=\"Scroll to bottom\"></button></div>\n <div class=\"quikchat-input-area\">\n <textarea class=\"quikchat-input-textbox\" rows=\"1\" aria-label=\"Type a message\"></textarea>\n <button class=\"quikchat-input-send-btn\">Send</button>\n </div>\n </div>\n `;\n\n this._parentElement.innerHTML = widgetHTML;\n this._chatWidget = this._parentElement.querySelector('.quikchat-base');\n this._titleArea = this._chatWidget.querySelector('.quikchat-title-area');\n this._messagesWrapper = this._chatWidget.querySelector('.quikchat-messages-wrapper');\n this._messagesArea = this._chatWidget.querySelector('.quikchat-messages-area');\n this._scrollBottomBtn = this._messagesWrapper.querySelector('.quikchat-scroll-bottom');\n this._inputArea = this._chatWidget.querySelector('.quikchat-input-area');\n this._textEntry = this._inputArea.querySelector('.quikchat-input-textbox');\n this._sendButton = this._inputArea.querySelector('.quikchat-input-send-btn');\n this.msgid = 0;\n }\n\n /**\n * Attach event listeners to the widget\n */\n _attachEventListeners() {\n this._sendButton.addEventListener('click', () => {\n const text = this._textEntry.value.trim();\n if (text === '') return;\n this._onSend(this, text);\n });\n this._textEntry.addEventListener('keydown', (event) => {\n // Check if Shift + Enter is pressed\n if (event.shiftKey && event.keyCode === 13) {\n event.preventDefault();\n const text = this._textEntry.value.trim();\n if (text === '') return;\n this._onSend(this, text);\n }\n });\n\n // Auto-grow textarea\n this._textEntry.addEventListener('input', () => this._autoGrowTextarea());\n\n this._messagesArea.addEventListener('scroll', () => {\n const { scrollTop, scrollHeight, clientHeight } = this._messagesArea;\n this.userScrolledUp = scrollTop + clientHeight < scrollHeight - 1;\n this._updateScrollBottomBtn();\n });\n\n // Scroll-to-bottom button\n this._scrollBottomBtn.addEventListener('click', () => this.scrollToBottom());\n\n // Ctrl+End to scroll to bottom\n this._chatWidget.addEventListener('keydown', (event) => {\n if (event.ctrlKey && event.key === 'End') {\n event.preventDefault();\n this.scrollToBottom();\n }\n });\n\n // Use ResizeObserver to detect parent container resize\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(() => this._handleContainerResize());\n this._resizeObserver.observe(this._parentElement);\n }\n }\n\n // set the onSend function callback.\n setCallbackOnSend(callback) {\n this._onSend = callback;\n }\n // set a callback for everytime a message is added (listener)\n setCallbackonMessageAdded(callback) {\n this._onMessageAdded = callback;\n }\n setCallbackonMessageAppend(callback) {\n this._onMessageAppend = callback;\n }\n setCallbackonMessageReplace(callback) {\n this._onMessageReplace = callback;\n }\n setCallbackonMessageDelete(callback) {\n this._onMessageDelete = callback;\n }\n\n // Public methods\n titleAreaToggle() {\n if (this._titleArea.style.display === 'none') {\n this.titleAreaShow();\n } else {\n this.titleAreaHide();\n }\n }\n\n titleAreaShow() {\n this._titleArea.style.display = '';\n }\n\n titleAreaHide() {\n this._titleArea.style.display = 'none';\n }\n\n titleAreaSetContents(title, align = 'center') {\n this._titleArea.innerHTML = title;\n this._titleArea.style.textAlign = align;\n }\n\n titleAreaGetContents() {\n return this._titleArea.innerHTML;\n }\n\n inputAreaToggle() {\n if (this._inputArea.style.display === 'none') {\n this.inputAreaShow();\n } else {\n this.inputAreaHide();\n }\n }\n\n inputAreaShow() {\n this._inputArea.style.display = '';\n }\n\n inputAreaHide() {\n this._inputArea.style.display = 'none';\n }\n\n inputAreaSetEnabled(enabled) {\n this._textEntry.disabled = !enabled;\n this._sendButton.disabled = !enabled;\n }\n\n inputAreaSetButtonText(text) {\n this._sendButton.textContent = text;\n }\n\n inputAreaGetButtonText() {\n return this._sendButton.textContent;\n }\n\n setDirection(dir) {\n const d = dir === 'rtl' ? 'rtl' : 'ltr';\n this._chatWidget.setAttribute('dir', d);\n if (d === 'rtl') {\n this._chatWidget.classList.add('quikchat-rtl');\n } else {\n this._chatWidget.classList.remove('quikchat-rtl');\n }\n }\n\n getDirection() {\n return this._chatWidget.getAttribute('dir') || 'ltr';\n }\n\n _handleContainerResize() {\n // Layout is handled by CSS flexbox — no JS height calculation needed.\n // This hook exists for future use or custom resize callbacks.\n }\n\n scrollToBottom() {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n this.userScrolledUp = false;\n this._updateScrollBottomBtn();\n }\n\n _updateScrollBottomBtn() {\n if (this.userScrolledUp) {\n this._scrollBottomBtn.classList.add('quikchat-scroll-bottom-visible');\n } else {\n this._scrollBottomBtn.classList.remove('quikchat-scroll-bottom-visible');\n }\n }\n\n _autoGrowTextarea() {\n const el = this._textEntry;\n el.style.height = 'auto';\n const maxHeight = 120;\n el.style.height = Math.min(el.scrollHeight, maxHeight) + 'px';\n el.style.overflowY = el.scrollHeight > maxHeight ? 'auto' : 'hidden';\n }\n\n _formatTimestamp(isoString) {\n const d = new Date(isoString);\n const h = d.getHours();\n const m = String(d.getMinutes()).padStart(2, '0');\n const ampm = h >= 12 ? 'PM' : 'AM';\n const h12 = h % 12 || 12;\n return h12 + ':' + m + ' ' + ampm;\n }\n\n messagesAreaShowTimestamps(show) {\n if (show) {\n this._messagesArea.classList.add('quikchat-show-timestamps');\n } else {\n this._messagesArea.classList.remove('quikchat-show-timestamps');\n }\n }\n\n messagesAreaShowTimestampsGet() {\n return this._messagesArea.classList.contains('quikchat-show-timestamps');\n }\n\n messagesAreaShowTimestampsToggle() {\n this._messagesArea.classList.toggle('quikchat-show-timestamps');\n }\n\n _escapeHTML(str) {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n _processContent(content) {\n if (this._sanitize === true) {\n content = this._escapeHTML(content);\n } else if (typeof this._sanitize === 'function') {\n content = this._sanitize(content);\n }\n if (this._messageFormatter) {\n content = this._messageFormatter(content);\n }\n return content;\n }\n\n //messagesArea functions\n messagesAreaAlternateColors(alt = true) {\n if (alt) {\n this._messagesArea.classList.add('quikchat-messages-area-alt');\n }\n else {\n this._messagesArea.classList.remove('quikchat-messages-area-alt');\n }\n return alt === true;\n }\n messagesAreaAlternateColorsToggle() {\n this._messagesArea.classList.toggle('quikchat-messages-area-alt');\n }\n messagesAreaAlternateColorsGet() {\n return this._messagesArea.classList.contains('quikchat-messages-area-alt');\n }\n // message functions\n messageAddFull(input = { content: \"\", userString: \"user\", align: \"right\", role: \"user\", userID: -1 }) {\n const msgid = this.msgid;\n const messageDiv = document.createElement('div');\n const msgidClass = 'quikchat-msgid-' + String(msgid).padStart(10, '0');\n messageDiv.classList.add('quikchat-message', msgidClass);\n messageDiv.classList.add('quikchat-role-' + (input.role || 'user'));\n messageDiv.classList.add('quikchat-align-' + (input.align || 'right'));\n this.msgid++;\n messageDiv.classList.add(this._messagesArea.children.length % 2 === 1 ? 'quikchat-message-1' : 'quikchat-message-2');\n\n // Visibility: default true, hidden messages get display:none\n const visible = input.visible !== false;\n if (!visible) {\n messageDiv.style.display = 'none';\n }\n\n // Tags: array of strings for group-based visibility control\n const tags = Array.isArray(input.tags) ? input.tags.slice() : [];\n\n const userDiv = document.createElement('div');\n userDiv.classList.add('quikchat-user-label');\n userDiv.style.textAlign = input.align;\n userDiv.innerHTML = input.userString;\n\n const contentDiv = document.createElement('div');\n contentDiv.classList.add('quikchat-message-content');\n contentDiv.style.textAlign = input.align;\n contentDiv.innerHTML = this._processContent(input.content);\n\n const timestamp = new Date().toISOString();\n const timestampSpan = document.createElement('span');\n timestampSpan.classList.add('quikchat-timestamp');\n timestampSpan.textContent = this._formatTimestamp(timestamp);\n\n messageDiv.appendChild(userDiv);\n messageDiv.appendChild(contentDiv);\n messageDiv.appendChild(timestampSpan);\n this._messagesArea.appendChild(messageDiv);\n\n // Scroll to the last message only if the user is not actively scrolling up\n if (!this.userScrolledUp) {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n }\n\n this._textEntry.value = '';\n this._autoGrowTextarea();\n const updatedtime = timestamp;\n\n if (this.trackHistory) {\n this._history.push({ msgid, ...input, visible, tags, timestamp, updatedtime, messageDiv });\n if (this._history.length > this._historyLimit) {\n this._history.shift();\n }\n }\n\n if (this._onMessageAdded) {\n this._onMessageAdded(this, msgid);\n }\n\n return msgid;\n }\n\n\n messageAddNew(content = \"\", userString = \"user\", align = \"right\", role = \"user\") {\n return this.messageAddFull(\n { content: content, userString: userString, align: align, role: role }\n );\n }\n messageRemove(n) {\n let success = false;\n try {\n this._messagesArea.removeChild(this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`));\n success = true;\n }\n catch (_error) {\n // Message ID not found\n }\n if (success) {\n this._history.splice(this._history.findIndex((item) => item.msgid === n), 1);\n if (this._onMessageDelete) {\n this._onMessageDelete(this, n);\n }\n }\n return success;\n }\n /* returns the message html object from the DOM\n */\n messageGetDOMObject(n) {\n let msg = null;\n try {\n msg = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n }\n catch (_error) {\n // Message ID not found\n }\n return msg;\n }\n /* returns the message content only\n */\n messageGetContent(n) {\n let content = \"\";\n try {\n content = this._history.filter((item) => item.msgid === n)[0].content;\n }\n catch (_error) {\n // Message ID not found\n }\n return content;\n }\n\n messageSetVisible(n, visible) {\n const msgEl = this.messageGetDOMObject(n);\n if (!msgEl) return false;\n msgEl.style.display = visible ? '' : 'none';\n const item = this._history.find((entry) => entry.msgid === n);\n if (item) item.visible = visible;\n return true;\n }\n\n messageGetVisible(n) {\n const item = this._history.find((entry) => entry.msgid === n);\n return item ? item.visible !== false : false;\n }\n\n messageToggleVisible(n) {\n const current = this.messageGetVisible(n);\n return this.messageSetVisible(n, !current);\n }\n\n messageSetVisibleByTag(tag, visible) {\n let count = 0;\n for (const item of this._history) {\n if (item.tags && item.tags.includes(tag)) {\n this.messageSetVisible(item.msgid, visible);\n count++;\n }\n }\n return count;\n }\n\n messageGetTags(n) {\n const item = this._history.find((entry) => entry.msgid === n);\n return item && item.tags ? item.tags.slice() : [];\n }\n\n messageSetTags(n, tags) {\n const item = this._history.find((entry) => entry.msgid === n);\n if (!item) return false;\n item.tags = Array.isArray(tags) ? tags.slice() : [];\n return true;\n }\n\n /* append message to the message content\n */\n messageAppendContent(n, content) {\n let success = false;\n try {\n const msgEl = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n const item = this._history.filter((entry) => entry.msgid === n)[0];\n item.content += content;\n item.updatedtime = new Date().toISOString();\n msgEl.querySelector('.quikchat-message-content').innerHTML = this._processContent(item.content);\n msgEl.classList.remove('quikchat-typing');\n success = true;\n\n if (!this.userScrolledUp) {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n }\n if (this._onMessageAppend) {\n this._onMessageAppend(this, n, content);\n }\n } catch (_error) {\n // Message ID not found\n }\n return success;\n }\n\n /* replace message content\n */\n messageReplaceContent(n, content) {\n let success = false;\n try {\n const msgEl = this._messagesArea.querySelector(`.quikchat-msgid-${String(n).padStart(10, '0')}`);\n const item = this._history.filter((entry) => entry.msgid === n)[0];\n item.content = content;\n item.updatedtime = new Date().toISOString();\n msgEl.querySelector('.quikchat-message-content').innerHTML = this._processContent(content);\n msgEl.classList.remove('quikchat-typing');\n success = true;\n\n if (!this.userScrolledUp) {\n this._messagesArea.scrollTop = this._messagesArea.scrollHeight;\n }\n if (this._onMessageReplace) {\n this._onMessageReplace(this, n, content);\n }\n } catch (_error) {\n // Message ID not found\n }\n return success;\n }\n\n messageAddTypingIndicator(userString = '', align = 'left') {\n const msgid = this.messageAddFull({\n content: '',\n userString: userString,\n align: align,\n role: 'assistant',\n });\n const msgEl = this.messageGetDOMObject(msgid);\n msgEl.classList.add('quikchat-typing');\n const contentDiv = msgEl.querySelector('.quikchat-message-content');\n contentDiv.innerHTML = '<span class=\"quikchat-typing-dots\"><span>.</span><span>.</span><span>.</span></span>';\n return msgid;\n }\n\n setMessageFormatter(formatter) {\n this._messageFormatter = formatter;\n }\n\n setSanitize(sanitize) {\n this._sanitize = sanitize;\n }\n\n // history functions\n /**\n *\n * @param {*} n\n * @param {*} m\n * @returns array of history messages\n */\n historyGet(n, m) {\n if (n === undefined) {\n return this._history.slice();\n }\n if (m === undefined) {\n if (n < 0) {\n return this._history.slice(n);\n }\n return this._history.slice(n, n + 1);\n }\n return this._history.slice(n, m);\n }\n\n historyClear() {\n this.msgid = 0;\n this._history = [];\n }\n\n historyGetLength() {\n return this._history.length;\n }\n\n historyGetMessage(n) {\n if (n >= 0 && n < this._history.length) {\n return this._history[n];\n }\n return {};\n }\n\n historyGetMessageContent(n) {\n if (n >= 0 && n < this._history.length) {\n return this._history[n].content;\n }\n return \"\";\n }\n\n historyExport() {\n return this._history.map((item) => ({\n msgid: item.msgid,\n content: item.content,\n userString: item.userString,\n align: item.align,\n role: item.role,\n userID: item.userID,\n visible: item.visible,\n tags: item.tags ? item.tags.slice() : [],\n timestamp: item.timestamp,\n updatedtime: item.updatedtime,\n }));\n }\n\n historyImport(data) {\n // Clear existing messages from DOM and history\n this._messagesArea.innerHTML = '';\n this._history = [];\n this.msgid = 0;\n\n for (const entry of data) {\n this.messageAddFull({\n content: entry.content || '',\n userString: entry.userString || 'user',\n align: entry.align || 'right',\n role: entry.role || 'user',\n userID: entry.userID,\n visible: entry.visible,\n tags: entry.tags,\n });\n }\n }\n\n changeTheme(newTheme) {\n this._chatWidget.classList.remove(this._theme);\n this._chatWidget.classList.add(newTheme);\n this._theme = newTheme;\n }\n\n get theme() {\n return this._theme;\n }\n\n static version() {\n return { \"version\": \"1.2.6\", \"license\": \"BSD-2\", \"url\": \"https://github/deftio/quikchat\" };\n }\n\n /**\n * quikchat.loremIpsum() - Generate a simple string of Lorem Ipsum text (sample typographer's text) of numChars in length.\n * borrowed from github.com/deftio/bitwrench.js\n * @param {number} numChars - The number of characters to generate (random btw 25 and 150 if undefined).\n * @param {number} [startSpot=0] - The starting index in the Lorem Ipsum text. If undefined, a random startSpot will be generated.\n * @param {boolean} [startWithCapitalLetter=true] - If true, capitalize the first character or inject a capital letter if the first character isn't a capital letter.\n *\n * @returns {string} A string of Lorem Ipsum text.\n *\n * @example\n * // Returns 200 characters of Lorem Ipsum starting from index 50\n * loremIpsum(200, 50);\n *\n * @example\n * //Returns a 200 Lorem Ipsum characters starting from a random index\n * loremIpsum(200);\n */\n\n static loremIpsum(numChars, startSpot = undefined, startWithCapitalLetter = true) {\n const loremText = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \";\n\n if (typeof numChars !== \"number\") {\n numChars = Math.floor(Math.random() * 126) + 25;\n }\n\n if (startSpot === undefined) {\n startSpot = Math.floor(Math.random() * loremText.length);\n }\n\n startSpot = startSpot % loremText.length;\n\n // Move startSpot to the next non-whitespace and non-punctuation character\n while (loremText[startSpot] === ' ' || /[.,:;!?]/.test(loremText[startSpot])) {\n startSpot = (startSpot + 1) % loremText.length;\n }\n\n const l = loremText.substring(startSpot) + loremText.substring(0, startSpot);\n\n let s = \"\";\n while (numChars > 0) {\n s += numChars < l.length ? l.substring(0, numChars) : l;\n numChars -= l.length;\n }\n\n if (s[s.length - 1] === \" \") {\n s = s.substring(0, s.length - 1) + \".\"; // always end on non-whitespace. \".\" was chosen arbitrarily.\n }\n\n if (startWithCapitalLetter) {\n s = s[0].toUpperCase() + s.substring(1);\n }\n\n return s;\n };\n\n\n}\n\nexport default quikchat;\n"],"names":["quikchat","parentElement","onSend","arguments","length","undefined","options","_classCallCheck","meta","_objectSpread","theme","trackHistory","showTimestamps","titleArea","title","show","align","messagesArea","alternating","document","querySelector","this","_parentElement","_theme","_onSend","_messageFormatter","messageFormatter","_sanitize","sanitize","_createWidget","titleAreaSetContents","titleAreaShow","titleAreaHide","messagesAreaAlternateColors","messagesAreaShowTimestamps","direction","setDirection","_attachEventListeners","_historyLimit","_history","key","value","widgetHTML","concat","innerHTML","_chatWidget","_titleArea","_messagesWrapper","_messagesArea","_scrollBottomBtn","_inputArea","_textEntry","_sendButton","msgid","_this","addEventListener","text","trim","event","shiftKey","keyCode","preventDefault","_autoGrowTextarea","_this$_messagesArea","scrollTop","scrollHeight","clientHeight","userScrolledUp","_updateScrollBottomBtn","scrollToBottom","ctrlKey","ResizeObserver","_resizeObserver","_handleContainerResize","observe","callback","_onMessageAdded","_onMessageAppend","_onMessageReplace","_onMessageDelete","style","display","textAlign","inputAreaShow","inputAreaHide","enabled","disabled","textContent","dir","d","setAttribute","classList","add","remove","getAttribute","el","height","Math","min","overflowY","isoString","Date","h","getHours","String","getMinutes","padStart","contains","toggle","str","div","createElement","content","_escapeHTML","alt","input","userString","role","userID","messageDiv","msgidClass","children","visible","tags","Array","isArray","slice","userDiv","contentDiv","_processContent","timestamp","toISOString","timestampSpan","_formatTimestamp","appendChild","updatedtime","push","shift","messageAddFull","n","success","removeChild","_error","splice","findIndex","item","msg","filter","msgEl","messageGetDOMObject","find","entry","current","messageGetVisible","messageSetVisible","tag","_step","count","_iterator","_createForOfIteratorHelper","s","done","includes","err","e","f","formatter","m","map","data","_step2","_iterator2","newTheme","get","version","license","url","numChars","startSpot","startWithCapitalLetter","loremText","floor","random","test","l","substring","toUpperCase"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quikchat",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "quikchat is a simple vanilla (no dependancies) JavaScript chat control for browsers ",
5
5
  "author": "deftio (https://github.com/deftio",
6
6
  "license": "BSD-2-Clause",
@@ -42,7 +42,7 @@
42
42
  "examples": "examples"
43
43
  },
44
44
  "scripts": {
45
- "dev": "node ./tools/devserver.cjs",
45
+ "dev": "npx bwcli serve . -p 6809 --listen 9000 --allow-exec --no-dir-list & sleep 1 && open http://localhost:6809/site/; wait",
46
46
  "lint": "eslint src/",
47
47
  "test": "jest --coverage",
48
48
  "test:e2e": "npx playwright test tests/resize.spec.cjs --reporter=line",
@@ -102,15 +102,16 @@
102
102
  "@rollup/plugin-node-resolve": "^16.0.3",
103
103
  "@rollup/plugin-terser": "^1.0.0",
104
104
  "babel-jest": "^30.3.0",
105
+ "bitwrench": "^2.0.31",
105
106
  "clean-css": "^5.3.3",
106
107
  "clean-css-cli": "^5.6.3",
107
- "cssnano": "^7.1.4",
108
+ "cssnano": "^7.1.5",
108
109
  "eslint": "^10.2.0",
109
- "globals": "^17.4.0",
110
+ "globals": "^17.5.0",
110
111
  "husky": "^9.1.7",
111
112
  "jest": "^30.3.0",
112
113
  "jest-environment-jsdom": "^30.3.0",
113
- "quikdown": "^1.1.1",
114
+ "quikdown": "^1.2.10",
114
115
  "rollup": "^4.60.1",
115
116
  "rollup-plugin-css-only": "^4.5.5",
116
117
  "rollup-plugin-postcss": "^4.0.2"