@techsee/techsee-nway-media-service-client 2.0.0 → 2.1.0

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 (84) hide show
  1. package/LICENSE.md +1 -0
  2. package/lib/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.d.ts.map +1 -1
  3. package/lib/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.js +30 -14
  4. package/lib/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.js.map +1 -1
  5. package/lib/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.scss +63 -2
  6. package/lib/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.d.ts +15 -0
  7. package/lib/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.d.ts.map +1 -0
  8. package/lib/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.js +107 -0
  9. package/lib/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.js.map +1 -0
  10. package/lib/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.scss +104 -0
  11. package/lib/components/ButtonPanels/RemoveButtonPanel/RemoveButtonPanel.d.ts +8 -0
  12. package/lib/components/ButtonPanels/RemoveButtonPanel/RemoveButtonPanel.d.ts.map +1 -0
  13. package/lib/components/ButtonPanels/RemoveButtonPanel/RemoveButtonPanel.js +22 -0
  14. package/lib/components/ButtonPanels/RemoveButtonPanel/RemoveButtonPanel.js.map +1 -0
  15. package/lib/components/ButtonPanels/index.d.ts +2 -0
  16. package/lib/components/ButtonPanels/index.d.ts.map +1 -1
  17. package/lib/components/ButtonPanels/index.js +5 -1
  18. package/lib/components/ButtonPanels/index.js.map +1 -1
  19. package/lib/components/JoinRequestBanner/JoinRequestBanner.d.ts +19 -0
  20. package/lib/components/JoinRequestBanner/JoinRequestBanner.d.ts.map +1 -0
  21. package/lib/components/JoinRequestBanner/JoinRequestBanner.js +107 -0
  22. package/lib/components/JoinRequestBanner/JoinRequestBanner.js.map +1 -0
  23. package/lib/components/JoinRequestBanner/JoinRequestBanner.scss +95 -0
  24. package/lib/components/Multiparty.d.ts +2 -1
  25. package/lib/components/Multiparty.d.ts.map +1 -1
  26. package/lib/components/Multiparty.js +12 -4
  27. package/lib/components/Multiparty.js.map +1 -1
  28. package/lib/components/Multiparty.types.d.ts +2 -1
  29. package/lib/components/Multiparty.types.d.ts.map +1 -1
  30. package/lib/components/Video/{Video.d.ts → NwayVideoContainer.d.ts} +5 -2
  31. package/lib/components/Video/NwayVideoContainer.d.ts.map +1 -0
  32. package/lib/components/Video/NwayVideoContainer.js +36 -0
  33. package/lib/components/Video/NwayVideoContainer.js.map +1 -0
  34. package/lib/components/Video/Video.scss +1 -1
  35. package/lib/components/Video/VideoDomRegistry.d.ts +7 -0
  36. package/lib/components/Video/VideoDomRegistry.d.ts.map +1 -0
  37. package/lib/components/Video/VideoDomRegistry.js +33 -0
  38. package/lib/components/Video/VideoDomRegistry.js.map +1 -0
  39. package/lib/components/Video/VideoPlaceholder.d.ts +3 -0
  40. package/lib/components/Video/VideoPlaceholder.d.ts.map +1 -1
  41. package/lib/components/Video/VideoPlaceholder.js.map +1 -1
  42. package/lib/components/VideoLayouts/AgentPinnedLayout/AgentPinnedLayout.js +2 -2
  43. package/lib/components/VideoLayouts/AgentPinnedLayout/AgentPinnedLayout.js.map +1 -1
  44. package/lib/components/VideoLayouts/AgentPinnedLayout/AgentPinnedLayout.scss +9 -0
  45. package/lib/components/VideoLayouts/BigMainVideoLayout/BigAreaLayout.d.ts +2 -6
  46. package/lib/components/VideoLayouts/BigMainVideoLayout/BigAreaLayout.d.ts.map +1 -1
  47. package/lib/components/VideoLayouts/BigMainVideoLayout/BigAreaLayout.js +93 -34
  48. package/lib/components/VideoLayouts/BigMainVideoLayout/BigAreaLayout.js.map +1 -1
  49. package/lib/components/VideoLayouts/BigMainVideoLayout/BigAreaLayout.scss +259 -31
  50. package/lib/components/VideoLayouts/VideoLayoutManager.d.ts +2 -1
  51. package/lib/components/VideoLayouts/VideoLayoutManager.d.ts.map +1 -1
  52. package/lib/components/VideoLayouts/VideoLayoutManager.js +2 -2
  53. package/lib/components/VideoLayouts/VideoLayoutManager.js.map +1 -1
  54. package/lib/components/WaitingForHost/WaitingForHost.d.ts +10 -0
  55. package/lib/components/WaitingForHost/WaitingForHost.d.ts.map +1 -0
  56. package/lib/components/WaitingForHost/WaitingForHost.js +23 -0
  57. package/lib/components/WaitingForHost/WaitingForHost.js.map +1 -0
  58. package/lib/components/WaitingForHost/WaitingForHost.scss +80 -0
  59. package/lib/index.d.ts +3 -1
  60. package/lib/index.d.ts.map +1 -1
  61. package/lib/index.js +5 -1
  62. package/lib/index.js.map +1 -1
  63. package/lib/services/ConnectionManager.d.ts +1 -0
  64. package/lib/services/ConnectionManager.d.ts.map +1 -1
  65. package/lib/services/ConnectionManager.js +13 -1
  66. package/lib/services/ConnectionManager.js.map +1 -1
  67. package/lib/services/MediaStateService.d.ts.map +1 -1
  68. package/lib/services/MediaStateService.js +4 -1
  69. package/lib/services/MediaStateService.js.map +1 -1
  70. package/lib/services/MultipartyController.d.ts +0 -3
  71. package/lib/services/MultipartyController.d.ts.map +1 -1
  72. package/lib/services/MultipartyController.js +69 -60
  73. package/lib/services/MultipartyController.js.map +1 -1
  74. package/lib/services/MultipartyEventTypes.d.ts +1 -0
  75. package/lib/services/MultipartyEventTypes.d.ts.map +1 -1
  76. package/lib/services/MultipartyEventTypes.js +1 -0
  77. package/lib/services/MultipartyEventTypes.js.map +1 -1
  78. package/lib/services/trafficLogManager.d.ts.map +1 -1
  79. package/lib/services/trafficLogManager.js +10 -7
  80. package/lib/services/trafficLogManager.js.map +1 -1
  81. package/package.json +27 -15
  82. package/lib/components/Video/Video.d.ts.map +0 -1
  83. package/lib/components/Video/Video.js +0 -23
  84. package/lib/components/Video/Video.js.map +0 -1
package/LICENSE.md CHANGED
@@ -0,0 +1 @@
1
+ .
@@ -1 +1 @@
1
- {"version":3,"file":"MediaButtonsPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAElC,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAmB,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAC,iBAAiB,EAAC,MAAM,mDAAmD,CAAC;AAEpF,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAErE,UAAU,KAAK;IACX,WAAW,EAAE,oBAAoB,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,iBAAiB,CAAC;IACpC,YAAY,EAAE,uBAAuB,CAAC;IACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,oBAAY,cAAc;IACtB,KAAK,IAAA;IACL,MAAM,IAAA;CACT;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAkG7C,CAAC"}
1
+ {"version":3,"file":"MediaButtonsPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAElC,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAmB,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAC,iBAAiB,EAAC,MAAM,mDAAmD,CAAC;AAEpF,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAErE,UAAU,KAAK;IACX,WAAW,EAAE,oBAAoB,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,iBAAiB,CAAC;IACpC,YAAY,EAAE,uBAAuB,CAAC;IACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,oBAAY,cAAc;IACtB,KAAK,IAAA;IACL,MAAM,IAAA;CACT;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0H7C,CAAC"}
@@ -17,15 +17,13 @@ require("./MediaButtonsPanel.scss");
17
17
  var react_1 = require("react");
18
18
  var MultipartyButton_1 = require("../MultipartyButton/MultipartyButton");
19
19
  var MediaConstants_1 = require("@techsee/techsee-media-service/lib/MediaConstants");
20
- var simple_icon_1 = require("@techsee/techsee-ui-common/lib/icons/simple-icon");
21
20
  var ButtonsSpacing;
22
21
  (function (ButtonsSpacing) {
23
22
  ButtonsSpacing[ButtonsSpacing["Dense"] = 0] = "Dense";
24
23
  ButtonsSpacing[ButtonsSpacing["Sparse"] = 1] = "Sparse";
25
24
  })(ButtonsSpacing = exports.ButtonsSpacing || (exports.ButtonsSpacing = {}));
26
25
  var MediaButtonsPanel = function (_a) {
27
- var _b;
28
- var buttonsType = _a.buttonsType, isMuted = _a.isMuted, isVideoTurnedOff = _a.isVideoTurnedOff, _c = _a.isBackgroundVisible, isBackgroundVisible = _c === void 0 ? true : _c, _d = _a.isIconTransparencyEnabled, isIconTransparencyEnabled = _d === void 0 ? true : _d, _e = _a.buttonsSpacing, buttonsSpacing = _e === void 0 ? ButtonsSpacing.Sparse : _e, _f = _a.screenShareRole, screenShareRole = _f === void 0 ? undefined : _f, translations = _a.translations, onToggleMute = _a.onToggleMute, onToggleVideo = _a.onToggleVideo, onSwitchCamera = _a.onSwitchCamera, _g = _a.muteButtonDisabled, muteButtonDisabled = _g === void 0 ? false : _g, onShareScreen = _a.onShareScreen, onStopScreenShare = _a.onStopScreenShare, _h = _a.showScreenShareButton, showScreenShareButton = _h === void 0 ? false : _h;
26
+ var buttonsType = _a.buttonsType, isMuted = _a.isMuted, isVideoTurnedOff = _a.isVideoTurnedOff, _b = _a.isBackgroundVisible, isBackgroundVisible = _b === void 0 ? true : _b, _c = _a.isIconTransparencyEnabled, isIconTransparencyEnabled = _c === void 0 ? true : _c, _d = _a.buttonsSpacing, buttonsSpacing = _d === void 0 ? ButtonsSpacing.Sparse : _d, _e = _a.screenShareRole, screenShareRole = _e === void 0 ? undefined : _e, translations = _a.translations, onToggleMute = _a.onToggleMute, onToggleVideo = _a.onToggleVideo, onSwitchCamera = _a.onSwitchCamera, _f = _a.muteButtonDisabled, muteButtonDisabled = _f === void 0 ? false : _f, onShareScreen = _a.onShareScreen, onStopScreenShare = _a.onStopScreenShare, _g = _a.showScreenShareButton, showScreenShareButton = _g === void 0 ? false : _g;
29
27
  var platformClass = 'mobile';
30
28
  if (buttonsType === MultipartyButton_1.MultipartyButtonType.Desktop) {
31
29
  platformClass = 'desktop';
@@ -34,24 +32,42 @@ var MediaButtonsPanel = function (_a) {
34
32
  platformClass = 'desktop-obsolete';
35
33
  }
36
34
  platformClass += ' ' + (buttonsSpacing === ButtonsSpacing.Dense ? 'dense' : 'sparse');
37
- var userIsSharingScreen = !!(screenShareRole === MediaConstants_1.SessionClientRole.USER);
38
- var nonUserIsSharingScreen = !!(screenShareRole && screenShareRole !== MediaConstants_1.SessionClientRole.USER);
39
- var _j = (0, react_1.useState)(false), displayStopSharingButton = _j[0], setDisplayStopSharingButton = _j[1];
35
+ var _h = (0, react_1.useState)(false), isLocallySharing = _h[0], setIsLocallySharing = _h[1];
36
+ var prevScreenShareRoleRef = (0, react_1.useRef)(screenShareRole);
37
+ // Sync local state with actual screenShareRole when it gets updated
38
+ (0, react_1.useEffect)(function () {
39
+ var prevScreenShareRole = prevScreenShareRoleRef.current;
40
+ if (screenShareRole === MediaConstants_1.SessionClientRole.USER && prevScreenShareRole !== MediaConstants_1.SessionClientRole.USER) {
41
+ setIsLocallySharing(true);
42
+ }
43
+ else if (screenShareRole === undefined && prevScreenShareRole === MediaConstants_1.SessionClientRole.USER) {
44
+ setIsLocallySharing(false);
45
+ }
46
+ prevScreenShareRoleRef.current = screenShareRole;
47
+ }, [screenShareRole, isLocallySharing]);
48
+ var userIsSharingScreen = (0, react_1.useMemo)(function () {
49
+ return !!(screenShareRole === MediaConstants_1.SessionClientRole.USER) || isLocallySharing;
50
+ }, [screenShareRole, isLocallySharing]);
51
+ var nonUserIsSharingScreen = (0, react_1.useMemo)(function () {
52
+ return !!(screenShareRole && screenShareRole !== MediaConstants_1.SessionClientRole.USER);
53
+ }, [screenShareRole]);
40
54
  var onClickScreenShareButton = (0, react_1.useCallback)(function () {
41
- if (userIsSharingScreen) {
42
- setDisplayStopSharingButton(!displayStopSharingButton);
55
+ // Don't allow sharing if another user is already sharing
56
+ if (nonUserIsSharingScreen) {
57
+ return;
43
58
  }
44
- if (!userIsSharingScreen && !nonUserIsSharingScreen) {
59
+ if (!userIsSharingScreen && !nonUserIsSharingScreen && onShareScreen) {
60
+ setIsLocallySharing(true);
45
61
  onShareScreen();
46
62
  }
47
- }, [userIsSharingScreen, nonUserIsSharingScreen, displayStopSharingButton, screenShareRole, onShareScreen]);
63
+ }, [userIsSharingScreen, nonUserIsSharingScreen, onShareScreen]);
48
64
  var onClickStopScreenShareButton = (0, react_1.useCallback)(function () {
49
- if (userIsSharingScreen && displayStopSharingButton) {
50
- setDisplayStopSharingButton(false);
65
+ if (onStopScreenShare) {
66
+ setIsLocallySharing(false);
51
67
  onStopScreenShare();
52
68
  }
53
- }, [userIsSharingScreen, displayStopSharingButton, screenShareRole, onStopScreenShare]);
54
- return ((0, jsx_runtime_1.jsxs)("div", __assign({ className: "media-buttons-panel ".concat(platformClass) }, { children: [(0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onToggleMute, iconName: isMuted ? 'mic-off' : 'mic-on', isSwitchedOn: !isIconTransparencyEnabled || !isMuted, isBackgroundVisible: isBackgroundVisible, disabled: muteButtonDisabled }), onToggleVideo && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onToggleVideo, iconName: isVideoTurnedOff ? 'camera-off' : 'camera-on', isSwitchedOn: !isIconTransparencyEnabled || !isVideoTurnedOff, isBackgroundVisible: isBackgroundVisible })), onSwitchCamera && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onSwitchCamera, iconName: 'switch-camera', isBackgroundVisible: isBackgroundVisible, disabled: isVideoTurnedOff })), onShareScreen && showScreenShareButton && ((0, jsx_runtime_1.jsxs)("div", __assign({ className: 'share-screen-mobile' }, { children: [(0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onClickScreenShareButton, iconName: 'Screen-Share', isBackgroundVisible: isBackgroundVisible, disabled: nonUserIsSharingScreen }), displayStopSharingButton && onStopScreenShare && ((0, jsx_runtime_1.jsxs)("div", __assign({ className: 'stop-desktop-sharing', onClick: onClickStopScreenShareButton }, { children: [(0, jsx_runtime_1.jsx)("button", __assign({ type: 'button' }, { children: (0, jsx_runtime_1.jsx)(simple_icon_1.Icon, { iconName: 'end-sharing' }) })), (0, jsx_runtime_1.jsx)("span", { children: (_b = translations.stopSharing) !== null && _b !== void 0 ? _b : 'Stop Sharing' })] })))] })))] })));
69
+ }, [onStopScreenShare]);
70
+ return ((0, jsx_runtime_1.jsxs)("div", __assign({ className: "media-buttons-panel ".concat(platformClass) }, { children: [onToggleVideo && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onToggleVideo, iconName: isVideoTurnedOff ? 'camera-off' : 'camera-on', isSwitchedOn: !isIconTransparencyEnabled || !isVideoTurnedOff, isBackgroundVisible: isBackgroundVisible })), onSwitchCamera && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onSwitchCamera, iconName: 'switch-camera', isBackgroundVisible: isBackgroundVisible, disabled: isVideoTurnedOff })), showScreenShareButton && ((0, jsx_runtime_1.jsxs)("div", __assign({ className: 'share-screen-mobile' }, { children: [!userIsSharingScreen && onShareScreen && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onClickScreenShareButton, iconName: 'Screen-Share', isBackgroundVisible: isBackgroundVisible, disabled: nonUserIsSharingScreen })), userIsSharingScreen && onStopScreenShare && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onClickStopScreenShareButton, iconName: 'end-sharing', isBackgroundVisible: isBackgroundVisible, isSwitchedOn: true }))] }))), (0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: buttonsType, onClick: onToggleMute, iconName: isMuted ? 'mic-off' : 'mic-on', isSwitchedOn: !isIconTransparencyEnabled || !isMuted, isBackgroundVisible: isBackgroundVisible, disabled: muteButtonDisabled })] })));
55
71
  };
56
72
  exports.MediaButtonsPanel = MediaButtonsPanel;
57
73
  //# sourceMappingURL=MediaButtonsPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MediaButtonsPanel.js","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MediaButtonsPanel.js","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/MediaButtonsPanel/MediaButtonsPanel.tsx"],"names":[],"mappings":"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"}
@@ -1,12 +1,17 @@
1
1
  .media-buttons-panel {
2
2
  display: flex;
3
3
 
4
+ // Mobile //
4
5
  &.mobile > * {
5
- margin: 15px 15px 15px 0;
6
+ margin: 15px 2px 15px 0;
7
+
8
+ &:last-child {
9
+ margin-right: 0;
10
+ }
6
11
  }
7
12
 
8
13
  &.desktop.sparse > * {
9
- margin: 10px 10px 10px 0;
14
+ margin: 10px 2px 10px 0;
10
15
 
11
16
  &:last-child {
12
17
  margin-right: 0;
@@ -28,4 +33,60 @@
28
33
  & > *:last-child {
29
34
  margin-right: 0;
30
35
  }
36
+
37
+ // Mobile screen sharing styles - no custom styles needed, using MultipartyButton
38
+ &.mobile {
39
+ .share-screen-mobile {
40
+ display: flex;
41
+ flex-direction: row;
42
+ align-items: center;
43
+ }
44
+ }
45
+
46
+ .btn-rounded:disabled {
47
+ .border-rounded-icon.color-black.reverse-color.transparent-p50 {
48
+ background-color: transparent;
49
+ color: #ffffff;
50
+ border: none;
51
+ box-shadow: none;
52
+ fill: #ffffff;
53
+
54
+ &:hover,
55
+ &:focus,
56
+ &:active {
57
+ background-color: transparent;
58
+ color: #ffffff;
59
+ border: none;
60
+ box-shadow: none;
61
+ }
62
+
63
+ // Preserve shadow box circle for switch camera button when disabled
64
+ &.icon-switch-camera {
65
+ background-color: black;
66
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07);
67
+
68
+ &:hover,
69
+ &:focus,
70
+ &:active {
71
+ background-color: black;
72
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07);
73
+ }
74
+ }
75
+
76
+ // Preserve background circle for screen share button when disabled but add opacity
77
+ &.icon-Screen-Share {
78
+ background-color: rgba(0, 0, 0, 0.5) !important;
79
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07);
80
+ opacity: 0.6;
81
+
82
+ &:hover,
83
+ &:focus,
84
+ &:active {
85
+ background-color: rgba(0, 0, 0, 0.5) !important;
86
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07);
87
+ opacity: 0.6;
88
+ }
89
+ }
90
+ }
91
+ }
31
92
  }
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import './ParticipantActionsMenu.scss';
3
+ type PinCallback = (() => void) | false | undefined;
4
+ type Props = {
5
+ isVideoHover: boolean;
6
+ isPinned: boolean;
7
+ onTogglePin?: PinCallback;
8
+ onRemove?: () => void;
9
+ pinLabel?: string;
10
+ pinnedLabel?: string;
11
+ removeLabel?: string;
12
+ };
13
+ export declare const ParticipantActionsMenu: React.FC<Props>;
14
+ export {};
15
+ //# sourceMappingURL=ParticipantActionsMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticipantActionsMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkE,MAAM,OAAO,CAAC;AACvF,OAAO,+BAA+B,CAAC;AAevC,KAAK,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,GAAG,SAAS,CAAC;AAEpD,KAAK,KAAK,GAAG;IACT,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA4HlD,CAAC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.ParticipantActionsMenu = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ var react_1 = require("react");
17
+ require("./ParticipantActionsMenu.scss");
18
+ var VIEWPORT_PADDING = 8;
19
+ /** Matches SCSS min-width until we measure the real node */
20
+ var DROPDOWN_WIDTH_ESTIMATE = 200;
21
+ function computeDropdownLeft(rect, dropdownWidth) {
22
+ var left = rect.left;
23
+ if (left + dropdownWidth > window.innerWidth - VIEWPORT_PADDING) {
24
+ left = rect.right - dropdownWidth;
25
+ }
26
+ var maxLeft = window.innerWidth - dropdownWidth - VIEWPORT_PADDING;
27
+ return Math.max(VIEWPORT_PADDING, Math.min(left, maxLeft));
28
+ }
29
+ var ParticipantActionsMenu = function (_a) {
30
+ var isVideoHover = _a.isVideoHover, isPinned = _a.isPinned, onTogglePin = _a.onTogglePin, onRemove = _a.onRemove, pinLabel = _a.pinLabel, pinnedLabel = _a.pinnedLabel, removeLabel = _a.removeLabel;
31
+ var _b = (0, react_1.useState)(false), isOpen = _b[0], setIsOpen = _b[1];
32
+ var _c = (0, react_1.useState)({}), dropdownStyle = _c[0], setDropdownStyle = _c[1];
33
+ var containerRef = (0, react_1.useRef)(null);
34
+ var btnRef = (0, react_1.useRef)(null);
35
+ var dropdownRef = (0, react_1.useRef)(null);
36
+ var positionDropdown = (0, react_1.useCallback)(function () {
37
+ var _a;
38
+ if (!btnRef.current) {
39
+ return;
40
+ }
41
+ var rect = btnRef.current.getBoundingClientRect();
42
+ var width = ((_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || DROPDOWN_WIDTH_ESTIMATE;
43
+ var left = computeDropdownLeft(rect, width);
44
+ setDropdownStyle({
45
+ position: 'fixed',
46
+ top: rect.bottom + 4,
47
+ left: left,
48
+ zIndex: 99999
49
+ });
50
+ }, []);
51
+ (0, react_1.useEffect)(function () {
52
+ var handleClickOutside = function (e) {
53
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
54
+ setIsOpen(false);
55
+ }
56
+ };
57
+ document.addEventListener('mousedown', handleClickOutside);
58
+ return function () { return document.removeEventListener('mousedown', handleClickOutside); };
59
+ }, []);
60
+ var handleToggle = function () {
61
+ if (!isOpen && btnRef.current) {
62
+ var rect = btnRef.current.getBoundingClientRect();
63
+ var left = computeDropdownLeft(rect, DROPDOWN_WIDTH_ESTIMATE);
64
+ setDropdownStyle({
65
+ position: 'fixed',
66
+ top: rect.bottom + 4,
67
+ left: left,
68
+ zIndex: 99999
69
+ });
70
+ }
71
+ setIsOpen(function (prev) { return !prev; });
72
+ };
73
+ (0, react_1.useLayoutEffect)(function () {
74
+ if (isOpen) {
75
+ positionDropdown();
76
+ }
77
+ }, [isOpen, positionDropdown]);
78
+ (0, react_1.useEffect)(function () {
79
+ if (!isOpen) {
80
+ return;
81
+ }
82
+ var onResizeOrScroll = function () { return positionDropdown(); };
83
+ window.addEventListener('resize', onResizeOrScroll);
84
+ document.addEventListener('scroll', onResizeOrScroll, true);
85
+ return function () {
86
+ window.removeEventListener('resize', onResizeOrScroll);
87
+ document.removeEventListener('scroll', onResizeOrScroll, true);
88
+ };
89
+ }, [isOpen, positionDropdown]);
90
+ var hasPinAction = typeof onTogglePin === 'function';
91
+ var hasRemoveAction = typeof onRemove === 'function';
92
+ var hasActions = hasPinAction || hasRemoveAction;
93
+ if (!hasActions) {
94
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
95
+ }
96
+ return ((0, jsx_runtime_1.jsxs)("div", __assign({ className: 'participant-actions-menu', ref: containerRef }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ className: "participant-actions-trigger".concat(isVideoHover || isOpen ? ' visible' : '') }, { children: (0, jsx_runtime_1.jsx)("button", __assign({ ref: btnRef, className: 'participant-actions-btn', onClick: handleToggle }, { children: (0, jsx_runtime_1.jsx)("i", { className: 'icon icon-dots' }) })) })), isOpen && ((0, jsx_runtime_1.jsxs)("div", __assign({ ref: dropdownRef, className: 'participant-actions-dropdown', style: dropdownStyle }, { children: [hasPinAction && ((0, jsx_runtime_1.jsxs)("button", __assign({ className: "participant-action-item".concat(isPinned ? ' pinned' : ''), disabled: isPinned, onClick: function () {
97
+ if (!isPinned && onTogglePin) {
98
+ onTogglePin();
99
+ setIsOpen(false);
100
+ }
101
+ } }, { children: [(0, jsx_runtime_1.jsx)("i", { className: 'action-icon icon icon-pin' }), (0, jsx_runtime_1.jsx)("span", __assign({ className: 'action-label' }, { children: isPinned ? (pinnedLabel !== null && pinnedLabel !== void 0 ? pinnedLabel : 'Pinned') : pinLabel }))] }))), hasRemoveAction && ((0, jsx_runtime_1.jsxs)("button", __assign({ className: 'participant-action-item', onClick: function () {
102
+ onRemove === null || onRemove === void 0 ? void 0 : onRemove();
103
+ setIsOpen(false);
104
+ } }, { children: [(0, jsx_runtime_1.jsx)("i", { className: 'action-icon icon icon-stop-sign' }), (0, jsx_runtime_1.jsx)("span", __assign({ className: 'action-label' }, { children: removeLabel }))] })))] })))] })));
105
+ };
106
+ exports.ParticipantActionsMenu = ParticipantActionsMenu;
107
+ //# sourceMappingURL=ParticipantActionsMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticipantActionsMenu.js","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/ParticipantActionsMenu/ParticipantActionsMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ .participant-actions-menu {
2
+ position: absolute;
3
+ top: 6px;
4
+ right: 6px;
5
+ z-index: 30;
6
+
7
+ @media screen and (max-width: 768px) {
8
+ // CSS max() — interpolate so Sass does not treat it as built-in max()
9
+ top: #{'max(6px, env(safe-area-inset-top, 0px))'};
10
+ right: 4px;
11
+ }
12
+
13
+ .participant-actions-trigger {
14
+ opacity: 0;
15
+ transition: opacity 0.15s;
16
+
17
+ &.visible {
18
+ opacity: 1;
19
+ }
20
+
21
+ .participant-actions-btn {
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ width: 36px;
26
+ height: 36px;
27
+ border-radius: 8px;
28
+ border: none;
29
+ background: rgba(80, 80, 80, 0.75);
30
+ cursor: pointer;
31
+ padding: 0;
32
+
33
+ &:hover {
34
+ background: rgba(80, 80, 80, 0.95);
35
+ }
36
+
37
+ i {
38
+ color: #fff;
39
+ font-size: 18px;
40
+ transform: rotate(90deg);
41
+ }
42
+ }
43
+ }
44
+
45
+ .participant-actions-dropdown {
46
+ background: #fff;
47
+ border-radius: 8px;
48
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
49
+ min-width: 200px;
50
+ overflow: hidden;
51
+ z-index: 1050;
52
+
53
+ .participant-action-item {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: 14px;
57
+ width: 100%;
58
+ padding: 14px 18px;
59
+ background: none;
60
+ border: none;
61
+ border-bottom: 1px solid #ebebeb;
62
+ cursor: pointer;
63
+ font-size: 15px;
64
+ color: #222;
65
+ text-align: left;
66
+ transition: background 0.15s;
67
+
68
+ &:last-child {
69
+ border-bottom: none;
70
+ }
71
+
72
+ &:hover:not(:disabled) {
73
+ background: #e8f0fe;
74
+ color: #1a73e8;
75
+
76
+ .action-icon {
77
+ color: #1a73e8;
78
+ }
79
+ }
80
+
81
+ &.pinned,
82
+ &:disabled {
83
+ color: #aaa;
84
+ cursor: default;
85
+
86
+ .action-icon {
87
+ color: #aaa;
88
+ }
89
+ }
90
+
91
+ .action-icon {
92
+ font-size: 18px;
93
+ color: #555;
94
+ flex-shrink: 0;
95
+ transition: color 0.15s;
96
+ }
97
+
98
+ .action-label {
99
+ white-space: nowrap;
100
+ font-weight: 500;
101
+ }
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ isVideoHover: boolean;
4
+ onRemove?: () => void;
5
+ };
6
+ export declare const RemoveButtonPanel: React.FC<Props>;
7
+ export {};
8
+ //# sourceMappingURL=RemoveButtonPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoveButtonPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/RemoveButtonPanel/RemoveButtonPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,KAAK,KAAK,GAAG;IACT,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAY7C,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.RemoveButtonPanel = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ var MultipartyButton_1 = require("../MultipartyButton/MultipartyButton");
17
+ var RemoveButtonPanel = function (_a) {
18
+ var onRemove = _a.onRemove, isVideoHover = _a.isVideoHover;
19
+ return ((0, jsx_runtime_1.jsx)("div", __assign({ className: 'remove-buttons-panel' }, { children: onRemove && ((0, jsx_runtime_1.jsx)(MultipartyButton_1.MultipartyButton, { type: MultipartyButton_1.MultipartyButtonType.Desktop, onClick: onRemove, iconName: 'close', isSwitchedOn: true, isBackgroundVisible: isVideoHover })) })));
20
+ };
21
+ exports.RemoveButtonPanel = RemoveButtonPanel;
22
+ //# sourceMappingURL=RemoveButtonPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoveButtonPanel.js","sourceRoot":"","sources":["../../../../src/components/ButtonPanels/RemoveButtonPanel/RemoveButtonPanel.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,yEAA4F;AAOrF,IAAM,iBAAiB,GAAoB,UAAC,EAAwB;QAAvB,QAAQ,cAAA,EAAE,YAAY,kBAAA;IAAmB,OAAA,CACzF,yCAAK,SAAS,EAAC,sBAAsB,gBAChC,QAAQ,IAAI,CACT,uBAAC,mCAAgB,IACb,IAAI,EAAE,uCAAoB,CAAC,OAAO,EAClC,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAC,OAAO,EAChB,YAAY,EAAE,IAAI,EAClB,mBAAmB,EAAE,YAAY,GACnC,CACL,IACC,CACT;AAZ4F,CAY5F,CAAC;AAZW,QAAA,iBAAiB,qBAY5B"}
@@ -3,4 +3,6 @@ export { MediaButtonsPanel } from './MediaButtonsPanel/MediaButtonsPanel';
3
3
  export { MultipartyButtonType } from './MultipartyButton/MultipartyButton';
4
4
  export { SnapshotButtonPanel } from './SnapshotButtonPanel/SnapshotButtonPanel';
5
5
  export { EndMeetingButtonPanel } from './EndMeetingButtonPanel/EndMeetingButtonPanel';
6
+ export { RemoveButtonPanel } from './RemoveButtonPanel/RemoveButtonPanel';
7
+ export { ParticipantActionsMenu } from './ParticipantActionsMenu/ParticipantActionsMenu';
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ButtonPanels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,mBAAmB,EAAC,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAC,qBAAqB,EAAC,MAAM,+CAA+C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ButtonPanels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,mBAAmB,EAAC,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAC,qBAAqB,EAAC,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAC,iBAAiB,EAAC,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iDAAiD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EndMeetingButtonPanel = exports.SnapshotButtonPanel = exports.MultipartyButtonType = exports.MediaButtonsPanel = exports.PinButtonPanel = void 0;
3
+ exports.ParticipantActionsMenu = exports.RemoveButtonPanel = exports.EndMeetingButtonPanel = exports.SnapshotButtonPanel = exports.MultipartyButtonType = exports.MediaButtonsPanel = exports.PinButtonPanel = void 0;
4
4
  var PinButtonPanel_1 = require("./PinButtonPanel/PinButtonPanel");
5
5
  Object.defineProperty(exports, "PinButtonPanel", { enumerable: true, get: function () { return PinButtonPanel_1.PinButtonPanel; } });
6
6
  var MediaButtonsPanel_1 = require("./MediaButtonsPanel/MediaButtonsPanel");
@@ -11,4 +11,8 @@ var SnapshotButtonPanel_1 = require("./SnapshotButtonPanel/SnapshotButtonPanel")
11
11
  Object.defineProperty(exports, "SnapshotButtonPanel", { enumerable: true, get: function () { return SnapshotButtonPanel_1.SnapshotButtonPanel; } });
12
12
  var EndMeetingButtonPanel_1 = require("./EndMeetingButtonPanel/EndMeetingButtonPanel");
13
13
  Object.defineProperty(exports, "EndMeetingButtonPanel", { enumerable: true, get: function () { return EndMeetingButtonPanel_1.EndMeetingButtonPanel; } });
14
+ var RemoveButtonPanel_1 = require("./RemoveButtonPanel/RemoveButtonPanel");
15
+ Object.defineProperty(exports, "RemoveButtonPanel", { enumerable: true, get: function () { return RemoveButtonPanel_1.RemoveButtonPanel; } });
16
+ var ParticipantActionsMenu_1 = require("./ParticipantActionsMenu/ParticipantActionsMenu");
17
+ Object.defineProperty(exports, "ParticipantActionsMenu", { enumerable: true, get: function () { return ParticipantActionsMenu_1.ParticipantActionsMenu; } });
14
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ButtonPanels/index.ts"],"names":[],"mappings":";;;AAAA,kEAA+D;AAAvD,gHAAA,cAAc,OAAA;AACtB,2EAAwE;AAAhE,sHAAA,iBAAiB,OAAA;AACzB,wEAAyE;AAAjE,wHAAA,oBAAoB,OAAA;AAC5B,iFAA8E;AAAtE,0HAAA,mBAAmB,OAAA;AAC3B,uFAAoF;AAA5E,8HAAA,qBAAqB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ButtonPanels/index.ts"],"names":[],"mappings":";;;AAAA,kEAA+D;AAAvD,gHAAA,cAAc,OAAA;AACtB,2EAAwE;AAAhE,sHAAA,iBAAiB,OAAA;AACzB,wEAAyE;AAAjE,wHAAA,oBAAoB,OAAA;AAC5B,iFAA8E;AAAtE,0HAAA,mBAAmB,OAAA;AAC3B,uFAAoF;AAA5E,8HAAA,qBAAqB,OAAA;AAC7B,2EAAwE;AAAhE,sHAAA,iBAAiB,OAAA;AACzB,0FAAuF;AAA/E,gIAAA,sBAAsB,OAAA"}
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import './JoinRequestBanner.scss';
3
+ export type PendingParticipant = {
4
+ participantId: string;
5
+ firstName: string;
6
+ lastName: string;
7
+ };
8
+ type JoinRequestBannerProps = {
9
+ pendingParticipants: PendingParticipant[];
10
+ titleLabel: string;
11
+ bannerTemplate: string;
12
+ admitLabel: string;
13
+ rejectLabel: string;
14
+ onAdmit: (participantId: string) => Promise<void>;
15
+ onReject: (participantId: string) => Promise<void>;
16
+ };
17
+ export declare const JoinRequestBanner: React.FC<JoinRequestBannerProps>;
18
+ export {};
19
+ //# sourceMappingURL=JoinRequestBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JoinRequestBanner.d.ts","sourceRoot":"","sources":["../../../src/components/JoinRequestBanner/JoinRequestBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AAEtC,OAAO,0BAA0B,CAAC;AAElC,MAAM,MAAM,kBAAkB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC1B,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAsEF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA2B9D,CAAC"}