@memori.ai/memori-react 4.2.0 → 4.3.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 (44) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/components/ExpertsDrawer/ExpertsDrawer.css +67 -0
  3. package/dist/components/ExpertsDrawer/ExpertsDrawer.d.ts +11 -0
  4. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +20 -0
  5. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -0
  6. package/dist/components/Header/Header.css +4 -0
  7. package/dist/components/Header/Header.d.ts +1 -0
  8. package/dist/components/Header/Header.js +3 -2
  9. package/dist/components/Header/Header.js.map +1 -1
  10. package/dist/components/MemoriWidget/MemoriWidget.js +4 -1
  11. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  12. package/dist/locales/en.json +3 -0
  13. package/dist/locales/it.json +3 -0
  14. package/dist/styles.css +1 -0
  15. package/esm/components/ExpertsDrawer/ExpertsDrawer.css +67 -0
  16. package/esm/components/ExpertsDrawer/ExpertsDrawer.d.ts +11 -0
  17. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +17 -0
  18. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -0
  19. package/esm/components/Header/Header.css +4 -0
  20. package/esm/components/Header/Header.d.ts +1 -0
  21. package/esm/components/Header/Header.js +3 -2
  22. package/esm/components/Header/Header.js.map +1 -1
  23. package/esm/components/MemoriWidget/MemoriWidget.js +4 -1
  24. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  25. package/esm/locales/en.json +3 -0
  26. package/esm/locales/it.json +3 -0
  27. package/esm/styles.css +1 -0
  28. package/package.json +1 -1
  29. package/src/components/ExpertsDrawer/ExpertsDrawer.css +67 -0
  30. package/src/components/ExpertsDrawer/ExpertsDrawer.stories.tsx +54 -0
  31. package/src/components/ExpertsDrawer/ExpertsDrawer.test.tsx +53 -0
  32. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +70 -0
  33. package/src/components/ExpertsDrawer/__snapshots__/ExpertsDrawer.test.tsx.snap +11 -0
  34. package/src/components/Header/Header.css +4 -0
  35. package/src/components/Header/Header.stories.tsx +39 -0
  36. package/src/components/Header/Header.test.tsx +58 -0
  37. package/src/components/Header/Header.tsx +14 -0
  38. package/src/components/Header/__snapshots__/Header.test.tsx.snap +171 -0
  39. package/src/components/MemoriWidget/MemoriWidget.tsx +14 -0
  40. package/src/index.stories.tsx +17 -1
  41. package/src/locales/en.json +3 -0
  42. package/src/locales/it.json +3 -0
  43. package/src/mocks/data.ts +14 -0
  44. package/src/styles.css +1 -0
@@ -0,0 +1,67 @@
1
+ .memori--experts-drawer {
2
+ z-index: 1000;
3
+ }
4
+
5
+ .memori--experts-drawer .memori-drawer--panel {
6
+ --memori-drawer--width: 100%;
7
+ --memori-drawer--width--md: 60%;
8
+ --memori-drawer--width--lg: 40%;
9
+ }
10
+
11
+ h2.memori--experts-drawer--title {
12
+ margin: 0;
13
+ font-size: inherit;
14
+ font-weight: 400;
15
+ line-height: inherit;
16
+ }
17
+
18
+ ul.memori--experts-drawer--list {
19
+ padding: 0;
20
+ margin: 0;
21
+ list-style: none;
22
+ }
23
+
24
+ li.memori--experts-drawer--item {
25
+ display: flex;
26
+ flex-wrap: nowrap;
27
+ align-items: center;
28
+ margin-top: 1rem;
29
+ margin-bottom: 1rem;
30
+ }
31
+
32
+ figure.memori--experts-drawer--avatar {
33
+ display: flex;
34
+ overflow: hidden;
35
+ width: 1.5rem;
36
+ height: 1.5rem;
37
+ align-items: center;
38
+ justify-content: center;
39
+ border-radius: 50%;
40
+ margin: 0 0.5rem 0 0;
41
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
42
+ }
43
+
44
+ figure.memori--experts-drawer--avatar img {
45
+ min-width: 100%;
46
+ min-height: 100%;
47
+ object-fit: cover;
48
+ object-position: center;
49
+ }
50
+
51
+ .memori--experts-drawer--content {
52
+ flex: 1;
53
+ }
54
+
55
+ h3.memori--experts-drawer--name {
56
+ margin: 0;
57
+ font-size: 0.875rem;
58
+ font-weight: 400;
59
+ line-height: 1.25rem;
60
+ }
61
+
62
+ p.memori--experts-drawer--description {
63
+ margin: 0;
64
+ font-size: 0.75rem;
65
+ font-weight: 400;
66
+ line-height: 1rem;
67
+ }
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ import { Meta, Story } from '@storybook/react';
3
+ import I18nWrapper from '../../I18nWrapper';
4
+ import ExpertsDrawer, { Props } from './ExpertsDrawer';
5
+ import { tenant, expertReference } from '../../mocks/data';
6
+ import './ExpertsDrawer.css';
7
+
8
+ const meta: Meta = {
9
+ title: 'Widget/ExpertsDrawer',
10
+ component: ExpertsDrawer,
11
+ argTypes: {
12
+ open: {
13
+ control: {
14
+ type: 'boolean',
15
+ },
16
+ },
17
+ },
18
+ parameters: {
19
+ controls: { expanded: true },
20
+ },
21
+ };
22
+
23
+ export default meta;
24
+
25
+ const Template: Story<Props> = args => {
26
+ return (
27
+ <I18nWrapper>
28
+ <ExpertsDrawer
29
+ {...args}
30
+ baseUrl="https://app.twincreator.com"
31
+ apiUrl="https://backend.memori.ai"
32
+ tenant={tenant}
33
+ experts={[
34
+ expertReference,
35
+ {
36
+ ...expertReference,
37
+ expertID: '2',
38
+ name: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
39
+ description:
40
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
41
+ },
42
+ ]}
43
+ />
44
+ </I18nWrapper>
45
+ );
46
+ };
47
+
48
+ // By passing using the Args format for exported stories, you can control the props for a component for reuse in a test
49
+ // https://storybook.js.org/docs/react/workflows/unit-testing
50
+ export const Default = Template.bind({});
51
+ Default.args = {
52
+ open: true,
53
+ onClose: () => {},
54
+ };
@@ -0,0 +1,53 @@
1
+ import { render } from '@testing-library/react';
2
+ import ExpertsDrawer from './ExpertsDrawer';
3
+ import React from 'react';
4
+ import { tenant, expertReference } from '../../mocks/data';
5
+
6
+ beforeEach(() => {
7
+ // @ts-ignore
8
+ window.IntersectionObserver = jest.fn(() => ({
9
+ observe: jest.fn(),
10
+ unobserve: jest.fn(),
11
+ disconnect: jest.fn(),
12
+ takeRecords: jest.fn(),
13
+ }));
14
+ });
15
+
16
+ it('renders ExpertsDrawer unchanged', () => {
17
+ const { container } = render(
18
+ <ExpertsDrawer
19
+ onClose={jest.fn()}
20
+ baseUrl="https://app.twincreator.com"
21
+ apiUrl="https://backend.memori.ai"
22
+ tenant={tenant}
23
+ experts={[
24
+ expertReference,
25
+ {
26
+ ...expertReference,
27
+ expertID: '2',
28
+ },
29
+ ]}
30
+ />
31
+ );
32
+ expect(container).toMatchSnapshot();
33
+ });
34
+
35
+ it('renders ExpertsDrawer open unchanged', () => {
36
+ const { container } = render(
37
+ <ExpertsDrawer
38
+ open
39
+ onClose={jest.fn()}
40
+ baseUrl="https://app.twincreator.com"
41
+ apiUrl="https://backend.memori.ai"
42
+ tenant={tenant}
43
+ experts={[
44
+ expertReference,
45
+ {
46
+ ...expertReference,
47
+ expertID: '2',
48
+ },
49
+ ]}
50
+ />
51
+ );
52
+ expect(container).toMatchSnapshot();
53
+ });
@@ -0,0 +1,70 @@
1
+ import {
2
+ ExpertReference,
3
+ Tenant,
4
+ } from '@memori.ai/memori-api-client/dist/types';
5
+ import Drawer from '../ui/Drawer';
6
+ import { useTranslation } from 'react-i18next';
7
+ import { getResourceUrl } from '../../helpers/media';
8
+
9
+ export interface Props {
10
+ experts: ExpertReference[];
11
+ baseUrl: string;
12
+ apiUrl: string;
13
+ tenant?: Tenant;
14
+ open?: boolean;
15
+ onClose: () => void;
16
+ }
17
+
18
+ const ExpertsDrawer = ({
19
+ open = false,
20
+ baseUrl,
21
+ apiUrl,
22
+ tenant,
23
+ experts,
24
+ onClose,
25
+ }: Props) => {
26
+ const { t } = useTranslation();
27
+
28
+ return (
29
+ <Drawer
30
+ open={open}
31
+ onClose={onClose}
32
+ className="memori--experts-drawer"
33
+ title={
34
+ <h2 className="memori--experts-drawer--title">
35
+ {t('widget.expertsInTheBoard')}
36
+ </h2>
37
+ }
38
+ >
39
+ <ul className="memori--experts-drawer--list">
40
+ {experts.map(expert => (
41
+ <li key={expert.expertID} className="memori--experts-drawer--item">
42
+ <figure className="memori--experts-drawer--avatar">
43
+ <img
44
+ src={`${apiUrl}/api/v1/memoriai/memori/avatar/${expert.expertMemoriID}`}
45
+ alt={expert.name}
46
+ onError={e => {
47
+ e.currentTarget.src = getResourceUrl({
48
+ tenantID: tenant?.id,
49
+ type: 'avatar',
50
+ baseURL: baseUrl,
51
+ });
52
+
53
+ e.currentTarget.onerror = null;
54
+ }}
55
+ />
56
+ </figure>
57
+ <div className="memori--experts-drawer--content">
58
+ <h3 className="memori--experts-drawer--name">{expert.name}</h3>
59
+ <p className="memori--experts-drawer--description">
60
+ {expert.description}
61
+ </p>
62
+ </div>
63
+ </li>
64
+ ))}
65
+ </ul>
66
+ </Drawer>
67
+ );
68
+ };
69
+
70
+ export default ExpertsDrawer;
@@ -0,0 +1,11 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`renders ExpertsDrawer open unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
7
+ />
8
+ </div>
9
+ `;
10
+
11
+ exports[`renders ExpertsDrawer unchanged 1`] = `<div />`;
@@ -43,6 +43,10 @@
43
43
  line-height: 1;
44
44
  }
45
45
 
46
+ .memori-header--button.memori-header--button--experts svg {
47
+ fill: #fff;
48
+ }
49
+
46
50
  .memori-header--position {
47
51
  display: inline-block;
48
52
  }
@@ -28,6 +28,7 @@ const Template: Story<Props> = args => {
28
28
  const [speakerMuted, setSpeakerMuted] = React.useState(args.speakerMuted);
29
29
  const [showSettingsDrawer, setShowSettingsDrawer] = React.useState(false);
30
30
  const [showKnownFactsDrawer, setShowKnownFactsDrawer] = React.useState(false);
31
+ const [showExpertsDrawer, setShowExpertsDrawer] = React.useState(false);
31
32
  const [continuousSpeech, setContinuousSpeech] = React.useState(true);
32
33
  const [continuousSpeechTimeout, setContinuousSpeechTimeout] =
33
34
  React.useState(2);
@@ -41,6 +42,7 @@ const Template: Story<Props> = args => {
41
42
  showSettings
42
43
  setShowSettingsDrawer={() => setShowSettingsDrawer(true)}
43
44
  setShowKnownFactsDrawer={() => setShowKnownFactsDrawer(true)}
45
+ setShowExpertsDrawer={() => setShowExpertsDrawer(true)}
44
46
  />
45
47
  <SettingsDrawer
46
48
  open={!!showSettingsDrawer}
@@ -194,3 +196,40 @@ WithDeepThoughtEnabledAndOngoingChat.args = {
194
196
  sessionID: '1234',
195
197
  loginToken: 'abcd',
196
198
  };
199
+
200
+ export const ForBoardOfExperts = Template.bind({});
201
+ ForBoardOfExperts.args = {
202
+ memori: {
203
+ ...memori,
204
+ enableBoardOfExperts: true,
205
+ },
206
+ history,
207
+ setShowPositionDrawer: () => {},
208
+ setShowSettingsDrawer: () => {},
209
+ showExperts: true,
210
+ clearHistory: () => {},
211
+ speakerMuted: false,
212
+ hasUserActivatedSpeak: false,
213
+ showShare: false,
214
+ showSettings: false,
215
+ loginToken: 'abcd',
216
+ };
217
+
218
+ export const ForBoardOfExpertsAndOngoingChat = Template.bind({});
219
+ ForBoardOfExpertsAndOngoingChat.args = {
220
+ memori: {
221
+ ...memori,
222
+ enableBoardOfExperts: true,
223
+ },
224
+ history,
225
+ setShowPositionDrawer: () => {},
226
+ setShowSettingsDrawer: () => {},
227
+ showExperts: true,
228
+ clearHistory: () => {},
229
+ speakerMuted: false,
230
+ hasUserActivatedSpeak: true,
231
+ showShare: false,
232
+ showSettings: false,
233
+ sessionID: '1234',
234
+ loginToken: 'abcd',
235
+ };
@@ -11,6 +11,7 @@ it('renders Header unchanged', () => {
11
11
  setShowPositionDrawer={jest.fn()}
12
12
  setShowSettingsDrawer={jest.fn()}
13
13
  setShowKnownFactsDrawer={jest.fn()}
14
+ setShowExpertsDrawer={jest.fn()}
14
15
  speakerMuted={false}
15
16
  setSpeakerMuted={jest.fn()}
16
17
  hasUserActivatedSpeak={false}
@@ -38,6 +39,7 @@ it('renders Header with position unchanged', () => {
38
39
  setShowPositionDrawer={jest.fn()}
39
40
  setShowSettingsDrawer={jest.fn()}
40
41
  setShowKnownFactsDrawer={jest.fn()}
42
+ setShowExpertsDrawer={jest.fn()}
41
43
  speakerMuted={false}
42
44
  setSpeakerMuted={jest.fn()}
43
45
  hasUserActivatedSpeak={false}
@@ -57,6 +59,7 @@ it('renders Header with speaker muted unchanged', () => {
57
59
  setShowPositionDrawer={jest.fn()}
58
60
  setShowSettingsDrawer={jest.fn()}
59
61
  setShowKnownFactsDrawer={jest.fn()}
62
+ setShowExpertsDrawer={jest.fn()}
60
63
  speakerMuted={true}
61
64
  setSpeakerMuted={jest.fn()}
62
65
  hasUserActivatedSpeak={false}
@@ -76,6 +79,7 @@ it('renders Header with share button unchanged', () => {
76
79
  setShowPositionDrawer={jest.fn()}
77
80
  setShowSettingsDrawer={jest.fn()}
78
81
  setShowKnownFactsDrawer={jest.fn()}
82
+ setShowExpertsDrawer={jest.fn()}
79
83
  speakerMuted={false}
80
84
  setSpeakerMuted={jest.fn()}
81
85
  hasUserActivatedSpeak={false}
@@ -95,6 +99,7 @@ it('renders Header with settings button unchanged', () => {
95
99
  setShowPositionDrawer={jest.fn()}
96
100
  setShowSettingsDrawer={jest.fn()}
97
101
  setShowKnownFactsDrawer={jest.fn()}
102
+ setShowExpertsDrawer={jest.fn()}
98
103
  speakerMuted={false}
99
104
  setSpeakerMuted={jest.fn()}
100
105
  hasUserActivatedSpeak={false}
@@ -114,6 +119,7 @@ it('renders Header with clear button unchanged', () => {
114
119
  setShowPositionDrawer={jest.fn()}
115
120
  setShowSettingsDrawer={jest.fn()}
116
121
  setShowKnownFactsDrawer={jest.fn()}
122
+ setShowExpertsDrawer={jest.fn()}
117
123
  speakerMuted={false}
118
124
  setSpeakerMuted={jest.fn()}
119
125
  hasUserActivatedSpeak={false}
@@ -134,6 +140,7 @@ it('renders Header with user activated speak unchanged', () => {
134
140
  setShowPositionDrawer={jest.fn()}
135
141
  setShowSettingsDrawer={jest.fn()}
136
142
  setShowKnownFactsDrawer={jest.fn()}
143
+ setShowExpertsDrawer={jest.fn()}
137
144
  speakerMuted={false}
138
145
  setSpeakerMuted={jest.fn()}
139
146
  hasUserActivatedSpeak={true}
@@ -156,6 +163,7 @@ it('renders Header with deep thought unchanged', () => {
156
163
  setShowPositionDrawer={jest.fn()}
157
164
  setShowSettingsDrawer={jest.fn()}
158
165
  setShowKnownFactsDrawer={jest.fn()}
166
+ setShowExpertsDrawer={jest.fn()}
159
167
  speakerMuted={false}
160
168
  setSpeakerMuted={jest.fn()}
161
169
  hasUserActivatedSpeak={false}
@@ -179,6 +187,56 @@ it('renders Header with deep thought and session open unchanged', () => {
179
187
  setShowPositionDrawer={jest.fn()}
180
188
  setShowSettingsDrawer={jest.fn()}
181
189
  setShowKnownFactsDrawer={jest.fn()}
190
+ setShowExpertsDrawer={jest.fn()}
191
+ speakerMuted={false}
192
+ setSpeakerMuted={jest.fn()}
193
+ hasUserActivatedSpeak={true}
194
+ showShare={false}
195
+ showSettings={false}
196
+ clearHistory={jest.fn()}
197
+ sessionID="1234"
198
+ loginToken="abcd"
199
+ />
200
+ );
201
+ expect(container).toMatchSnapshot();
202
+ });
203
+
204
+ it('renders Header for board of experts unchanged', () => {
205
+ const { container } = render(
206
+ <Header
207
+ memori={{
208
+ ...memori,
209
+ enableBoardOfExperts: true,
210
+ }}
211
+ history={history}
212
+ setShowPositionDrawer={jest.fn()}
213
+ setShowSettingsDrawer={jest.fn()}
214
+ setShowKnownFactsDrawer={jest.fn()}
215
+ setShowExpertsDrawer={jest.fn()}
216
+ speakerMuted={false}
217
+ setSpeakerMuted={jest.fn()}
218
+ hasUserActivatedSpeak={false}
219
+ showShare={false}
220
+ showSettings={false}
221
+ clearHistory={jest.fn()}
222
+ loginToken="abcd"
223
+ />
224
+ );
225
+ expect(container).toMatchSnapshot();
226
+ });
227
+
228
+ it('renders Header for board of experts with session open unchanged', () => {
229
+ const { container } = render(
230
+ <Header
231
+ memori={{
232
+ ...memori,
233
+ enableBoardOfExperts: true,
234
+ }}
235
+ history={history}
236
+ setShowPositionDrawer={jest.fn()}
237
+ setShowSettingsDrawer={jest.fn()}
238
+ setShowKnownFactsDrawer={jest.fn()}
239
+ setShowExpertsDrawer={jest.fn()}
182
240
  speakerMuted={false}
183
241
  setSpeakerMuted={jest.fn()}
184
242
  hasUserActivatedSpeak={true}
@@ -19,6 +19,7 @@ import Fullscreen from '../icons/Fullscreen';
19
19
  import Refresh from '../icons/Refresh';
20
20
  import Clear from '../icons/Clear';
21
21
  import DeepThought from '../icons/DeepThought';
22
+ import Group from '../icons/Group';
22
23
 
23
24
  export interface Props {
24
25
  className?: string;
@@ -29,6 +30,7 @@ export interface Props {
29
30
  setShowPositionDrawer: (show: boolean) => void;
30
31
  setShowSettingsDrawer: (show: boolean) => void;
31
32
  setShowKnownFactsDrawer: (show: boolean) => void;
33
+ setShowExpertsDrawer: (show: boolean) => void;
32
34
  speakerMuted: boolean;
33
35
  setSpeakerMuted: (mute: boolean) => void;
34
36
  hasUserActivatedSpeak?: boolean;
@@ -51,6 +53,7 @@ const Header: React.FC<Props> = ({
51
53
  setShowPositionDrawer,
52
54
  setShowSettingsDrawer,
53
55
  setShowKnownFactsDrawer,
56
+ setShowExpertsDrawer,
54
57
  speakerMuted,
55
58
  setSpeakerMuted,
56
59
  hasUserActivatedSpeak = false,
@@ -142,6 +145,17 @@ const Header: React.FC<Props> = ({
142
145
  title={t('knownFacts.title') || 'Known facts'}
143
146
  />
144
147
  )}
148
+ {memori.enableBoardOfExperts && (
149
+ <Button
150
+ primary
151
+ shape="circle"
152
+ icon={<Group />}
153
+ className="memori-header--button memori-header--button--experts"
154
+ disabled={!hasUserActivatedSpeak || !sessionID}
155
+ onClick={() => setShowExpertsDrawer(true)}
156
+ title={t('widget.showExpertsInTheBoard') || 'Experts in this board'}
157
+ />
158
+ )}
145
159
  {showSpeaker && (
146
160
  <Button
147
161
  primary
@@ -1,5 +1,176 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`renders Header for board of experts unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ class="memori-header"
7
+ >
8
+ <button
9
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--experts"
10
+ disabled=""
11
+ title="widget.showExpertsInTheBoard"
12
+ >
13
+ <span
14
+ class="memori-button--icon"
15
+ >
16
+ <svg
17
+ aria-hidden="true"
18
+ fill="none"
19
+ focusable="false"
20
+ height="16"
21
+ role="img"
22
+ stroke="currentColor"
23
+ stroke-linecap="round"
24
+ stroke-linejoin="round"
25
+ stroke-width="2"
26
+ viewBox="0 0 640 512"
27
+ width="20"
28
+ xmlns="http://www.w3.org/2000/svg"
29
+ >
30
+ <path
31
+ d="M211.2 96a64 64 0 10-128 0 64 64 0 10128 0zM32 256c0 17.7 14.3 32 32 32h85.6c10.1-39.4 38.6-71.5 75.8-86.6-9.7-6-21.2-9.4-33.4-9.4H96c-35.3 0-64 28.7-64 64zm461.6 32H576c17.7 0 32-14.3 32-32 0-35.3-28.7-64-64-64h-96c-11.7 0-22.7 3.1-32.1 8.6 38.1 14.8 67.4 47.3 77.7 87.4zm-102.4-61.6c-6.9-1.6-14.2-2.4-21.6-2.4h-96c-8.5 0-16.7 1.1-24.5 3.1-30.8 8.1-55.6 31.1-66.1 60.9-3.5 10-5.5 20.8-5.5 32 0 17.7 14.3 32 32 32h224c17.7 0 32-14.3 32-32 0-11.2-1.9-22-5.5-32-10.8-30.7-36.8-54.2-68.9-61.6zM563.2 96a64 64 0 10-128 0 64 64 0 10128 0zm-241.6 96a80 80 0 100-160 80 80 0 100 160zM32 416c-17.7 0-32 14.3-32 32s14.3 32 32 32h576c17.7 0 32-14.3 32-32s-14.3-32-32-32H32z"
32
+ />
33
+ </svg>
34
+ </span>
35
+ </button>
36
+ <button
37
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--speaker"
38
+ title="widget.sound"
39
+ >
40
+ <span
41
+ class="memori-button--icon"
42
+ >
43
+ <svg
44
+ aria-hidden="true"
45
+ focusable="false"
46
+ role="img"
47
+ viewBox="0 0 1024 1024"
48
+ xmlns="http://www.w3.org/2000/svg"
49
+ >
50
+ <path
51
+ d="M625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582zm348-327H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zm-41.9 261.8l-110.3-63.7a15.9 15.9 0 00-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0021.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0021.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 00-21.7-5.9L746 287.8a15.99 15.99 0 00-5.8 21.8L760 344z"
52
+ />
53
+ </svg>
54
+ </span>
55
+ </button>
56
+ <div
57
+ class="memori-export-history-button memori-header--button memori-header--button--export"
58
+ data-headlessui-state=""
59
+ title="write_and_speak.exportChatHistoryMessage"
60
+ >
61
+ <button
62
+ class="memori-button memori-button--circle memori-button--icon-only memori-button--disabled"
63
+ data-headlessui-state=""
64
+ disabled=""
65
+ id="headlessui-popover-button-:r1f:"
66
+ type="button"
67
+ >
68
+ <div
69
+ class="memori-button--icon"
70
+ >
71
+ <svg
72
+ aria-hidden="true"
73
+ focusable="false"
74
+ role="img"
75
+ viewBox="0 0 1024 1024"
76
+ xmlns="http://www.w3.org/2000/svg"
77
+ >
78
+ <path
79
+ d="M464 512a48 48 0 1096 0 48 48 0 10-96 0zm200 0a48 48 0 1096 0 48 48 0 10-96 0zm-400 0a48 48 0 1096 0 48 48 0 10-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 00-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 00-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 00112 714v152a46 46 0 0046 46h152.1A449.4 449.4 0 00510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 00142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"
80
+ />
81
+ </svg>
82
+ </div>
83
+ </button>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ `;
88
+
89
+ exports[`renders Header for board of experts with session open unchanged 1`] = `
90
+ <div>
91
+ <div
92
+ class="memori-header"
93
+ >
94
+ <button
95
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--experts"
96
+ title="widget.showExpertsInTheBoard"
97
+ >
98
+ <span
99
+ class="memori-button--icon"
100
+ >
101
+ <svg
102
+ aria-hidden="true"
103
+ fill="none"
104
+ focusable="false"
105
+ height="16"
106
+ role="img"
107
+ stroke="currentColor"
108
+ stroke-linecap="round"
109
+ stroke-linejoin="round"
110
+ stroke-width="2"
111
+ viewBox="0 0 640 512"
112
+ width="20"
113
+ xmlns="http://www.w3.org/2000/svg"
114
+ >
115
+ <path
116
+ d="M211.2 96a64 64 0 10-128 0 64 64 0 10128 0zM32 256c0 17.7 14.3 32 32 32h85.6c10.1-39.4 38.6-71.5 75.8-86.6-9.7-6-21.2-9.4-33.4-9.4H96c-35.3 0-64 28.7-64 64zm461.6 32H576c17.7 0 32-14.3 32-32 0-35.3-28.7-64-64-64h-96c-11.7 0-22.7 3.1-32.1 8.6 38.1 14.8 67.4 47.3 77.7 87.4zm-102.4-61.6c-6.9-1.6-14.2-2.4-21.6-2.4h-96c-8.5 0-16.7 1.1-24.5 3.1-30.8 8.1-55.6 31.1-66.1 60.9-3.5 10-5.5 20.8-5.5 32 0 17.7 14.3 32 32 32h224c17.7 0 32-14.3 32-32 0-11.2-1.9-22-5.5-32-10.8-30.7-36.8-54.2-68.9-61.6zM563.2 96a64 64 0 10-128 0 64 64 0 10128 0zm-241.6 96a80 80 0 100-160 80 80 0 100 160zM32 416c-17.7 0-32 14.3-32 32s14.3 32 32 32h576c17.7 0 32-14.3 32-32s-14.3-32-32-32H32z"
117
+ />
118
+ </svg>
119
+ </span>
120
+ </button>
121
+ <button
122
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--speaker"
123
+ title="widget.sound"
124
+ >
125
+ <span
126
+ class="memori-button--icon"
127
+ >
128
+ <svg
129
+ aria-hidden="true"
130
+ focusable="false"
131
+ role="img"
132
+ viewBox="0 0 1024 1024"
133
+ xmlns="http://www.w3.org/2000/svg"
134
+ >
135
+ <path
136
+ d="M625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582zm348-327H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zm-41.9 261.8l-110.3-63.7a15.9 15.9 0 00-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0021.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0021.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 00-21.7-5.9L746 287.8a15.99 15.99 0 00-5.8 21.8L760 344z"
137
+ />
138
+ </svg>
139
+ </span>
140
+ </button>
141
+ <div
142
+ class="memori-export-history-button memori-header--button memori-header--button--export"
143
+ data-headlessui-state=""
144
+ title="write_and_speak.exportChatHistoryMessage"
145
+ >
146
+ <button
147
+ aria-expanded="false"
148
+ class="memori-button memori-button--circle memori-button--icon-only memori-button--primary"
149
+ data-headlessui-state=""
150
+ id="headlessui-popover-button-:r1k:"
151
+ type="button"
152
+ >
153
+ <div
154
+ class="memori-button--icon"
155
+ >
156
+ <svg
157
+ aria-hidden="true"
158
+ focusable="false"
159
+ role="img"
160
+ viewBox="0 0 1024 1024"
161
+ xmlns="http://www.w3.org/2000/svg"
162
+ >
163
+ <path
164
+ d="M464 512a48 48 0 1096 0 48 48 0 10-96 0zm200 0a48 48 0 1096 0 48 48 0 10-96 0zm-400 0a48 48 0 1096 0 48 48 0 10-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 00-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 00-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 00112 714v152a46 46 0 0046 46h152.1A449.4 449.4 0 00510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 00142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"
165
+ />
166
+ </svg>
167
+ </div>
168
+ </button>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ `;
173
+
3
174
  exports[`renders Header unchanged 1`] = `
4
175
  <div>
5
176
  <div