From a9aca667fc1273710f55cf7756df45485af9c69f Mon Sep 17 00:00:00 2001 From: Mitchdev Date: Tue, 19 Sep 2023 18:24:30 +1200 Subject: [PATCH 1/4] Watching Focus --- assets/chat/css/style.scss | 19 +++++++++++++- assets/chat/img/icon-watching.svg | 1 + assets/chat/js/chat.js | 29 +++++++++++++++++++++- assets/chat/js/messages/ChatUserMessage.js | 15 +++++++++++ assets/chat/js/user.js | 9 +++++++ assets/chat/js/window.js | 1 + assets/views/embed.html | 7 ++++++ 7 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 assets/chat/img/icon-watching.svg diff --git a/assets/chat/css/style.scss b/assets/chat/css/style.scss index 00834d9c..1733d3b0 100644 --- a/assets/chat/css/style.scss +++ b/assets/chat/css/style.scss @@ -200,6 +200,11 @@ hr { center; background-size: contain; } + #chat-watching-focus-btn .btn-icon { + background: transparent url('../img/icon-watching.svg') no-repeat center + center; + background-size: contain; + } #chat-settings-btn .btn-icon { background: transparent url('../img/icon-settings.svg') no-repeat center center; @@ -836,8 +841,20 @@ hr { } } +.watching-focus { + .msg-emote, + .msg-user { + opacity: 0.3; + + &.watching-same, + &.msg-highlight { + opacity: 1; + } + } +} + /* Focus or highlight a line */ -.focus .msg-chat { +.focus:not(.watching-focus) .msg-chat { opacity: 0.3; &.msg-pinned { diff --git a/assets/chat/img/icon-watching.svg b/assets/chat/img/icon-watching.svg new file mode 100644 index 00000000..35acc10f --- /dev/null +++ b/assets/chat/img/icon-watching.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/chat/js/chat.js b/assets/chat/js/chat.js index 7f5c2078..c7148415 100644 --- a/assets/chat/js/chat.js +++ b/assets/chat/js/chat.js @@ -102,6 +102,7 @@ class Chat { this.regexhighlightnicks = null; this.regexhighlightself = null; this.replyusername = null; + this.watchingfocus = false; // An interface to tell the chat to do things via chat commands, or via emit // e.g. control.emit('CONNECT', 'ws://localhost:9001') is essentially chat.cmdCONNECT('ws://localhost:9001') @@ -352,6 +353,12 @@ class Chat { } }); + // Watching focus + this.ui.on('click touch', '#chat-watching-focus-btn', () => { + this.watchingfocus = !this.watchingfocus; + this.ui.toggleClass('watching-focus', this.watchingfocus); + }); + // Chat focus / menu close when clicking on some areas let downinoutput = false; this.output.on('mousedown', () => { @@ -687,6 +694,12 @@ class Chat { ) { user.createdDate = data.createdDate; } + if ( + Object.hasOwn(data, 'watching') && + !user.equalWatching(data.watching) + ) { + user.watching = data.watching; + } } return user; } @@ -1059,10 +1072,21 @@ class Chat { ) { if (win.lastmessage.type === MessageTypes.EMOTE) { win.lastmessage.incEmoteCount(); + + if (this.user.equalWatching(usr.watching)) { + win.lastmessage.ui.classList.toggle('watching-same', true); + } + this.mainwindow.update(); } else { win.removeLastMessage(); - MessageBuilder.emote(textonly, data.timestamp, 2).into(this); + const msg = MessageBuilder.emote(textonly, data.timestamp, 2).into( + this, + ); + + if (this.user.equalWatching(usr.watching)) { + msg.ui.classList.add('watching-same'); + } } } else if (!this.resolveMessage(data.nick, data.data)) { MessageBuilder.message(data.data, usr, data.timestamp).into(this); @@ -1396,6 +1420,9 @@ class Chat { onUPDATEUSER(data) { if (this.user?.id === data.id) { this.setUser(data); + for (const window of this.windows.values()) { + window.updateMessages(this); + } } } diff --git a/assets/chat/js/messages/ChatUserMessage.js b/assets/chat/js/messages/ChatUserMessage.js index 63835093..d49961b0 100644 --- a/assets/chat/js/messages/ChatUserMessage.js +++ b/assets/chat/js/messages/ChatUserMessage.js @@ -27,6 +27,7 @@ export default class ChatUserMessage extends ChatMessage { this.title = ''; this.slashme = false; this.mentioned = []; + this.watching = null; } html(chat = null) { @@ -37,6 +38,13 @@ export default class ChatUserMessage extends ChatMessage { if (this.user && this.user.username) { classes.push(...this.user.features); attr['data-username'] = this.user.username.toLowerCase(); + + if (this.user.watching) { + this.watching = this.user.watching; + if (chat.user.equalWatching(this.user.watching)) { + classes.push('watching-same'); + } + } } if (this.mentioned && this.mentioned.length > 0) attr['data-mentioned'] = this.mentioned.join(' ').toLowerCase(); @@ -108,4 +116,11 @@ export default class ChatUserMessage extends ChatMessage { this.ui.classList.toggle('msg-own', isOwn); this.isown = isOwn; } + + setWatching(user) { + this.ui.classList.toggle( + 'watching-same', + user.watching && user.equalWatching(this.watching), + ); + } } diff --git a/assets/chat/js/user.js b/assets/chat/js/user.js index 27e8dff1..b90877d9 100644 --- a/assets/chat/js/user.js +++ b/assets/chat/js/user.js @@ -8,12 +8,14 @@ class ChatUser { this.username = args; this.createdDate = args; this.features = []; + this.watching = null; } else { this.id = args.id || null; this.nick = args.nick || ''; this.username = args.nick || ''; this.createdDate = args.createdDate || ''; this.features = args.features || []; + this.watching = args.watching || null; } } @@ -73,6 +75,13 @@ class ChatUser { } return 0; } + + equalWatching(embed) { + return ( + this.watching?.platform === embed?.platform && + this.watching?.id === embed?.id + ); + } } export default ChatUser; diff --git a/assets/chat/js/window.js b/assets/chat/js/window.js index c47de9b0..dfefa72a 100644 --- a/assets/chat/js/window.js +++ b/assets/chat/js/window.js @@ -135,6 +135,7 @@ class ChatWindow extends EventEmitter { message.highlight(chat.shouldHighlightMessage(message)); message.setTag(chat.taggednicks.get(username)); message.setTagTitle(chat.taggednotes.get(username)); + message.setWatching(chat.user); if (message.moderated) { message.censor(parseInt(chat.settings.get('showremoved') || '1', 10)); diff --git a/assets/views/embed.html b/assets/views/embed.html index 87ddb616..0d73a6de 100644 --- a/assets/views/embed.html +++ b/assets/views/embed.html @@ -51,6 +51,13 @@
+ + + From cf81e7ac5762168e784e65e7f73fb54ccfa91a83 Mon Sep 17 00:00:00 2001 From: Mitchdev Date: Sun, 3 Dec 2023 23:27:51 +1300 Subject: [PATCH 2/4] Fix for new event messages --- assets/chat/js/messages/ChatMessage.js | 8 ++++++++ assets/chat/js/messages/ChatUserMessage.js | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/chat/js/messages/ChatMessage.js b/assets/chat/js/messages/ChatMessage.js index f5a2d5ff..e277b6ca 100644 --- a/assets/chat/js/messages/ChatMessage.js +++ b/assets/chat/js/messages/ChatMessage.js @@ -40,6 +40,7 @@ export default class ChatMessage extends ChatUIMessage { this.unformatted = unformatted; this.ignored = false; this.censorType = null; + this.watching = null; } html(chat = null) { @@ -146,4 +147,11 @@ export default class ChatMessage extends ChatUIMessage { this.ui.classList.toggle('msg-own', isOwn); this.isown = isOwn; } + + setWatching(user) { + this.ui.classList.toggle( + 'watching-same', + user.equalWatching(this.watching), + ); + } } diff --git a/assets/chat/js/messages/ChatUserMessage.js b/assets/chat/js/messages/ChatUserMessage.js index 17b81144..0beb5297 100644 --- a/assets/chat/js/messages/ChatUserMessage.js +++ b/assets/chat/js/messages/ChatUserMessage.js @@ -27,7 +27,6 @@ export default class ChatUserMessage extends ChatMessage { this.title = ''; this.slashme = false; this.mentioned = []; - this.watching = null; } html(chat = null) { @@ -116,11 +115,4 @@ export default class ChatUserMessage extends ChatMessage { this.ui.classList.toggle('msg-own', isOwn); this.isown = isOwn; } - - setWatching(user) { - this.ui.classList.toggle( - 'watching-same', - user.watching && user.equalWatching(this.watching), - ); - } } From 19f0f8d0117e0c44614eb50a7e69d6836851c0d3 Mon Sep 17 00:00:00 2001 From: Mitchdev Date: Sun, 3 Dec 2023 23:29:40 +1300 Subject: [PATCH 3/4] Add bootstrap tooltip --- .eslintrc.js | 1 + assets/chat/css/style.scss | 1 + assets/chat/js/chat.js | 4 ++++ assets/demo.js | 1 + assets/views/embed.html | 4 +++- package-lock.json | 48 ++++++++++++++++++++++++++++++++++++-- package.json | 3 ++- 7 files changed, 58 insertions(+), 4 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index ae7cb4af..aff794c0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -11,6 +11,7 @@ module.exports = { }, rules: { 'class-methods-use-this': 'off', + 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], 'no-param-reassign': ['error', { props: false }], 'prefer-destructuring': ['error', { object: true, array: false }], diff --git a/assets/chat/css/style.scss b/assets/chat/css/style.scss index 1733d3b0..1ddbba67 100644 --- a/assets/chat/css/style.scss +++ b/assets/chat/css/style.scss @@ -1,6 +1,7 @@ @import '../../common'; @import '../../icons/icons'; @import '~normalize.css'; +@import '~bootstrap'; @import url('https://fonts.googleapis.com/css?family=Roboto:400,500,600,700'); *, diff --git a/assets/chat/js/chat.js b/assets/chat/js/chat.js index ad75ede3..14db10ae 100644 --- a/assets/chat/js/chat.js +++ b/assets/chat/js/chat.js @@ -2,6 +2,7 @@ import { fetch } from 'whatwg-fetch'; import $ from 'jquery'; import { debounce } from 'throttle-debounce'; import moment from 'moment'; +import { Tooltip } from 'bootstrap'; import { KEYCODES, DATE_FORMATS, @@ -266,6 +267,9 @@ class Chat { return link.sheet; })(); + const tooltipList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); + tooltipList.forEach((el) => new Tooltip(el)); + this.ishidden = (document.visibilityState || 'visible') !== 'visible'; this.output = this.ui.find('#chat-output-frame'); this.input = this.ui.find('#chat-input-control'); diff --git a/assets/demo.js b/assets/demo.js index 7eba5cdb..48e36d67 100644 --- a/assets/demo.js +++ b/assets/demo.js @@ -49,6 +49,7 @@ switch ((Chat.reqParam('t') || 'embed').toUpperCase()) { case 'EMBED': default: + html.attr('data-bs-theme', 'dark'); chat .withGui(embedHtml) .then(() => chat.loadEmotesAndFlairs()) diff --git a/assets/views/embed.html b/assets/views/embed.html index 9abd3ff6..959e96b1 100644 --- a/assets/views/embed.html +++ b/assets/views/embed.html @@ -54,7 +54,9 @@ diff --git a/package-lock.json b/package-lock.json index 55f7f638..8cd920b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,9 @@ "packages": { "": { "name": "dgg-chat-gui", - "version": "2.37.0", + "version": "2.38.1", "license": "SEE LICENSE IN ", "dependencies": { - "bufferutil": "^4.0.3", "dotenv": "^16.0.3", "jquery": "^3.6.0", "moment": "~2.29.1", @@ -25,6 +24,7 @@ "@babel/preset-env": "^7.14.2", "autoprefixer": "^10.2.5", "babel-loader": "^9.1.2", + "bootstrap": "^5.3.2", "css-loader": "^6.7.3", "eslint": "^8.27.0", "eslint-config-airbnb-base": "^15.0.0", @@ -2748,6 +2748,17 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4186,6 +4197,25 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -16167,6 +16197,13 @@ "fastq": "^1.6.0" } }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "peer": true + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -17324,6 +17361,13 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "dev": true, + "requires": {} + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", diff --git a/package.json b/package.json index ccac2e2b..05f85f3b 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@babel/preset-env": "^7.14.2", "autoprefixer": "^10.2.5", "babel-loader": "^9.1.2", + "bootstrap": "^5.3.2", "css-loader": "^6.7.3", "eslint": "^8.27.0", "eslint-config-airbnb-base": "^15.0.0", @@ -87,4 +88,4 @@ "prettier -cwu --loglevel silent ." ] } -} +} \ No newline at end of file From a42e6b8bfdd8b5ac32af7ecbb27e9edc05d96119 Mon Sep 17 00:00:00 2001 From: Mitchdev Date: Tue, 5 Dec 2023 22:36:21 +1300 Subject: [PATCH 4/4] Swap bootstrap with tippy --- .eslintrc.js | 1 - assets/chat/css/style.scss | 13 +++++++++- assets/chat/js/chat.js | 13 +++++++--- assets/demo.js | 1 - assets/views/embed.html | 4 +-- package-lock.json | 50 ++++++++++++++------------------------ package.json | 2 +- 7 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index aff794c0..ae7cb4af 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -11,7 +11,6 @@ module.exports = { }, rules: { 'class-methods-use-this': 'off', - 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], 'no-param-reassign': ['error', { props: false }], 'prefer-destructuring': ['error', { object: true, array: false }], diff --git a/assets/chat/css/style.scss b/assets/chat/css/style.scss index 1ddbba67..6cc58035 100644 --- a/assets/chat/css/style.scss +++ b/assets/chat/css/style.scss @@ -1,7 +1,8 @@ @import '../../common'; @import '../../icons/icons'; @import '~normalize.css'; -@import '~bootstrap'; +@import '~tippy.js/dist/tippy.css'; +@import '~tippy.js/dist/svg-arrow.css'; @import url('https://fonts.googleapis.com/css?family=Roboto:400,500,600,700'); *, @@ -2180,3 +2181,13 @@ body.pref-fontscale[data-fontscale='10'] { font-family: 'Among Us'; src: url('../../../fonts/AmongUs-Regular.ttf') format('truetype'); } + +.tippy-box[data-theme~='dgg'] { + text-align: center; + background-color: white; + color: #000; +} + +.tippy-box[data-theme~='dgg'] > .tippy-svg-arrow { + fill: white; +} diff --git a/assets/chat/js/chat.js b/assets/chat/js/chat.js index 14db10ae..81a40d04 100644 --- a/assets/chat/js/chat.js +++ b/assets/chat/js/chat.js @@ -2,7 +2,7 @@ import { fetch } from 'whatwg-fetch'; import $ from 'jquery'; import { debounce } from 'throttle-debounce'; import moment from 'moment'; -import { Tooltip } from 'bootstrap'; +import tippy, { roundArrow } from 'tippy.js'; import { KEYCODES, DATE_FORMATS, @@ -267,8 +267,15 @@ class Chat { return link.sheet; })(); - const tooltipList = document.querySelectorAll('[data-bs-toggle="tooltip"]'); - tooltipList.forEach((el) => new Tooltip(el)); + // Tooltips + tippy('[data-tippy-content]', { + arrow: roundArrow, + delay: 0, + duration: 0, + maxWidth: 250, + hideOnClick: false, + theme: 'dgg', + }); this.ishidden = (document.visibilityState || 'visible') !== 'visible'; this.output = this.ui.find('#chat-output-frame'); diff --git a/assets/demo.js b/assets/demo.js index 48e36d67..7eba5cdb 100644 --- a/assets/demo.js +++ b/assets/demo.js @@ -49,7 +49,6 @@ switch ((Chat.reqParam('t') || 'embed').toUpperCase()) { case 'EMBED': default: - html.attr('data-bs-theme', 'dark'); chat .withGui(embedHtml) .then(() => chat.loadEmotesAndFlairs()) diff --git a/assets/views/embed.html b/assets/views/embed.html index 959e96b1..20f96e01 100644 --- a/assets/views/embed.html +++ b/assets/views/embed.html @@ -54,9 +54,7 @@ diff --git a/package-lock.json b/package-lock.json index 8cd920b5..5805adc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "overlayscrollbars": "^2.0.3", "sass-loader": "^13.2.0", "throttle-debounce": "~5.0.0", + "tippy.js": "^6.3.7", "whatwg-fetch": "^3.6.2" }, "devDependencies": { @@ -24,7 +25,6 @@ "@babel/preset-env": "^7.14.2", "autoprefixer": "^10.2.5", "babel-loader": "^9.1.2", - "bootstrap": "^5.3.2", "css-loader": "^6.7.3", "eslint": "^8.27.0", "eslint-config-airbnb-base": "^15.0.0", @@ -2752,8 +2752,6 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -4197,25 +4195,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "node_modules/bootstrap": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", - "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -13170,6 +13149,14 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -16200,9 +16187,7 @@ "@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, - "peer": true + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@sinclair/typebox": { "version": "0.27.8", @@ -17361,13 +17346,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "bootstrap": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", - "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", - "dev": true, - "requires": {} - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -23950,6 +23928,14 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "requires": { + "@popperjs/core": "^2.9.0" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", diff --git a/package.json b/package.json index 05f85f3b..e96cc93a 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "overlayscrollbars": "^2.0.3", "sass-loader": "^13.2.0", "throttle-debounce": "~5.0.0", + "tippy.js": "^6.3.7", "whatwg-fetch": "^3.6.2" }, "devDependencies": { @@ -48,7 +49,6 @@ "@babel/preset-env": "^7.14.2", "autoprefixer": "^10.2.5", "babel-loader": "^9.1.2", - "bootstrap": "^5.3.2", "css-loader": "^6.7.3", "eslint": "^8.27.0", "eslint-config-airbnb-base": "^15.0.0",