botframework-webchat-fluent-theme 4.18.1-main.20250207.d769574 → 4.18.1-main.20250305.e998c56

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botframework-webchat-fluent-theme",
3
- "version": "4.18.1-main.20250207.d769574",
3
+ "version": "4.18.1-main.20250305.e998c56",
4
4
  "description": "Fluent theme for Bot Framework Web Chat",
5
5
  "main": "./dist/botframework-webchat-fluent-theme.js",
6
6
  "types": "./dist/botframework-webchat-fluent-theme.d.ts",
@@ -61,27 +61,31 @@
61
61
  "@types/react": [
62
62
  "16",
63
63
  "react@16.8.6 is our baseline"
64
+ ],
65
+ "valibot": [
66
+ "0",
67
+ "valibot@0 until they finalize @1"
64
68
  ]
65
69
  },
66
70
  "devDependencies": {
67
71
  "@tsconfig/strictest": "^2.0.5",
68
72
  "@types/math-random": "^1.0.2",
69
- "@types/node": "^20.12.11",
70
- "@types/react": "^16.14.60",
71
- "botframework-webchat-base": "4.18.1-main.20250207.d769574",
72
- "botframework-webchat-styles": "4.18.1-main.20250207.d769574",
73
- "tsup": "^8.0.2",
74
- "typescript": "^5.4.5"
73
+ "@types/node": "^22.13.4",
74
+ "@types/react": "^16.14.62",
75
+ "botframework-webchat-base": "4.18.1-main.20250305.e998c56",
76
+ "botframework-webchat-styles": "4.18.1-main.20250305.e998c56",
77
+ "tsup": "^8.3.6",
78
+ "typescript": "^5.7.3"
75
79
  },
76
80
  "dependencies": {
77
- "botframework-webchat-api": "4.18.1-main.20250207.d769574",
78
- "botframework-webchat-component": "4.18.1-main.20250207.d769574",
79
- "botframework-webchat-core": "4.18.1-main.20250207.d769574",
81
+ "botframework-webchat-api": "4.18.1-main.20250305.e998c56",
82
+ "botframework-webchat-component": "4.18.1-main.20250305.e998c56",
83
+ "botframework-webchat-core": "4.18.1-main.20250305.e998c56",
80
84
  "classnames": "2.5.1",
81
85
  "inject-meta-tag": "0.0.1",
82
86
  "math-random": "2.0.1",
83
87
  "use-ref-from": "0.1.0",
84
- "valibot": "^0.37.0"
88
+ "valibot": "0.42.1"
85
89
  },
86
90
  "peerDependencies": {
87
91
  "react": ">= 16.8.6"
@@ -145,6 +145,12 @@
145
145
  &:has(:global(.border-loader)) {
146
146
  width: 100%;
147
147
  }
148
+
149
+ /* Ensure activity loader doesn't have bubble and shadow */
150
+ &:has(:global(.activity-loader)) :global(.webchat__bubble__content) {
151
+ background: transparent;
152
+ box-shadow: none;
153
+ }
148
154
  }
149
155
 
150
156
  /* Message bubble content */
@@ -0,0 +1,10 @@
1
+ :global(.webchat-fluent) .activity-loader {
2
+ flex: none;
3
+ height: 8px;
4
+ margin: var(--webchat-spacingHorizontalM) 0 0 18px;
5
+ width: auto;
6
+
7
+ &.variant-fluent {
8
+ margin: 0 0 var(--webchat-spacingHorizontalM) var(--webchat-spacingVerticalSNudge);
9
+ }
10
+ }
@@ -0,0 +1,27 @@
1
+ import { useStyles } from 'botframework-webchat-styles/react';
2
+ import cx from 'classnames';
3
+ import React, { Fragment, memo, type ReactNode } from 'react';
4
+
5
+ import { useVariantClassName } from '../../styles';
6
+ import styles from './ActivityLoader.module.css';
7
+
8
+ const loadingAnimationUrl =
9
+ 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MDAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCA0MDAgMjAiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjAiIHgyPSIxMDAlIiB5MT0iMCIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAlIj48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJzdG9wLWNvbG9yIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iI2FkNWFlMTsjYWQ1YWUxOyMwRTk0RTE7IzBFOTRFMTsjNjY5ZmMyOyM2NjlmYzI7I2FkNWFlMSIvPjwvc3RvcD48c3RvcCBvZmZzZXQ9IjUwJSI+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ic3RvcC1jb2xvciIgZHVyPSIycyIga2V5VGltZXM9IjA7MC4yOzAuMzM7MC41OzAuNjY7MC44OzEiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IiNlOTYxOGQ7I2U5NjE4ZDsjNTdBQjgyOyM1N0FCODI7IzYzNzdlMDsjNjM3N2UwOyNlOTYxOGQiLz48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxMDAlIj48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJzdG9wLWNvbG9yIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iI2ZkOWU1ZjsjZmQ5ZTVmOyNDNkMyMjU7I0M2QzIyNTsjOWI4MGVjOyM5YjgwZWM7I2ZkOWU1ZiIvPjwvc3RvcD48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyBmaWxsPSJ1cmwoI2EpIj48cmVjdCBoZWlnaHQ9IjIwIiByeD0iMTAiPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IngiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuNTswLjY2OzEiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IjI2OzI2OzA7MCIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IndpZHRoIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIyMDsyMDszMDszMDsyMDsyMCIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9Im9wYWNpdHkiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuNTswLjY2OzEiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IjE7MTswOzAiLz48L3JlY3Q+PHJlY3QgaGVpZ2h0PSIyMCIgcng9IjEwIj48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJ4IiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iNjI7NjI7NzI7NzI7MjY7MjY7MCIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IndpZHRoIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iMTA0OzEwNDsyMDsyMDs3MDs3MDsyMCIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9Im9wYWNpdHkiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuODsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIxOzE7MCIvPjwvcmVjdD48cmVjdCBoZWlnaHQ9IjIwIiByeD0iMTAiPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IngiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuMjswLjMzOzAuNTswLjY2OzAuODsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIxODI7MTgyOzEwODsxMDg7MTEyOzExMjsyNiIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IndpZHRoIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIyMDsyMDs2MDs2MDsyMDsyMCIvPjwvcmVjdD48cmVjdCBoZWlnaHQ9IjIwIiByeD0iMTAiPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IngiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuMjswLjMzOzAuNTswLjY2OzAuODsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIyMTg7MjE4OzE4NDsxODQ7MTQ4OzE0ODs2MiIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IndpZHRoIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iNjA7NjA7ODA7ODA7NDA7NDA7MTA0Ii8+PC9yZWN0PjxyZWN0IGhlaWdodD0iMjAiIHJ4PSIxMCI+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ieCIgZHVyPSIycyIga2V5VGltZXM9IjA7MC4yOzAuMzM7MC41OzAuNjY7MC44OzEiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IjI5NDsyOTQ7MjgwOzI4MDsyMDQ7MjA0OzE4MiIvPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IndpZHRoIiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iNDA7NDA7MjA7MjA7ODA7ODA7MjAiLz48L3JlY3Q+PHJlY3QgaGVpZ2h0PSIyMCIgcng9IjEwIj48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJ4IiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iMzUwOzM1MDszMTY7MzE2OzMwMDszMDA7MjE4Ii8+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0id2lkdGgiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuMjswLjMzOzAuNTswLjY2OzAuODsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIyMDsyMDs2MDs2MDsyMDsyMDs2MCIvPjwvcmVjdD48cmVjdCBoZWlnaHQ9IjIwIiByeD0iMTAiPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9IngiIGR1cj0iMnMiIGtleVRpbWVzPSIwOzAuMjswLjMzOzAuNTswLjY2OzAuODsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIzODY7Mzg2OzM5MjszOTI7MzM2OzMzNjsyOTQiLz48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJ3aWR0aCIgZHVyPSIycyIga2V5VGltZXM9IjA7MC41OzAuNjY7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iMjA7MjA7NDA7NDAiLz48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJvcGFjaXR5IiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjU7MC42NjsxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIwOzA7MTsxIi8+PC9yZWN0PjxyZWN0IHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgcng9IjEwIj48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJ4IiBkdXI9IjJzIiBrZXlUaW1lcz0iMDswLjI7MC4zMzswLjU7MC42NjswLjg7MSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iNDIyOzQyMjs0Mjg7NDI4OzM5MjszOTI7MzUwIi8+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ib3BhY2l0eSIgZHVyPSIycyIga2V5VGltZXM9IjA7MC44OzEiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IjA7MDsxIi8+PC9yZWN0PjwvZz48L3N2Zz4=';
10
+
11
+ function FluentActivityLoader({ children }: Readonly<{ children?: ReactNode | undefined }>) {
12
+ const classNames = useStyles(styles);
13
+ const variantClassName = useVariantClassName(classNames);
14
+ return (
15
+ <Fragment>
16
+ {children}
17
+ <img
18
+ alt=""
19
+ className={cx(classNames['activity-loader'], variantClassName)}
20
+ role="presentation"
21
+ src={loadingAnimationUrl}
22
+ />
23
+ </Fragment>
24
+ );
25
+ }
26
+
27
+ export default memo(FluentActivityLoader);
@@ -1,9 +1,11 @@
1
1
  import { type ActivityMiddleware, type StyleOptions } from 'botframework-webchat-api';
2
+ import { DecoratorComposer, DecoratorMiddleware } from 'botframework-webchat-api/decorator';
2
3
  import { Components } from 'botframework-webchat-component';
3
4
  import { WebChatDecorator } from 'botframework-webchat-component/decorator';
4
5
  import React, { memo, type ReactNode } from 'react';
5
6
 
6
7
  import { ActivityDecorator } from '../components/activity';
8
+ import ActivityLoader from '../components/activity/ActivityLoader';
7
9
  import { isPreChatMessageActivity, PreChatMessageActivity } from '../components/preChatActivity';
8
10
  import { PrimarySendBox } from '../components/sendBox';
9
11
  import { TelephoneKeypadProvider } from '../components/telephoneKeypad';
@@ -41,6 +43,12 @@ const activityMiddleware: readonly ActivityMiddleware[] = Object.freeze([
41
43
 
42
44
  const sendBoxMiddleware = [() => () => () => PrimarySendBox];
43
45
 
46
+ const decoratorMiddleware: DecoratorMiddleware[] = [
47
+ init =>
48
+ init === 'activity border' &&
49
+ (next => request => (request.livestreamingState === 'preparing' ? ActivityLoader : next(request)))
50
+ ];
51
+
44
52
  const styles = createStyles();
45
53
 
46
54
  const fluentStyleOptions: StyleOptions = Object.freeze({
@@ -57,7 +65,9 @@ const FluentThemeProvider = ({ children, variant = 'fluent' }: Props) => (
57
65
  styleOptions={fluentStyleOptions}
58
66
  styles={styles}
59
67
  >
60
- <WebChatDecorator>{children}</WebChatDecorator>
68
+ <WebChatDecorator>
69
+ <DecoratorComposer middleware={decoratorMiddleware}>{children}</DecoratorComposer>
70
+ </WebChatDecorator>
61
71
  </ThemeProvider>
62
72
  </TelephoneKeypadProvider>
63
73
  </WebChatTheme>