From e24d8e755991b35468488eb480578dd0e4e7b59b Mon Sep 17 00:00:00 2001 From: germanocaumo Date: Thu, 24 Jul 2025 07:26:44 -0300 Subject: [PATCH 01/10] feat: add quiz support - Change poll title in chat and show checkmark next to the correct answer (if showCorrectAnswer is true). - Update tldraw to alswo show the checkmark in the poll shape. --- src/components/chat/messages/index.js | 8 +++++--- src/components/chat/messages/system/poll/index.js | 13 ++++++++++++- src/components/chat/messages/system/poll/options.js | 8 ++++++-- src/locales/messages/ar.json | 1 + src/locales/messages/ca.json | 1 + src/locales/messages/cs_CZ.json | 1 + src/locales/messages/de.json | 1 + src/locales/messages/el_GR.json | 1 + src/locales/messages/en.json | 1 + src/locales/messages/eo.json | 2 ++ src/locales/messages/et.json | 1 + src/locales/messages/eu.json | 1 + src/locales/messages/fa_IR.json | 1 + src/locales/messages/fr.json | 1 + src/locales/messages/gl.json | 1 + src/locales/messages/he.json | 1 + src/locales/messages/hr.json | 1 + src/locales/messages/hu_HU.json | 1 + src/locales/messages/hy.json | 1 + src/locales/messages/id.json | 1 + src/locales/messages/it_IT.json | 1 + src/locales/messages/ja.json | 1 + src/locales/messages/ka.json | 1 + src/locales/messages/ko_KR.json | 1 + src/locales/messages/nl.json | 1 + src/locales/messages/oc.json | 1 + src/locales/messages/pl_PL.json | 1 + src/locales/messages/pt.json | 1 + src/locales/messages/pt_BR.json | 1 + src/locales/messages/ru.json | 1 + src/locales/messages/sv_SE.json | 1 + src/locales/messages/te.json | 1 + src/locales/messages/tr.json | 1 + src/locales/messages/tr_TR.json | 1 + src/locales/messages/uk_UA.json | 1 + src/locales/messages/vi_VN.json | 1 + src/locales/messages/zh_CN.json | 1 + src/locales/messages/zh_TW.json | 1 + 38 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/components/chat/messages/index.js b/src/components/chat/messages/index.js index d2cc1a59..08a11aff 100644 --- a/src/components/chat/messages/index.js +++ b/src/components/chat/messages/index.js @@ -15,7 +15,7 @@ const propTypes = { const defaultProps = { currentIndex: 0, - setRef: () => {}, + setRef: () => { }, }; const Messages = ({ @@ -34,9 +34,9 @@ const Messages = ({ switch (type) { case ID.USERS: - const indexOfMessageToBeReplied = (item.replyToMessageId) + const indexOfMessageToBeReplied = (item.replyToMessageId) ? storage.messages.findIndex((message) => message.id === item.replyToMessageId) : -1; - const messageToBeReplied = (indexOfMessageToBeReplied !== -1) + const messageToBeReplied = (indexOfMessageToBeReplied !== -1) ? storage.messages[indexOfMessageToBeReplied] : null; return ( @@ -72,6 +72,8 @@ const Messages = ({ responders={item.responders} timestamp={timestamp} type={item.type} + isQuiz={item.isQuiz} + showCorrectAnswer={item.showCorrectAnswer} /> ); diff --git a/src/components/chat/messages/system/poll/index.js b/src/components/chat/messages/system/poll/index.js index b7856b50..1fa8e3e6 100644 --- a/src/components/chat/messages/system/poll/index.js +++ b/src/components/chat/messages/system/poll/index.js @@ -16,6 +16,10 @@ const intlMessages = defineMessages({ id: 'player.chat.message.poll.name', description: 'Label for the poll message name', }, + quiz: { + id: 'player.chat.message.poll.quiz', + description: 'Label for the quiz message name', + }, }); const propTypes = { @@ -25,6 +29,8 @@ const propTypes = { responders: PropTypes.number, timestamp: PropTypes.number, type: PropTypes.string, + isQuiz: PropTypes.bool, + showCorrectAnswer: PropTypes.bool, }; const defaultProps = { @@ -34,6 +40,8 @@ const defaultProps = { responders: 0, timestamp: 0, type: '', + isQuiz: false, + showCorrectAnswer: false, }; const Poll = ({ @@ -43,6 +51,8 @@ const Poll = ({ responders, timestamp, type, + isQuiz, + showCorrectAnswer, }) => { const intl = useIntl(); @@ -50,7 +60,7 @@ const Poll = ({ @@ -61,6 +71,7 @@ const Poll = ({ ); diff --git a/src/components/chat/messages/system/poll/options.js b/src/components/chat/messages/system/poll/options.js index 0975e61f..e324e6e7 100644 --- a/src/components/chat/messages/system/poll/options.js +++ b/src/components/chat/messages/system/poll/options.js @@ -38,16 +38,19 @@ const intlMessages = defineMessages({ const propTypes = { answers: PropTypes.array, type: PropTypes.string, + showCorrectAnswer: PropTypes.bool, }; const defaultProps = { answers: [], type: '', + showCorrectAnswer: false, }; const Options = ({ answers, type, + showCorrectAnswer, }) => { const intl = useIntl(); @@ -62,13 +65,14 @@ const Options = ({ const { id, key, + isCorrectAnswer } = item; const label = getPollLabel(key, type); - return( + return (
- {id + 1}: {label ? intl.formatMessage(intlMessages[label]) : key} + {id + 1}: {label ? intl.formatMessage(intlMessages[label]) : key} {showCorrectAnswer && isCorrectAnswer && '✅'}
); })} diff --git a/src/locales/messages/ar.json b/src/locales/messages/ar.json index bf5c8856..14ace897 100644 --- a/src/locales/messages/ar.json +++ b/src/locales/messages/ar.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "الشريحة السابقة", "player.about.modal.shortcuts.swap": "تبادل المحتوى", "player.chat.message.poll.name": "نتيجة التصويت", + "player.chat.message.poll.quiz": "نتيجة الاختبار", "player.chat.message.poll.question": "سؤال", "player.chat.message.poll.options": "خيارات", "player.chat.message.poll.option.yes": "نعم", diff --git a/src/locales/messages/ca.json b/src/locales/messages/ca.json index 952810ec..96d4122f 100644 --- a/src/locales/messages/ca.json +++ b/src/locales/messages/ca.json @@ -22,6 +22,7 @@ "player.about.modal.shortcuts.skip.previous": "Diapositiva anterior", "player.about.modal.shortcuts.swap": "Intercanviar continguts", "player.chat.message.poll.name": "Resultat de l'enquesta", + "player.chat.message.poll.quiz": "Resultat del qüestionari", "player.chat.message.poll.question": "Pregunta", "player.chat.message.poll.options": "Opcions", "player.chat.message.poll.option.yes": "Sí", diff --git a/src/locales/messages/cs_CZ.json b/src/locales/messages/cs_CZ.json index d92844ad..0fae394a 100644 --- a/src/locales/messages/cs_CZ.json +++ b/src/locales/messages/cs_CZ.json @@ -11,6 +11,7 @@ "loader.wrapper.aria": "Sekce Loader", "player.wrapper.aria": "Sekce přehrávače", "player.chat.message.poll.name": "Výsledky ankety", + "player.chat.message.poll.quiz": "Výsledek kvízu", "player.chat.message.poll.question": "Otázka", "player.chat.message.poll.options": "Možnosti", "player.chat.message.poll.option.yes": "Ano", diff --git a/src/locales/messages/de.json b/src/locales/messages/de.json index 27e5563e..002191dd 100644 --- a/src/locales/messages/de.json +++ b/src/locales/messages/de.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Vorherige Folie", "player.about.modal.shortcuts.swap": "Inhalt umschalten", "player.chat.message.poll.name": "Umfrageergebnis", + "player.chat.message.poll.quiz": "Quizergebnis", "player.chat.message.poll.question": "Frage", "player.chat.message.poll.options": "Einstellungen", "player.chat.message.poll.option.yes": "Ja", diff --git a/src/locales/messages/el_GR.json b/src/locales/messages/el_GR.json index 850a677d..94d36014 100644 --- a/src/locales/messages/el_GR.json +++ b/src/locales/messages/el_GR.json @@ -15,6 +15,7 @@ "player.about.modal.shortcuts.skip.previous": "Προηγούμενη διαφάνεια", "player.about.modal.shortcuts.swap": "Εναλλαγή περιεχομένου", "player.chat.message.poll.name": "Αποτέλεσμα δημοσκόπησης", + "player.chat.message.poll.quiz": "Αποτέλεσμα κουίζ", "player.chat.message.poll.question": "Ερώτηση", "player.chat.message.poll.options": "Επιλογές", "player.chat.message.poll.option.yes": "Ναι", diff --git a/src/locales/messages/en.json b/src/locales/messages/en.json index ed46468b..8e733f68 100644 --- a/src/locales/messages/en.json +++ b/src/locales/messages/en.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Previous Slide", "player.about.modal.shortcuts.swap": "Swap content", "player.chat.message.poll.name": "Poll result", + "player.chat.message.poll.quiz": "Quiz result", "player.chat.message.poll.question": "Question", "player.chat.message.poll.options": "Options", "player.chat.message.poll.option.yes": "Yes", diff --git a/src/locales/messages/eo.json b/src/locales/messages/eo.json index 97550605..4af672fc 100644 --- a/src/locales/messages/eo.json +++ b/src/locales/messages/eo.json @@ -1,5 +1,7 @@ { "button.about.aria": "Pri", + "player.chat.message.poll.name": "Rezulto de enketo", + "player.chat.message.poll.quiz": "Kvizrezulto", "player.chat.message.poll.question": "Demando", "player.chat.message.poll.option.yes": "Jes", "player.chat.message.poll.option.no": "Ne" diff --git a/src/locales/messages/et.json b/src/locales/messages/et.json index 8fb39927..5a73216e 100644 --- a/src/locales/messages/et.json +++ b/src/locales/messages/et.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Eelmine slaid", "player.about.modal.shortcuts.swap": "Vaheta sisu", "player.chat.message.poll.name": "Küsitluse tulemus", + "player.chat.message.poll.quiz": "Viktoriini tulemus", "player.chat.message.poll.question": "Küsimus", "player.chat.message.poll.options": "Valikud", "player.chat.message.poll.option.yes": "Jah", diff --git a/src/locales/messages/eu.json b/src/locales/messages/eu.json index 92693146..531d51fa 100644 --- a/src/locales/messages/eu.json +++ b/src/locales/messages/eu.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Aurreko diapositiba", "player.about.modal.shortcuts.swap": "Trukatu edukia", "player.chat.message.poll.name": "Inkestaren emaitza", + "player.chat.message.poll.quiz": "Galdetegiaren emaitza", "player.chat.message.poll.question": "Galdera", "player.chat.message.poll.options": "Aukerak", "player.chat.message.poll.option.yes": "Bai", diff --git a/src/locales/messages/fa_IR.json b/src/locales/messages/fa_IR.json index e6d1bd5d..20ec1636 100644 --- a/src/locales/messages/fa_IR.json +++ b/src/locales/messages/fa_IR.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "اسلاید قبلی", "player.about.modal.shortcuts.swap": "تعویض محتوا", "player.chat.message.poll.name": "نتیجه رأی‌گیری", + "player.chat.message.poll.quiz": "نتیجه آزمون", "player.chat.message.poll.question": "پرسش", "player.chat.message.poll.options": "گزینه‌ها", "player.chat.message.poll.option.yes": "بله", diff --git a/src/locales/messages/fr.json b/src/locales/messages/fr.json index 21e18c8d..2943f296 100644 --- a/src/locales/messages/fr.json +++ b/src/locales/messages/fr.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Diapositive précédente", "player.about.modal.shortcuts.swap": "Permuter le contenu", "player.chat.message.poll.name": "Résultat du sondage", + "player.chat.message.poll.quiz": "Résultat du quiz", "player.chat.message.poll.question": "Question", "player.chat.message.poll.options": "Options", "player.chat.message.poll.option.yes": "Oui", diff --git a/src/locales/messages/gl.json b/src/locales/messages/gl.json index 260a7042..50bbcdac 100644 --- a/src/locales/messages/gl.json +++ b/src/locales/messages/gl.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Diapositiva anterior", "player.about.modal.shortcuts.swap": "Intercambiar o contido", "player.chat.message.poll.name": "Resultado da enquisa", + "player.chat.message.poll.quiz": "Resultado do cuestionario", "player.chat.message.poll.question": "Pregunta", "player.chat.message.poll.options": "Opcións", "player.chat.message.poll.option.yes": "Si", diff --git a/src/locales/messages/he.json b/src/locales/messages/he.json index 5f067712..870eda78 100644 --- a/src/locales/messages/he.json +++ b/src/locales/messages/he.json @@ -1,3 +1,4 @@ { + "player.chat.message.poll.quiz": "תוצאות חידון", "player.chat.wrapper.aria": "אזור רב־שיח" } diff --git a/src/locales/messages/hr.json b/src/locales/messages/hr.json index 41d9afc7..66e73514 100644 --- a/src/locales/messages/hr.json +++ b/src/locales/messages/hr.json @@ -13,6 +13,7 @@ "player.about.modal.shortcuts.seek.backward": "Traži unatrag", "player.about.modal.shortcuts.seek.forward": "Traži unaprijed", "player.chat.message.poll.name": "Rezultat ankete", + "player.chat.message.poll.quiz": "Rezultat kviza", "player.chat.message.poll.question": "Pitanje", "player.chat.message.poll.options": "Opcije", "player.chat.message.poll.option.yes": "Da", diff --git a/src/locales/messages/hu_HU.json b/src/locales/messages/hu_HU.json index bf465d5a..de3555c5 100644 --- a/src/locales/messages/hu_HU.json +++ b/src/locales/messages/hu_HU.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Előző dia", "player.about.modal.shortcuts.swap": "Tartalom cseréje", "player.chat.message.poll.name": "Szavazás eredménye", + "player.chat.message.poll.quiz": "Kvíz eredménye", "player.chat.message.poll.question": "Kérdés", "player.chat.message.poll.options": "Lehetőségek", "player.chat.message.poll.option.yes": "Igen", diff --git a/src/locales/messages/hy.json b/src/locales/messages/hy.json index 38e750ef..3246ab70 100644 --- a/src/locales/messages/hy.json +++ b/src/locales/messages/hy.json @@ -22,6 +22,7 @@ "player.about.modal.shortcuts.skip.previous": "Նախորդ սլայդը", "player.about.modal.shortcuts.swap": "Փոխել պարունակությունը", "player.chat.message.poll.name": "Հարցման արդյունքները", + "player.chat.message.poll.quiz": "Վիկտորինայի արդյունքները", "player.chat.message.poll.question": "Հարց", "player.chat.message.poll.options": "Տարբերակներ", "player.chat.message.poll.option.yes": "Այո", diff --git a/src/locales/messages/id.json b/src/locales/messages/id.json index 700973fe..3f3ac2cd 100644 --- a/src/locales/messages/id.json +++ b/src/locales/messages/id.json @@ -17,6 +17,7 @@ "player.about.modal.shortcuts.skip.next": "Salindia selanjutnya", "player.about.modal.shortcuts.skip.previous": "Salindia Sebelumnya", "player.chat.message.poll.name": "Hasil jajak pendapat", + "player.chat.message.poll.quiz": "Hasil kuis", "player.chat.message.poll.question": "Pertanyaan", "player.chat.message.poll.options": "Opsi", "player.chat.message.poll.option.yes": "Ya", diff --git a/src/locales/messages/it_IT.json b/src/locales/messages/it_IT.json index 25c10ff5..d691444a 100644 --- a/src/locales/messages/it_IT.json +++ b/src/locales/messages/it_IT.json @@ -14,6 +14,7 @@ "player.about.modal.shortcuts.skip.next": "Prossima slide", "player.about.modal.shortcuts.skip.previous": "Slide precedente", "player.chat.message.poll.name": "Risultati sondaggio", + "player.chat.message.poll.quiz": "Risultati quiz", "player.chat.message.poll.question": "Domanda", "player.chat.message.poll.options": "Opzioni", "player.chat.message.poll.option.yes": "Si", diff --git a/src/locales/messages/ja.json b/src/locales/messages/ja.json index 30890d1d..205ae2b8 100644 --- a/src/locales/messages/ja.json +++ b/src/locales/messages/ja.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "前のスライド", "player.about.modal.shortcuts.swap": "コンテンツ入れ替え", "player.chat.message.poll.name": "投票結果", + "player.chat.message.poll.quiz": "クイズ結果", "player.chat.message.poll.question": "質問", "player.chat.message.poll.options": "項目", "player.chat.message.poll.option.yes": "はい", diff --git a/src/locales/messages/ka.json b/src/locales/messages/ka.json index 5d7e5072..abd6e2fb 100644 --- a/src/locales/messages/ka.json +++ b/src/locales/messages/ka.json @@ -1,5 +1,6 @@ { "button.about.aria": "შესახებ", + "player.chat.message.poll.quiz": "ვიქტორინის შედეგი", "player.chat.message.poll.options": "პარამეტრები", "player.chat.message.poll.option.true": "ჭეშმარიტი", "player.chat.message.poll.option.false": "მცდარი", diff --git a/src/locales/messages/ko_KR.json b/src/locales/messages/ko_KR.json index 0c386268..294b6e4f 100644 --- a/src/locales/messages/ko_KR.json +++ b/src/locales/messages/ko_KR.json @@ -17,6 +17,7 @@ "player.about.modal.shortcuts.skip.next": "다음 슬라이드", "player.about.modal.shortcuts.skip.previous": "이전 슬라이드", "player.chat.message.poll.name": "설문조사 결과", + "player.chat.message.poll.quiz": "퀴즈 결과", "player.chat.message.poll.question": "질문", "player.chat.message.poll.options": "옵션", "player.chat.message.poll.option.yes": "예", diff --git a/src/locales/messages/nl.json b/src/locales/messages/nl.json index d62c51c5..1d1248e1 100644 --- a/src/locales/messages/nl.json +++ b/src/locales/messages/nl.json @@ -22,6 +22,7 @@ "player.about.modal.shortcuts.skip.previous": "Vorige dia", "player.about.modal.shortcuts.swap": "Verwissel inhoud", "player.chat.message.poll.name": "Peilingresultaat", + "player.chat.message.poll.quiz": "Quizresultaat", "player.chat.message.poll.question": "Vraag", "player.chat.message.poll.options": "Opties", "player.chat.message.poll.option.yes": "Ja", diff --git a/src/locales/messages/oc.json b/src/locales/messages/oc.json index d31cee17..23fd177f 100644 --- a/src/locales/messages/oc.json +++ b/src/locales/messages/oc.json @@ -1,5 +1,6 @@ { "button.about.aria": "A prepaus", + "player.chat.message.poll.quiz": "Resultat del quiz", "player.chat.message.poll.question": "Question", "player.chat.message.poll.options": "Opcions", "player.chat.message.poll.option.yes": "Òc", diff --git a/src/locales/messages/pl_PL.json b/src/locales/messages/pl_PL.json index c8bf70da..d5cb6ea5 100644 --- a/src/locales/messages/pl_PL.json +++ b/src/locales/messages/pl_PL.json @@ -2,6 +2,7 @@ "button.clear.aria": "Wyczyść wyszukiwanie", "button.search.aria": "Szukaj", "player.chat.message.poll.name": "Wynik ankiety", + "player.chat.message.poll.quiz": "Wynik quizu", "player.chat.message.poll.option.no": "Nie", "player.search.modal.title": "Szukaj", "player.search.modal.subtitle": "Wyszukaj w zawartości slajdów prezentacji" diff --git a/src/locales/messages/pt.json b/src/locales/messages/pt.json index c59a0e3c..2298f544 100644 --- a/src/locales/messages/pt.json +++ b/src/locales/messages/pt.json @@ -11,6 +11,7 @@ "loader.wrapper.aria": "Área de carregamento", "player.wrapper.aria": "Área do reprodutor", "player.chat.message.poll.name": "Resultado da sondagem", + "player.chat.message.poll.quiz": "Resultado do questionário", "player.chat.message.poll.question": "Pergunta", "player.chat.message.poll.options": "Opções", "player.chat.message.poll.option.yes": "Sim", diff --git a/src/locales/messages/pt_BR.json b/src/locales/messages/pt_BR.json index 3dc1fc21..7c3e6ebb 100644 --- a/src/locales/messages/pt_BR.json +++ b/src/locales/messages/pt_BR.json @@ -22,6 +22,7 @@ "player.about.modal.shortcuts.skip.previous": "Slide anterior", "player.about.modal.shortcuts.swap": "Trocar conteúdo", "player.chat.message.poll.name": "Resultado da enquete", + "player.chat.message.poll.quiz": "Resultado do quiz", "player.chat.message.poll.question": "Pergunta", "player.chat.message.poll.options": "Opções", "player.chat.message.poll.option.yes": "Sim", diff --git a/src/locales/messages/ru.json b/src/locales/messages/ru.json index c87c6eeb..523d6804 100644 --- a/src/locales/messages/ru.json +++ b/src/locales/messages/ru.json @@ -21,6 +21,7 @@ "player.about.modal.shortcuts.skip.previous": "Предыдущий слайд", "player.about.modal.shortcuts.swap": "Поменять местами содержимое", "player.chat.message.poll.name": "Результаты голосования", + "player.chat.message.poll.quiz": "Результаты викторины", "player.chat.message.poll.question": "Вопрос", "player.chat.message.poll.options": "Варианты", "player.chat.message.poll.option.yes": "Да", diff --git a/src/locales/messages/sv_SE.json b/src/locales/messages/sv_SE.json index d1ef3f9a..6d7b8313 100644 --- a/src/locales/messages/sv_SE.json +++ b/src/locales/messages/sv_SE.json @@ -11,6 +11,7 @@ "loader.wrapper.aria": "Laddningsfält", "player.wrapper.aria": "Spelar-fält", "player.chat.message.poll.name": "Omröstningsresultat", + "player.chat.message.poll.quiz": "Quizresultat", "player.chat.message.poll.question": "Fråga", "player.chat.message.poll.options": "Alternativ", "player.chat.message.poll.option.yes": "Ja", diff --git a/src/locales/messages/te.json b/src/locales/messages/te.json index d452cae2..d6bdb410 100644 --- a/src/locales/messages/te.json +++ b/src/locales/messages/te.json @@ -11,6 +11,7 @@ "loader.wrapper.aria": "లోడ్ చేసే ప్రాంతం", "player.wrapper.aria": "ప్లేయర్ ప్రాంతం", "player.chat.message.poll.name": "పోల్ ఫలితం", + "player.chat.message.poll.quiz": "క్విజ్ ఫలితం", "player.chat.message.poll.question": "ప్రశ్న", "player.chat.message.poll.options": "ఎంపికలు", "player.chat.message.poll.option.yes": "అవును", diff --git a/src/locales/messages/tr.json b/src/locales/messages/tr.json index b9029372..03287d92 100644 --- a/src/locales/messages/tr.json +++ b/src/locales/messages/tr.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "Önceki slayt", "player.about.modal.shortcuts.swap": "İçeriği değiştir", "player.chat.message.poll.name": "Oylama sonucu", + "player.chat.message.poll.quiz": "Sınav sonucu", "player.chat.message.poll.question": "Soru", "player.chat.message.poll.options": "Seçenekler", "player.chat.message.poll.option.yes": "Evet", diff --git a/src/locales/messages/tr_TR.json b/src/locales/messages/tr_TR.json index b9a26821..515df3e1 100644 --- a/src/locales/messages/tr_TR.json +++ b/src/locales/messages/tr_TR.json @@ -22,6 +22,7 @@ "player.about.modal.shortcuts.skip.previous": "Önceki slayt", "player.about.modal.shortcuts.swap": "İçeriği değiştir", "player.chat.message.poll.name": "Anket sonucu", + "player.chat.message.poll.quiz": "Test sonucu", "player.chat.message.poll.question": "Soru", "player.chat.message.poll.options": "Seçenekler", "player.chat.message.poll.option.yes": "Evet", diff --git a/src/locales/messages/uk_UA.json b/src/locales/messages/uk_UA.json index 55571354..c5d890ca 100644 --- a/src/locales/messages/uk_UA.json +++ b/src/locales/messages/uk_UA.json @@ -11,6 +11,7 @@ "loader.wrapper.aria": "Область завантажувача", "player.wrapper.aria": "Область програвача", "player.chat.message.poll.name": "Результати опитування", + "player.chat.message.poll.quiz": "Результати вікторини", "player.chat.message.poll.question": "Питання", "player.chat.message.poll.options": "Варіанти", "player.chat.message.poll.option.yes": "Так", diff --git a/src/locales/messages/vi_VN.json b/src/locales/messages/vi_VN.json index 7e5d8baf..959927ff 100644 --- a/src/locales/messages/vi_VN.json +++ b/src/locales/messages/vi_VN.json @@ -4,6 +4,7 @@ "button.search.aria": "Tìm kiếm", "button.swap.aria": "Hoán đổi nội dung", "player.chat.message.poll.name": "Kết quả khảo sát", + "player.chat.message.poll.quiz": "Kết quả trắc nghiệm", "player.chat.message.poll.question": "Câu hỏi", "player.chat.message.poll.options": "Tùy chọn", "player.chat.message.poll.option.yes": "Có", diff --git a/src/locales/messages/zh_CN.json b/src/locales/messages/zh_CN.json index c07f0e15..ccafdeb1 100644 --- a/src/locales/messages/zh_CN.json +++ b/src/locales/messages/zh_CN.json @@ -4,6 +4,7 @@ "button.close.aria": "关闭弹窗", "button.search.aria": "搜索", "player.chat.message.poll.name": "投票结果", + "player.chat.message.poll.quiz": "测验结果", "player.chat.message.poll.question": "问题", "player.chat.message.poll.options": "选项", "player.chat.message.poll.option.yes": "是", diff --git a/src/locales/messages/zh_TW.json b/src/locales/messages/zh_TW.json index 52f1417d..2e686b03 100644 --- a/src/locales/messages/zh_TW.json +++ b/src/locales/messages/zh_TW.json @@ -23,6 +23,7 @@ "player.about.modal.shortcuts.skip.previous": "上一頁", "player.about.modal.shortcuts.swap": "互換內容", "player.chat.message.poll.name": "投票結果", + "player.chat.message.poll.quiz": "測驗結果", "player.chat.message.poll.question": "問題", "player.chat.message.poll.options": "選項", "player.chat.message.poll.option.yes": "是", From c799dc159bf1fbf8fbcc9a5ce9fa13295d043bc2 Mon Sep 17 00:00:00 2001 From: antobinary <6312397+antobinary@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:22:42 +0000 Subject: [PATCH 02/10] chore: bump version to 5.4.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 994ec47d..02be7229 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bbb-playback", - "version": "5.3.5", + "version": "5.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bbb-playback", - "version": "5.3.5", + "version": "5.4.0", "license": "LGPL-3.0", "dependencies": { "@bigbluebutton/tldraw": "^2.0.0-alpha.29", diff --git a/package.json b/package.json index c759d398..1a6fc0fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bbb-playback", - "version": "5.3.5", + "version": "5.4.0", "homepage": "/playback/presentation/2.3", "dependencies": { "@bigbluebutton/tldraw": "^2.0.0-alpha.29", From 72240368960c9ca5cb0ba358b13f866ef42ca1fe Mon Sep 17 00:00:00 2001 From: germanocaumo Date: Wed, 17 Sep 2025 08:38:51 -0300 Subject: [PATCH 03/10] Revert "Merge pull request #288 from Tainan404/add-support-for-layout-swap" This reverts commit 382ce35bdd745c197f1d9beab45e5d0aee93be14, reversing changes made to 4c8e3166a9c059f9b553c4038ec4db99f85834d6. Reverts code to handle layout events, as it will be handled in recording processing instead, saying the screenshare stopped and started multiple times when the quick swap is used. --- src/components/player/content/index.js | 18 +-------- src/components/presentation/index.js | 5 +-- src/components/thumbnails/index.js | 53 ++------------------------ src/components/tldraw/index.js | 5 +-- src/components/tldraw_v2/index.js | 4 +- src/components/utils/hooks/index.js | 22 +---------- src/config.js | 1 - src/utils/builder.js | 21 +--------- src/utils/constants.js | 1 - src/utils/data/storage.js | 5 --- src/utils/data/validators.js | 21 +--------- 11 files changed, 14 insertions(+), 142 deletions(-) diff --git a/src/components/player/content/index.js b/src/components/player/content/index.js index 6502f312..58aa5596 100644 --- a/src/components/player/content/index.js +++ b/src/components/player/content/index.js @@ -4,7 +4,7 @@ import Presentation from 'components/presentation'; import TldrawPresentation from 'components/tldraw'; import TldrawPresentationV2 from 'components/tldraw_v2'; import { getTldrawBbbVersion } from 'utils/tldraw'; -import { useCurrentInterval, useShouldShowScreenShare } from 'components/utils/hooks'; +import { useCurrentInterval } from 'components/utils/hooks'; import Screenshare from 'components/screenshare'; import Thumbnails from 'components/thumbnails'; import FullscreenButton from 'components/player/buttons/fullscreen'; @@ -26,8 +26,6 @@ const Content = ({ index, } = useCurrentInterval(storage.tldraw); - const shouldShowScreenshare = useShouldShowScreenShare(); - if (layout.single) return null; const isTldrawWhiteboard = storage.tldraw.length || @@ -60,19 +58,7 @@ const Content = ({ />
{presentation} - {layout.screenshare ? ( - // video-js doesn't mount properly when not mounted in time - - - - ): null} + {layout.screenshare ? : null}
{ const viewBox = getViewBox(currentPanzoomIndex); const started = currentPanzoomIndex !== -1; - const shouldShowScreenshare = useShouldShowScreenShare(); + return (
diff --git a/src/components/thumbnails/index.js b/src/components/thumbnails/index.js index a121952c..fb750f4f 100644 --- a/src/components/thumbnails/index.js +++ b/src/components/thumbnails/index.js @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo, useRef } from 'react'; +import React, { useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, @@ -34,7 +34,7 @@ const propTypes = { }; const defaultProps = { - handleSearch: () => {}, + handleSearch: () => { }, interactive: false, search: [], }; @@ -44,6 +44,7 @@ const Thumbnails = ({ interactive, search, }) => { + const currentIndex = useCurrentIndex(storage.thumbnails); const interaction = useRef(false); const firstNode = useRef(); const currentNode = useRef(); @@ -76,52 +77,6 @@ const Thumbnails = ({ } }); - const items = useMemo(()=> { - const thumbnails = storage.thumbnails; - const layoutSwap = storage.layoutSwap ?? []; - const merged = [...thumbnails, ...layoutSwap]; - const sorted = merged.sort((a, b) => a.timestamp - b.timestamp); - - const addThumbsForSwap = sorted.map((item, index, arr) => { - const previousItem = arr[index - 1]; - const nextItem = arr[index + 1]; - if (item.hasOwnProperty('showScreenshare')) { - if (!item.showScreenshare) { - const previousThumbs = arr.slice(0, index) - const Thumbnail = previousThumbs.find((t) => t.src && t.src !== 'screenshare'); - return { - ...item, - src: Thumbnail?.src ?? '', - alt: Thumbnail?.alt ?? '', - }; - } else if ( - item.showScreenshare - && (nextItem && nextItem.src !== 'screenshare') - && (previousItem && previousItem.src !== 'screenshare') - ) { - return { - ...item, - src: 'screenshare', - alt: 'screenshare', - } - } - return null; - } - return item; - }).filter((item) => item !== null); - - const reworkIds = addThumbsForSwap.map((item, index) => { - return { - ...item, - id: index + 1, - } - }); - - return reworkIds; - }, [storage.thumbnails, storage.layoutSwap]); - - const currentIndex = useCurrentIndex(items); - return (
interaction.current = false} tabIndex="0" > - {items.reduce((result, item, index) => { + {storage.thumbnails.reduce((result, item, index) => { if (!isFiltered(index)) { const active = index === currentIndex; diff --git a/src/components/tldraw/index.js b/src/components/tldraw/index.js index 42191818..80ef697d 100644 --- a/src/components/tldraw/index.js +++ b/src/components/tldraw/index.js @@ -18,7 +18,6 @@ import { useCurrentContent, useCurrentIndex, useCurrentInterval, - useShouldShowScreenShare, } from 'components/utils/hooks'; import { ID } from 'utils/constants'; import storage from 'utils/data/storage'; @@ -118,7 +117,7 @@ const TldrawPresentation = ({ size }) => { const currentPanzoomIndex = useCurrentIndex(storage.panzooms); const currentSlideIndex = useCurrentIndex(storage.slides); const started = currentPanzoomIndex !== -1; - const shouldShowScreenShare = useShouldShowScreenShare(); + const result = SlideData(tldrawAPI); let { assets, shapes, scaleRatio } = result; @@ -157,7 +156,7 @@ const TldrawPresentation = ({ size }) => { return (
{!started diff --git a/src/components/tldraw_v2/index.js b/src/components/tldraw_v2/index.js index bb183523..ed51fce0 100644 --- a/src/components/tldraw_v2/index.js +++ b/src/components/tldraw_v2/index.js @@ -11,7 +11,6 @@ import { useCurrentContent, useCurrentIndex, useCurrentInterval, - useShouldShowScreenShare, } from 'components/utils/hooks'; import { ID } from 'utils/constants'; import storage from 'utils/data/storage'; @@ -100,7 +99,6 @@ const TldrawPresentationV2 = ({ size }) => { const started = currentPanzoomIndex !== -1; const result = SlideData(tldrawAPI); - const shouldShowScreenshare = useShouldShowScreenShare(); let { assets, shapes, scaleRatio } = result; const { @@ -157,7 +155,7 @@ const TldrawPresentationV2 = ({ size }) => { return (
{!started ?
diff --git a/src/components/utils/hooks/index.js b/src/components/utils/hooks/index.js index bc7881c2..a68b3068 100644 --- a/src/components/utils/hooks/index.js +++ b/src/components/utils/hooks/index.js @@ -8,8 +8,7 @@ import { getCurrentDataIndex, getCurrentDataInterval, } from 'utils/data'; -import storage from 'utils/data/storage'; -import { isEqual, isShowScreenshareAsContent } from 'utils/data/validators'; +import { isEqual } from 'utils/data/validators'; const useCurrentContent = () => { const [currentContent, setCurrentContent] = useState(ID.PRESENTATION); @@ -29,24 +28,6 @@ const useCurrentContent = () => { return currentContent; }; -const useShouldShowScreenShare = () => { - const [shouldShowScreenShare, setShouldShowScreenShare] = useState(false); - - useEffect(() => { - const handleTimeUpdate = (event) => { - const nextShouldShowScreenShare = isShowScreenshareAsContent(storage.layoutSwap, event.detail.time); - if (shouldShowScreenShare !== nextShouldShowScreenShare) setShouldShowScreenShare(nextShouldShowScreenShare); - }; - - document.addEventListener(EVENTS.TIME_UPDATE, handleTimeUpdate); - return () => { - document.removeEventListener(EVENTS.TIME_UPDATE, handleTimeUpdate); - }; - }, [shouldShowScreenShare]); - - return shouldShowScreenShare; -} - const useCurrentIndex = (data) => { const [currentIndex, setCurrentIndex] = useState(-1); @@ -96,5 +77,4 @@ export { useCurrentContent, useCurrentIndex, useCurrentInterval, - useShouldShowScreenShare, }; diff --git a/src/config.js b/src/config.js index 4dcf2581..83383b6d 100644 --- a/src/config.js +++ b/src/config.js @@ -27,7 +27,6 @@ const files = { shapes: 'shapes.svg', tldraw: 'tldraw.json', videos: 'external_videos.json', - layout: 'layout.xml', }; const locale = { default: 'en' }; diff --git a/src/utils/builder.js b/src/utils/builder.js index 0a39f37e..579f176b 100644 --- a/src/utils/builder.js +++ b/src/utils/builder.js @@ -336,7 +336,7 @@ const buildShapes = result => { data.thumbnails = buildThumbnails(data.slides); data.canvases = buildCanvases(g, data.slides); } - data.slides = data.slides.filter(slide => !slide.src.includes(ID.DESKSHARE)); + return data; }; @@ -371,22 +371,6 @@ const buildTldraw = result => { return tldraw; } -const buildLayout = result => { - const { recording } = result; - - if (recording?.event) { - const newData = convertToArray(recording.event).map(layout => { - return { - timestamp: parseFloat(layout._timestamp), - showScreenshare: layout._show_screenshare === 'true', - } - }); - return newData; - } - - return []; -}; - const buildPanzooms = result => { let data = []; const { recording } = result; @@ -583,9 +567,6 @@ const build = (filename, value) => { case config.shapes: data = buildShapes(result); break; - case config.layout: - data = buildLayout(result); - break; default: logger.debug('unhandled', 'xml', filename); reject(filename); diff --git a/src/utils/constants.js b/src/utils/constants.js index 6f9606c4..e87cbb32 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -52,7 +52,6 @@ const ID = { USERS: 'users', VIDEOS: 'videos', WEBCAMS: 'webcams', - LAYOUT: 'layout', }; const CONTENT = [ diff --git a/src/utils/data/storage.js b/src/utils/data/storage.js index d8022d5a..15151f2c 100644 --- a/src/utils/data/storage.js +++ b/src/utils/data/storage.js @@ -165,7 +165,6 @@ const storage = { videos: hasProperty(DATA, ID.VIDEOS), presentation: hasProperty(DATA, ID.SHAPES), screenshare: hasProperty(DATA, ID.SCREENSHARE), - layoutSwap: hasProperty(DATA, ID.LAYOUT), }; }, get content() { @@ -177,7 +176,6 @@ const storage = { videos: !isEmpty(this.videos), presentation: hasPresentation(this.slides), screenshare: !isEmpty(this.screenshare), - layoutSwap: !isEmpty(this.layoutSwap), }; }, get alternates() { @@ -240,9 +238,6 @@ const storage = { return DATA[ID.THUMBNAILS]; }, - get layoutSwap() { - return DATA[ID.LAYOUT]; - }, get tldraw() { return DATA[ID.TLDRAW]; }, diff --git a/src/utils/data/validators.js b/src/utils/data/validators.js index a7d2b466..79a5522e 100644 --- a/src/utils/data/validators.js +++ b/src/utils/data/validators.js @@ -52,7 +52,7 @@ const isContentVisible = (layout, swap) => { let visible; switch (layout) { - case CONTENT: + case CONTENT: visible = !swap; break; case MEDIA: @@ -159,24 +159,6 @@ const isVisible = (time, timestamp) => timestamp <= time; const wasCleared = (time, clear) => clear !== -1 && clear <= time; -function getMostRecentEvent(arr, time) { - return arr - .filter(item => item.timestamp <= time) - .reduce( - (prev, curr) => (prev?.timestamp > curr.timestamp ? prev : curr), - null - ); -} - -const isShowScreenshareAsContent = (data, time) => { - if (isEmpty(data)) return true; - - const event = getMostRecentEvent(data, time); - - if (!event) return false; - return event.showScreenshare; -} - export { hasIndex, hasPresentation, @@ -191,5 +173,4 @@ export { isValid, isVisible, wasCleared, - isShowScreenshareAsContent, }; From a2a0b6d765ae07059ec76613b97b2285e1dc5aa1 Mon Sep 17 00:00:00 2001 From: Calvin Walton Date: Fri, 19 Sep 2025 16:20:23 -0400 Subject: [PATCH 04/10] Revert "Revert "Merge pull request #288 from Tainan404/add-support-for-layout-swap"" --- src/components/player/content/index.js | 18 ++++++++- src/components/presentation/index.js | 5 ++- src/components/thumbnails/index.js | 53 ++++++++++++++++++++++++-- src/components/tldraw/index.js | 5 ++- src/components/tldraw_v2/index.js | 4 +- src/components/utils/hooks/index.js | 22 ++++++++++- src/config.js | 1 + src/utils/builder.js | 21 +++++++++- src/utils/constants.js | 1 + src/utils/data/storage.js | 5 +++ src/utils/data/validators.js | 21 +++++++++- 11 files changed, 142 insertions(+), 14 deletions(-) diff --git a/src/components/player/content/index.js b/src/components/player/content/index.js index 58aa5596..6502f312 100644 --- a/src/components/player/content/index.js +++ b/src/components/player/content/index.js @@ -4,7 +4,7 @@ import Presentation from 'components/presentation'; import TldrawPresentation from 'components/tldraw'; import TldrawPresentationV2 from 'components/tldraw_v2'; import { getTldrawBbbVersion } from 'utils/tldraw'; -import { useCurrentInterval } from 'components/utils/hooks'; +import { useCurrentInterval, useShouldShowScreenShare } from 'components/utils/hooks'; import Screenshare from 'components/screenshare'; import Thumbnails from 'components/thumbnails'; import FullscreenButton from 'components/player/buttons/fullscreen'; @@ -26,6 +26,8 @@ const Content = ({ index, } = useCurrentInterval(storage.tldraw); + const shouldShowScreenshare = useShouldShowScreenShare(); + if (layout.single) return null; const isTldrawWhiteboard = storage.tldraw.length || @@ -58,7 +60,19 @@ const Content = ({ />
{presentation} - {layout.screenshare ? : null} + {layout.screenshare ? ( + // video-js doesn't mount properly when not mounted in time + + + + ): null}
{ const viewBox = getViewBox(currentPanzoomIndex); const started = currentPanzoomIndex !== -1; - + const shouldShowScreenshare = useShouldShowScreenShare(); return (
diff --git a/src/components/thumbnails/index.js b/src/components/thumbnails/index.js index fb750f4f..a121952c 100644 --- a/src/components/thumbnails/index.js +++ b/src/components/thumbnails/index.js @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from 'react'; +import React, { useEffect, useMemo, useRef } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, @@ -34,7 +34,7 @@ const propTypes = { }; const defaultProps = { - handleSearch: () => { }, + handleSearch: () => {}, interactive: false, search: [], }; @@ -44,7 +44,6 @@ const Thumbnails = ({ interactive, search, }) => { - const currentIndex = useCurrentIndex(storage.thumbnails); const interaction = useRef(false); const firstNode = useRef(); const currentNode = useRef(); @@ -77,6 +76,52 @@ const Thumbnails = ({ } }); + const items = useMemo(()=> { + const thumbnails = storage.thumbnails; + const layoutSwap = storage.layoutSwap ?? []; + const merged = [...thumbnails, ...layoutSwap]; + const sorted = merged.sort((a, b) => a.timestamp - b.timestamp); + + const addThumbsForSwap = sorted.map((item, index, arr) => { + const previousItem = arr[index - 1]; + const nextItem = arr[index + 1]; + if (item.hasOwnProperty('showScreenshare')) { + if (!item.showScreenshare) { + const previousThumbs = arr.slice(0, index) + const Thumbnail = previousThumbs.find((t) => t.src && t.src !== 'screenshare'); + return { + ...item, + src: Thumbnail?.src ?? '', + alt: Thumbnail?.alt ?? '', + }; + } else if ( + item.showScreenshare + && (nextItem && nextItem.src !== 'screenshare') + && (previousItem && previousItem.src !== 'screenshare') + ) { + return { + ...item, + src: 'screenshare', + alt: 'screenshare', + } + } + return null; + } + return item; + }).filter((item) => item !== null); + + const reworkIds = addThumbsForSwap.map((item, index) => { + return { + ...item, + id: index + 1, + } + }); + + return reworkIds; + }, [storage.thumbnails, storage.layoutSwap]); + + const currentIndex = useCurrentIndex(items); + return (
interaction.current = false} tabIndex="0" > - {storage.thumbnails.reduce((result, item, index) => { + {items.reduce((result, item, index) => { if (!isFiltered(index)) { const active = index === currentIndex; diff --git a/src/components/tldraw/index.js b/src/components/tldraw/index.js index 80ef697d..42191818 100644 --- a/src/components/tldraw/index.js +++ b/src/components/tldraw/index.js @@ -18,6 +18,7 @@ import { useCurrentContent, useCurrentIndex, useCurrentInterval, + useShouldShowScreenShare, } from 'components/utils/hooks'; import { ID } from 'utils/constants'; import storage from 'utils/data/storage'; @@ -117,7 +118,7 @@ const TldrawPresentation = ({ size }) => { const currentPanzoomIndex = useCurrentIndex(storage.panzooms); const currentSlideIndex = useCurrentIndex(storage.slides); const started = currentPanzoomIndex !== -1; - + const shouldShowScreenShare = useShouldShowScreenShare(); const result = SlideData(tldrawAPI); let { assets, shapes, scaleRatio } = result; @@ -156,7 +157,7 @@ const TldrawPresentation = ({ size }) => { return (
{!started diff --git a/src/components/tldraw_v2/index.js b/src/components/tldraw_v2/index.js index ed51fce0..bb183523 100644 --- a/src/components/tldraw_v2/index.js +++ b/src/components/tldraw_v2/index.js @@ -11,6 +11,7 @@ import { useCurrentContent, useCurrentIndex, useCurrentInterval, + useShouldShowScreenShare, } from 'components/utils/hooks'; import { ID } from 'utils/constants'; import storage from 'utils/data/storage'; @@ -99,6 +100,7 @@ const TldrawPresentationV2 = ({ size }) => { const started = currentPanzoomIndex !== -1; const result = SlideData(tldrawAPI); + const shouldShowScreenshare = useShouldShowScreenShare(); let { assets, shapes, scaleRatio } = result; const { @@ -155,7 +157,7 @@ const TldrawPresentationV2 = ({ size }) => { return (
{!started ?
diff --git a/src/components/utils/hooks/index.js b/src/components/utils/hooks/index.js index a68b3068..bc7881c2 100644 --- a/src/components/utils/hooks/index.js +++ b/src/components/utils/hooks/index.js @@ -8,7 +8,8 @@ import { getCurrentDataIndex, getCurrentDataInterval, } from 'utils/data'; -import { isEqual } from 'utils/data/validators'; +import storage from 'utils/data/storage'; +import { isEqual, isShowScreenshareAsContent } from 'utils/data/validators'; const useCurrentContent = () => { const [currentContent, setCurrentContent] = useState(ID.PRESENTATION); @@ -28,6 +29,24 @@ const useCurrentContent = () => { return currentContent; }; +const useShouldShowScreenShare = () => { + const [shouldShowScreenShare, setShouldShowScreenShare] = useState(false); + + useEffect(() => { + const handleTimeUpdate = (event) => { + const nextShouldShowScreenShare = isShowScreenshareAsContent(storage.layoutSwap, event.detail.time); + if (shouldShowScreenShare !== nextShouldShowScreenShare) setShouldShowScreenShare(nextShouldShowScreenShare); + }; + + document.addEventListener(EVENTS.TIME_UPDATE, handleTimeUpdate); + return () => { + document.removeEventListener(EVENTS.TIME_UPDATE, handleTimeUpdate); + }; + }, [shouldShowScreenShare]); + + return shouldShowScreenShare; +} + const useCurrentIndex = (data) => { const [currentIndex, setCurrentIndex] = useState(-1); @@ -77,4 +96,5 @@ export { useCurrentContent, useCurrentIndex, useCurrentInterval, + useShouldShowScreenShare, }; diff --git a/src/config.js b/src/config.js index 83383b6d..4dcf2581 100644 --- a/src/config.js +++ b/src/config.js @@ -27,6 +27,7 @@ const files = { shapes: 'shapes.svg', tldraw: 'tldraw.json', videos: 'external_videos.json', + layout: 'layout.xml', }; const locale = { default: 'en' }; diff --git a/src/utils/builder.js b/src/utils/builder.js index 579f176b..0a39f37e 100644 --- a/src/utils/builder.js +++ b/src/utils/builder.js @@ -336,7 +336,7 @@ const buildShapes = result => { data.thumbnails = buildThumbnails(data.slides); data.canvases = buildCanvases(g, data.slides); } - + data.slides = data.slides.filter(slide => !slide.src.includes(ID.DESKSHARE)); return data; }; @@ -371,6 +371,22 @@ const buildTldraw = result => { return tldraw; } +const buildLayout = result => { + const { recording } = result; + + if (recording?.event) { + const newData = convertToArray(recording.event).map(layout => { + return { + timestamp: parseFloat(layout._timestamp), + showScreenshare: layout._show_screenshare === 'true', + } + }); + return newData; + } + + return []; +}; + const buildPanzooms = result => { let data = []; const { recording } = result; @@ -567,6 +583,9 @@ const build = (filename, value) => { case config.shapes: data = buildShapes(result); break; + case config.layout: + data = buildLayout(result); + break; default: logger.debug('unhandled', 'xml', filename); reject(filename); diff --git a/src/utils/constants.js b/src/utils/constants.js index e87cbb32..6f9606c4 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -52,6 +52,7 @@ const ID = { USERS: 'users', VIDEOS: 'videos', WEBCAMS: 'webcams', + LAYOUT: 'layout', }; const CONTENT = [ diff --git a/src/utils/data/storage.js b/src/utils/data/storage.js index 15151f2c..d8022d5a 100644 --- a/src/utils/data/storage.js +++ b/src/utils/data/storage.js @@ -165,6 +165,7 @@ const storage = { videos: hasProperty(DATA, ID.VIDEOS), presentation: hasProperty(DATA, ID.SHAPES), screenshare: hasProperty(DATA, ID.SCREENSHARE), + layoutSwap: hasProperty(DATA, ID.LAYOUT), }; }, get content() { @@ -176,6 +177,7 @@ const storage = { videos: !isEmpty(this.videos), presentation: hasPresentation(this.slides), screenshare: !isEmpty(this.screenshare), + layoutSwap: !isEmpty(this.layoutSwap), }; }, get alternates() { @@ -238,6 +240,9 @@ const storage = { return DATA[ID.THUMBNAILS]; }, + get layoutSwap() { + return DATA[ID.LAYOUT]; + }, get tldraw() { return DATA[ID.TLDRAW]; }, diff --git a/src/utils/data/validators.js b/src/utils/data/validators.js index 79a5522e..a7d2b466 100644 --- a/src/utils/data/validators.js +++ b/src/utils/data/validators.js @@ -52,7 +52,7 @@ const isContentVisible = (layout, swap) => { let visible; switch (layout) { - case CONTENT: + case CONTENT: visible = !swap; break; case MEDIA: @@ -159,6 +159,24 @@ const isVisible = (time, timestamp) => timestamp <= time; const wasCleared = (time, clear) => clear !== -1 && clear <= time; +function getMostRecentEvent(arr, time) { + return arr + .filter(item => item.timestamp <= time) + .reduce( + (prev, curr) => (prev?.timestamp > curr.timestamp ? prev : curr), + null + ); +} + +const isShowScreenshareAsContent = (data, time) => { + if (isEmpty(data)) return true; + + const event = getMostRecentEvent(data, time); + + if (!event) return false; + return event.showScreenshare; +} + export { hasIndex, hasPresentation, @@ -173,4 +191,5 @@ export { isValid, isVisible, wasCleared, + isShowScreenshareAsContent, }; From 55644d4b2be644034860c8abce3d4ca65e844907 Mon Sep 17 00:00:00 2001 From: hiroshisuga <45039819+hiroshisuga@users.noreply.github.com> Date: Fri, 3 Oct 2025 07:23:30 +0900 Subject: [PATCH 05/10] Fix typo --- src/utils/data/storage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/data/storage.js b/src/utils/data/storage.js index d8022d5a..8e1a52a9 100644 --- a/src/utils/data/storage.js +++ b/src/utils/data/storage.js @@ -83,7 +83,7 @@ const fetchFile = (data, recordId, onUpdate, onLoaded, onError) => { } }).then(value => { build(file, value).then(content => { - if (content) logger.debug(ID.STORAGE, 'builded', file); + if (content) logger.debug(ID.STORAGE, 'built', file); DATA[data] = content; onUpdate(data); if (hasLoaded()) onLoaded(); From afe5b4db076fbc1d040167cee350cad6ed48cdc4 Mon Sep 17 00:00:00 2001 From: Tainan Felipe Date: Thu, 16 Oct 2025 13:24:23 -0300 Subject: [PATCH 06/10] feat: render chat messages using messageAsHtml during playback --- src/components/chat/messages/index.scss | 7 +++++++ src/components/chat/messages/user/text.js | 22 ++++++---------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/components/chat/messages/index.scss b/src/components/chat/messages/index.scss index 6d7ede65..49269508 100644 --- a/src/components/chat/messages/index.scss +++ b/src/components/chat/messages/index.scss @@ -17,6 +17,13 @@ line-height: 1; } +.text-vanilla { + margin-top: 0.25rem; + > * { + margin: 0; + } +} + .user-message-wrapper { transition: background-color .5s ease; } diff --git a/src/components/chat/messages/user/text.js b/src/components/chat/messages/user/text.js index fe451ddd..8db90ad6 100644 --- a/src/components/chat/messages/user/text.js +++ b/src/components/chat/messages/user/text.js @@ -1,7 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Linkify from 'linkify-react'; -import cx from 'classnames'; const propTypes = { active: PropTypes.bool, @@ -20,20 +18,12 @@ const Text = ({ hyperlink, text, }) => { - if (hyperlink) { - const options = { - className: cx('linkified', { inactive: !active }), - target: '_blank', - }; - - return ( - - {text.replace(/(\S)(https?:\/\/)/g, '$1 $2')} - - ); - } - - return <>{text}; + return ( +
+ ); }; Text.propTypes = propTypes; From 775a9dd0d3c71754af2beec5829e86998258cf51 Mon Sep 17 00:00:00 2001 From: Tainan Felipe Date: Thu, 16 Oct 2025 14:22:35 -0300 Subject: [PATCH 07/10] Add more styles --- src/components/chat/messages/index.scss | 54 ++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/components/chat/messages/index.scss b/src/components/chat/messages/index.scss index 49269508..8c669185 100644 --- a/src/components/chat/messages/index.scss +++ b/src/components/chat/messages/index.scss @@ -4,6 +4,10 @@ --gray-light-color: var(--gray-light); --gray-lightest-color: var(--gray-lightest); --highlight-color: var(--blue); + --color-text: #111; + --color-off-white: #F3F6F9; + --color-gray-lightest: #D4D9DF; + --color-danger-dark: #AE1010; } .reply-tag { @@ -18,12 +22,58 @@ } .text-vanilla { - margin-top: 0.25rem; - > * { + color: var(--color-text); + + img { + max-width: 100%; + max-height: 100%; + } + + p { + margin: 0; + white-space: pre-wrap; + } + + pre:has(code), + p code:not(pre > code) { + background-color: var(--color-off-white); + border: solid 1px var(--color-gray-lightest); + border-radius: 4px; + padding: 2px; + margin: 0; + font-size: 12px; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: anywhere; + } + + p code:not(pre > code) { + color: var(--color-danger-dark); + } + + h1 { + font-size: 1.5em; + margin: 0; + } + + h2 { + font-size: 1.3em; + margin: 0; + } + + h3 { + font-size: 1.1em; + margin: 0; + } + + h4, + h5, + h6 { margin: 0; } } + .user-message-wrapper { transition: background-color .5s ease; } From 0140ee2a2b9de6f114ae42963e15ff23bf803a2e Mon Sep 17 00:00:00 2001 From: Arthurk12 Date: Tue, 11 Nov 2025 16:26:59 -0300 Subject: [PATCH 08/10] feat(whiteboard): make default yellow color more vibrant Updates the default yellow color to #FFFF00, which is a more vibrant shade, improving visual distinction from the orange color and enhancing overall visibility in drawings and highlights. --- src/components/tldraw_v2/index.js | 5 ++++- src/utils/tldraw.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/components/tldraw_v2/index.js b/src/components/tldraw_v2/index.js index bb183523..6b3f08e3 100644 --- a/src/components/tldraw_v2/index.js +++ b/src/components/tldraw_v2/index.js @@ -18,7 +18,8 @@ import storage from 'utils/data/storage'; import './index.scss'; import { getTldrawData, getViewBox, createTldrawImageAsset, - createTldrawBackgroundShape, createTldrawCursorShape + createTldrawBackgroundShape, createTldrawCursorShape, + setupColorThemePaletteOverrides } from 'utils/tldraw'; import { buildFileURL } from 'utils/data'; import { isEmpty } from 'utils/data/validators'; @@ -27,6 +28,8 @@ import getCursor from './cursor'; const MAX_IMAGE_WIDTH = 1440; const MAX_IMAGE_HEIGHT = 1080; +setupColorThemePaletteOverrides(); + const intlMessages = defineMessages({ aria: { id: 'player.presentation.wrapper.aria', diff --git a/src/utils/tldraw.js b/src/utils/tldraw.js index 450b8745..1e9a5811 100644 --- a/src/utils/tldraw.js +++ b/src/utils/tldraw.js @@ -1,4 +1,5 @@ import storage from 'utils/data/storage'; +import { DefaultColorThemePalette } from '@bigbluebutton/tldraw'; /** * Retrieves the BBB version for a specific Tldraw instance from storage. @@ -160,6 +161,33 @@ const createTldrawCursorShape = (x, y, curPageId) => { } } +const setupColorThemePaletteOverrides = () => { + // Override the default color theme to use our custom palette with more vibrant yellow highlights + DefaultColorThemePalette.lightMode.black.highlight = { + srgb: '#FFFF00', + p3: 'color(display-p3 1 1 0)', + }; + DefaultColorThemePalette.darkMode.black.highlight = { + srgb: '#FFFF00', + p3: 'color(display-p3 1 1 0)', + }; + // Override the default yellow color to be a more vibrant yellow + DefaultColorThemePalette.lightMode.yellow = { + solid: '#FFFF00', + highlight: { + srgb: '#FFFF00', + p3: 'color(display-p3 1 1 0)', + }, + }; + DefaultColorThemePalette.darkMode.yellow = { + solid: '#FFFF00', + highlight: { + srgb: '#FFFF00', + p3: 'color(display-p3 1 1 0)', + }, + }; +}; + export { getTldrawBbbVersion, getTldrawData, @@ -167,4 +195,5 @@ export { createTldrawImageAsset, createTldrawBackgroundShape, createTldrawCursorShape, + setupColorThemePaletteOverrides, }; From f4c4f08dcaa5a5d5842d57768c7fce24973eb5cb Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Wed, 12 Nov 2025 17:38:14 -0500 Subject: [PATCH 09/10] chore: npm audit fixes --- package-lock.json | 517 ++++++++++++++++++++++++++-------------------- 1 file changed, 297 insertions(+), 220 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02be7229..37bb84f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2002,16 +2002,16 @@ "dev": true }, "node_modules/@bigbluebutton/editor": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/editor/-/editor-2.0.0-alpha.29.tgz", - "integrity": "sha512-Yrn37ESRr1daCd3ipOb9wS0Fb1QJTGUujj9OQxuQhGEJqSn2RdQzp89Tidf3IvsUGk8VsAhAEjvMR3nReSIW6Q==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/editor/-/editor-2.0.0-alpha.31.tgz", + "integrity": "sha512-JXFVDDLP4nrNbUzsciwOdhZZttzjKb0iHEXsWHAxaKxJgD5hNwKujeknafpNQwRFLd6XtY6OVU8LIDIzTz/9QQ==", "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/state": "2.0.0-alpha.29", - "@bigbluebutton/store": "2.0.0-alpha.29", - "@bigbluebutton/tlschema": "2.0.0-alpha.29", - "@bigbluebutton/utils": "2.0.0-alpha.29", - "@bigbluebutton/validate": "2.0.0-alpha.29", + "@bigbluebutton/state": "2.0.0-alpha.31", + "@bigbluebutton/store": "2.0.0-alpha.31", + "@bigbluebutton/tlschema": "2.0.0-alpha.31", + "@bigbluebutton/utils": "2.0.0-alpha.31", + "@bigbluebutton/validate": "2.0.0-alpha.31", "@types/core-js": "^2.5.5", "@use-gesture/react": "^10.2.27", "classnames": "^2.3.2", @@ -2047,9 +2047,9 @@ } }, "node_modules/@bigbluebutton/state": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/state/-/state-2.0.0-alpha.29.tgz", - "integrity": "sha512-pYAngdqbbg5Xtm9OsegAHRSw2fX4qDm0MS5j43uQlW4wTiPeTIeT+naw4eZgBQO7N4uqwq0hnrkSFogzdIk60g==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/state/-/state-2.0.0-alpha.31.tgz", + "integrity": "sha512-61X1XdDwAOA1091oVlanypfr+LsJUX8RIcJ4joX2Ac+vw7TZezowxSSwfDIKFa7ploVKJ3Vdut4/9d2fExUvcQ==", "license": "Apache-2.0", "dependencies": { "@testing-library/react": "^16.0.0" @@ -2086,13 +2086,13 @@ } }, "node_modules/@bigbluebutton/store": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/store/-/store-2.0.0-alpha.29.tgz", - "integrity": "sha512-jfSMvH8MT++3wPYfm9HUMcG82Jtbr378WIvuWvhcg0/XsaxesiLGHr9XTvACnHLHq49D3Bx6C5anPt+qA85rig==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/store/-/store-2.0.0-alpha.31.tgz", + "integrity": "sha512-9wlrfzffSf7XZwkD7eGj7bhb3orgqNnXIASC3IcQdx83O/3CweIDfWgYQb3EuryGrQ3UxP3ul4bJz7gR64tFdA==", "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/state": "2.0.0-alpha.29", - "@bigbluebutton/utils": "2.0.0-alpha.29", + "@bigbluebutton/state": "2.0.0-alpha.31", + "@bigbluebutton/utils": "2.0.0-alpha.31", "lodash.isequal": "^4.5.0", "nanoid": "4.0.2" } @@ -2116,12 +2116,12 @@ } }, "node_modules/@bigbluebutton/tldraw": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/tldraw/-/tldraw-2.0.0-alpha.29.tgz", - "integrity": "sha512-EyGwz9O0j9VAaR+jQqEVjKhHPdVFDSKZHrFc8wG3wEN9b5SkPt/kJdqsXbKk52lwJIDdNHZ156fQnvWVzL5EKA==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/tldraw/-/tldraw-2.0.0-alpha.31.tgz", + "integrity": "sha512-Atd/0VfyJ/TNle+7D5FsGz5a518y9bZp8p6CXnbDzOzmBulOQMnVKg2zK+QJ1A5yBGGfZ0JlH8mAHhkz3gGItg==", "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/editor": "2.0.0-alpha.29", + "@bigbluebutton/editor": "2.0.0-alpha.31", "@radix-ui/react-alert-dialog": "^1.0.0", "@radix-ui/react-context-menu": "^2.1.5", "@radix-ui/react-dialog": "^1.0.5", @@ -2465,15 +2465,15 @@ } }, "node_modules/@bigbluebutton/tlschema": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/tlschema/-/tlschema-2.0.0-alpha.29.tgz", - "integrity": "sha512-f44yThWQEBTUXx8IjZr/QZ5xl252W+PmC1yUxX5654ZsNe5bqGivUDcfMqTVvtw1Fi3we2ToLRXicyXjgR/n4Q==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/tlschema/-/tlschema-2.0.0-alpha.31.tgz", + "integrity": "sha512-ecDvV0K3cmrSj1Lp1Zld9zf5NoNXl3SBpQGx9osyALV1SL8kAvFwhy/rx9FXaI/aAM36HMXMl2jF1z4AJx+cHg==", "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/state": "2.0.0-alpha.29", - "@bigbluebutton/store": "2.0.0-alpha.29", - "@bigbluebutton/utils": "2.0.0-alpha.29", - "@bigbluebutton/validate": "2.0.0-alpha.29", + "@bigbluebutton/state": "2.0.0-alpha.31", + "@bigbluebutton/store": "2.0.0-alpha.31", + "@bigbluebutton/utils": "2.0.0-alpha.31", + "@bigbluebutton/validate": "2.0.0-alpha.31", "nanoid": "4.0.2" } }, @@ -2496,18 +2496,18 @@ } }, "node_modules/@bigbluebutton/utils": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/utils/-/utils-2.0.0-alpha.29.tgz", - "integrity": "sha512-uDXkPRUQtHTzddMexOkQET6d3522uBwUxDOFCRRs2njpSelxqHtK6ej834Qpe0aZifITQ6DA4Q5cRFSPCd/3uA==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/utils/-/utils-2.0.0-alpha.31.tgz", + "integrity": "sha512-7lmqVY8wMd8VSg1QQyFwrNx1oO+2kDoJkcwqUtOPhPHypAjYFjI7/on3VB6NNz7H7FPpkgos+uLrjCrJmNRfiw==", "license": "Apache-2.0" }, "node_modules/@bigbluebutton/validate": { - "version": "2.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/@bigbluebutton/validate/-/validate-2.0.0-alpha.29.tgz", - "integrity": "sha512-K9MVWLMCOR/Qy1a29G51lnwLG3PogNQMtFlCSYoHmzOJKgYXe/Uq6ahNodicZBewc5Hs7b8dOGuGW141XraqUQ==", + "version": "2.0.0-alpha.31", + "resolved": "https://registry.npmjs.org/@bigbluebutton/validate/-/validate-2.0.0-alpha.31.tgz", + "integrity": "sha512-jtOc9AZUGOBmRRcTz5UoM4tkxBCPTc2fsAf0ZxA7/lR2aNa4EiPj7r0e6GgcR/PjYiU8qUab8UegnATXG85YFA==", "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/utils": "2.0.0-alpha.29" + "@bigbluebutton/utils": "2.0.0-alpha.31" } }, "node_modules/@csstools/normalize.css": { @@ -3955,19 +3955,18 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", - "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", + "ansi-html": "^0.0.9", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", + "schema-utils": "^4.2.0", "source-map": "^0.7.3" }, "engines": { @@ -3977,9 +3976,9 @@ "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <4.0.0", + "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -4004,6 +4003,63 @@ } } }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/@radix-ui/number": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", @@ -7296,9 +7352,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "license": "MIT", "peer": true, "dependencies": { @@ -7306,91 +7362,15 @@ "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", - "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", + "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@tldraw/core": { "version": "1.23.2", "resolved": "https://registry.npmjs.org/@tldraw/core/-/core-1.23.2.tgz", @@ -7830,10 +7810,11 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -8543,6 +8524,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -9243,15 +9237,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9303,10 +9288,11 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9394,10 +9380,11 @@ } }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9421,6 +9408,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -9736,12 +9737,6 @@ "node": ">= 12" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -9770,17 +9765,18 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -9802,11 +9798,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -10982,6 +10982,21 @@ "resolved": "https://registry.npmjs.org/downscale/-/downscale-1.0.6.tgz", "integrity": "sha512-Arh9ftj+wo3CkFoT48SgT/crMyqmgZtNaaV/etjzHaUqNAaS36GS38ECURnfl7X/XvXN5uZNigGF7Vhffrm/pg==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -11159,13 +11174,11 @@ "dev": true }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -11227,15 +11240,30 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -12280,6 +12308,23 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -12352,10 +12397,11 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -12674,14 +12720,17 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -12812,16 +12861,22 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12853,6 +12908,20 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -13011,12 +13080,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13122,10 +13192,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13134,12 +13205,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -13149,10 +13221,11 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -16778,6 +16851,16 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -16895,9 +16978,10 @@ } }, "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz", + "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==", + "license": "MIT", "dependencies": { "dom-walk": "^0.1.0" } @@ -17364,10 +17448,11 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -19284,15 +19369,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -22662,10 +22738,11 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.1.tgz", - "integrity": "sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -22673,7 +22750,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -22695,7 +22772,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { From 306e189aa7647cc6916baf02a6f005591ec642cb Mon Sep 17 00:00:00 2001 From: antobinary <6312397+antobinary@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:35:50 +0000 Subject: [PATCH 10/10] chore: bump version to 5.4.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 37bb84f5..f5074308 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bbb-playback", - "version": "5.4.0", + "version": "5.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bbb-playback", - "version": "5.4.0", + "version": "5.4.1", "license": "LGPL-3.0", "dependencies": { "@bigbluebutton/tldraw": "^2.0.0-alpha.29", diff --git a/package.json b/package.json index 1a6fc0fa..555194e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bbb-playback", - "version": "5.4.0", + "version": "5.4.1", "homepage": "/playback/presentation/2.3", "dependencies": { "@bigbluebutton/tldraw": "^2.0.0-alpha.29",