@azure/communication-react 1.5.1-alpha-202306170013 → 1.5.1-alpha-202306200012

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/communication-react.d.ts +11 -0
  2. package/dist/dist-cjs/communication-react/index.js +177 -112
  3. package/dist/dist-cjs/communication-react/index.js.map +1 -1
  4. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  5. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  6. package/dist/dist-esm/react-components/src/components/HorizontalGallery.js +6 -3
  7. package/dist/dist-esm/react-components/src/components/HorizontalGallery.js.map +1 -1
  8. package/dist/dist-esm/react-components/src/components/ParticipantItem.d.ts +5 -0
  9. package/dist/dist-esm/react-components/src/components/ParticipantItem.js +3 -2
  10. package/dist/dist-esm/react-components/src/components/ParticipantItem.js.map +1 -1
  11. package/dist/dist-esm/react-components/src/components/ParticipantList.d.ts +2 -0
  12. package/dist/dist-esm/react-components/src/components/ParticipantList.js +4 -4
  13. package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
  14. package/dist/dist-esm/react-components/src/components/ResponsiveVerticalGallery.d.ts +2 -2
  15. package/dist/dist-esm/react-components/src/components/ResponsiveVerticalGallery.js +2 -1
  16. package/dist/dist-esm/react-components/src/components/ResponsiveVerticalGallery.js.map +1 -1
  17. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/TextFieldWithMention.js +25 -39
  18. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/TextFieldWithMention.js.map +1 -1
  19. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/mentionTagUtils.d.ts +0 -1
  20. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/mentionTagUtils.js +50 -21
  21. package/dist/dist-esm/react-components/src/components/TextFieldWithMention/mentionTagUtils.js.map +1 -1
  22. package/dist/dist-esm/react-components/src/components/VerticalGallery.js +6 -3
  23. package/dist/dist-esm/react-components/src/components/VerticalGallery.js.map +1 -1
  24. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js +4 -2
  25. package/dist/dist-esm/react-components/src/components/VideoGallery/DefaultLayout.js.map +1 -1
  26. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js +11 -6
  27. package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideoLayout.js.map +1 -1
  28. package/dist/dist-esm/react-components/src/components/VideoGallery/Layout.d.ts +3 -1
  29. package/dist/dist-esm/react-components/src/components/VideoGallery/Layout.js.map +1 -1
  30. package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.js +3 -3
  31. package/dist/dist-esm/react-components/src/components/VideoGallery/OverflowGallery.js.map +1 -1
  32. package/dist/dist-esm/react-components/src/components/VideoGallery/styles/FloatingLocalVideo.styles.d.ts +1 -1
  33. package/dist/dist-esm/react-components/src/components/VideoGallery/styles/FloatingLocalVideo.styles.js +6 -3
  34. package/dist/dist-esm/react-components/src/components/VideoGallery/styles/FloatingLocalVideo.styles.js.map +1 -1
  35. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.d.ts +1 -0
  36. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js +11 -3
  37. package/dist/dist-esm/react-components/src/components/VideoGallery/utils/videoGalleryLayoutUtils.js.map +1 -1
  38. package/dist/dist-esm/react-components/src/components/VideoGallery.js +12 -7
  39. package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
  40. package/dist/dist-esm/react-components/src/components/VideoTile.js +1 -1
  41. package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
  42. package/dist/dist-esm/react-components/src/components/styles/VerticalGallery.styles.js +1 -1
  43. package/dist/dist-esm/react-components/src/components/styles/VerticalGallery.styles.js.map +1 -1
  44. package/dist/dist-esm/react-components/src/components/styles/VideoGallery.styles.d.ts +4 -0
  45. package/dist/dist-esm/react-components/src/components/styles/VideoGallery.styles.js +6 -0
  46. package/dist/dist-esm/react-components/src/components/styles/VideoGallery.styles.js.map +1 -1
  47. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.d.ts +4 -0
  48. package/dist/dist-esm/react-composites/src/composites/CallComposite/Strings.js.map +1 -1
  49. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/TransferPage.js +24 -11
  50. package/dist/dist-esm/react-composites/src/composites/CallComposite/pages/TransferPage.js.map +1 -1
  51. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/TransferPage.styles.d.ts +7 -0
  52. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/TransferPage.styles.js +4 -0
  53. package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/TransferPage.styles.js.map +1 -1
  54. package/dist/dist-esm/react-composites/src/composites/common/ParticipantContainer.js +4 -3
  55. package/dist/dist-esm/react-composites/src/composites/common/ParticipantContainer.js.map +1 -1
  56. package/dist/dist-esm/react-composites/src/composites/localization/locales/en-US/strings.json +2 -1
  57. package/package.json +8 -8
@@ -167,7 +167,7 @@ const _toCommunicationIdentifier = (id) => {
167
167
  // Copyright (c) Microsoft Corporation.
168
168
  // Licensed under the MIT license.
169
169
  // GENERATED FILE. DO NOT EDIT MANUALLY.
170
- var telemetryVersion = '1.5.1-alpha-202306170013';
170
+ var telemetryVersion = '1.5.1-alpha-202306200012';
171
171
 
172
172
  // Copyright (c) Microsoft Corporation.
173
173
  /**
@@ -6304,10 +6304,14 @@ const getTagClosingTagInfo = (tag) => {
6304
6304
  * @returns Updated HTML and selection index if the selection index should be set.
6305
6305
  */
6306
6306
  const updateHTML = (props) => {
6307
- const { htmlText, oldPlainText, newPlainText, tags, startIndex, oldPlainTextEndIndex, change, mentionTrigger } = props;
6307
+ const { htmlText, oldPlainText, tags, startIndex, oldPlainTextEndIndex, change, mentionTrigger } = props;
6308
6308
  if (tags.length === 0 || (startIndex === 0 && oldPlainTextEndIndex === oldPlainText.length - 1)) {
6309
6309
  // no tags added yet or the whole text is changed
6310
- return { updatedHTML: newPlainText, updatedSelectionIndex: undefined };
6310
+ const changeWithSkippedChars = escapeHTMLChars(change);
6311
+ const updatedHTML = escapeHTMLChars(oldPlainText.substring(0, startIndex)) +
6312
+ changeWithSkippedChars +
6313
+ escapeHTMLChars(oldPlainText.substring(oldPlainTextEndIndex));
6314
+ return { updatedHTML, updatedSelectionIndex: oldPlainTextEndIndex + change.length };
6311
6315
  }
6312
6316
  let result = '';
6313
6317
  let lastProcessedHTMLIndex = 0;
@@ -6317,7 +6321,7 @@ const updateHTML = (props) => {
6317
6321
  // e.g.: change is after and partially in tag => change will be added after the tag and outdated text in the tag will be removed
6318
6322
  // e.g.: change is on the beginning of the tag => change will be added before the tag
6319
6323
  // e.g.: change is on the end of the tag => change will be added to the tag if it's not mention and after the tag if it's mention
6320
- let processedChange = change;
6324
+ let processedChange = escapeHTMLChars(change);
6321
6325
  // end tag plain text index of the last processed tag
6322
6326
  let lastProcessedPlainTextTagEndIndex = 0;
6323
6327
  // as some tags/text can be removed fully, selection should be updated correctly
@@ -6339,13 +6343,13 @@ const updateHTML = (props) => {
6339
6343
  if (startIndex <= tag.plainTextBeginIndex) {
6340
6344
  // change start is before the open tag
6341
6345
  // Math.max(lastProcessedPlainTextTagEndIndex, startIndex) is used as startIndex may not be in [[previous tag].plainTextEndIndex - tag.plainTextBeginIndex] range
6342
- const startChangeDiff = tag.plainTextBeginIndex - Math.max(lastProcessedPlainTextTagEndIndex, startIndex);
6346
+ const startChangeDiff = getChangeDiff(oldPlainText, Math.max(lastProcessedPlainTextTagEndIndex, startIndex), tag.plainTextBeginIndex);
6343
6347
  result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex - startChangeDiff) + processedChange;
6344
6348
  processedChange = '';
6345
6349
  if (oldPlainTextEndIndex <= tag.plainTextBeginIndex) {
6346
6350
  // the whole change is before tag start
6347
6351
  // mentionTag length can be ignored here as the change is before the tag
6348
- const endChangeDiff = tag.plainTextBeginIndex - oldPlainTextEndIndex;
6352
+ const endChangeDiff = getChangeDiff(oldPlainText, oldPlainTextEndIndex, tag.plainTextBeginIndex);
6349
6353
  lastProcessedHTMLIndex = tag.openTagIndex - endChangeDiff;
6350
6354
  // the change is handled; exit
6351
6355
  break;
@@ -6375,13 +6379,13 @@ const updateHTML = (props) => {
6375
6379
  if (startIndex !== tag.plainTextBeginIndex && startIndex !== closingTagInfo.plainTextEndIndex) {
6376
6380
  // mention tag should be deleted when user tries to edit it in the middle
6377
6381
  result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;
6378
- changeNewEndIndex = tag.plainTextBeginIndex + processedChange.length;
6382
+ changeNewEndIndex = tag.plainTextBeginIndex + unEscapeHtmlCharacters(processedChange).length;
6379
6383
  lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;
6380
6384
  }
6381
6385
  else if (startIndex === tag.plainTextBeginIndex) {
6382
6386
  // non empty change at the beginning of the mention tag to be added before the mention tag
6383
6387
  result += htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex) + processedChange;
6384
- changeNewEndIndex = tag.plainTextBeginIndex + processedChange.length;
6388
+ changeNewEndIndex = tag.plainTextBeginIndex + unEscapeHtmlCharacters(processedChange).length;
6385
6389
  lastProcessedHTMLIndex = tag.openTagIndex;
6386
6390
  }
6387
6391
  else if (startIndex === closingTagInfo.plainTextEndIndex) {
@@ -6389,12 +6393,13 @@ const updateHTML = (props) => {
6389
6393
  result +=
6390
6394
  htmlText.substring(lastProcessedHTMLIndex, closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength) +
6391
6395
  processedChange;
6392
- changeNewEndIndex = closingTagInfo.plainTextEndIndex + processedChange.length;
6396
+ changeNewEndIndex = closingTagInfo.plainTextEndIndex + unEscapeHtmlCharacters(processedChange).length;
6393
6397
  lastProcessedHTMLIndex = closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength;
6394
6398
  }
6395
6399
  processedChange = '';
6396
6400
  }
6397
6401
  else {
6402
+ // When change is empty, it means that this change is a deletion
6398
6403
  const updateMentionTagResult = handleMentionTagUpdate({
6399
6404
  htmlText,
6400
6405
  oldPlainText,
@@ -6422,7 +6427,6 @@ const updateHTML = (props) => {
6422
6427
  const updatedContent = updateHTML({
6423
6428
  htmlText: tag.content,
6424
6429
  oldPlainText,
6425
- newPlainText,
6426
6430
  tags: tag.subTags,
6427
6431
  startIndex,
6428
6432
  oldPlainTextEndIndex,
@@ -6434,13 +6438,13 @@ const updateHTML = (props) => {
6434
6438
  }
6435
6439
  else {
6436
6440
  // no subtags
6437
- const startChangeDiff = startIndex - tag.plainTextBeginIndex;
6441
+ const startChangeDiff = getChangeDiff(oldPlainText, tag.plainTextBeginIndex, startIndex);
6438
6442
  result +=
6439
6443
  htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length + startChangeDiff) +
6440
6444
  processedChange;
6441
6445
  processedChange = '';
6442
6446
  if (oldPlainTextEndIndex < closingTagInfo.plainTextEndIndex) {
6443
- const endChangeDiff = oldPlainTextEndIndex - tag.plainTextBeginIndex;
6447
+ const endChangeDiff = getChangeDiff(oldPlainText, tag.plainTextBeginIndex, oldPlainTextEndIndex);
6444
6448
  lastProcessedHTMLIndex = tag.openTagIndex + tag.openTagBody.length + endChangeDiff;
6445
6449
  }
6446
6450
  else if (oldPlainTextEndIndex === closingTagInfo.plainTextEndIndex) {
@@ -6479,7 +6483,6 @@ const updateHTML = (props) => {
6479
6483
  const updatedContent = updateHTML({
6480
6484
  htmlText: tag.content,
6481
6485
  oldPlainText,
6482
- newPlainText,
6483
6486
  tags: tag.subTags,
6484
6487
  startIndex,
6485
6488
  oldPlainTextEndIndex,
@@ -6539,7 +6542,6 @@ const updateHTML = (props) => {
6539
6542
  const updatedContent = updateHTML({
6540
6543
  htmlText: tag.content,
6541
6544
  oldPlainText,
6542
- newPlainText,
6543
6545
  tags: tag.subTags,
6544
6546
  startIndex,
6545
6547
  oldPlainTextEndIndex,
@@ -6555,7 +6557,7 @@ const updateHTML = (props) => {
6555
6557
  htmlText.substring(lastProcessedHTMLIndex, tag.openTagIndex + tag.openTagBody.length) + processedChange;
6556
6558
  processedChange = '';
6557
6559
  // oldPlainTextEndIndex already includes mentionTag length
6558
- const endChangeDiff = closingTagInfo.plainTextEndIndex - oldPlainTextEndIndex;
6560
+ const endChangeDiff = getChangeDiff(oldPlainText, oldPlainTextEndIndex, closingTagInfo.plainTextEndIndex);
6559
6561
  // as change may be before the end of the tag, we need to add the rest of the tag
6560
6562
  lastProcessedHTMLIndex = closingTagInfo.closeTagIdx - endChangeDiff;
6561
6563
  }
@@ -6567,9 +6569,9 @@ const updateHTML = (props) => {
6567
6569
  if (i === tags.length - 1 && oldPlainTextEndIndex >= closingTagInfo.plainTextEndIndex) {
6568
6570
  // the last tag should handle the end of the change if needed
6569
6571
  // oldPlainTextEndIndex already includes mentionTag length
6570
- const endChangeDiff = oldPlainTextEndIndex - closingTagInfo.plainTextEndIndex;
6572
+ const endChangeDiff = getChangeDiff(oldPlainText, closingTagInfo.plainTextEndIndex, oldPlainTextEndIndex);
6571
6573
  if (startIndex >= closingTagInfo.plainTextEndIndex) {
6572
- const startChangeDiff = startIndex - closingTagInfo.plainTextEndIndex;
6574
+ const startChangeDiff = getChangeDiff(oldPlainText, closingTagInfo.plainTextEndIndex, startIndex);
6573
6575
  result +=
6574
6576
  htmlText.substring(lastProcessedHTMLIndex, closingTagInfo.closeTagIdx + closingTagInfo.closeTagLength + startChangeDiff) + processedChange;
6575
6577
  }
@@ -6719,17 +6721,18 @@ const textToTagParser = (text, trigger) => {
6719
6721
  if (!foundHtmlTag) {
6720
6722
  if (parseIndex !== 0) {
6721
6723
  // Add the remaining text to the plain text representation
6722
- plainTextRepresentation += text.substring(parseIndex);
6724
+ const newText = text.substring(parseIndex);
6725
+ plainTextRepresentation += unEscapeHtmlCharacters(newText);
6723
6726
  }
6724
6727
  else {
6725
- plainTextRepresentation = text;
6728
+ plainTextRepresentation = unEscapeHtmlCharacters(text);
6726
6729
  }
6727
6730
  break;
6728
6731
  }
6729
6732
  if (foundHtmlTag.type === 'open' || foundHtmlTag.type === 'self-closing') {
6730
6733
  const nextTag = parseOpenTag(foundHtmlTag.content, foundHtmlTag.startIdx);
6731
6734
  // Add the plain text between the last tag and this one found
6732
- plainTextRepresentation += text.substring(parseIndex, foundHtmlTag.startIdx);
6735
+ plainTextRepresentation += unEscapeHtmlCharacters(text.substring(parseIndex, foundHtmlTag.startIdx));
6733
6736
  nextTag.plainTextBeginIndex = plainTextRepresentation.length;
6734
6737
  if (foundHtmlTag.type === 'open') {
6735
6738
  tagParseStack.push(nextTag);
@@ -6755,14 +6758,14 @@ const textToTagParser = (text, trigger) => {
6755
6758
  plainTextRepresentation.slice(currentOpenTag.plainTextBeginIndex);
6756
6759
  }
6757
6760
  if (!currentOpenTag.subTags) {
6758
- plainTextRepresentation += currentOpenTag.content;
6761
+ plainTextRepresentation += unEscapeHtmlCharacters(currentOpenTag.content);
6759
6762
  }
6760
6763
  else if (currentOpenTag.subTags.length > 0) {
6761
6764
  // Add text after the last tag
6762
6765
  const lastSubTag = currentOpenTag.subTags[currentOpenTag.subTags.length - 1];
6763
6766
  const startOfRemainingText = ((_a = lastSubTag.closingTagIndex) !== null && _a !== void 0 ? _a : lastSubTag.openTagIndex) + lastSubTag.tagType.length + 3;
6764
6767
  const trailingText = currentOpenTag.content.substring(startOfRemainingText);
6765
- plainTextRepresentation += trailingText;
6768
+ plainTextRepresentation += unEscapeHtmlCharacters(trailingText);
6766
6769
  }
6767
6770
  currentOpenTag.plainTextEndIndex = plainTextRepresentation.length;
6768
6771
  addTag(currentOpenTag, tagParseStack, tags);
@@ -6850,6 +6853,32 @@ const addTag = (tag, parseStack, tags) => {
6850
6853
  }
6851
6854
  }
6852
6855
  };
6856
+ // We should revisit this in the future when we support other text such as rich text editing.
6857
+ const escapeHTMLChars = (text) => {
6858
+ const mentionRegex = new RegExp(`<${MSFT_MENTION_TAG}(.*?)>(.*?)</${MSFT_MENTION_TAG}>`, 'i');
6859
+ if (!text.match(mentionRegex)) {
6860
+ return text
6861
+ .replace(/&(?![A-Z]+;)/gi, '&amp;')
6862
+ .replace(/</g, '&lt;')
6863
+ .replace(/>/g, '&gt;');
6864
+ }
6865
+ return text;
6866
+ };
6867
+ const getChangeDiff = (plainText, startIndex, endIndex) => {
6868
+ return endIndex - startIndex + getLengthDiffForEscapedHtmlChars(plainText, startIndex, endIndex);
6869
+ };
6870
+ const getLengthDiffForEscapedHtmlChars = (text, startIndex, endIndex) => {
6871
+ var _a, _b;
6872
+ const subText = text.substring(startIndex, endIndex);
6873
+ const escapedAngleBracketCount = ((_a = subText.match(/(<)|(>)/g)) === null || _a === void 0 ? void 0 : _a.length) || 0;
6874
+ let escapedCharLength = escapedAngleBracketCount * ('&lt;'.length - '<'.length);
6875
+ const escapedAmpersandCount = ((_b = subText.match(/&/g)) === null || _b === void 0 ? void 0 : _b.length) || 0;
6876
+ escapedCharLength += escapedAmpersandCount * ('&amp;'.length - '&'.length);
6877
+ return escapedCharLength;
6878
+ };
6879
+ const unEscapeHtmlCharacters = (text) => {
6880
+ return text.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&');
6881
+ };
6853
6882
 
6854
6883
  // Copyright (c) Microsoft Corporation.
6855
6884
  /**
@@ -7117,13 +7146,11 @@ const TextFieldWithMention = (props) => {
7117
7146
  const oldPlainText = inputTextValue;
7118
7147
  const mention = htmlStringForMentionSuggestion(suggestion, localeStrings);
7119
7148
  // update plain text with the mention html text
7120
- const newPlainText = inputTextValue.substring(0, currentTriggerStartIndex) + mention + inputTextValue.substring(selectionEnd);
7121
7149
  const triggerText = (_b = mentionLookupOptions === null || mentionLookupOptions === void 0 ? void 0 : mentionLookupOptions.trigger) !== null && _b !== void 0 ? _b : DEFAULT_MENTION_TRIGGER;
7122
7150
  // update html text with updated plain text
7123
7151
  const updatedContent = updateHTML({
7124
7152
  htmlText: textValue,
7125
7153
  oldPlainText,
7126
- newPlainText,
7127
7154
  tags: tagsValue,
7128
7155
  startIndex: currentTriggerStartIndex,
7129
7156
  oldPlainTextEndIndex: selectionEnd,
@@ -7438,44 +7465,32 @@ const TextFieldWithMention = (props) => {
7438
7465
  }
7439
7466
  }
7440
7467
  }
7441
- let result = '';
7442
- if (tagsValue.length === 0) {
7443
- // no tags in the string and newValue should be used as a result string
7444
- result = newValue;
7445
- }
7446
- else {
7447
- // there are tags in the text value and htmlTextValue is html string
7448
- // find diff between old and new text
7449
- const { changeStart, oldChangeEnd, newChangeEnd } = findStringsDiffIndexes({
7450
- oldText: inputTextValue,
7451
- newText: newValue,
7452
- previousSelectionStart: previousSelectionStartValue,
7453
- previousSelectionEnd: previousSelectionEndValue,
7454
- currentSelectionStart: currentSelectionStartValue,
7455
- currentSelectionEnd: currentSelectionEndValue
7456
- });
7457
- const change = newValue.substring(changeStart, newChangeEnd);
7458
- // get updated html string
7459
- const updatedContent = updateHTML({
7460
- htmlText: htmlTextValue,
7461
- oldPlainText: inputTextValue,
7462
- newPlainText: newValue,
7463
- tags: tagsValue,
7464
- startIndex: changeStart,
7465
- oldPlainTextEndIndex: oldChangeEnd,
7466
- change,
7467
- mentionTrigger: triggerText
7468
- });
7469
- result = updatedContent.updatedHTML;
7470
- // update caret index if needed
7471
- if (updatedContent.updatedSelectionIndex !== undefined) {
7472
- setCaretIndex(updatedContent.updatedSelectionIndex);
7473
- setSelectionEndValue(updatedContent.updatedSelectionIndex);
7474
- setSelectionStartValue(updatedContent.updatedSelectionIndex);
7475
- }
7476
- }
7477
- onChange && onChange(event, result);
7478
- }), [onChange, mentionLookupOptions, setCaretIndex, setCaretPosition, updateMentionSuggestions, debouncedQueryUpdate]);
7468
+ const { changeStart, oldChangeEnd, newChangeEnd } = findStringsDiffIndexes({
7469
+ oldText: inputTextValue,
7470
+ newText: newValue,
7471
+ previousSelectionStart: previousSelectionStartValue,
7472
+ previousSelectionEnd: previousSelectionEndValue,
7473
+ currentSelectionStart: currentSelectionStartValue,
7474
+ currentSelectionEnd: currentSelectionEndValue
7475
+ });
7476
+ const change = newValue.substring(changeStart, newChangeEnd);
7477
+ const updatedContent = updateHTML({
7478
+ htmlText: htmlTextValue,
7479
+ oldPlainText: inputTextValue,
7480
+ tags: tagsValue,
7481
+ startIndex: changeStart,
7482
+ oldPlainTextEndIndex: oldChangeEnd,
7483
+ change,
7484
+ mentionTrigger: triggerText
7485
+ });
7486
+ // update caret index if needed
7487
+ if (updatedContent.updatedSelectionIndex !== undefined) {
7488
+ setCaretIndex(updatedContent.updatedSelectionIndex);
7489
+ setSelectionEndValue(updatedContent.updatedSelectionIndex);
7490
+ setSelectionStartValue(updatedContent.updatedSelectionIndex);
7491
+ }
7492
+ onChange && onChange(event, updatedContent.updatedHTML);
7493
+ }), [debouncedQueryUpdate, mentionLookupOptions, onChange, updateMentionSuggestions]);
7479
7494
  // Adjust the selection range based on a mouse / touch interaction
7480
7495
  const handleOnMove = React.useCallback(({ event, selectionStartValue, selectionEndValue, interactionStartSelection, shouldHandleMoveEvent }) => {
7481
7496
  if (shouldHandleMoveEvent &&
@@ -10283,6 +10298,7 @@ const ParticipantItem = (props) => {
10283
10298
  const theme = useTheme();
10284
10299
  const localeStrings = useLocale$1().strings.participantItem;
10285
10300
  const ids = useIdentifiers();
10301
+ const uniqueId = React.useId();
10286
10302
  const strings = Object.assign(Object.assign({}, localeStrings), props.strings);
10287
10303
  // For 'me' show empty name so avatar will get 'Person' icon, when there is no name
10288
10304
  const meAvatarText = (displayName === null || displayName === void 0 ? void 0 : displayName.trim()) || '';
@@ -10322,7 +10338,7 @@ const ParticipantItem = (props) => {
10322
10338
  React__default['default'].createElement(react.Stack, { horizontal: true, className: react.mergeStyles({
10323
10339
  width: `calc(100% - ${!me && participantStateString ? participantStateMaxWidth : menuButtonContainerStyle.width})`,
10324
10340
  alignItems: 'center'
10325
- }) },
10341
+ }), id: uniqueId, "aria-labelledby": `${props.ariaLabelledBy} ${uniqueId}` },
10326
10342
  avatar,
10327
10343
  me && React__default['default'].createElement(react.Text, { className: meTextStyle }, strings.isMeText),
10328
10344
  React__default['default'].createElement(react.Stack, { horizontal: true, className: react.mergeStyles(infoContainerStyle) }, onRenderIcon && onRenderIcon(props))),
@@ -10444,7 +10460,7 @@ const iconStyles$2 = react.mergeStyles({
10444
10460
  });
10445
10461
 
10446
10462
  // Copyright (c) Microsoft Corporation.
10447
- const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, styles, onParticipantClick, showParticipantOverflowTooltip) => {
10463
+ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, styles, onParticipantClick, showParticipantOverflowTooltip, participantAriaLabelledBy) => {
10448
10464
  const callingParticipant = participant;
10449
10465
  let presence = undefined;
10450
10466
  if (callingParticipant) {
@@ -10464,7 +10480,7 @@ const onRenderParticipantDefault = (participant, strings, myUserId, onRenderAvat
10464
10480
  return (React__default['default'].createElement(ParticipantItem, { styles: styles, key: participant.userId, userId: participant.userId, displayName: participant.displayName, me: myUserId ? participant.userId === myUserId : false, menuItems: menuItems, presence: presence, onRenderIcon: onRenderIcon, onRenderAvatar: onRenderAvatar, onClick: () => onParticipantClick === null || onParticipantClick === void 0 ? void 0 : onParticipantClick(participant), showParticipantOverflowTooltip: showParticipantOverflowTooltip,
10465
10481
  /* @conditional-compile-remove(one-to-n-calling) */
10466
10482
  /* @conditional-compile-remove(PSTN-calls) */
10467
- participantState: callingParticipant.state }));
10483
+ participantState: callingParticipant.state, ariaLabelledBy: participantAriaLabelledBy }));
10468
10484
  };
10469
10485
  const getParticipantsForDefaultRender = (participants, excludeMe, myUserId) => {
10470
10486
  if (!excludeMe || !myUserId) {
@@ -10487,7 +10503,7 @@ const getParticipantsForDefaultRender = (participants, excludeMe, myUserId) => {
10487
10503
  */
10488
10504
  const ParticipantList = (props) => {
10489
10505
  var _a, _b, _c, _d;
10490
- const { excludeMe = false, myUserId, participants, onRemoveParticipant, onRenderAvatar, onRenderParticipant, onFetchParticipantMenuItems, showParticipantOverflowTooltip } = props;
10506
+ const { excludeMe = false, myUserId, participants, onRemoveParticipant, onRenderAvatar, onRenderParticipant, onFetchParticipantMenuItems, showParticipantOverflowTooltip, participantAriaLabelledBy } = props;
10491
10507
  const ids = useIdentifiers();
10492
10508
  const strings = useLocale$1().strings.participantItem;
10493
10509
  const displayedParticipants = React.useMemo(() => {
@@ -10525,7 +10541,7 @@ const ParticipantList = (props) => {
10525
10541
  const participantItemStyles = React.useMemo(() => { var _a; return react.merge(participantListItemStyle, (_a = props.styles) === null || _a === void 0 ? void 0 : _a.participantItemStyles); }, [(_c = props.styles) === null || _c === void 0 ? void 0 : _c.participantItemStyles]);
10526
10542
  return (React__default['default'].createElement(react.Stack, { "data-ui-id": ids.participantList, className: react.mergeStyles(participantListStyle$1, (_d = props.styles) === null || _d === void 0 ? void 0 : _d.root) }, displayedParticipants.map((participant) => onRenderParticipant
10527
10543
  ? onRenderParticipant(participant)
10528
- : onRenderParticipantDefault(participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, participantItemStyles, props.onParticipantClick, showParticipantOverflowTooltip))));
10544
+ : onRenderParticipantDefault(participant, strings, myUserId, onRenderAvatar, createParticipantMenuItems, participantItemStyles, props.onParticipantClick, showParticipantOverflowTooltip, participantAriaLabelledBy))));
10529
10545
  };
10530
10546
 
10531
10547
  // Copyright (c) Microsoft Corporation.
@@ -11270,7 +11286,7 @@ const VideoTile = (props) => {
11270
11286
  }
11271
11287
  const currentObserver = observer.current;
11272
11288
  return () => currentObserver.disconnect();
11273
- }, [observer, videoTileRef]);
11289
+ }, [videoTileRef]);
11274
11290
  /* @conditional-compile-remove(pinned-participants) */
11275
11291
  const useLongPressProps = React.useMemo(() => {
11276
11292
  return {
@@ -11629,6 +11645,12 @@ const localVideoCameraCycleButtonStyles = (theme) => {
11629
11645
  }
11630
11646
  };
11631
11647
  };
11648
+ /**
11649
+ * @private
11650
+ */
11651
+ const localVideoTileContainerStyles = {
11652
+ root: { width: '100%', height: '100%' }
11653
+ };
11632
11654
 
11633
11655
  // Copyright (c) Microsoft Corporation.
11634
11656
  /**
@@ -11771,7 +11793,7 @@ const DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS = 6;
11771
11793
  const _useOrganizedParticipants = (props) => {
11772
11794
  const visibleGridParticipants = React.useRef([]);
11773
11795
  const visibleOverflowGalleryParticipants = React.useRef([]);
11774
- const { remoteParticipants = [], dominantSpeakers = [], maxRemoteVideoStreams, maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS, isScreenShareActive = false, pinnedParticipantUserIds = [] } = props;
11796
+ const { remoteParticipants = [], localParticipant, dominantSpeakers = [], maxRemoteVideoStreams, maxOverflowGalleryDominantSpeakers = DEFAULT_MAX_OVERFLOW_GALLERY_DOMINANT_SPEAKERS, isScreenShareActive = false, pinnedParticipantUserIds = [] } = props;
11775
11797
  const videoParticipants = remoteParticipants.filter((p) => { var _a; return (_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable; });
11776
11798
  visibleGridParticipants.current =
11777
11799
  pinnedParticipantUserIds.length > 0 || isScreenShareActive
@@ -11809,7 +11831,13 @@ const _useOrganizedParticipants = (props) => {
11809
11831
  ]);
11810
11832
  const gridParticipants = getGridParticipants();
11811
11833
  const getOverflowGalleryRemoteParticipants = React.useCallback(() => {
11812
- if (isScreenShareActive) {
11834
+ if (isScreenShareActive && localParticipant) {
11835
+ const localParticipantPlusOverflow = [localParticipant].concat(visibleGridParticipants.current.concat(visibleOverflowGalleryParticipants.current));
11836
+ // If screen sharing is active, assign video and audio participants as overflow gallery participants
11837
+ /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
11838
+ return localParticipantPlusOverflow.concat(callingParticipants);
11839
+ }
11840
+ else if (isScreenShareActive) {
11813
11841
  // If screen sharing is active, assign video and audio participants as overflow gallery participants
11814
11842
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */
11815
11843
  return visibleGridParticipants.current.concat(visibleOverflowGalleryParticipants.current.concat(callingParticipants));
@@ -11824,7 +11852,8 @@ const _useOrganizedParticipants = (props) => {
11824
11852
  }
11825
11853
  }, [
11826
11854
  /* @conditional-compile-remove(PSTN-calls) */ /* @conditional-compile-remove(one-to-n-calling) */ callingParticipants,
11827
- isScreenShareActive
11855
+ isScreenShareActive,
11856
+ localParticipant
11828
11857
  ]);
11829
11858
  const overflowGalleryParticipants = getOverflowGalleryRemoteParticipants();
11830
11859
  return { gridParticipants, overflowGalleryParticipants: overflowGalleryParticipants };
@@ -11977,9 +12006,12 @@ const HorizontalGallery = (props) => {
11977
12006
  const firstIndexOfCurrentPage = page * childrenPerPage;
11978
12007
  const clippedPage = firstIndexOfCurrentPage < numberOfChildren - 1 ? page : lastPage;
11979
12008
  const childrenOnCurrentPage = React.useMemo(() => {
11980
- return indexesArray[clippedPage].map((index) => {
11981
- return React__default['default'].Children.toArray(children)[index];
11982
- });
12009
+ if (indexesArray[0] !== undefined) {
12010
+ return indexesArray[clippedPage].map((index) => {
12011
+ return React__default['default'].Children.toArray(children)[index];
12012
+ });
12013
+ }
12014
+ return [];
11983
12015
  }, [indexesArray, clippedPage, children]);
11984
12016
  const showButtons = numberOfChildren > childrenPerPage;
11985
12017
  const disablePreviousButton = page === 0;
@@ -12035,10 +12067,13 @@ const LOCAL_VIDEO_TILE_ZINDEX = 2;
12035
12067
  /**
12036
12068
  * @private
12037
12069
  */
12038
- const localVideoTileContainerStyle = (theme, localVideoTileSizeRem) => {
12070
+ const localVideoTileContainerStyle = (theme, localVideoTileSizeRem, screenSharePresent) => {
12071
+ console.log(screenSharePresent);
12039
12072
  return {
12040
- minWidth: `${localVideoTileSizeRem.width}rem`,
12041
- minHeight: `${localVideoTileSizeRem.height}rem`,
12073
+ width: screenSharePresent ? `${localVideoTileSizeRem.width}rem` : '',
12074
+ height: screenSharePresent ? `${localVideoTileSizeRem.height}rem` : '',
12075
+ minWidth: screenSharePresent ? '' : `${localVideoTileSizeRem.width}rem`,
12076
+ minHeight: screenSharePresent ? '' : `${localVideoTileSizeRem.height}rem`,
12042
12077
  position: 'absolute',
12043
12078
  bottom: `${localVideoTileOuterPaddingRem}rem`,
12044
12079
  borderRadius: theme.effects.roundedCorner4,
@@ -12365,7 +12400,7 @@ const childrenContainerStyle = (pageControlBarHeight) => {
12365
12400
  */
12366
12401
  const rootStyle = {
12367
12402
  height: '100%',
12368
- width: '100%',
12403
+ width: 'inherit',
12369
12404
  gap: `${VERTICAL_GALLERY_GAP}rem`,
12370
12405
  position: 'relative'
12371
12406
  };
@@ -12434,9 +12469,12 @@ const VerticalGallery = (props) => {
12434
12469
  const firstIndexOfCurrentPage = (page - 1) * childrenPerPage;
12435
12470
  const clippedPage = firstIndexOfCurrentPage < numberOfChildren - 1 ? page : lastPage;
12436
12471
  const childrenOnCurrentPage = React.useMemo(() => {
12437
- return indexesArray[clippedPage - 1].map((index) => {
12438
- return React__default['default'].Children.toArray(children)[index];
12439
- });
12472
+ if (indexesArray[0] !== undefined) {
12473
+ return indexesArray[clippedPage - 1].map((index) => {
12474
+ return React__default['default'].Children.toArray(children)[index];
12475
+ });
12476
+ }
12477
+ return;
12440
12478
  }, [indexesArray, clippedPage, children]);
12441
12479
  const showButtons = numberOfChildren > childrenPerPage;
12442
12480
  const onPreviousButtonClick = () => {
@@ -12520,13 +12558,14 @@ const VerticalGalleryControlBar = (props) => {
12520
12558
  * @beta
12521
12559
  */
12522
12560
  const ResponsiveVerticalGallery = (props) => {
12561
+ var _a;
12523
12562
  const { children, containerStyles, verticalGalleryStyles, gapHeightRem, controlBarHeightRem, isShort, onFetchTilesToRender, onChildrenPerPageChange } = props;
12524
12563
  const containerRef = React.useRef(null);
12525
12564
  const containerHeight = _useContainerHeight(containerRef);
12526
12565
  const topPadding = containerRef.current ? parseFloat(getComputedStyle(containerRef.current).paddingTop) : 0;
12527
12566
  const bottomPadding = containerRef.current ? parseFloat(getComputedStyle(containerRef.current).paddingBottom) : 0;
12528
12567
  const childrenPerPage = calculateVerticalChildrenPerPage({
12529
- numberOfChildren: React__default['default'].Children.count(children),
12568
+ numberOfChildren: (_a = React__default['default'].Children.count(children)) !== null && _a !== void 0 ? _a : 0,
12530
12569
  containerHeight: (containerHeight !== null && containerHeight !== void 0 ? containerHeight : 0) - topPadding - bottomPadding,
12531
12570
  gapHeightRem,
12532
12571
  controlBarHeight: controlBarHeightRem !== null && controlBarHeightRem !== void 0 ? controlBarHeightRem : 2,
@@ -12620,16 +12659,16 @@ const OverflowGallery = (props) => {
12620
12659
  ]);
12621
12660
  /* @conditional-compile-remove(vertical-gallery) */
12622
12661
  if (overflowGalleryPosition === 'VerticalRight') {
12623
- return (React__default['default'].createElement(ResponsiveVerticalGallery, { key: "responsive-vertical-gallery", containerStyles: containerStyles, verticalGalleryStyles: galleryStyles, controlBarHeightRem: HORIZONTAL_GALLERY_BUTTON_WIDTH, gapHeightRem: HORIZONTAL_GALLERY_GAP, isShort: isShort, onFetchTilesToRender: onFetchTilesToRender, onChildrenPerPageChange: onChildrenPerPageChange }, overflowGalleryElements));
12662
+ return (React__default['default'].createElement(ResponsiveVerticalGallery, { key: "responsive-vertical-gallery", containerStyles: containerStyles, verticalGalleryStyles: galleryStyles, controlBarHeightRem: HORIZONTAL_GALLERY_BUTTON_WIDTH, gapHeightRem: HORIZONTAL_GALLERY_GAP, isShort: isShort, onFetchTilesToRender: onFetchTilesToRender, onChildrenPerPageChange: onChildrenPerPageChange }, overflowGalleryElements ? overflowGalleryElements : [React__default['default'].createElement(React__default['default'].Fragment, null)]));
12624
12663
  }
12625
12664
  /* @conditional-compile-remove(pinned-participants) */
12626
12665
  if (isNarrow) {
12627
12666
  // There are no pages for ScrollableHorizontalGallery so we will approximate the first 3 remote
12628
12667
  // participant tiles are visible
12629
12668
  onChildrenPerPageChange === null || onChildrenPerPageChange === void 0 ? void 0 : onChildrenPerPageChange(3);
12630
- return (React__default['default'].createElement(ScrollableHorizontalGallery, { horizontalGalleryElements: overflowGalleryElements, onFetchTilesToRender: onFetchTilesToRender, key: "scrollable-horizontal-gallery" }));
12669
+ return (React__default['default'].createElement(ScrollableHorizontalGallery, { horizontalGalleryElements: overflowGalleryElements ? overflowGalleryElements : [React__default['default'].createElement(React__default['default'].Fragment, null)], onFetchTilesToRender: onFetchTilesToRender, key: "scrollable-horizontal-gallery" }));
12631
12670
  }
12632
- return (React__default['default'].createElement(ResponsiveHorizontalGallery, { key: "responsive-horizontal-gallery", containerStyles: containerStyles, onFetchTilesToRender: onFetchTilesToRender, horizontalGalleryStyles: galleryStyles, buttonWidthRem: HORIZONTAL_GALLERY_BUTTON_WIDTH, gapWidthRem: HORIZONTAL_GALLERY_GAP, onChildrenPerPageChange: onChildrenPerPageChange }, overflowGalleryElements));
12671
+ return (React__default['default'].createElement(ResponsiveHorizontalGallery, { key: "responsive-horizontal-gallery", containerStyles: containerStyles, onFetchTilesToRender: onFetchTilesToRender, horizontalGalleryStyles: galleryStyles, buttonWidthRem: HORIZONTAL_GALLERY_BUTTON_WIDTH, gapWidthRem: HORIZONTAL_GALLERY_GAP, onChildrenPerPageChange: onChildrenPerPageChange }, overflowGalleryElements ? overflowGalleryElements : [React__default['default'].createElement(React__default['default'].Fragment, null)]));
12633
12672
  };
12634
12673
 
12635
12674
  // Copyright (c) Microsoft Corporation.
@@ -12640,7 +12679,7 @@ const OverflowGallery = (props) => {
12640
12679
  * @private
12641
12680
  */
12642
12681
  const DefaultLayout = (props) => {
12643
- const { remoteParticipants = [], dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth,
12682
+ const { remoteParticipants = [], localParticipant, dominantSpeakers, localVideoComponent, screenShareComponent, onRenderRemoteParticipant, styles, maxRemoteVideoStreams, parentWidth,
12644
12683
  /* @conditional-compile-remove(vertical-gallery) */
12645
12684
  parentHeight, pinnedParticipantUserIds = [],
12646
12685
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition = 'HorizontalBottom' } = props;
@@ -12649,14 +12688,16 @@ const DefaultLayout = (props) => {
12649
12688
  const isShort = parentHeight ? isShortHeight(parentHeight) : false;
12650
12689
  // This is for tracking the number of children in the first page of overflow gallery.
12651
12690
  // This number will be used for the maxOverflowGalleryDominantSpeakers when organizing the remote participants.
12691
+ // We need to add the local participant to the pinned participant count so we are placing the speakers correctly.
12652
12692
  const childrenPerPage = React.useRef(4);
12653
12693
  const { gridParticipants, overflowGalleryParticipants } = useOrganizedParticipants({
12654
12694
  remoteParticipants,
12695
+ localParticipant,
12655
12696
  dominantSpeakers,
12656
12697
  maxRemoteVideoStreams,
12657
12698
  isScreenShareActive: !!screenShareComponent,
12658
12699
  maxOverflowGalleryDominantSpeakers: screenShareComponent
12659
- ? childrenPerPage.current - (pinnedParticipantUserIds.length % childrenPerPage.current)
12700
+ ? childrenPerPage.current - ((pinnedParticipantUserIds.length + 1) % childrenPerPage.current)
12660
12701
  : childrenPerPage.current,
12661
12702
  /* @conditional-compile-remove(pinned-participants) */ pinnedParticipantUserIds
12662
12703
  });
@@ -13501,7 +13542,10 @@ const FloatingLocalVideoLayout = (props) => {
13501
13542
  const overflowGalleryTiles = overflowGalleryParticipants.map((p, i) => {
13502
13543
  var _a, _b;
13503
13544
  return onRenderRemoteParticipant(p, maxRemoteVideoStreams && maxRemoteVideoStreams >= 0
13504
- ? ((_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable) && indexesToRender.includes(i) && activeVideoStreams++ < maxRemoteVideoStreams
13545
+ ? ((_a = p.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable) &&
13546
+ indexesToRender &&
13547
+ indexesToRender.includes(i) &&
13548
+ activeVideoStreams++ < maxRemoteVideoStreams
13505
13549
  : (_b = p.videoStream) === null || _b === void 0 ? void 0 : _b.isAvailable);
13506
13550
  });
13507
13551
  const layerHostId = reactHooks.useId('layerhost');
@@ -13510,7 +13554,7 @@ const FloatingLocalVideoLayout = (props) => {
13510
13554
  return SMALL_FLOATING_MODAL_SIZE_REM;
13511
13555
  }
13512
13556
  /* @conditional-compile-remove(vertical-gallery) */
13513
- if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'VerticalRight') {
13557
+ if ((overflowGalleryTiles.length > 0 || screenShareComponent) && overflowGalleryPosition === 'VerticalRight') {
13514
13558
  return isNarrow
13515
13559
  ? SMALL_FLOATING_MODAL_SIZE_REM
13516
13560
  : isShort
@@ -13518,25 +13562,26 @@ const FloatingLocalVideoLayout = (props) => {
13518
13562
  : VERTICAL_GALLERY_FLOATING_MODAL_SIZE_REM;
13519
13563
  }
13520
13564
  /*@conditional-compile-remove(click-to-call) */
13521
- if (overflowGalleryTiles.length > 0 && overflowGalleryPosition === 'HorizontalBottom') {
13565
+ if ((overflowGalleryTiles.length > 0 || screenShareComponent) && overflowGalleryPosition === 'HorizontalBottom') {
13522
13566
  return localVideoTileSize === '16:9' || !isNarrow ? LARGE_FLOATING_MODAL_SIZE_REM : SMALL_FLOATING_MODAL_SIZE_REM;
13523
13567
  }
13524
13568
  return LARGE_FLOATING_MODAL_SIZE_REM;
13525
13569
  }, [
13526
13570
  overflowGalleryTiles.length,
13527
13571
  isNarrow,
13572
+ screenShareComponent,
13528
13573
  /* @conditional-compile-remove(vertical-gallery) */ isShort,
13529
13574
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
13530
13575
  /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
13531
13576
  ]);
13532
- const wrappedLocalVideoComponent = localVideoComponent && shouldFloatLocalVideo ? (
13577
+ const wrappedLocalVideoComponent = (localVideoComponent && shouldFloatLocalVideo) || (screenShareComponent && localVideoComponent) ? (
13533
13578
  // When we use showCameraSwitcherInLocalPreview it disables dragging to allow keyboard navigation.
13534
13579
  showCameraSwitcherInLocalPreview ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileWithControlsContainerStyle(theme, localVideoSizeRem), {
13535
13580
  boxShadow: theme.effects.elevation8,
13536
13581
  zIndex: LOCAL_VIDEO_TILE_ZINDEX
13537
- }) }, localVideoComponent)) : overflowGalleryTiles.length > 0 ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileContainerStyle(theme, localVideoSizeRem)) }, localVideoComponent)) : (React__default['default'].createElement(FloatingLocalVideo, { localVideoComponent: localVideoComponent, layerHostId: layerHostId, localVideoSizeRem: localVideoSizeRem, parentWidth: parentWidth, parentHeight: parentHeight }))) : undefined;
13582
+ }) }, localVideoComponent)) : overflowGalleryTiles.length > 0 || screenShareComponent ? (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(localVideoTileContainerStyle(theme, localVideoSizeRem, !!screenShareComponent)) }, localVideoComponent)) : (React__default['default'].createElement(FloatingLocalVideo, { localVideoComponent: localVideoComponent, layerHostId: layerHostId, localVideoSizeRem: localVideoSizeRem, parentWidth: parentWidth, parentHeight: parentHeight }))) : undefined;
13538
13583
  const overflowGallery = React.useMemo(() => {
13539
- if (overflowGalleryTiles.length === 0) {
13584
+ if (overflowGalleryTiles.length === 0 && !screenShareComponent) {
13540
13585
  return null;
13541
13586
  }
13542
13587
  return (React__default['default'].createElement(OverflowGallery
@@ -13553,6 +13598,7 @@ const FloatingLocalVideoLayout = (props) => {
13553
13598
  }, [
13554
13599
  isNarrow,
13555
13600
  /* @conditional-compile-remove(vertical-gallery) */ isShort,
13601
+ screenShareComponent,
13556
13602
  overflowGalleryTiles,
13557
13603
  styles === null || styles === void 0 ? void 0 : styles.horizontalGallery,
13558
13604
  /* @conditional-compile-remove(vertical-gallery) */ overflowGalleryPosition,
@@ -13669,7 +13715,7 @@ const VideoGallery = (props) => {
13669
13715
  root: { borderRadius: theme.effects.roundedCorner4 }
13670
13716
  }, styles === null || styles === void 0 ? void 0 : styles.localVideo);
13671
13717
  const initialsName = !localParticipant.displayName ? '' : localParticipant.displayName;
13672
- return (React__default['default'].createElement(react.Stack, { key: "local-video-tile-key", tabIndex: 0, "aria-label": strings.localVideoMovementLabel, role: 'dialog' },
13718
+ return (React__default['default'].createElement(react.Stack, { styles: localVideoTileContainerStyles, key: "local-video-tile-key", tabIndex: 0, "aria-label": strings.localVideoMovementLabel, role: 'dialog' },
13673
13719
  React__default['default'].createElement(_LocalVideoTile, { userId: localParticipant.userId, onCreateLocalStreamView: onCreateLocalStreamView, onDisposeLocalStreamView: onDisposeLocalStreamView, isAvailable: (_a = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _a === void 0 ? void 0 : _a.isAvailable, isMuted: localParticipant.isMuted, renderElement: (_b = localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.videoStream) === null || _b === void 0 ? void 0 : _b.renderElement, displayName: isNarrow ? '' : strings.localVideoLabel, initialsName: initialsName, localVideoViewOptions: localVideoViewOptions, onRenderAvatar: onRenderAvatar, showLabel: !((shouldFloatLocalVideo && isNarrow) ||
13674
13720
  /*@conditional-compile-remove(click-to-call) */ localVideoTileSize === '9:16'), showMuteIndicator: showMuteIndicator, showCameraSwitcherInLocalPreview: showCameraSwitcherInLocalPreview, localVideoCameraCycleButtonProps: localVideoCameraCycleButtonProps, localVideoCameraSwitcherLabel: strings.localVideoCameraSwitcherLabel, localVideoSelectedDescription: strings.localVideoSelectedDescription, styles: localVideoTileStyles })));
13675
13721
  }, [
@@ -13731,11 +13777,13 @@ const VideoGallery = (props) => {
13731
13777
  /* @conditional-compile-remove(PSTN-calls) */
13732
13778
  participantState: participant.state,
13733
13779
  /* @conditional-compile-remove(pinned-participants) */
13734
- menuKind: remoteVideoTileMenuOptions
13735
- ? remoteVideoTileMenuOptions.kind === 'drawer'
13736
- ? 'drawer'
13737
- : 'contextual'
13738
- : undefined,
13780
+ menuKind: participant.userId === localParticipant.userId
13781
+ ? undefined
13782
+ : remoteVideoTileMenuOptions
13783
+ ? remoteVideoTileMenuOptions.kind === 'drawer'
13784
+ ? 'drawer'
13785
+ : 'contextual'
13786
+ : undefined,
13739
13787
  /* @conditional-compile-remove(pinned-participants) */
13740
13788
  drawerMenuHostId: drawerMenuHostId,
13741
13789
  /* @conditional-compile-remove(pinned-participants) */
@@ -13752,6 +13800,7 @@ const VideoGallery = (props) => {
13752
13800
  onCreateRemoteStreamView,
13753
13801
  onDisposeRemoteVideoStreamView,
13754
13802
  remoteVideoViewOptions,
13803
+ localParticipant,
13755
13804
  onRenderAvatar,
13756
13805
  showMuteIndicator,
13757
13806
  strings,
@@ -13772,6 +13821,7 @@ const VideoGallery = (props) => {
13772
13821
  : undefined;
13773
13822
  const layoutProps = React.useMemo(() => ({
13774
13823
  remoteParticipants,
13824
+ localParticipant,
13775
13825
  screenShareComponent,
13776
13826
  showCameraSwitcherInLocalPreview,
13777
13827
  maxRemoteVideoStreams,
@@ -13786,6 +13836,7 @@ const VideoGallery = (props) => {
13786
13836
  /* @conditional-compile-remove(click-to-call) */ localVideoTileSize
13787
13837
  }), [
13788
13838
  remoteParticipants,
13839
+ localParticipant,
13789
13840
  screenShareComponent,
13790
13841
  showCameraSwitcherInLocalPreview,
13791
13842
  maxRemoteVideoStreams,
@@ -18785,7 +18836,7 @@ const CallCompositeIcon = (props) => (React__default['default'].createElement(re
18785
18836
  */
18786
18837
  const CallWithChatCompositeIcon = (props) => (React__default['default'].createElement(react.FontIcon, Object.assign({}, props)));
18787
18838
 
18788
- var call$j={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown"};var chat$j={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$j={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$j,chat:chat$j,callWithChat:callWithChat$j};
18839
+ var call$j={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown",transferPageNoticeString:"You are being transferred"};var chat$j={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$j={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_US = {call:call$j,chat:chat$j,callWithChat:callWithChat$j};
18789
18840
 
18790
18841
  var call$i={cameraLabel:"Camera",noCamerasLabel:"No cameras found",cameraPermissionDenied:"Your browser is blocking access to your camera",cameraTurnedOff:"Your camera is turned off",chatButtonLabel:"Chat",close:"Close",complianceBannerNowOnlyRecording:"You are now only recording this meeting.",complianceBannerNowOnlyTranscription:"You are now only transcribing this meeting.",complianceBannerRecordingAndTranscriptionSaved:"Recording and transcription are being saved.",complianceBannerRecordingAndTranscriptionStarted:"Recording and transcription have started.",complianceBannerRecordingAndTranscriptionStopped:"Recording and transcription have stopped.",complianceBannerRecordingSaving:"Recording is being saved.",complianceBannerRecordingStarted:"Recording has started.",complianceBannerRecordingStopped:"Recording has stopped.",complianceBannerTranscriptionStarted:"Transcription has started.",complianceBannerTranscriptionConsent:"By joining, you are giving consent for this meeting to be transcribed.",complianceBannerTranscriptionSaving:"Transcription is being saved.",complianceBannerTranscriptionStopped:"Transcription has stopped.",configurationPageTitle:"Start a call",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",defaultPlaceHolder:"Select an option",dismissSidePaneButtonLabel:"Close",videoEffectsPaneTitle:"Effects",videoEffectsPaneBackgroundSelectionTitle:"Background",configurationPageVideoEffectsButtonLabel:"Effects",unableToStartVideoEffect:"Unable to apply video effect.",blurBackgroundEffectButtonLabel:"Blur",blurBackgroundTooltip:"Blur Background",removeBackgroundEffectButtonLabel:"None",removeBackgroundTooltip:"Remove Background",cameraOffBackgroundEffectWarningText:"Your camera is off. Turn on camera to see video effect.",failedToJoinCallDueToNoNetworkMoreDetails:"Call was disconnected due to a network issue. Check your connection and join again.",failedToJoinCallDueToNoNetworkTitle:"Call disconnected",failedToJoinTeamsMeetingReasonAccessDeniedMoreDetails:"You were not granted entry in the call. If this was a mistake, re-join the call.",failedToJoinTeamsMeetingReasonAccessDeniedTitle:"Dismissed from lobby",learnMore:"Learn more",leavingCallTitle:"Leaving...",leftCallMoreDetails:"If this was a mistake, re-join the call.",leftCallTitle:"You left the call",lobbyScreenConnectingToCallTitle:"Joining call",lobbyScreenWaitingToBeAdmittedTitle:"Waiting to be admitted",microphonePermissionDenied:"Your browser is blocking access to your microphone",microphoneToggleInLobbyNotAllowed:"Cannot mute or unmute while in lobby.",mutedMessage:"You're muted",networkReconnectMoreDetails:"Looks like something went wrong. We're trying to get back into the call.",networkReconnectTitle:"Hold on",deniedPermissionToRoomDetails:"You do not have permission to join this room.",deniedPermissionToRoomTitle:"Permission denied to room",peopleButtonLabel:"People",peoplePaneTitle:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",privacyPolicy:"Privacy policy",rejoinCallButtonLabel:"Re-join call",removedFromCallMoreDetails:"Another participant removed you from the call.",removedFromCallTitle:"You were removed",removeMenuLabel:"Remove",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",roomNotFoundDetails:"Room ID provided is not valid.",roomNotFoundTitle:"Room not found",soundLabel:"Sound",noMicrophonesLabel:"No microphones found",noSpeakersLabel:"No speakers found",startCallButtonLabel:"Start call",openDialpadButtonLabel:"Dial phone number",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",moreButtonCallingLabel:"More",resumeCallButtonLabel:"Resume",resumingCallButtonLabel:"Resuming...",resumeCallButtonAriaLabel:"Resume call",resumingCallButtonAriaLabel:"Resume call",holdScreenLabel:"You're on hold",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number",outboundCallingNoticeString:"Calling...",participantJoinedNoticeString:"{displayName} joined",twoParticipantJoinedNoticeString:"{displayName1} and {displayName2} have joined",threeParticipantJoinedNoticeString:"{displayName1}, {displayName2} and {displayName3} have joined",participantLeftNoticeString:"{displayName} left",twoParticipantLeftNoticeString:"{displayName1} and {displayName2} have left",threeParticipantLeftNoticeString:"{displayName1}, {displayName2} and {displayName3} have left",unnamedParticipantString:"unnamed participant",manyUnnamedParticipantsJoined:"unnamed participant and {numOfParticipants} other participants joined",manyUnnamedParticipantsLeft:"unnamed participant and {numOfParticipants} other participants left",manyParticipantsJoined:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants joined",manyParticipantsLeft:"{displayName1}, {displayName2}, {displayName3} and {numOfParticipants} other participants left",liveCaptionsLabel:"Live captions",captionsSettingsLabel:"Caption settings",startCaptionsButtonOnLabel:"Turn on captions",startCaptionsButtonOffLabel:"Turn off captions",startCaptionsButtonTooltipOnContent:"Turn off captions",startCaptionsButtonTooltipOffContent:"Turn on captions",captionsSettingsModalTitle:"What language is being spoken?",captionsSettingsDropdownLabel:"Spoken language",captionsSettingsDropdownInfoText:"Language that everyone on this call is speaking.",captionsSettingsConfirmButtonLabel:"Confirm",captionsSettingsCancelButtonLabel:"Cancel",captionsSettingsModalAriaLabel:"Captions Setting Modal",captionsSettingsCloseModalButtonAriaLabel:"Close Captions Setting",captionsBannerMoreButtonCallingLabel:"More",captionsBannerMoreButtonTooltip:"More options",captionsAvailableLanguageStrings:{"ar-ae":"Arabic - U.A.E.","ar-sa":"Arabic - Saudi Arabia","da-dk":"Danish","de-de":"German - Germany","en-au":"English - Australia","en-ca":"English - Canada","en-gb":"English - United Kingdom","en-in":"English - India","en-nz":"English - New Zealand","en-us":"English - United States","es-es":"Spanish - Spain (Modern Sort)","es-mx":"Spanish - Mexico","fi-fi":"Finnish","fr-ca":"French - Canada","fr-fr":"French - France","hi-in":"Hindi","it-it":"Italian - Italy","ja-jp":"Japanese","ko-kr":"Korean","nb-no":"Norwegian (Bokmål)","nl-be":"Dutch - Belgium","nl-nl":"Dutch - Netherlands","pl-pl":"Polish","pt-br":"Portuguese - Brazil","ru-ru":"Russian","sv-se":"Swedish","zh-cn":"Chinese - People's Republic of China","zh-hk":"Chinese - Hong Kong SAR","cs-cz":"Czech","pt-pt":"Portuguese - Portugal","tr-tr":"Turkish","vi-vn":"Vietnamese","th-th":"Thai","he-il":"Hebrew","cy-gb":"Welsh","uk-ua":"Ukrainian","el-gr":"Greek","hu-hu":"Hungarian","ro-ro":"Romanian","sk-sk":"Slovak","zh-tw":"Chinese - Taiwan"},captionsBannerSpinnerText:"Starting captions...",transferPageTransferorText:"Transferring...",transferPageTransferTargetText:"Connecting...",transferPageUnknownTransferorDisplayName:"Unknown",transferPageUnknownTransferTargetDisplayName:"Unknown"};var chat$i={chatListHeader:"In this chat",uploadFile:"Upload File"};var callWithChat$i={chatButtonLabel:"Chat",chatButtonNewMessageNotificationLabel:"New Message",chatButtonTooltipClosedWithMessageCount:"Show chat ({unreadMessagesCount} unread)",chatButtonTooltipClose:"Hide chat",chatButtonTooltipOpen:"Show chat",chatPaneTitle:"Chat",copyInviteLinkButtonLabel:"Copy invite link",copyInviteLinkActionedAriaLabel:"Invite link copied",dismissSidePaneButtonLabel:"Close",moreDrawerAudioDeviceMenuTitle:"Audio Device",moreDrawerButtonLabel:"More options",moreDrawerButtonTooltip:"More options",moreDrawerMicrophoneMenuTitle:"Microphone",moreDrawerSpeakerMenuTitle:"Speaker",moreDrawerCaptionsMenuTitle:"Live captions",moreDrawerSpokenLanguageMenuTitle:"Spoken language",peopleButtonLabel:"People",peopleButtonTooltipOpen:"Show participants",peopleButtonTooltipClose:"Hide participants",peoplePaneSubTitle:"In this call",peoplePaneTitle:"People",pictureInPictureTileAriaLabel:"Video Feeds. Click to return to call screen.",removeMenuLabel:"Remove",openDialpadButtonLabel:"Dial phone number",returnToCallButtonAriaDescription:"Return to Call",returnToCallButtonAriaLabel:"Back",peoplePaneAddPeopleButtonLabel:"Add People",dialpadStartCallButtonLabel:"Call",dialpadModalTitle:"Dial Phone Number",dialpadModalAriaLabel:"Dialpad",dialpadCloseModalButtonAriaLabel:"Close dialpad",openDtmfDialpadLabel:"Show dialpad",dtmfDialpadPlaceholderText:"Enter number"};var en_GB = {call:call$i,chat:chat$i,callWithChat:callWithChat$i};
18791
18842
 
@@ -20687,6 +20738,7 @@ const ParticipantContainer = (props) => {
20687
20738
  */
20688
20739
  const ParticipantListWithHeading = (props) => {
20689
20740
  const { onFetchAvatarPersonaData, onFetchParticipantMenuItems, title, participantListProps } = props;
20741
+ const subheadingUniqueId = React.useId();
20690
20742
  const theme = react.useTheme();
20691
20743
  const subheadingStyleThemed = React.useMemo(() => ({
20692
20744
  root: {
@@ -20696,11 +20748,11 @@ const ParticipantListWithHeading = (props) => {
20696
20748
  }
20697
20749
  }), [theme.palette.neutralSecondary, theme.fonts.smallPlus.fontSize, props.isMobile]);
20698
20750
  return (React__default['default'].createElement(react.Stack, { className: participantListStack },
20699
- React__default['default'].createElement(react.Stack.Item, { styles: subheadingStyleThemed, "aria-label": title }, title),
20751
+ React__default['default'].createElement(react.Stack.Item, { styles: subheadingStyleThemed, "aria-label": title, id: subheadingUniqueId }, title),
20700
20752
  React__default['default'].createElement(react.FocusZone, { className: participantListContainerStyle, shouldFocusOnMount: true },
20701
20753
  React__default['default'].createElement(ParticipantList, Object.assign({}, participantListProps, { styles: props.isMobile ? participantListMobileStyle : participantListStyle, onRenderAvatar: (userId, options) => (React__default['default'].createElement(React__default['default'].Fragment, null,
20702
20754
  React__default['default'].createElement(AvatarPersona, Object.assign({ "data-ui-id": "chat-composite-participant-custom-avatar", userId: userId }, options, { hidePersonaDetails: !!(options === null || options === void 0 ? void 0 : options.text) }, { dataProvider: onFetchAvatarPersonaData })),
20703
- (options === null || options === void 0 ? void 0 : options.text) && (React__default['default'].createElement(react.Text, { nowrap: true, styles: displayNameStyles$1 }, options === null || options === void 0 ? void 0 : options.text)))), onFetchParticipantMenuItems: onFetchParticipantMenuItems, showParticipantOverflowTooltip: !props.isMobile })))));
20755
+ (options === null || options === void 0 ? void 0 : options.text) && (React__default['default'].createElement(react.Text, { nowrap: true, styles: displayNameStyles$1 }, options === null || options === void 0 ? void 0 : options.text)))), onFetchParticipantMenuItems: onFetchParticipantMenuItems, showParticipantOverflowTooltip: !props.isMobile, participantAriaLabelledBy: subheadingUniqueId })))));
20704
20756
  };
20705
20757
 
20706
20758
  // Copyright (c) Microsoft Corporation.
@@ -26019,6 +26071,10 @@ const outboundCallStringsTrampoline = (strings) => {
26019
26071
 
26020
26072
  // Copyright (c) Microsoft Corporation.
26021
26073
  // Licensed under the MIT license.
26074
+ /**
26075
+ * @private
26076
+ */
26077
+ const pageContainer = { width: '100%', height: '100%' };
26022
26078
  /**
26023
26079
  * @private
26024
26080
  */
@@ -26079,6 +26135,8 @@ const TransferPage = (props) => {
26079
26135
  const remoteParticipants = useSelector$1(getRemoteParticipants);
26080
26136
  /* @conditional-compile-remove(call-transfer) */
26081
26137
  const transferCall = useSelector$1(getTransferCall);
26138
+ /* @conditional-compile-remove(call-transfer) */
26139
+ const [announcerString, setAnnouncerString] = React.useState(undefined);
26082
26140
  // Reduce the controls shown when mobile view is enabled.
26083
26141
  const callControlOptions = props.mobileView
26084
26142
  ? reduceCallControlsForMobile((_a = props.options) === null || _a === void 0 ? void 0 : _a.callControls)
@@ -26093,6 +26151,10 @@ const TransferPage = (props) => {
26093
26151
  }
26094
26152
  return 'transferor';
26095
26153
  }, [transferCall, transferTarget === null || transferTarget === void 0 ? void 0 : transferTarget.displayName]);
26154
+ /* @conditional-compile-remove(call-transfer) */
26155
+ React.useEffect(() => {
26156
+ setAnnouncerString(strings.transferPageNoticeString);
26157
+ }, [strings.transferPageNoticeString]);
26096
26158
  let transferTileParticipant = transferor;
26097
26159
  /* @conditional-compile-remove(call-transfer) */
26098
26160
  if (pageSubject === 'transferTarget') {
@@ -26105,16 +26167,19 @@ const TransferPage = (props) => {
26105
26167
  transferParticipantDisplayName =
26106
26168
  (_d = transferTarget === null || transferTarget === void 0 ? void 0 : transferTarget.displayName) !== null && _d !== void 0 ? _d : strings.transferPageUnknownTransferTargetDisplayName;
26107
26169
  }
26108
- return (React__default['default'].createElement(CallArrangement, { complianceBannerProps: { strings },
26109
- // Ignore errors from before current call. This avoids old errors from showing up when a user re-joins a call.
26110
- errorBarProps: ((_e = props.options) === null || _e === void 0 ? void 0 : _e.errorBar) !== false && Object.assign(Object.assign({}, errorBarProps), { ignorePremountErrors: true }), callControlProps: {
26111
- options: callControlOptions,
26112
- increaseFlyoutItemSize: props.mobileView
26113
- }, mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, onRenderGalleryContent: () => (React__default['default'].createElement(TransferTile, { userId: transferTileParticipant ? toFlatCommunicationIdentifier(transferTileParticipant === null || transferTileParticipant === void 0 ? void 0 : transferTileParticipant.identifier) : undefined, displayName: transferParticipantDisplayName, initialsName: transferParticipantDisplayName,
26114
- /* @conditional-compile-remove(call-transfer) */
26115
- statusText: pageSubject === 'transferTarget'
26116
- ? strings.transferPageTransferTargetText
26117
- : strings.transferPageTransferorText, onRenderAvatar: props.onRenderAvatar, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData })), dataUiId: 'transfer-page', updateSidePaneRenderer: props.updateSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader }));
26170
+ return (React__default['default'].createElement(react.Stack, { className: react.mergeStyles(pageContainer) },
26171
+ /* @conditional-compile-remove(call-transfer) */
26172
+ React__default['default'].createElement(Announcer$1, { announcementString: announcerString, ariaLive: "polite" }),
26173
+ React__default['default'].createElement(CallArrangement, { complianceBannerProps: { strings },
26174
+ // Ignore errors from before current call. This avoids old errors from showing up when a user re-joins a call.
26175
+ errorBarProps: ((_e = props.options) === null || _e === void 0 ? void 0 : _e.errorBar) !== false && Object.assign(Object.assign({}, errorBarProps), { ignorePremountErrors: true }), callControlProps: {
26176
+ options: callControlOptions,
26177
+ increaseFlyoutItemSize: props.mobileView
26178
+ }, mobileView: props.mobileView, modalLayerHostId: props.modalLayerHostId, onRenderGalleryContent: () => (React__default['default'].createElement(TransferTile, { userId: transferTileParticipant ? toFlatCommunicationIdentifier(transferTileParticipant === null || transferTileParticipant === void 0 ? void 0 : transferTileParticipant.identifier) : undefined, displayName: transferParticipantDisplayName, initialsName: transferParticipantDisplayName,
26179
+ /* @conditional-compile-remove(call-transfer) */
26180
+ statusText: pageSubject === 'transferTarget'
26181
+ ? strings.transferPageTransferTargetText
26182
+ : strings.transferPageTransferorText, onRenderAvatar: props.onRenderAvatar, onFetchAvatarPersonaData: props.onFetchAvatarPersonaData })), dataUiId: 'transfer-page', updateSidePaneRenderer: props.updateSidePaneRenderer, mobileChatTabHeader: props.mobileChatTabHeader })));
26118
26183
  };
26119
26184
  const TransferTile = (props) => {
26120
26185
  const { displayName, initialsName, userId, onRenderAvatar, onFetchAvatarPersonaData, statusText } = props;