@memori.ai/memori-react 2.2.2 → 2.3.1

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 (51) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +6 -2
  3. package/dist/components/AvatarView/index.js +1 -1
  4. package/dist/components/AvatarView/index.js.map +1 -1
  5. package/dist/components/Header/Header.css +3 -3
  6. package/dist/components/MemoriWidget/MemoriWidget.d.ts +1 -1
  7. package/dist/components/MemoriWidget/MemoriWidget.js +6 -3
  8. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  9. package/dist/components/PoweredBy/PoweredBy.css +1 -1
  10. package/dist/components/SettingsDrawer/SettingsDrawer.d.ts +2 -1
  11. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  12. package/dist/components/ShareButton/ShareButton.css +1 -0
  13. package/dist/components/layouts/Chat.d.ts +4 -0
  14. package/dist/components/layouts/Chat.js +8 -0
  15. package/dist/components/layouts/Chat.js.map +1 -0
  16. package/dist/components/layouts/Chat.test.d.ts +1 -0
  17. package/dist/components/layouts/Chat.test.js +25 -0
  18. package/dist/components/layouts/Chat.test.js.map +1 -0
  19. package/dist/components/layouts/chat.css +114 -0
  20. package/dist/styles.css +1 -0
  21. package/esm/components/AvatarView/index.js +1 -1
  22. package/esm/components/AvatarView/index.js.map +1 -1
  23. package/esm/components/Header/Header.css +3 -3
  24. package/esm/components/MemoriWidget/MemoriWidget.d.ts +1 -1
  25. package/esm/components/MemoriWidget/MemoriWidget.js +6 -3
  26. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  27. package/esm/components/PoweredBy/PoweredBy.css +1 -1
  28. package/esm/components/SettingsDrawer/SettingsDrawer.d.ts +2 -1
  29. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  30. package/esm/components/ShareButton/ShareButton.css +1 -0
  31. package/esm/components/layouts/Chat.d.ts +4 -0
  32. package/esm/components/layouts/Chat.js +5 -0
  33. package/esm/components/layouts/Chat.js.map +1 -0
  34. package/esm/components/layouts/Chat.test.d.ts +1 -0
  35. package/esm/components/layouts/Chat.test.js +22 -0
  36. package/esm/components/layouts/Chat.test.js.map +1 -0
  37. package/esm/components/layouts/chat.css +114 -0
  38. package/esm/styles.css +1 -0
  39. package/package.json +1 -1
  40. package/src/components/AvatarView/index.tsx +2 -1
  41. package/src/components/Header/Header.css +3 -3
  42. package/src/components/MemoriWidget/MemoriWidget.tsx +4 -1
  43. package/src/components/PoweredBy/PoweredBy.css +1 -1
  44. package/src/components/SettingsDrawer/SettingsDrawer.tsx +2 -2
  45. package/src/components/ShareButton/ShareButton.css +1 -0
  46. package/src/components/layouts/Chat.test.tsx +31 -0
  47. package/src/components/layouts/Chat.tsx +35 -0
  48. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +329 -0
  49. package/src/components/layouts/chat.css +114 -0
  50. package/src/components/layouts/layouts.stories.tsx +110 -0
  51. package/src/styles.css +1 -0
@@ -0,0 +1,114 @@
1
+ .memori-widget.memori-layout-chat {
2
+ height: 100vh !important;
3
+ }
4
+
5
+ .memori-widget.memori-layout-chat .memori--global-background.no-background-image {
6
+ background: none;
7
+ }
8
+
9
+ .memori-widget>.memori-spin.memori-chat-layout {
10
+ display: flex;
11
+ height: 100%;
12
+ flex-direction: column;
13
+ }
14
+
15
+ .memori-chat-layout--header {
16
+ text-align: right;
17
+ }
18
+
19
+ .memori-chat-layout .memori-header {
20
+ display: inline-block;
21
+ width: auto;
22
+ }
23
+
24
+ .memori-chat-layout .memori--avatar {
25
+ top: 0;
26
+ }
27
+
28
+ .memori-chat-layout .memori--title {
29
+ position: relative;
30
+ top: 10px;
31
+ }
32
+
33
+ .memori-chat-layout .memori-chat--cover {
34
+ display: none;
35
+ }
36
+
37
+ .memori-chat-layout .memori--cover {
38
+ top: 10px;
39
+ padding: 0;
40
+ background-image: none !important;
41
+ }
42
+
43
+ .memori-chat-layout .memori--powered-by {
44
+ top: 0;
45
+ bottom: auto;
46
+ }
47
+
48
+ .memori-chat-layout--controls {
49
+ position: relative;
50
+ z-index: 5;
51
+ max-height: calc(100% - 50px);
52
+ flex: 1;
53
+ }
54
+
55
+ .memori-chat-layout--controls .memori--start-panel,
56
+ .memori-chat-layout--controls .memori-chat--wrapper {
57
+ width: 80vw;
58
+ max-width: 800px;
59
+ margin: 0 auto;
60
+ }
61
+
62
+ .memori-chat-layout--controls .memori--start-panel {
63
+ margin-top: 3rem;
64
+ }
65
+
66
+ .memori-chat-layout--controls .memori-chat--wrapper {
67
+ height: calc(100% - 1rem);
68
+ }
69
+
70
+ .memori-chat-layout .memori-chat--content {
71
+ padding: 0;
72
+ }
73
+
74
+ @media (max-width: 870px) {
75
+
76
+ .memori-chat-layout--controls .memori--start-panel,
77
+ .memori-chat-layout--controls .memori-chat--wrapper {
78
+ width: 100%;
79
+ }
80
+
81
+ .memori-chat-layout--controls .memori-chat--wrapper {
82
+ padding: 0;
83
+ }
84
+ }
85
+
86
+ @media (max-width: 480px) {
87
+ .memori-send-on-enter-menu {
88
+ display: none;
89
+ }
90
+
91
+ .memori-header--button-settings {
92
+ display: none;
93
+ }
94
+ }
95
+
96
+ .memori-chat-layout .memori--avatar-toggle {
97
+ display: none;
98
+ width: 100%;
99
+ justify-content: center;
100
+ }
101
+
102
+ .memori-chat-layout .memori--title,
103
+ .memori-chat-layout .memori--description,
104
+ .memori-chat-layout .memori--needsPosition {
105
+ color: var(--memori-text-color);
106
+ }
107
+
108
+ .memori-chat-layout .memori--global-background-image {
109
+ background-image: linear-gradient(rgba(0, 0, 0, 0.8), rgba(200, 200, 200, 0.8));
110
+ }
111
+
112
+ .memori-chat-layout .memori-chat-inputs--mic {
113
+ font-size: 125%;
114
+ }
package/esm/styles.css CHANGED
@@ -41,6 +41,7 @@
41
41
  @import url('https://fonts.bunny.net/css?family=exo-2:200,400,700');
42
42
 
43
43
  @import url('./components/layouts/totem.css');
44
+ @import url('./components/layouts/chat.css');
44
45
 
45
46
  .sr-only {
46
47
  position: absolute;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.2.2",
2
+ "version": "2.3.1",
3
3
  "name": "@memori.ai/memori-react",
4
4
  "author": "Memori Srl",
5
5
  "main": "dist/index.js",
@@ -50,6 +50,7 @@ export default function AvatarView({
50
50
  const defaultStyles = halfBody
51
51
  ? defaultStylesHalfBody
52
52
  : defaultStylesFullBody;
53
+
53
54
  return (
54
55
  <Canvas
55
56
  style={style || defaultStyles}
@@ -72,7 +73,7 @@ export default function AvatarView({
72
73
  anglePower={5}
73
74
  />
74
75
  ) : (
75
- <Environment preset="sunset" />
76
+ <Environment files="https://raw.githack.com/pmndrs/drei-assets/456060a26bbeb8fdf79326f224b6d99b8bcce736/hdri/venice_sunset_1k.hdr" />
76
77
  )}
77
78
  {rotateAvatar && halfBody && (
78
79
  <OrbitControls enablePan={false} enableZoom={false} />
@@ -1,6 +1,6 @@
1
1
  .memori-header {
2
2
  position: relative;
3
- z-index: 1;
3
+ z-index: 6;
4
4
  width: calc(50% - 1rem);
5
5
  height: 50px;
6
6
  padding: calc(var(--memori-inner-content-pad) / 4) calc(var(--memori-inner-content-pad) / 2);
@@ -25,7 +25,7 @@
25
25
  justify-content: center;
26
26
  }
27
27
 
28
- .memori-header--button + .memori-header--button {
28
+ .memori-header--button+.memori-header--button {
29
29
  margin-left: 0.25rem;
30
30
  }
31
31
 
@@ -58,4 +58,4 @@
58
58
 
59
59
  .memori-header .memori-share-button {
60
60
  margin-left: 0.25rem;
61
- }
61
+ }
@@ -54,6 +54,7 @@ import PoweredBy from '../PoweredBy/PoweredBy';
54
54
  // Layout
55
55
  import FullPageLayout from '../layouts/FullPage';
56
56
  import TotemLayout from '../layouts/Totem';
57
+ import ChatLayout from '../layouts/Chat';
57
58
 
58
59
  // Helpers / Utils
59
60
  import { getTranslation } from '../../helpers/translations';
@@ -165,7 +166,7 @@ export interface Props {
165
166
  memoriConfigs?: MemoriConfig[];
166
167
  memoriLang?: string;
167
168
  integration?: Integration;
168
- layout?: 'DEFAULT' | 'FULLPAGE' | 'TOTEM';
169
+ layout?: 'DEFAULT' | 'FULLPAGE' | 'TOTEM' | 'CHAT';
169
170
  customLayout?: React.FC<LayoutProps>;
170
171
  showShare?: boolean;
171
172
  showInstruct?: boolean;
@@ -2293,6 +2294,8 @@ const MemoriWidget = ({
2293
2294
  ? customLayout
2294
2295
  : selectedLayout === 'TOTEM'
2295
2296
  ? TotemLayout
2297
+ : selectedLayout === 'CHAT'
2298
+ ? ChatLayout
2296
2299
  : selectedLayout === 'FULLPAGE'
2297
2300
  ? FullPageLayout
2298
2301
  : FullPageLayout;
@@ -42,4 +42,4 @@
42
42
  color: var(--memori-text-color, rgba(0, 0, 0, 0.85)) !important;
43
43
  opacity: 0.8;
44
44
  text-decoration: underline;
45
- }
45
+ }
@@ -1,4 +1,3 @@
1
- import { Memori } from '@memori.ai/memori-api-client/dist/types';
2
1
  import Drawer from '../ui/Drawer';
3
2
  import { useTranslation } from 'react-i18next';
4
3
  import Checkbox from '../ui/Checkbox';
@@ -6,10 +5,11 @@ import Select from '../ui/Select';
6
5
  import { setLocalConfig } from '../../helpers/configuration';
7
6
  import { RadioGroup } from '@headlessui/react';
8
7
  import Button from '../ui/Button';
8
+ import { Props as WidgetProps } from '../MemoriWidget/MemoriWidget';
9
9
 
10
10
  export interface Props {
11
11
  open: boolean;
12
- layout?: 'FULLPAGE' | 'TOTEM' | 'DEFAULT';
12
+ layout?: WidgetProps['layout'];
13
13
  onClose: () => void;
14
14
  microphoneMode?: 'HOLD_TO_TALK' | 'CONTINUOUS';
15
15
  continuousSpeechTimeout?: number;
@@ -44,6 +44,7 @@ a.memori-share-button--link {
44
44
  width: 100%;
45
45
  justify-content: flex-start;
46
46
  color: inherit;
47
+ font-weight: normal;
47
48
  text-align: left;
48
49
  text-decoration: none;
49
50
  }
@@ -0,0 +1,31 @@
1
+ import { render } from '@testing-library/react';
2
+ import Memori from '../MemoriWidget/MemoriWidget';
3
+ import { integration, memori, tenant } from '../../mocks/data';
4
+
5
+ Object.defineProperty(window, 'matchMedia', {
6
+ writable: true,
7
+ value: jest.fn().mockImplementation(query => ({
8
+ matches: false,
9
+ media: query,
10
+ onchange: null,
11
+ addListener: jest.fn(), // Deprecated
12
+ removeListener: jest.fn(), // Deprecated
13
+ addEventListener: jest.fn(),
14
+ removeEventListener: jest.fn(),
15
+ dispatchEvent: jest.fn(),
16
+ })),
17
+ });
18
+
19
+ it('renders Chat layout unchanged', () => {
20
+ const { container } = render(
21
+ <Memori
22
+ showShare={true}
23
+ showSettings={true}
24
+ memori={memori}
25
+ tenant={tenant}
26
+ integration={integration}
27
+ layout="CHAT"
28
+ />
29
+ );
30
+ expect(container).toMatchSnapshot();
31
+ });
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import Spin from '../ui/Spin';
3
+ import { LayoutProps } from '../MemoriWidget/MemoriWidget';
4
+
5
+ const ChatLayout: React.FC<LayoutProps> = ({
6
+ header,
7
+ chat,
8
+ startPanel,
9
+ integrationStyle,
10
+ integrationBackground,
11
+ changeMode,
12
+ sessionId,
13
+ hasUserActivatedSpeak,
14
+ showInstruct = false,
15
+ loading = false,
16
+ poweredBy,
17
+ }) => (
18
+ <>
19
+ {integrationStyle}
20
+ {integrationBackground}
21
+
22
+ <Spin spinning={loading} className="memori-chat-layout">
23
+ {poweredBy}
24
+ {showInstruct && changeMode}
25
+
26
+ <div className="memori-chat-layout--header">{header}</div>
27
+
28
+ <div className="memori-chat-layout--controls">
29
+ {sessionId && hasUserActivatedSpeak ? chat : startPanel}
30
+ </div>
31
+ </Spin>
32
+ </>
33
+ );
34
+
35
+ export default ChatLayout;
@@ -0,0 +1,329 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`renders Chat layout unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ class="memori memori-widget memori-layout-chat memori-controls-bottom memori--with-integration"
7
+ data-memori-engine-state="{}"
8
+ data-memori-id="66b4e161-2431-4b21-9b70-d8c27de730ca"
9
+ data-memori-integration="cb3c4776-7f0b-4f97-a773-c32a5d7a3bf1"
10
+ data-memori-name="Memori"
11
+ data-memori-secondary-id="25ced51c-3520-41af-8bbe-222d861b8e32"
12
+ style="height: 100vh;"
13
+ >
14
+ <style>
15
+
16
+ :root, .memori-widget {
17
+ --memori-chat-bubble-bg: #fff;
18
+ --memori-text-color: #2a2a2a;
19
+ --memori-button-bg: #823ce1;
20
+ --memori-primary: #823ce1;
21
+ --memori-button-text: #ffffff;
22
+ --memori-blur-background: 5px;
23
+ --memori-inner-bg: rgba(255, 255, 255, 0.8);
24
+ --memori-inner-content-pad: 1.5rem;
25
+ --memori-nav-bg-image: none;
26
+ --memori-nav-bg: rgba(255, 255, 255, 0.8);
27
+ }
28
+
29
+ </style>
30
+ <div
31
+ class="memori--global-background"
32
+ >
33
+ <div
34
+ class="memori--global-background-image"
35
+ style="background-image: url(https://assets.memori.ai/api/v2/asset/364e498c-11da-42d5-9e32-19e5d137d4b8.jpeg);"
36
+ />
37
+ </div>
38
+ <div
39
+ class="memori-spin memori-chat-layout"
40
+ >
41
+ <div
42
+ class="memori--powered-by"
43
+ >
44
+ <img
45
+ alt=""
46
+ src="https://app.twincreator.com/images/twincreator/logo.png"
47
+ />
48
+ <p>
49
+ Powered by
50
+
51
+ <a
52
+ href="https://app.twincreator.com/it"
53
+ rel="noopener noreferrer"
54
+ target="_blank"
55
+ >
56
+ TwinCreator
57
+ </a>
58
+ </p>
59
+ </div>
60
+ <div
61
+ class="memori-chat-layout--header"
62
+ >
63
+ <div
64
+ class="memori-header"
65
+ >
66
+ <div
67
+ class="memori-export-history-button memori-header--button"
68
+ data-headlessui-state=""
69
+ title="write_and_speak.exportChatHistoryMessage"
70
+ >
71
+ <button
72
+ class="memori-button memori-button--circle memori-button--icon-only memori-button--disabled"
73
+ data-headlessui-state=""
74
+ disabled=""
75
+ id="headlessui-popover-button-:r0:"
76
+ type="button"
77
+ >
78
+ <div
79
+ class="memori-button--icon"
80
+ >
81
+ <svg
82
+ aria-hidden="true"
83
+ focusable="false"
84
+ role="img"
85
+ viewBox="0 0 1024 1024"
86
+ xmlns="http://www.w3.org/2000/svg"
87
+ >
88
+ <path
89
+ 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"
90
+ />
91
+ </svg>
92
+ </div>
93
+ </button>
94
+ </div>
95
+ <button
96
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button-settings"
97
+ title="widget.settings"
98
+ >
99
+ <span
100
+ class="memori-button--icon"
101
+ >
102
+ <svg
103
+ aria-hidden="true"
104
+ focusable="false"
105
+ role="img"
106
+ viewBox="0 0 1024 1024"
107
+ xmlns="http://www.w3.org/2000/svg"
108
+ >
109
+ <path
110
+ d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 009.3-35.2l-.9-2.6a443.74 443.74 0 00-79.7-137.9l-1.8-2.1a32.12 32.12 0 00-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 00-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 00-25.8 25.7l-15.8 85.4a351.86 351.86 0 00-99 57.4l-81.9-29.1a32 32 0 00-35.1 9.5l-1.8 2.1a446.02 446.02 0 00-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 00-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0035.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0025.8 25.7l2.7.5a449.4 449.4 0 00159 0l2.7-.5a32.05 32.05 0 0025.8-25.7l15.7-85a350 350 0 0099.7-57.6l81.3 28.9a32 32 0 0035.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 01-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 01-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 01512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 01400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 01624 502c0 29.9-11.7 58-32.8 79.2z"
111
+ />
112
+ </svg>
113
+ </span>
114
+ </button>
115
+ <div
116
+ class="memori-share-button memori-share-button--align-left"
117
+ data-headlessui-state=""
118
+ >
119
+ <button
120
+ aria-expanded="false"
121
+ aria-haspopup="true"
122
+ class="memori-button memori-button--circle memori-button--icon-only memori-share-button--button memori-header--button memori-button--primary"
123
+ data-headlessui-state=""
124
+ id="headlessui-menu-button-:r5:"
125
+ title="widget.share"
126
+ type="button"
127
+ >
128
+ <div
129
+ class="memori-button--icon"
130
+ >
131
+ <svg
132
+ aria-hidden="true"
133
+ focusable="false"
134
+ role="img"
135
+ viewBox="0 0 1024 1024"
136
+ xmlns="http://www.w3.org/2000/svg"
137
+ >
138
+ <path
139
+ d="M752 664c-28.5 0-54.8 10-75.4 26.7L469.4 540.8a160.68 160.68 0 0 0 0-57.6l207.2-149.9C697.2 350 723.5 360 752 360c66.2 0 120-53.8 120-120s-53.8-120-120-120-120 53.8-120 120c0 11.6 1.6 22.7 4.7 33.3L439.9 415.8C410.7 377.1 364.3 352 312 352c-88.4 0-160 71.6-160 160s71.6 160 160 160c52.3 0 98.7-25.1 127.9-63.8l196.8 142.5c-3.1 10.6-4.7 21.8-4.7 33.3 0 66.2 53.8 120 120 120s120-53.8 120-120-53.8-120-120-120zm0-476c28.7 0 52 23.3 52 52s-23.3 52-52 52-52-23.3-52-52 23.3-52 52-52zM312 600c-48.5 0-88-39.5-88-88s39.5-88 88-88 88 39.5 88 88-39.5 88-88 88zm440 236c-28.7 0-52-23.3-52-52s23.3-52 52-52 52 23.3 52 52-23.3 52-52 52z"
140
+ />
141
+ </svg>
142
+ </div>
143
+ </button>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ <div
148
+ class="memori-chat-layout--controls"
149
+ >
150
+ <div
151
+ class="memori--start-panel"
152
+ >
153
+ <div
154
+ class="memori--cover"
155
+ >
156
+ <div
157
+ class="memori--completions-enabled"
158
+ >
159
+ <div
160
+ class="memori-tooltip memori-tooltip--align-left"
161
+ >
162
+ <div
163
+ class="memori-tooltip--content"
164
+ >
165
+ completionsEnabled
166
+ </div>
167
+ <div
168
+ class="memori-tooltip--trigger"
169
+ >
170
+ <span
171
+ aria-label="completionsEnabled"
172
+ >
173
+ <svg
174
+ aria-hidden="true"
175
+ fill="none"
176
+ focusable="false"
177
+ role="img"
178
+ viewBox="0 0 24 24"
179
+ xmlns="http://www.w3.org/2000/svg"
180
+ >
181
+ <g
182
+ clip-rule="evenodd"
183
+ fill="currentColor"
184
+ fill-rule="evenodd"
185
+ >
186
+ <path
187
+ clip-rule="evenodd"
188
+ d="M0 4a4 4 0 014-4h16a4 4 0 014 4v16a4 4 0 01-4 4H4a4 4 0 01-4-4zm4-2.4A2.4 2.4 0 001.6 4v16A2.4 2.4 0 004 22.4h16a2.4 2.4 0 002.4-2.4V4A2.4 2.4 0 0020 1.6z"
189
+ fill-rule="evenodd"
190
+ />
191
+ <path
192
+ clip-rule="evenodd"
193
+ d="M9.715 8.442a.798.798 0 00-1.43 0l-3.2 6.4a.799.799 0 101.431.716l.579-1.158h3.811l.578 1.158a.8.8 0 001.431-.716zm.391 4.358L9 10.589 7.894 12.8z"
194
+ fill-rule="evenodd"
195
+ />
196
+ <path
197
+ clip-rule="evenodd"
198
+ d="M17 8c.552 0 1 .358 1 .8v6.4c0 .442-.448.8-1 .8s-1-.358-1-.8V8.8c0-.442.448-.8 1-.8z"
199
+ fill-rule="evenodd"
200
+ />
201
+ </g>
202
+ </svg>
203
+ </span>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ </div>
208
+ <picture
209
+ class="memori--avatar"
210
+ >
211
+ <source
212
+ src="https://app.twincreator.com/images/twincreator/square_logo.png"
213
+ />
214
+ <img
215
+ alt="Memori"
216
+ src="https://app.twincreator.com/images/twincreator/square_logo.png"
217
+ />
218
+ </picture>
219
+ <h2
220
+ class="memori--title"
221
+ >
222
+ Memori
223
+ </h2>
224
+ <div
225
+ class="memori--description"
226
+ >
227
+ <p>
228
+ <span
229
+ class="memori--description-text"
230
+ >
231
+ Lorem ipsum.
232
+ </span>
233
+ </p>
234
+ <div
235
+ class="memori--language-chooser"
236
+ >
237
+ <div
238
+ class="memori-select"
239
+ >
240
+ <input
241
+ hidden=""
242
+ name="day"
243
+ readonly=""
244
+ 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;"
245
+ type="hidden"
246
+ value="IT"
247
+ />
248
+ <label
249
+ class="memori-select--label"
250
+ data-headlessui-state=""
251
+ id="headlessui-listbox-label-:r7:"
252
+ >
253
+ write_and_speak.iWantToTalkToIn
254
+ :
255
+ </label>
256
+ <button
257
+ aria-expanded="false"
258
+ aria-haspopup="true"
259
+ aria-label="write_and_speak.iWantToTalkToIn"
260
+ aria-labelledby="headlessui-listbox-label-:r7: headlessui-listbox-button-:r8:"
261
+ class="memori-select--button"
262
+ data-headlessui-state=""
263
+ id="headlessui-listbox-button-:r8:"
264
+ type="button"
265
+ >
266
+ <span
267
+ class="memori-select--value"
268
+ >
269
+ Italiano
270
+ </span>
271
+ <span
272
+ class="memori-select--icon"
273
+ >
274
+ <svg
275
+ aria-hidden="true"
276
+ fill="currentColor"
277
+ focusable="false"
278
+ role="img"
279
+ viewBox="0 0 20 20"
280
+ xmlns="http://www.w3.org/2000/svg"
281
+ >
282
+ <path
283
+ clip-rule="evenodd"
284
+ d="M10 3a.75.75 0 01.55.24l3.25 3.5a.75.75 0 11-1.1 1.02L10 4.852 7.3 7.76a.75.75 0 01-1.1-1.02l3.25-3.5A.75.75 0 0110 3zm-3.76 9.2a.75.75 0 011.06.04l2.7 2.908 2.7-2.908a.75.75 0 111.1 1.02l-3.25 3.5a.75.75 0 01-1.1 0l-3.25-3.5a.75.75 0 01.04-1.06z"
285
+ fill-rule="evenodd"
286
+ />
287
+ </svg>
288
+ </span>
289
+ </button>
290
+ </div>
291
+ </div>
292
+ <button
293
+ class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
294
+ >
295
+ write_and_speak.tryMeButton
296
+ </button>
297
+ <p
298
+ class="memori--start-description"
299
+ >
300
+ write_and_speak.pageTryMeExplanation
301
+ </p>
302
+ </div>
303
+ </div>
304
+ </div>
305
+ <div
306
+ class="memori-spin--spinner"
307
+ >
308
+ <svg
309
+ aria-hidden="true"
310
+ class="memori-loading-icon"
311
+ focusable="false"
312
+ role="img"
313
+ viewBox="0 0 1024 1024"
314
+ xmlns="http://www.w3.org/2000/svg"
315
+ >
316
+ <path
317
+ d="M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z"
318
+ />
319
+ </svg>
320
+ </div>
321
+ </div>
322
+ <audio
323
+ id="memori-audio"
324
+ src="https://app.twincreator.com/intro.mp3"
325
+ style="display: none;"
326
+ />
327
+ </div>
328
+ </div>
329
+ `;