botframework-webchat-component 4.14.1 → 4.15.2-main.20220413.af6e8a3

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 (411) hide show
  1. package/.eslintrc.yml +4 -106
  2. package/.prettierrc.yml +1 -1
  3. package/lib/Activity/CarouselFilmStrip.js +1 -1
  4. package/lib/Activity/CarouselFilmStripAttachment.js +1 -1
  5. package/lib/Activity/CarouselLayout.js +3 -3
  6. package/lib/Activity/Speak.d.ts +2 -2
  7. package/lib/Activity/Speak.d.ts.map +1 -1
  8. package/lib/Activity/Speak.js +15 -8
  9. package/lib/Activity/StackedLayout.d.ts +5 -3
  10. package/lib/Activity/StackedLayout.d.ts.map +1 -1
  11. package/lib/Activity/StackedLayout.js +16 -21
  12. package/lib/Attachment/FileAttachment.js +2 -2
  13. package/lib/Attachment/FileContent.d.ts.map +1 -1
  14. package/lib/Attachment/FileContent.js +11 -1
  15. package/lib/BasicSendBox.d.ts.map +1 -1
  16. package/lib/BasicSendBox.js +8 -9
  17. package/lib/BasicToast.js +1 -1
  18. package/lib/BasicToaster.js +6 -3
  19. package/lib/BasicTranscript.d.ts +7 -0
  20. package/lib/BasicTranscript.d.ts.map +1 -0
  21. package/lib/BasicTranscript.js +386 -728
  22. package/lib/BasicTypingIndicator.d.ts +2 -1
  23. package/lib/BasicTypingIndicator.d.ts.map +1 -1
  24. package/lib/BasicTypingIndicator.js +12 -4
  25. package/lib/Composer.d.ts.map +1 -1
  26. package/lib/Composer.js +37 -32
  27. package/lib/ConnectivityStatus/Connecting.js +1 -1
  28. package/lib/Dictation.js +1 -1
  29. package/lib/Middleware/Activity/createCoreMiddleware.d.ts.map +1 -1
  30. package/lib/Middleware/Activity/createCoreMiddleware.js +9 -12
  31. package/lib/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js +1 -1
  32. package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts +2 -2
  33. package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts.map +1 -1
  34. package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.js +5 -4
  35. package/lib/Middleware/ActivityStatus/Timestamp.d.ts +2 -2
  36. package/lib/Middleware/ActivityStatus/Timestamp.d.ts.map +1 -1
  37. package/lib/Middleware/ActivityStatus/Timestamp.js +4 -2
  38. package/lib/Middleware/ActivityStatus/createSendStatusMiddleware.js +20 -17
  39. package/lib/Middleware/Attachment/createCoreMiddleware.js +2 -5
  40. package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts.map +1 -1
  41. package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.js +1 -1
  42. package/lib/Middleware/Avatar/createCoreMiddleware.d.ts.map +1 -1
  43. package/lib/Middleware/Avatar/createCoreMiddleware.js +2 -3
  44. package/lib/Middleware/CardAction/createCoreMiddleware.js +10 -3
  45. package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts.map +1 -1
  46. package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.js +1 -1
  47. package/lib/Middleware/Toast/createCoreMiddleware.d.ts.map +1 -1
  48. package/lib/Middleware/Toast/createCoreMiddleware.js +1 -1
  49. package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts.map +1 -1
  50. package/lib/Middleware/TypingIndicator/createCoreMiddleware.js +8 -6
  51. package/lib/ReactWebChat.js +2 -2
  52. package/lib/ScreenReaderActivity.js +15 -6
  53. package/lib/ScreenReaderText.d.ts +9 -0
  54. package/lib/ScreenReaderText.d.ts.map +1 -0
  55. package/lib/ScreenReaderText.js +22 -8
  56. package/lib/SendBox/AutoResizeTextArea.js +1 -1
  57. package/lib/SendBox/DictationInterims.js +1 -1
  58. package/lib/SendBox/IconButton.d.ts +11 -0
  59. package/lib/SendBox/IconButton.d.ts.map +1 -0
  60. package/lib/SendBox/IconButton.js +26 -6
  61. package/lib/SendBox/MicrophoneButton.js +2 -2
  62. package/lib/SendBox/SendButton.js +2 -2
  63. package/lib/SendBox/SuggestedAction.d.ts +17 -0
  64. package/lib/SendBox/SuggestedAction.d.ts.map +1 -0
  65. package/lib/SendBox/SuggestedAction.js +26 -17
  66. package/lib/SendBox/SuggestedActions.d.ts.map +1 -1
  67. package/lib/SendBox/SuggestedActions.js +26 -9
  68. package/lib/SendBox/TextBox.js +4 -4
  69. package/lib/SendBox/UploadButton.js +4 -4
  70. package/lib/Styles/StyleSet/BasicTranscript.d.ts +13 -5
  71. package/lib/Styles/StyleSet/BasicTranscript.d.ts.map +1 -1
  72. package/lib/Styles/StyleSet/BasicTranscript.js +21 -9
  73. package/lib/Styles/StyleSet/Bubble.d.ts.map +1 -1
  74. package/lib/Styles/StyleSet/Bubble.js +3 -3
  75. package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts.map +1 -1
  76. package/lib/Styles/StyleSet/CarouselFilmStrip.js +3 -3
  77. package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts.map +1 -1
  78. package/lib/Styles/StyleSet/CarouselFilmStripAttachment.js +3 -3
  79. package/lib/Styles/StyleSet/KeyboardHelp.d.ts +123 -0
  80. package/lib/Styles/StyleSet/KeyboardHelp.d.ts.map +1 -0
  81. package/lib/Styles/StyleSet/KeyboardHelp.js +145 -0
  82. package/lib/Styles/StyleSet/ScrollToEndButton.d.ts +1 -1
  83. package/lib/Styles/StyleSet/ScrollToEndButton.js +2 -2
  84. package/lib/Styles/StyleSet/SendBoxButton.d.ts +56 -10
  85. package/lib/Styles/StyleSet/SendBoxButton.d.ts.map +1 -1
  86. package/lib/Styles/StyleSet/SendBoxButton.js +76 -12
  87. package/lib/Styles/StyleSet/SendBoxTextBox.d.ts +1 -1
  88. package/lib/Styles/StyleSet/SendBoxTextBox.d.ts.map +1 -1
  89. package/lib/Styles/StyleSet/SendBoxTextBox.js +3 -3
  90. package/lib/Styles/StyleSet/StackedLayout.d.ts.map +1 -1
  91. package/lib/Styles/StyleSet/StackedLayout.js +1 -1
  92. package/lib/Styles/StyleSet/SuggestedAction.d.ts +73 -28
  93. package/lib/Styles/StyleSet/SuggestedAction.d.ts.map +1 -1
  94. package/lib/Styles/StyleSet/SuggestedAction.js +116 -41
  95. package/lib/Styles/StyleSet/SuggestedActions.d.ts +13 -6
  96. package/lib/Styles/StyleSet/SuggestedActions.d.ts.map +1 -1
  97. package/lib/Styles/StyleSet/SuggestedActions.js +13 -6
  98. package/lib/Styles/createStyleSet.d.ts +324 -55
  99. package/lib/Styles/createStyleSet.d.ts.map +1 -1
  100. package/lib/Styles/createStyleSet.js +6 -3
  101. package/lib/Styles/mirrorStyle.js +12 -3
  102. package/lib/Toast/NotificationIcon.js +7 -3
  103. package/lib/Toast/createToastMiddleware.d.ts.map +1 -1
  104. package/lib/Toast/createToastMiddleware.js +1 -1
  105. package/lib/Transcript/ActivityRow.d.ts +9 -0
  106. package/lib/Transcript/ActivityRow.d.ts.map +1 -0
  107. package/lib/Transcript/ActivityRow.js +159 -0
  108. package/lib/Transcript/ActivityTextAlt.js +57 -0
  109. package/lib/Transcript/FocusTrap.d.ts +8 -0
  110. package/lib/Transcript/FocusTrap.d.ts.map +1 -0
  111. package/lib/Transcript/FocusTrap.js +74 -0
  112. package/lib/Transcript/KeyboardHelp.d.ts +4 -0
  113. package/lib/Transcript/KeyboardHelp.d.ts.map +1 -0
  114. package/lib/Transcript/KeyboardHelp.js +550 -0
  115. package/lib/Transcript/LiveRegionTranscript.d.ts +8 -0
  116. package/lib/Transcript/LiveRegionTranscript.d.ts.map +1 -0
  117. package/lib/Transcript/LiveRegionTranscript.js +229 -0
  118. package/lib/Transcript/types.d.ts +2 -0
  119. package/lib/Transcript/types.d.ts.map +1 -0
  120. package/lib/Transcript/types.js +2 -0
  121. package/lib/Transcript/useActivityAccessibleName.d.ts +4 -0
  122. package/lib/Transcript/useActivityAccessibleName.d.ts.map +1 -0
  123. package/lib/Transcript/useActivityAccessibleName.js +97 -0
  124. package/lib/Transcript/useTypistNames.d.ts +3 -0
  125. package/lib/Transcript/useTypistNames.d.ts.map +1 -0
  126. package/lib/Transcript/useTypistNames.js +61 -0
  127. package/lib/Utils/AccessKeySink/Surface.js +1 -1
  128. package/lib/Utils/AccessibleButton.d.ts +11 -0
  129. package/lib/Utils/AccessibleButton.d.ts.map +1 -0
  130. package/lib/Utils/AccessibleButton.js +12 -7
  131. package/lib/Utils/AccessibleInputText.js +1 -1
  132. package/lib/Utils/AccessibleTextArea.js +1 -1
  133. package/lib/Utils/CroppedImage.js +1 -1
  134. package/lib/Utils/FocusRedirector.d.ts +9 -0
  135. package/lib/Utils/FocusRedirector.d.ts.map +1 -0
  136. package/lib/Utils/FocusRedirector.js +17 -14
  137. package/lib/Utils/InlineMarkdown.js +15 -8
  138. package/lib/Utils/TypeFocusSink/FocusBox.js +1 -1
  139. package/lib/Utils/TypeFocusSink/inputtableKey.d.ts +2 -0
  140. package/lib/Utils/TypeFocusSink/inputtableKey.d.ts.map +1 -0
  141. package/lib/Utils/TypeFocusSink/inputtableKey.js +5 -2
  142. package/lib/Utils/activityAltText.d.ts +8 -0
  143. package/lib/Utils/activityAltText.d.ts.map +1 -0
  144. package/lib/Utils/addTargetBlankToHyperlinksMarkdown.js +2 -2
  145. package/lib/Utils/createCustomEvent.js +8 -2
  146. package/lib/Utils/detectBrowser.js +4 -2
  147. package/lib/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js +1 -1
  148. package/lib/Utils/downscaleImageToDataURL/index.js +1 -1
  149. package/lib/Utils/findAncestor.js +17 -0
  150. package/lib/Utils/getActivityUniqueId.js +4 -2
  151. package/lib/Utils/intersectionOf.d.ts +5 -0
  152. package/lib/Utils/intersectionOf.d.ts.map +1 -0
  153. package/lib/Utils/intersectionOf.js +17 -2
  154. package/lib/Utils/isZeroOrPositive.d.ts +5 -0
  155. package/lib/Utils/isZeroOrPositive.d.ts.map +1 -0
  156. package/lib/Utils/isZeroOrPositive.js +4 -1
  157. package/lib/Utils/mapMap.js +9 -2
  158. package/lib/Utils/readDataURIToBlob.js +1 -1
  159. package/lib/Utils/scrollIntoViewWithBlockNearest.d.ts +7 -0
  160. package/lib/Utils/scrollIntoViewWithBlockNearest.d.ts.map +1 -0
  161. package/lib/Utils/scrollIntoViewWithBlockNearest.js +48 -0
  162. package/lib/Utils/shallowEquals.js +7 -3
  163. package/lib/Utils/supportPseudoClass.d.ts +2 -0
  164. package/lib/Utils/supportPseudoClass.d.ts.map +1 -0
  165. package/lib/Utils/supportPseudoClass.js +23 -0
  166. package/lib/Utils/tabbableElements.d.ts +2 -0
  167. package/lib/Utils/tabbableElements.d.ts.map +1 -0
  168. package/lib/Utils/tabbableElements.js +2 -2
  169. package/lib/connectToWebChat.js +15 -7
  170. package/lib/hooks/index.js +24 -24
  171. package/lib/hooks/internal/BypassSpeechSynthesisPonyfill.js +8 -7
  172. package/lib/hooks/internal/useChanged.js +8 -1
  173. package/lib/hooks/internal/useDispatchScrollPosition.js +3 -7
  174. package/lib/hooks/internal/useDispatchTranscriptFocusByActivityKey.d.ts +2 -0
  175. package/lib/hooks/internal/useDispatchTranscriptFocusByActivityKey.d.ts.map +1 -0
  176. package/lib/hooks/internal/useDispatchTranscriptFocusByActivityKey.js +15 -0
  177. package/lib/hooks/internal/useFocusVisible.d.ts +3 -0
  178. package/lib/hooks/internal/useFocusVisible.d.ts.map +1 -0
  179. package/lib/hooks/internal/useFocusVisible.js +48 -0
  180. package/lib/hooks/internal/useMemoWithPrevious.d.ts +3 -0
  181. package/lib/hooks/internal/useMemoWithPrevious.d.ts.map +1 -0
  182. package/lib/hooks/internal/useMemoWithPrevious.js +22 -0
  183. package/lib/hooks/internal/useMemoize.d.ts +14 -0
  184. package/lib/hooks/internal/useMemoize.d.ts.map +1 -0
  185. package/lib/hooks/internal/useMemoize.js +11 -2
  186. package/lib/hooks/internal/useObserveFocusVisible.d.ts +3 -0
  187. package/lib/hooks/internal/useObserveFocusVisible.d.ts.map +1 -0
  188. package/lib/hooks/internal/useObserveFocusVisible.js +208 -0
  189. package/lib/hooks/internal/usePrevious.d.ts +2 -0
  190. package/lib/hooks/internal/usePrevious.d.ts.map +1 -0
  191. package/lib/hooks/internal/usePrevious.js +18 -0
  192. package/lib/hooks/internal/useStateRef.d.ts +3 -0
  193. package/lib/hooks/internal/useStateRef.d.ts.map +1 -0
  194. package/lib/hooks/internal/useStateRef.js +40 -0
  195. package/lib/hooks/internal/useValueRef.d.ts +3 -0
  196. package/lib/hooks/internal/useValueRef.d.ts.map +1 -0
  197. package/lib/hooks/internal/useValueRef.js +25 -0
  198. package/lib/hooks/useFocus.d.ts +1 -1
  199. package/lib/hooks/useFocus.d.ts.map +1 -1
  200. package/lib/hooks/useFocus.js +1 -1
  201. package/lib/hooks/useObserveTranscriptFocus.d.ts +2 -2
  202. package/lib/hooks/useObserveTranscriptFocus.d.ts.map +1 -1
  203. package/lib/hooks/useObserveTranscriptFocus.js +1 -1
  204. package/lib/hooks/useRenderMarkdownAsHTML.d.ts.map +1 -1
  205. package/lib/hooks/useRenderMarkdownAsHTML.js +1 -1
  206. package/lib/hooks/useScrollTo.d.ts.map +1 -1
  207. package/lib/hooks/useScrollTo.js +1 -1
  208. package/lib/hooks/useScrollToEnd.d.ts.map +1 -1
  209. package/lib/hooks/useScrollToEnd.js +1 -1
  210. package/lib/hooks/useSendFiles.d.ts.map +1 -1
  211. package/lib/hooks/useSendFiles.js +4 -4
  212. package/lib/index.d.ts +13 -3
  213. package/lib/index.d.ts.map +1 -1
  214. package/lib/index.js +20 -18
  215. package/lib/providers/ActivityTree/ActivityTreeComposer.d.ts +5 -0
  216. package/lib/providers/ActivityTree/ActivityTreeComposer.d.ts.map +1 -0
  217. package/lib/providers/ActivityTree/ActivityTreeComposer.js +86 -0
  218. package/lib/providers/ActivityTree/private/Context.d.ts +9 -0
  219. package/lib/providers/ActivityTree/private/Context.d.ts.map +1 -0
  220. package/lib/providers/ActivityTree/private/Context.js +13 -0
  221. package/lib/providers/ActivityTree/private/types.d.ts +10 -0
  222. package/lib/providers/ActivityTree/private/types.d.ts.map +1 -0
  223. package/lib/providers/ActivityTree/private/types.js +2 -0
  224. package/lib/providers/ActivityTree/private/useActivitiesWithRenderer.d.ts +4 -0
  225. package/lib/providers/ActivityTree/private/useActivitiesWithRenderer.d.ts.map +1 -0
  226. package/lib/providers/ActivityTree/private/useActivitiesWithRenderer.js +58 -0
  227. package/lib/providers/ActivityTree/private/useActivityTreeWithRenderer.d.ts +5 -0
  228. package/lib/providers/ActivityTree/private/useActivityTreeWithRenderer.d.ts.map +1 -0
  229. package/lib/providers/ActivityTree/private/useActivityTreeWithRenderer.js +166 -0
  230. package/lib/providers/ActivityTree/private/useContext.d.ts +3 -0
  231. package/lib/providers/ActivityTree/private/useContext.d.ts.map +1 -0
  232. package/lib/providers/ActivityTree/private/useContext.js +24 -0
  233. package/lib/providers/ActivityTree/useActivityTreeWithRenderer.d.ts +8 -0
  234. package/lib/providers/ActivityTree/useActivityTreeWithRenderer.d.ts.map +1 -0
  235. package/lib/providers/ActivityTree/useActivityTreeWithRenderer.js +17 -0
  236. package/lib/providers/LiveRegionTwin/LiveRegionTwinComposer.d.ts +37 -0
  237. package/lib/providers/LiveRegionTwin/LiveRegionTwinComposer.d.ts.map +1 -0
  238. package/lib/providers/LiveRegionTwin/LiveRegionTwinComposer.js +160 -0
  239. package/lib/providers/LiveRegionTwin/private/Context.d.ts +10 -0
  240. package/lib/providers/LiveRegionTwin/private/Context.d.ts.map +1 -0
  241. package/lib/providers/LiveRegionTwin/private/Context.js +13 -0
  242. package/lib/providers/LiveRegionTwin/private/LiveRegionTwinContainer.d.ts +12 -0
  243. package/lib/providers/LiveRegionTwin/private/LiveRegionTwinContainer.d.ts.map +1 -0
  244. package/lib/providers/LiveRegionTwin/private/LiveRegionTwinContainer.js +100 -0
  245. package/lib/providers/LiveRegionTwin/private/types.d.ts +8 -0
  246. package/lib/providers/LiveRegionTwin/private/types.d.ts.map +1 -0
  247. package/lib/providers/LiveRegionTwin/private/types.js +2 -0
  248. package/lib/providers/LiveRegionTwin/private/useContext.d.ts +3 -0
  249. package/lib/providers/LiveRegionTwin/private/useContext.d.ts.map +1 -0
  250. package/lib/providers/LiveRegionTwin/private/useContext.js +24 -0
  251. package/lib/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.d.ts +2 -0
  252. package/lib/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.d.ts.map +1 -0
  253. package/lib/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.js +24 -0
  254. package/lib/providers/LiveRegionTwin/private/useStaticElementEntries.d.ts +3 -0
  255. package/lib/providers/LiveRegionTwin/private/useStaticElementEntries.d.ts.map +1 -0
  256. package/lib/providers/LiveRegionTwin/private/useStaticElementEntries.js +15 -0
  257. package/lib/providers/LiveRegionTwin/useQueueStaticElement.d.ts +8 -0
  258. package/lib/providers/LiveRegionTwin/useQueueStaticElement.d.ts.map +1 -0
  259. package/lib/providers/LiveRegionTwin/useQueueStaticElement.js +20 -0
  260. package/lib/providers/TranscriptFocus/TranscriptFocusComposer.d.ts +7 -0
  261. package/lib/providers/TranscriptFocus/TranscriptFocusComposer.d.ts.map +1 -0
  262. package/lib/providers/TranscriptFocus/TranscriptFocusComposer.js +184 -0
  263. package/lib/providers/TranscriptFocus/private/Context.d.ts +12 -0
  264. package/lib/providers/TranscriptFocus/private/Context.d.ts.map +1 -0
  265. package/lib/providers/TranscriptFocus/private/Context.js +13 -0
  266. package/lib/providers/TranscriptFocus/private/useContext.d.ts +2 -0
  267. package/lib/providers/TranscriptFocus/private/useContext.d.ts.map +1 -0
  268. package/lib/providers/TranscriptFocus/private/useContext.js +24 -0
  269. package/lib/providers/TranscriptFocus/useActiveDescendantId.d.ts +2 -0
  270. package/lib/providers/TranscriptFocus/useActiveDescendantId.d.ts.map +1 -0
  271. package/lib/providers/TranscriptFocus/useActiveDescendantId.js +15 -0
  272. package/lib/providers/TranscriptFocus/useFocusByActivityKey.d.ts +8 -0
  273. package/lib/providers/TranscriptFocus/useFocusByActivityKey.d.ts.map +1 -0
  274. package/lib/providers/TranscriptFocus/useFocusByActivityKey.js +21 -0
  275. package/lib/providers/TranscriptFocus/useFocusRelativeActivity.d.ts +2 -0
  276. package/lib/providers/TranscriptFocus/useFocusRelativeActivity.d.ts.map +1 -0
  277. package/lib/providers/TranscriptFocus/useFocusRelativeActivity.js +15 -0
  278. package/lib/providers/TranscriptFocus/useFocusedActivityKey.d.ts +2 -0
  279. package/lib/providers/TranscriptFocus/useFocusedActivityKey.d.ts.map +1 -0
  280. package/lib/providers/TranscriptFocus/useFocusedActivityKey.js +15 -0
  281. package/lib/providers/TranscriptFocus/useFocusedExplicitly.d.ts +2 -0
  282. package/lib/providers/TranscriptFocus/useFocusedExplicitly.d.ts.map +1 -0
  283. package/lib/providers/TranscriptFocus/useFocusedExplicitly.js +15 -0
  284. package/lib/providers/TranscriptFocus/useGetDescendantIdByActivityKey.d.ts +2 -0
  285. package/lib/providers/TranscriptFocus/useGetDescendantIdByActivityKey.d.ts.map +1 -0
  286. package/lib/providers/TranscriptFocus/useGetDescendantIdByActivityKey.js +15 -0
  287. package/package.json +30 -33
  288. package/src/Activity/CarouselFilmStripAttachment.js +0 -1
  289. package/src/Activity/Speak.tsx +21 -18
  290. package/src/Activity/StackedLayout.tsx +30 -35
  291. package/src/Attachment/FileAttachment.js +1 -1
  292. package/src/Attachment/FileContent.tsx +12 -0
  293. package/src/BasicSendBox.tsx +3 -2
  294. package/src/BasicToaster.js +5 -1
  295. package/src/BasicTranscript.tsx +894 -0
  296. package/src/BasicTypingIndicator.tsx +3 -2
  297. package/src/Composer.tsx +41 -29
  298. package/src/Middleware/Activity/createCoreMiddleware.tsx +47 -46
  299. package/src/Middleware/ActivityStatus/SendStatus/SendStatus.tsx +5 -3
  300. package/src/Middleware/ActivityStatus/Timestamp.tsx +5 -3
  301. package/src/Middleware/ActivityStatus/createSendStatusMiddleware.js +2 -0
  302. package/src/Middleware/Attachment/createCoreMiddleware.tsx +28 -28
  303. package/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.tsx +25 -23
  304. package/src/Middleware/Avatar/createCoreMiddleware.tsx +9 -8
  305. package/src/Middleware/CardAction/createCoreMiddleware.js +9 -2
  306. package/src/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.ts +11 -9
  307. package/src/Middleware/Toast/createCoreMiddleware.tsx +12 -10
  308. package/src/Middleware/TypingIndicator/createCoreMiddleware.tsx +8 -2
  309. package/src/ScreenReaderActivity.js +18 -3
  310. package/src/{ScreenReaderText.js → ScreenReaderText.tsx} +27 -9
  311. package/src/SendBox/{IconButton.js → IconButton.tsx} +19 -3
  312. package/src/SendBox/{SuggestedAction.js → SuggestedAction.tsx} +72 -35
  313. package/src/SendBox/SuggestedActions.tsx +48 -21
  314. package/src/Styles/StyleSet/BasicTranscript.ts +34 -20
  315. package/src/Styles/StyleSet/Bubble.ts +0 -1
  316. package/src/Styles/StyleSet/CarouselFilmStrip.ts +12 -10
  317. package/src/Styles/StyleSet/CarouselFilmStripAttachment.ts +4 -3
  318. package/src/Styles/StyleSet/KeyboardHelp.ts +157 -0
  319. package/src/Styles/StyleSet/ScrollToEndButton.ts +1 -1
  320. package/src/Styles/StyleSet/SendBoxButton.ts +84 -13
  321. package/src/Styles/StyleSet/SendBoxTextBox.ts +1 -2
  322. package/src/Styles/StyleSet/StackedLayout.ts +13 -11
  323. package/src/Styles/StyleSet/SuggestedAction.ts +129 -42
  324. package/src/Styles/StyleSet/SuggestedActions.ts +13 -5
  325. package/src/Styles/createStyleSet.ts +2 -1
  326. package/src/Styles/mirrorStyle.js +10 -2
  327. package/src/Toast/NotificationIcon.js +4 -1
  328. package/src/Toast/createToastMiddleware.tsx +4 -1
  329. package/src/Transcript/ActivityRow.tsx +123 -0
  330. package/src/Transcript/ActivityTextAlt.tsx +31 -0
  331. package/src/Transcript/FocusTrap.tsx +64 -0
  332. package/src/Transcript/KeyboardHelp.tsx +282 -0
  333. package/src/Transcript/LiveRegionTranscript.tsx +196 -0
  334. package/src/Transcript/types.ts +1 -0
  335. package/src/Transcript/useActivityAccessibleName.ts +84 -0
  336. package/src/Transcript/useTypistNames.ts +37 -0
  337. package/src/Utils/{AccessibleButton.js → AccessibleButton.tsx} +19 -4
  338. package/src/Utils/{FocusRedirector.js → FocusRedirector.tsx} +21 -8
  339. package/src/Utils/InlineMarkdown.js +18 -2
  340. package/src/Utils/TypeFocusSink/inputtableKey.ts +5 -1
  341. package/src/Utils/createCustomEvent.js +7 -1
  342. package/src/Utils/detectBrowser.js +2 -1
  343. package/src/Utils/findAncestor.ts +12 -0
  344. package/src/Utils/getActivityUniqueId.ts +5 -0
  345. package/src/Utils/intersectionOf.ts +14 -0
  346. package/src/Utils/isZeroOrPositive.ts +7 -0
  347. package/src/Utils/mapMap.js +7 -1
  348. package/src/Utils/scrollIntoViewWithBlockNearest.ts +20 -0
  349. package/src/Utils/shallowEquals.js +8 -1
  350. package/src/Utils/supportPseudoClass.ts +17 -0
  351. package/src/Utils/{tabbableElements.js → tabbableElements.ts} +6 -5
  352. package/src/connectToWebChat.js +11 -4
  353. package/src/hooks/internal/BypassSpeechSynthesisPonyfill.js +3 -1
  354. package/src/hooks/internal/useChanged.ts +17 -0
  355. package/src/hooks/internal/useDispatchScrollPosition.js +1 -3
  356. package/src/hooks/internal/useDispatchTranscriptFocusByActivityKey.ts +5 -0
  357. package/src/hooks/internal/useFocusVisible.ts +22 -0
  358. package/src/hooks/internal/useMemoWithPrevious.ts +16 -0
  359. package/src/hooks/internal/useMemoize.spec.js +1 -1
  360. package/src/hooks/internal/useMemoize.ts +53 -0
  361. package/src/hooks/internal/useObserveFocusVisible.ts +252 -0
  362. package/src/hooks/internal/usePrevious.ts +12 -0
  363. package/src/hooks/internal/useStateRef.ts +31 -0
  364. package/src/hooks/internal/useValueRef.ts +22 -0
  365. package/src/hooks/useFocus.ts +1 -1
  366. package/src/hooks/useObserveTranscriptFocus.ts +2 -2
  367. package/src/hooks/useRenderMarkdownAsHTML.ts +4 -5
  368. package/src/hooks/useScrollTo.ts +4 -3
  369. package/src/hooks/useScrollToEnd.ts +4 -3
  370. package/src/hooks/useSendFiles.ts +7 -5
  371. package/src/index.ts +0 -1
  372. package/src/providers/ActivityTree/ActivityTreeComposer.tsx +74 -0
  373. package/src/providers/ActivityTree/private/Context.ts +12 -0
  374. package/src/providers/ActivityTree/private/types.ts +12 -0
  375. package/src/providers/ActivityTree/private/useActivitiesWithRenderer.ts +64 -0
  376. package/src/providers/ActivityTree/private/useActivityTreeWithRenderer.ts +135 -0
  377. package/src/providers/ActivityTree/private/useContext.ts +15 -0
  378. package/src/providers/ActivityTree/useActivityTreeWithRenderer.ts +16 -0
  379. package/src/providers/LiveRegionTwin/LiveRegionTwinComposer.tsx +161 -0
  380. package/src/providers/LiveRegionTwin/private/Context.ts +15 -0
  381. package/src/providers/LiveRegionTwin/private/LiveRegionTwinContainer.tsx +80 -0
  382. package/src/providers/LiveRegionTwin/private/types.ts +10 -0
  383. package/src/providers/LiveRegionTwin/private/useContext.ts +15 -0
  384. package/src/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.ts +13 -0
  385. package/src/providers/LiveRegionTwin/private/useStaticElementEntries.ts +7 -0
  386. package/src/providers/LiveRegionTwin/useQueueStaticElement.ts +12 -0
  387. package/src/providers/TranscriptFocus/TranscriptFocusComposer.tsx +180 -0
  388. package/src/providers/TranscriptFocus/private/Context.ts +16 -0
  389. package/src/providers/TranscriptFocus/private/useContext.ts +13 -0
  390. package/src/providers/TranscriptFocus/useActiveDescendantId.ts +5 -0
  391. package/src/providers/TranscriptFocus/useFocusByActivityKey.ts +14 -0
  392. package/src/providers/TranscriptFocus/useFocusRelativeActivity.ts +5 -0
  393. package/src/providers/TranscriptFocus/useFocusedActivityKey.ts +5 -0
  394. package/src/providers/TranscriptFocus/useFocusedExplicitly.ts +5 -0
  395. package/src/providers/TranscriptFocus/useGetDescendantIdByActivityKey.ts +5 -0
  396. package/.eslintignore +0 -1
  397. package/lib/Middleware/GroupActivities/createCoreMiddleware.js +0 -69
  398. package/lib/Utils/findLastIndex.js +0 -32
  399. package/lib/hooks/internal/useAcknowledgedActivity.js +0 -90
  400. package/lib/hooks/internal/useDispatchTranscriptFocus.js +0 -19
  401. package/src/BasicTranscript.js +0 -1139
  402. package/src/Middleware/GroupActivities/createCoreMiddleware.js +0 -57
  403. package/src/Utils/findLastIndex.js +0 -11
  404. package/src/Utils/findLastIndex.spec.js +0 -31
  405. package/src/Utils/getActivityUniqueId.js +0 -3
  406. package/src/Utils/intersectionOf.js +0 -11
  407. package/src/Utils/isZeroOrPositive.js +0 -4
  408. package/src/hooks/internal/useAcknowledgedActivity.js +0 -65
  409. package/src/hooks/internal/useChanged.js +0 -10
  410. package/src/hooks/internal/useDispatchTranscriptFocus.js +0 -7
  411. package/src/hooks/internal/useMemoize.js +0 -37
@@ -0,0 +1,157 @@
1
+ // Numbers are commonly used in CSS.
2
+ /* eslint-disable no-magic-numbers */
3
+
4
+ import { StrictStyleOptions } from 'botframework-webchat-api';
5
+
6
+ export default function createKeyboardHelpStyleSet({ paddingRegular, primaryFont }: StrictStyleOptions) {
7
+ return {
8
+ '&.webchat__keyboard-help': {
9
+ fontFamily: primaryFont,
10
+ fontSize: 14,
11
+ height: '100%',
12
+ margin: paddingRegular,
13
+ outline: 0,
14
+
15
+ '&:not(.webchat__keyboard-help--shown)': {
16
+ height: 0,
17
+ margin: 0,
18
+ overflow: 'hidden',
19
+ pointerEvents: 'none',
20
+ width: 0
21
+ },
22
+
23
+ '& .webchat__keyboard-help__box': {
24
+ // From Power BI:
25
+ // boxShadow: '0 6.4px 14.4px rgb(0 0 0 / 13%), 0 1.2px 3.6px rgb(0 0 0 / 11%)',
26
+ // From Fluent (depth-16 for teaching callouts):
27
+ borderRadius: 2,
28
+ boxShadow: '0px 8px 16px rgba(0, 0, 0, 0.14), 0px 0px 2px rgba(0, 0, 0, 0.12)',
29
+ boxSizing: 'border-box',
30
+ height: '100%',
31
+ padding: paddingRegular * 2,
32
+ position: 'relative',
33
+
34
+ '@media (forced-colors: active)': {
35
+ boxShadow: 'none',
36
+ outlineColor: 'white',
37
+ outlineStyle: 'solid',
38
+ outlineWidth: 4
39
+ },
40
+
41
+ '@media (forced-colors: none) and (prefers-color-scheme: dark)': {
42
+ boxShadow: '0px 8px 16px rgba(0, 0, 0, 0.28), 0px 0px 2px rgba(0, 0, 0, 0.24)'
43
+ }
44
+ },
45
+
46
+ '& .webchat__keyboard-help__close-button': {
47
+ appearance: 'none',
48
+ backgroundColor: 'transparent',
49
+ borderColor: 'black',
50
+ borderRadius: 4,
51
+ borderStyle: 'solid',
52
+ borderWidth: 2,
53
+ color: '#999',
54
+ height: 34,
55
+ padding: 0,
56
+ position: 'absolute',
57
+ right: paddingRegular,
58
+ top: paddingRegular,
59
+ width: 34,
60
+
61
+ '@media (forced-colors: none) and (prefers-color-scheme: light)': {
62
+ '&:active': {
63
+ backgroundColor: '#EDEBE9' // neutralLight (gray30)
64
+ },
65
+
66
+ '&:not(:active):hover': {
67
+ backgroundColor: '#F3F2F1' // neutralLighter (gray20)
68
+ }
69
+ },
70
+
71
+ '@media (forced-colors: none) and (prefers-color-scheme: dark)': {
72
+ borderColor: 'white',
73
+
74
+ '&:active': {
75
+ backgroundColor: '#292827' // neutralLight (gray30)
76
+ },
77
+
78
+ '&:not(:active):hover': {
79
+ backgroundColor: '#252423' // neutralLight (gray30)
80
+ }
81
+ }
82
+ },
83
+
84
+ '& .webchat__keyboard-help__close-button_image': {
85
+ fill: '#323130', // neutralPrimary (gray160)
86
+ height: 10,
87
+ width: 10,
88
+
89
+ '@media (forced-colors: active)': {
90
+ fill: 'White'
91
+ },
92
+
93
+ '@media (forced-colors: none) and (prefers-color-scheme: dark)': {
94
+ fill: '#F3F2F1' // neutralPrimary (gray160)
95
+ }
96
+ },
97
+
98
+ '& .webchat__keyboard-help__header, & .webchat__keyboard-help__sub-header': {
99
+ marginBottom: paddingRegular / 2,
100
+ marginTop: 0
101
+ },
102
+
103
+ '& .webchat__keyboard-help__section': {
104
+ marginBottom: paddingRegular
105
+ },
106
+
107
+ '& .webchat__keyboard-help__two-panes': {
108
+ alignItems: 'flex-start',
109
+ display: 'flex'
110
+ },
111
+
112
+ '& .webchat__keyboard-help__image': {
113
+ flexShrink: 10000,
114
+ paddingRight: paddingRegular
115
+ },
116
+
117
+ '& .webchat__keyboard-help__image--dark, & .webchat__keyboard-help__image--high-contrast': {
118
+ display: 'none'
119
+ },
120
+
121
+ '@media (forced-colors: active)': {
122
+ '& .webchat__keyboard-help__image--dark, & .webchat__keyboard-help__image--light': {
123
+ display: 'none'
124
+ },
125
+
126
+ '& .webchat__keyboard-help__image--high-contrast': {
127
+ display: 'unset'
128
+ }
129
+ },
130
+
131
+ '@media (forced-colors: none) and (prefers-color-scheme: dark)': {
132
+ backgroundColor: 'black',
133
+ color: '#F3F2F1',
134
+
135
+ '& .webchat__keyboard-help__image--light': {
136
+ display: 'none'
137
+ },
138
+
139
+ '& .webchat__keyboard-help__image--dark': {
140
+ display: 'unset'
141
+ }
142
+ },
143
+
144
+ '& .webchat__keyboard-help__notes': {
145
+ marginBottom: paddingRegular
146
+ },
147
+
148
+ '& .webchat__keyboard-help__notes-header': {
149
+ margin: 0
150
+ },
151
+
152
+ '& .webchat__keyboard-help__notes-text': {
153
+ margin: 0
154
+ }
155
+ }
156
+ };
157
+ }
@@ -14,7 +14,7 @@ export default function createScrollToEndButtonStyle({
14
14
  return {
15
15
  '&.webchat__scroll-to-end-button': {
16
16
  // TODO: [P3] Can we not to unset borderWidth and outline earlier?
17
- '@media screen and (-ms-high-contrast: active)': {
17
+ '@media screen and (forced-colors: active)': {
18
18
  borderWidth: 'initial',
19
19
  outline: 'initial'
20
20
  },
@@ -2,47 +2,118 @@ import { StrictStyleOptions } from 'botframework-webchat-api';
2
2
 
3
3
  export default function createSendBoxButtonStyle({
4
4
  sendBoxButtonColor,
5
+ sendBoxButtonColorOnActive,
5
6
  sendBoxButtonColorOnDisabled,
6
7
  sendBoxButtonColorOnFocus,
7
8
  sendBoxButtonColorOnHover,
9
+ sendBoxButtonKeyboardFocusIndicatorBorderColor,
10
+ sendBoxButtonKeyboardFocusIndicatorBorderRadius,
11
+ sendBoxButtonKeyboardFocusIndicatorBorderStyle,
12
+ sendBoxButtonKeyboardFocusIndicatorBorderWidth,
13
+ sendBoxButtonKeyboardFocusIndicatorInset,
14
+ sendBoxButtonShadeBorderRadius,
15
+ sendBoxButtonShadeColor,
16
+ sendBoxButtonShadeColorOnActive,
17
+ sendBoxButtonShadeColorOnDisabled,
18
+ sendBoxButtonShadeColorOnFocus,
19
+ sendBoxButtonShadeColorOnHover,
20
+ sendBoxButtonShadeInset,
8
21
  sendBoxHeight,
9
22
  subtle
10
23
  }: StrictStyleOptions) {
11
24
  return {
12
25
  '&.webchat__icon-button': {
13
26
  alignItems: 'center',
27
+ appearance: 'none',
14
28
  backgroundColor: 'Transparent',
15
29
  border: 0,
16
30
  display: 'flex',
31
+ fill: sendBoxButtonColor || subtle,
17
32
  justifyContent: 'center',
18
33
  outline: 0,
19
34
  padding: 0,
20
-
21
- // We use the sendBoxHeight, so the button looks square
22
- width: sendBoxHeight,
35
+ position: 'relative',
36
+ width: sendBoxHeight, // We use the sendBoxHeight, so the button looks square
23
37
 
24
38
  '&:not(.webchat__icon-button--stretch)': {
25
39
  height: sendBoxHeight
26
40
  },
27
41
 
42
+ // Order of style preferences (based on effort of user gesture): disabled > active > hover > focus.
43
+ // Keyboard focus indicator styles applied by :focus-visible do not conflict with :active/:hover/:focus, so it is not included here.
44
+ '&:disabled, &[aria-disabled="true"]': {
45
+ fill: sendBoxButtonColorOnDisabled,
46
+
47
+ '& .webchat__icon-button__shade': {
48
+ backgroundColor: sendBoxButtonShadeColorOnDisabled
49
+ }
50
+ },
51
+
28
52
  '&:not(:disabled):not([aria-disabled="true"])': {
29
- '&:focus svg': {
30
- fill: sendBoxButtonColorOnFocus
53
+ '&:active': {
54
+ fill: sendBoxButtonColorOnActive,
55
+
56
+ '& .webchat__icon-button__shade': {
57
+ backgroundColor: sendBoxButtonShadeColorOnActive
58
+ }
31
59
  },
32
60
 
33
- '&:hover svg': {
34
- fill: sendBoxButtonColorOnHover
61
+ '&:not(:active)': {
62
+ '&:hover': {
63
+ fill: sendBoxButtonColorOnHover,
64
+
65
+ '& .webchat__icon-button__shade': {
66
+ backgroundColor: sendBoxButtonShadeColorOnHover
67
+ }
68
+ },
69
+
70
+ '&:not(:hover)': {
71
+ '&:focus': {
72
+ fill: sendBoxButtonColorOnFocus,
73
+
74
+ '& .webchat__icon-button__shade': {
75
+ backgroundColor: sendBoxButtonShadeColorOnFocus
76
+ }
77
+ }
78
+ }
35
79
  }
36
80
  },
37
81
 
38
- '& svg': {
39
- fill: sendBoxButtonColor || subtle
82
+ // On unsupported browser, :focus-visible and :not(:focus-visible) is always false.
83
+ // And it will turn the whole CSS selector ":unsupported, .truthy" to false.
84
+ '&:not(:focus-visible) .webchat__icon-button__keyboard-focus-indicator': {
85
+ display: 'none'
40
86
  },
41
87
 
42
- '&:disabled, &[aria-disabled="true"]': {
43
- '& svg': {
44
- fill: sendBoxButtonColorOnDisabled
45
- }
88
+ '&:not(.webchat__icon-button--focus-visible) .webchat__icon-button__keyboard-focus-indicator': {
89
+ display: 'none'
90
+ },
91
+
92
+ // Make sure all contents are in the same stacking context.
93
+ '& > *': {
94
+ position: 'relative'
95
+ },
96
+
97
+ '& .webchat__icon-button__shade': {
98
+ backgroundColor: sendBoxButtonShadeColor,
99
+ borderRadius: sendBoxButtonShadeBorderRadius,
100
+ bottom: sendBoxButtonShadeInset,
101
+ left: sendBoxButtonShadeInset,
102
+ position: 'absolute',
103
+ right: sendBoxButtonShadeInset,
104
+ top: sendBoxButtonShadeInset
105
+ },
106
+
107
+ '& .webchat__icon-button__keyboard-focus-indicator': {
108
+ borderColor: sendBoxButtonKeyboardFocusIndicatorBorderColor,
109
+ borderRadius: sendBoxButtonKeyboardFocusIndicatorBorderRadius,
110
+ borderStyle: sendBoxButtonKeyboardFocusIndicatorBorderStyle,
111
+ borderWidth: sendBoxButtonKeyboardFocusIndicatorBorderWidth,
112
+ bottom: sendBoxButtonKeyboardFocusIndicatorInset,
113
+ left: sendBoxButtonKeyboardFocusIndicatorInset,
114
+ position: 'absolute',
115
+ right: sendBoxButtonKeyboardFocusIndicatorInset,
116
+ top: sendBoxButtonKeyboardFocusIndicatorInset
46
117
  }
47
118
  }
48
119
  };
@@ -3,7 +3,6 @@ import { StrictStyleOptions } from 'botframework-webchat-api';
3
3
  export default function createSendBoxTextBoxStyle({
4
4
  paddingRegular,
5
5
  primaryFont,
6
- sendBoxBackground,
7
6
  sendBoxDisabledTextColor,
8
7
  sendBoxMaxHeight,
9
8
  sendBoxPlaceholderColor,
@@ -27,7 +26,7 @@ export default function createSendBoxTextBoxStyle({
27
26
  },
28
27
 
29
28
  '& .webchat__send-box-text-box__input, & .webchat__send-box-text-box__html-text-area': {
30
- backgroundColor: sendBoxBackground,
29
+ backgroundColor: 'transparent', // We set this to transparent because we already applied "sendBoxBackground" to a parent container.
31
30
 
32
31
  '&:not(:disabled):not([aria-disabled="true"])': {
33
32
  color: sendBoxTextColor
@@ -42,9 +42,10 @@ export default function createStackedLayoutStyle({
42
42
  width: '100%'
43
43
  },
44
44
 
45
- '&.webchat__stacked-layout--no-message .webchat__stacked-layout__attachment-row.webchat__stacked-layout__attachment-row--first': {
46
- marginTop: 0
47
- },
45
+ '&.webchat__stacked-layout--no-message .webchat__stacked-layout__attachment-row.webchat__stacked-layout__attachment-row--first':
46
+ {
47
+ marginTop: 0
48
+ },
48
49
 
49
50
  '& .webchat__stacked-layout__message': {
50
51
  maxWidth: bubbleMaxWidth,
@@ -65,15 +66,16 @@ export default function createStackedLayoutStyle({
65
66
  }
66
67
  },
67
68
 
68
- '&.webchat__stacked-layout--hide-avatar, &.webchat__stacked-layout--show-avatar, &.webchat__stacked-layout--hide-nub, &.webchat__stacked-layout--show-nub': {
69
- '& .webchat__stacked-layout__attachment, & .webchat__stacked-layout__message': {
70
- maxWidth: bubbleMaxWidth + paddingRegular
71
- },
69
+ '&.webchat__stacked-layout--hide-avatar, &.webchat__stacked-layout--show-avatar, &.webchat__stacked-layout--hide-nub, &.webchat__stacked-layout--show-nub':
70
+ {
71
+ '& .webchat__stacked-layout__attachment, & .webchat__stacked-layout__message': {
72
+ maxWidth: bubbleMaxWidth + paddingRegular
73
+ },
72
74
 
73
- '& .webchat__stacked-layout__nub-pad': {
74
- width: paddingRegular
75
- }
76
- },
75
+ '& .webchat__stacked-layout__nub-pad': {
76
+ width: paddingRegular
77
+ }
78
+ },
77
79
 
78
80
  '&:not(.webchat__stacked-layout--top-callout)': {
79
81
  '& .webchat__stacked-layout__avatar-gutter, & .webchat__stacked-layout__content': {
@@ -7,62 +7,141 @@ export default function createSuggestedActionStyle({
7
7
  paddingRegular,
8
8
  paddingWide,
9
9
  primaryFont,
10
- suggestedActionBackground,
10
+ suggestedActionBorderRadius,
11
+
12
+ suggestedActionBackgroundColor,
11
13
  suggestedActionBorderColor,
12
14
  suggestedActionBorderStyle,
13
15
  suggestedActionBorderWidth,
14
- suggestedActionBorderRadius,
15
- suggestedActionImageHeight,
16
16
  suggestedActionTextColor,
17
- suggestedActionDisabledBackground,
18
- suggestedActionDisabledBorderColor,
19
- suggestedActionDisabledBorderStyle,
20
- suggestedActionDisabledBorderWidth,
21
- suggestedActionDisabledTextColor,
17
+
18
+ suggestedActionBackgroundColorOnActive,
19
+ suggestedActionBorderColorOnActive,
20
+ suggestedActionBorderStyleOnActive,
21
+ suggestedActionBorderWidthOnActive,
22
+ suggestedActionTextColorOnActive,
23
+
24
+ suggestedActionBackgroundColorOnDisabled,
25
+ suggestedActionBorderColorOnDisabled,
26
+ suggestedActionBorderStyleOnDisabled,
27
+ suggestedActionBorderWidthOnDisabled,
28
+ suggestedActionTextColorOnDisabled,
29
+
30
+ suggestedActionBackgroundColorOnFocus,
31
+ suggestedActionBorderColorOnFocus,
32
+ suggestedActionBorderStyleOnFocus,
33
+ suggestedActionBorderWidthOnFocus,
34
+ suggestedActionTextColorOnFocus,
35
+
36
+ suggestedActionBackgroundColorOnHover,
37
+ suggestedActionBorderColorOnHover,
38
+ suggestedActionBorderStyleOnHover,
39
+ suggestedActionBorderWidthOnHover,
40
+ suggestedActionTextColorOnHover,
41
+
42
+ suggestedActionKeyboardFocusIndicatorBorderColor,
43
+ suggestedActionKeyboardFocusIndicatorBorderRadius,
44
+ suggestedActionKeyboardFocusIndicatorBorderStyle,
45
+ suggestedActionKeyboardFocusIndicatorBorderWidth,
46
+ suggestedActionKeyboardFocusIndicatorInset,
47
+
22
48
  suggestedActionHeight,
49
+ suggestedActionImageHeight,
23
50
  suggestedActionsStackedLayoutButtonMaxHeight,
24
- subtle
51
+ subtle,
52
+
53
+ // Deprecated
54
+ suggestedActionActiveBackground,
55
+ suggestedActionBackground,
56
+ suggestedActionDisabledBackground,
57
+ suggestedActionFocusBackground,
58
+ suggestedActionHoverBackground
25
59
  }: StrictStyleOptions) {
26
60
  return {
27
61
  '&.webchat__suggested-action': {
28
- display: 'flex',
62
+ alignItems: 'center',
63
+ background: suggestedActionBackground, // Deprecated as of 4.15.0. Remove on or after 2021-09-16.
64
+ backgroundColor: suggestedActionBackgroundColor,
65
+ borderColor: suggestedActionBorderColor || accent,
66
+ borderRadius: suggestedActionBorderRadius,
67
+ borderStyle: suggestedActionBorderStyle,
68
+ borderWidth: suggestedActionBorderWidth,
69
+ color: suggestedActionTextColor || accent,
70
+ fontFamily: primaryFont,
71
+ fontSize: 'inherit',
72
+ height: suggestedActionHeight,
73
+ justifyContent: 'center',
29
74
  maxWidth: '100%',
75
+ outline: 0,
76
+ paddingLeft: paddingWide,
77
+ paddingRight: paddingWide,
78
+ position: 'relative',
79
+ whiteSpace: 'nowrap',
80
+ width: '100%',
81
+
82
+ // Order of style preferences (based on effort of user gesture): disabled > active > hover > focus.
83
+ // Keyboard focus indicator styles applied by :focus-visible do not conflict with :active/:hover/:focus, so it is not included here.
84
+ '&:disabled, &[aria-disabled="true"]': {
85
+ background: suggestedActionDisabledBackground,
86
+ backgroundColor: suggestedActionBackgroundColorOnDisabled,
87
+ borderColor: suggestedActionBorderColorOnDisabled,
88
+ borderStyle: suggestedActionBorderStyleOnDisabled,
89
+ borderWidth: suggestedActionBorderWidthOnDisabled,
90
+ color: suggestedActionTextColorOnDisabled || subtle
91
+ },
30
92
 
31
- '& .webchat__suggested-action__button': {
32
- alignItems: 'center',
33
- borderRadius: suggestedActionBorderRadius,
34
- fontFamily: primaryFont,
35
- fontSize: 'inherit',
36
- height: suggestedActionHeight,
37
- justifyContent: 'center',
38
- maxWidth: '100%',
39
- paddingLeft: paddingWide,
40
- paddingRight: paddingWide,
41
- whiteSpace: 'nowrap',
42
- width: '100%',
43
-
44
- '&:disabled, &[aria-disabled="true"]': {
45
- background: suggestedActionDisabledBackground || suggestedActionBackground,
46
- borderColor: suggestedActionDisabledBorderColor,
47
- borderStyle: suggestedActionDisabledBorderStyle,
48
- borderWidth: suggestedActionDisabledBorderWidth,
49
- color: suggestedActionDisabledTextColor || subtle
93
+ '&:not(:disabled):not([aria-disabled="true"])': {
94
+ '&:active': {
95
+ background: suggestedActionActiveBackground,
96
+ backgroundColor: suggestedActionBackgroundColorOnActive,
97
+ borderColor: suggestedActionBorderColorOnActive,
98
+ borderStyle: suggestedActionBorderStyleOnActive,
99
+ borderWidth: suggestedActionBorderWidthOnActive,
100
+ color: suggestedActionTextColorOnActive
50
101
  },
51
102
 
52
- '&:not(:disabled):not([aria-disabled="true"])': {
53
- background: suggestedActionBackground,
54
- borderColor: suggestedActionBorderColor || accent,
55
- borderStyle: suggestedActionBorderStyle,
56
- borderWidth: suggestedActionBorderWidth,
57
- color: suggestedActionTextColor || accent
103
+ '&:not(:active)': {
104
+ '&:hover': {
105
+ background: suggestedActionHoverBackground,
106
+ backgroundColor: suggestedActionBackgroundColorOnHover,
107
+ borderColor: suggestedActionBorderColorOnHover,
108
+ borderStyle: suggestedActionBorderStyleOnHover,
109
+ borderWidth: suggestedActionBorderWidthOnHover,
110
+ color: suggestedActionTextColorOnHover
111
+ },
112
+
113
+ '&:not(:hover)': {
114
+ '&:focus': {
115
+ background: suggestedActionFocusBackground,
116
+ backgroundColor: suggestedActionBackgroundColorOnFocus,
117
+ borderColor: suggestedActionBorderColorOnFocus,
118
+ borderStyle: suggestedActionBorderStyleOnFocus,
119
+ borderWidth: suggestedActionBorderWidthOnFocus,
120
+ color: suggestedActionTextColorOnFocus
121
+ }
122
+ }
58
123
  }
59
124
  },
60
125
 
61
- '& .webchat__suggested-action__image': {
62
- height: suggestedActionImageHeight
126
+ // On unsupported browser, :focus-visible and :not(:focus-visible) is always false.
127
+ // And it will turn the whole CSS selector ":unsupported, .truthy" to false.
128
+ '&:not(:focus-visible) .webchat__suggested-action__keyboard-focus-indicator': {
129
+ display: 'none'
130
+ },
131
+
132
+ '&:not(.webchat__suggested-action--focus-visible) .webchat__suggested-action__keyboard-focus-indicator': {
133
+ display: 'none'
134
+ },
135
+
136
+ '&:not(.webchat__suggested-action--rtl) .webchat__suggested-action__image + .webchat__suggested-action__text': {
137
+ paddingLeft: paddingRegular
138
+ },
139
+
140
+ '&.webchat__suggested-action--rtl .webchat__suggested-action__image + .webchat__suggested-action__text': {
141
+ paddingRight: paddingRegular
63
142
  },
64
143
 
65
- '& .webchat__suggested-action--wrapping': {
144
+ '&.webchat__suggested-action--wrapping': {
66
145
  height: 'auto',
67
146
  maxHeight: suggestedActionsStackedLayoutButtonMaxHeight || '100%',
68
147
  minHeight:
@@ -71,12 +150,20 @@ export default function createSuggestedActionStyle({
71
150
  : suggestedActionHeight
72
151
  },
73
152
 
74
- '&:not(.webchat__suggested-action--rtl) .webchat__suggested-action__image + .webchat__suggested-action__text': {
75
- paddingLeft: paddingRegular
153
+ '& .webchat__suggested-action__image': {
154
+ height: suggestedActionImageHeight
76
155
  },
77
156
 
78
- '&.webchat__suggested-action--rtl .webchat__suggested-action__image + .webchat__suggested-action__text': {
79
- paddingRight: paddingRegular
157
+ '& .webchat__suggested-action__keyboard-focus-indicator': {
158
+ borderColor: suggestedActionKeyboardFocusIndicatorBorderColor,
159
+ borderRadius: suggestedActionKeyboardFocusIndicatorBorderRadius,
160
+ borderStyle: suggestedActionKeyboardFocusIndicatorBorderStyle,
161
+ borderWidth: suggestedActionKeyboardFocusIndicatorBorderWidth,
162
+ bottom: suggestedActionKeyboardFocusIndicatorInset,
163
+ left: suggestedActionKeyboardFocusIndicatorInset,
164
+ position: 'absolute',
165
+ right: suggestedActionKeyboardFocusIndicatorInset,
166
+ top: suggestedActionKeyboardFocusIndicatorInset
80
167
  }
81
168
  }
82
169
  };
@@ -25,7 +25,7 @@ export default function createSuggestedActionsStyle({
25
25
  paddingBottom: paddingRegular / 2,
26
26
  paddingTop: paddingRegular / 2,
27
27
 
28
- '& .webchat__suggested-actions__button': {
28
+ '& .webchat__suggested-actions__item-box': {
29
29
  paddingBottom: paddingRegular / 2,
30
30
  paddingLeft: paddingRegular / 2,
31
31
  paddingRight: paddingRegular / 2,
@@ -113,13 +113,16 @@ export default function createSuggestedActionsStyle({
113
113
  paddingTop: paddingRegular / 2
114
114
  },
115
115
 
116
- '& .webchat__suggested-actions__item': {
116
+ '& .webchat__suggested-actions__flow-item-box': {
117
117
  maxWidth: '100%',
118
118
  overflow: 'hidden' // This is required in IE11
119
119
  },
120
120
 
121
- '& .webchat__suggested-actions__button': {
122
- padding: paddingRegular / 2
121
+ '& .webchat__suggested-actions__item-box': {
122
+ paddingBottom: paddingRegular / 2,
123
+ paddingLeft: paddingRegular / 2,
124
+ paddingRight: paddingRegular / 2,
125
+ paddingTop: paddingRegular / 2
123
126
  }
124
127
  },
125
128
 
@@ -133,7 +136,7 @@ export default function createSuggestedActionsStyle({
133
136
  paddingTop: paddingRegular / 2
134
137
  },
135
138
 
136
- '& .webchat__suggested-actions__button': {
139
+ '& .webchat__suggested-actions__item-box': {
137
140
  paddingBottom: paddingRegular / 2,
138
141
  paddingLeft: paddingRegular / 2,
139
142
  paddingRight: paddingRegular / 2,
@@ -152,6 +155,11 @@ export default function createSuggestedActionsStyle({
152
155
  display: 'flex',
153
156
  whiteSpace: 'normal'
154
157
  }
158
+ },
159
+
160
+ '& .webchat__suggested-actions__item-box': {
161
+ display: 'flex',
162
+ maxWidth: '100%'
155
163
  }
156
164
  }
157
165
  };
@@ -1,4 +1,3 @@
1
- /* eslint-disable complexity */
2
1
  import { normalizeStyleOptions, StyleOptions } from 'botframework-webchat-api';
3
2
 
4
3
  import createActivitiesStyle from './StyleSet/Activities';
@@ -18,6 +17,7 @@ import createErrorNotificationStyle from './StyleSet/ErrorNotification';
18
17
  import createFileContentStyle from './StyleSet/FileContent';
19
18
  import createImageAvatarStyle from './StyleSet/ImageAvatar';
20
19
  import createInitialsAvatarStyle from './StyleSet/InitialsAvatar';
20
+ import createKeyboardHelpStyle from './StyleSet/KeyboardHelp';
21
21
  import createMicrophoneButtonStyle from './StyleSet/MicrophoneButton';
22
22
  import createRootStyle from './StyleSet/Root';
23
23
  import createScrollToEndButtonStyle from './StyleSet/ScrollToEndButton';
@@ -67,6 +67,7 @@ export default function createStyleSet(styleOptions: StyleOptions) {
67
67
  fileContent: createFileContentStyle(strictStyleOptions),
68
68
  imageAvatar: createImageAvatarStyle(strictStyleOptions),
69
69
  initialsAvatar: createInitialsAvatarStyle(strictStyleOptions),
70
+ keyboardHelp: createKeyboardHelpStyle(strictStyleOptions),
70
71
  microphoneButton: createMicrophoneButtonStyle(strictStyleOptions),
71
72
  options: { ...strictStyleOptions }, // Cloned to make sure no additional modifications will propagate up.
72
73
  root: createRootStyle(strictStyleOptions),
@@ -1,3 +1,5 @@
1
+ import { isForbiddenPropertyName } from 'botframework-webchat-core';
2
+
1
3
  export default function mirrorStyle(mirrorSelector, styles) {
2
4
  const mirrored = {};
3
5
 
@@ -7,8 +9,14 @@ export default function mirrorStyle(mirrorSelector, styles) {
7
9
  match === 'Left' ? 'Right' : match === 'left' ? 'right' : match === 'Right' ? 'Left' : 'left'
8
10
  );
9
11
 
10
- mirrored[patchedKey] = value;
11
- } else {
12
+ if (!isForbiddenPropertyName(patchedKey)) {
13
+ // Mitigated through denylisting.
14
+ // eslint-disable-next-line security/detect-object-injection
15
+ mirrored[patchedKey] = value;
16
+ }
17
+ } else if (!isForbiddenPropertyName(key)) {
18
+ // Mitigated through denylisting.
19
+ // eslint-disable-next-line security/detect-object-injection
12
20
  mirrored[key] = mirrorStyle('', value);
13
21
  }
14
22
  }
@@ -1,4 +1,5 @@
1
1
  import { hooks } from 'botframework-webchat-api';
2
+ import { isForbiddenPropertyName } from 'botframework-webchat-core';
2
3
  import PropTypes from 'prop-types';
3
4
  import React from 'react';
4
5
 
@@ -17,7 +18,9 @@ const NotificationIcon = ({ className, level }) => {
17
18
  warn: localize('TOAST_ALT_WARN')
18
19
  };
19
20
 
20
- const prefix = prefixes[level] || '';
21
+ // Mitigated through denylisting.
22
+ // eslint-disable-next-line security/detect-object-injection
23
+ const prefix = (!isForbiddenPropertyName(level) && prefixes[level]) || '';
21
24
 
22
25
  return (
23
26
  <React.Fragment>