@n8n/chat 0.6.0 → 0.6.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 (205) hide show
  1. package/{src/App.vue → App.vue} +2 -2
  2. package/README.md +27 -4
  3. package/__stories__/App.stories.d.ts +16 -0
  4. package/__stories__/App.stories.js +38 -0
  5. package/__stories__/App.stories.mjs +32 -0
  6. package/__tests__/index.spec.d.ts +1 -0
  7. package/__tests__/index.spec.js +146 -0
  8. package/__tests__/index.spec.mjs +172 -0
  9. package/__tests__/setup.js +3 -0
  10. package/__tests__/setup.mjs +1 -0
  11. package/__tests__/utils/create.d.ts +5 -0
  12. package/__tests__/utils/create.js +16 -0
  13. package/__tests__/utils/create.mjs +10 -0
  14. package/__tests__/utils/fetch.d.ts +3 -0
  15. package/__tests__/utils/fetch.js +20 -0
  16. package/__tests__/utils/fetch.mjs +9 -0
  17. package/__tests__/utils/index.js +38 -0
  18. package/__tests__/utils/index.mjs +3 -0
  19. package/__tests__/utils/selectors.d.ts +12 -0
  20. package/__tests__/utils/selectors.js +58 -0
  21. package/__tests__/utils/selectors.mjs +41 -0
  22. package/api/generic.d.ts +6 -0
  23. package/api/generic.js +68 -0
  24. package/api/generic.mjs +54 -0
  25. package/api/index.js +27 -0
  26. package/api/index.mjs +2 -0
  27. package/api/message.d.ts +3 -0
  28. package/api/message.js +33 -0
  29. package/api/message.mjs +30 -0
  30. package/chat.bundle.es.js +10753 -0
  31. package/chat.bundle.umd.js +18 -0
  32. package/chat.es.js +6864 -0
  33. package/chat.umd.js +18 -0
  34. package/components/Button.vue +34 -0
  35. package/{src/components → components}/Chat.vue +19 -15
  36. package/components/ChatWindow.vue +104 -0
  37. package/components/GetStarted.vue +24 -0
  38. package/{src/components → components}/GetStartedFooter.vue +4 -4
  39. package/{src/components → components}/Input.vue +35 -40
  40. package/components/Layout.vue +66 -0
  41. package/components/Message.vue +94 -0
  42. package/components/MessageTyping.vue +101 -0
  43. package/{src/components → components}/MessagesList.vue +8 -8
  44. package/{src/components → components}/PoweredBy.vue +6 -7
  45. package/components/index.js +76 -0
  46. package/components/index.mjs +10 -0
  47. package/composables/index.js +38 -0
  48. package/composables/index.mjs +3 -0
  49. package/composables/useChat.d.ts +1 -0
  50. package/composables/useChat.js +11 -0
  51. package/composables/useChat.mjs +5 -0
  52. package/composables/useI18n.d.ts +4 -0
  53. package/composables/useI18n.js +23 -0
  54. package/composables/useI18n.mjs +12 -0
  55. package/composables/useOptions.d.ts +3 -0
  56. package/composables/useOptions.js +14 -0
  57. package/composables/useOptions.mjs +8 -0
  58. package/constants/defaults.d.ts +3 -0
  59. package/constants/defaults.js +32 -0
  60. package/constants/defaults.mjs +26 -0
  61. package/constants/index.js +38 -0
  62. package/constants/index.mjs +3 -0
  63. package/constants/localStorage.d.ts +2 -0
  64. package/constants/localStorage.js +8 -0
  65. package/{src/constants/localStorage.ts → constants/localStorage.mjs} +1 -1
  66. package/constants/symbols.d.ts +3 -0
  67. package/constants/symbols.js +8 -0
  68. package/constants/symbols.mjs +2 -0
  69. package/css/index.css +31 -0
  70. package/event-buses/chatEventBus.d.ts +1 -0
  71. package/event-buses/chatEventBus.js +8 -0
  72. package/event-buses/chatEventBus.mjs +2 -0
  73. package/event-buses/index.js +16 -0
  74. package/event-buses/index.mjs +1 -0
  75. package/index.d.ts +3 -0
  76. package/index.js +43 -0
  77. package/index.mjs +36 -0
  78. package/main.css +151 -0
  79. package/package.json +41 -5
  80. package/plugins/chat.d.ts +3 -0
  81. package/plugins/chat.js +85 -0
  82. package/plugins/chat.mjs +83 -0
  83. package/plugins/index.js +16 -0
  84. package/plugins/index.mjs +1 -0
  85. package/style.css +1 -0
  86. package/types/App.vue.d.ts +8 -0
  87. package/types/__stories__/App.stories.d.ts +17 -0
  88. package/types/__tests__/index.spec.d.ts +1 -0
  89. package/types/__tests__/setup.d.ts +0 -0
  90. package/types/__tests__/utils/create.d.ts +5 -0
  91. package/types/__tests__/utils/fetch.d.ts +4 -0
  92. package/types/__tests__/utils/index.d.ts +3 -0
  93. package/types/__tests__/utils/selectors.d.ts +12 -0
  94. package/types/api/generic.d.ts +6 -0
  95. package/types/api/index.d.ts +2 -0
  96. package/types/api/message.d.ts +3 -0
  97. package/types/chat.d.ts +11 -0
  98. package/types/chat.js +1 -0
  99. package/types/chat.mjs +0 -0
  100. package/types/components/Button.vue.d.ts +9 -0
  101. package/types/components/Chat.vue.d.ts +2 -0
  102. package/types/components/ChatWindow.vue.d.ts +2 -0
  103. package/types/components/GetStarted.vue.d.ts +2 -0
  104. package/types/components/GetStartedFooter.vue.d.ts +2 -0
  105. package/types/components/Input.vue.d.ts +2 -0
  106. package/types/components/Layout.vue.d.ts +11 -0
  107. package/types/components/Message.vue.d.ts +21 -0
  108. package/types/components/MessageTyping.vue.d.ts +15 -0
  109. package/types/components/MessagesList.vue.d.ts +14 -0
  110. package/types/components/PoweredBy.vue.d.ts +2 -0
  111. package/types/components/index.d.ts +10 -0
  112. package/types/composables/index.d.ts +3 -0
  113. package/types/composables/useChat.d.ts +2 -0
  114. package/types/composables/useI18n.d.ts +4 -0
  115. package/types/composables/useOptions.d.ts +4 -0
  116. package/types/constants/defaults.d.ts +3 -0
  117. package/types/constants/index.d.ts +3 -0
  118. package/types/constants/localStorage.d.ts +2 -0
  119. package/types/constants/symbols.d.ts +4 -0
  120. package/types/event-buses/chatEventBus.d.ts +1 -0
  121. package/types/event-buses/index.d.ts +1 -0
  122. package/types/index.js +49 -0
  123. package/types/index.mjs +4 -0
  124. package/types/messages.d.ts +6 -0
  125. package/types/messages.js +1 -0
  126. package/types/messages.mjs +0 -0
  127. package/types/options.d.ts +25 -0
  128. package/types/options.js +1 -0
  129. package/types/options.mjs +0 -0
  130. package/types/plugins/chat.d.ts +3 -0
  131. package/types/plugins/index.d.ts +1 -0
  132. package/types/types/chat.d.ts +11 -0
  133. package/types/types/index.d.ts +4 -0
  134. package/types/types/messages.d.ts +6 -0
  135. package/types/types/options.d.ts +25 -0
  136. package/types/types/webhook.d.ts +15 -0
  137. package/types/utils/event-bus.d.ts +8 -0
  138. package/types/utils/mount.d.ts +1 -0
  139. package/types/webhook.d.ts +15 -0
  140. package/types/webhook.js +1 -0
  141. package/types/webhook.mjs +0 -0
  142. package/utils/event-bus.d.ts +8 -0
  143. package/utils/event-bus.js +38 -0
  144. package/utils/event-bus.mjs +32 -0
  145. package/utils/index.d.ts +2 -0
  146. package/utils/index.js +27 -0
  147. package/utils/index.mjs +2 -0
  148. package/utils/mount.d.ts +1 -0
  149. package/utils/mount.js +19 -0
  150. package/utils/mount.mjs +13 -0
  151. package/.eslintignore +0 -2
  152. package/.eslintrc.cjs +0 -51
  153. package/.np-config.json +0 -5
  154. package/.storybook/main.ts +0 -27
  155. package/.storybook/preview.scss +0 -4
  156. package/.storybook/preview.ts +0 -16
  157. package/.vscode/extensions.json +0 -3
  158. package/env.d.ts +0 -1
  159. package/index.html +0 -13
  160. package/resources/workflow.json +0 -293
  161. package/scripts/pack.js +0 -11
  162. package/scripts/postbuild.js +0 -16
  163. package/src/__stories__/App.stories.ts +0 -43
  164. package/src/__tests__/index.spec.ts +0 -223
  165. package/src/__tests__/utils/create.ts +0 -16
  166. package/src/__tests__/utils/fetch.ts +0 -18
  167. package/src/__tests__/utils/selectors.ts +0 -53
  168. package/src/api/generic.ts +0 -64
  169. package/src/api/message.ts +0 -31
  170. package/src/components/Button.vue +0 -41
  171. package/src/components/ChatWindow.vue +0 -125
  172. package/src/components/GetStarted.vue +0 -24
  173. package/src/components/Layout.vue +0 -82
  174. package/src/components/Message.vue +0 -97
  175. package/src/components/MessageTyping.vue +0 -109
  176. package/src/composables/useChat.ts +0 -7
  177. package/src/composables/useI18n.ts +0 -16
  178. package/src/composables/useOptions.ts +0 -11
  179. package/src/constants/defaults.ts +0 -25
  180. package/src/constants/symbols.ts +0 -8
  181. package/src/event-buses/chatEventBus.ts +0 -3
  182. package/src/index.ts +0 -42
  183. package/src/main.scss +0 -40
  184. package/src/plugins/chat.ts +0 -101
  185. package/src/types/chat.ts +0 -12
  186. package/src/types/messages.ts +0 -6
  187. package/src/types/options.ts +0 -23
  188. package/src/types/webhook.ts +0 -17
  189. package/src/utils/event-bus.ts +0 -51
  190. package/src/utils/mount.ts +0 -16
  191. package/tsconfig.json +0 -27
  192. package/vite.config.ts +0 -51
  193. package/vitest.config.ts +0 -20
  194. /package/{src/__tests__/setup.ts → __tests__/setup.d.ts} +0 -0
  195. /package/{src/__tests__/utils/index.ts → __tests__/utils/index.d.ts} +0 -0
  196. /package/{src/api/index.ts → api/index.d.ts} +0 -0
  197. /package/{src/components/index.ts → components/index.d.ts} +0 -0
  198. /package/{src/composables/index.ts → composables/index.d.ts} +0 -0
  199. /package/{src/constants/index.ts → constants/index.d.ts} +0 -0
  200. /package/{src/event-buses/index.ts → event-buses/index.d.ts} +0 -0
  201. /package/{public/favicon.ico → favicon.ico} +0 -0
  202. /package/{src/plugins/index.ts → plugins/index.d.ts} +0 -0
  203. /package/{src/shims.d.ts → shims.d.ts} +0 -0
  204. /package/{src/types/index.ts → types/index.d.ts} +0 -0
  205. /package/{src/utils/index.ts → types/utils/index.d.ts} +0 -0
@@ -0,0 +1,104 @@
1
+ <script lang="ts" setup>
2
+ // eslint-disable-next-line import/no-unresolved
3
+ import IconChat from 'virtual:icons/mdi/chat';
4
+ // eslint-disable-next-line import/no-unresolved
5
+ import IconChevronDown from 'virtual:icons/mdi/chevron-down';
6
+ import Chat from '@n8n/chat/components/Chat.vue';
7
+ import { nextTick, ref } from 'vue';
8
+ import { chatEventBus } from '@n8n/chat/event-buses';
9
+
10
+ const isOpen = ref(false);
11
+
12
+ function toggle() {
13
+ isOpen.value = !isOpen.value;
14
+
15
+ if (isOpen.value) {
16
+ void nextTick(() => {
17
+ chatEventBus.emit('scrollToBottom');
18
+ });
19
+ }
20
+ }
21
+ </script>
22
+
23
+ <template>
24
+ <div class="chat-window-wrapper">
25
+ <Transition name="chat-window-transition">
26
+ <div class="chat-window" v-show="isOpen">
27
+ <Chat />
28
+ </div>
29
+ </Transition>
30
+ <div class="chat-window-toggle" @click="toggle">
31
+ <Transition name="chat-window-toggle-transition" mode="out-in">
32
+ <IconChat v-if="!isOpen" height="32" width="32" />
33
+ <IconChevronDown v-else height="32" width="32" />
34
+ </Transition>
35
+ </div>
36
+ </div>
37
+ </template>
38
+
39
+ <style>
40
+ .chat-window-wrapper {
41
+ position: fixed;
42
+ display: flex;
43
+ flex-direction: column;
44
+ bottom: var(--chat--window--bottom, var(--chat--spacing));
45
+ right: var(--chat--window--right, var(--chat--spacing));
46
+ z-index: var(--chat--window--z-index, 9999);
47
+ max-width: calc(100% - var(--chat--window--right, var(--chat--spacing)) * 2);
48
+ max-height: calc(100% - var(--chat--window--bottom, var(--chat--spacing)) * 2);
49
+ }
50
+ .chat-window-wrapper .chat-window {
51
+ display: flex;
52
+ width: var(--chat--window--width);
53
+ height: var(--chat--window--height);
54
+ max-width: 100%;
55
+ max-height: 100%;
56
+ border: var(--chat--window--border, 1px solid var(--chat--color-light-shade-100));
57
+ border-radius: var(--chat--window--border-radius, var(--chat--border-radius));
58
+ margin-bottom: var(--chat--window--margin-bottom, var(--chat--spacing));
59
+ overflow: hidden;
60
+ transform-origin: bottom right;
61
+ }
62
+ .chat-window-wrapper .chat-window .chat-layout {
63
+ width: auto;
64
+ height: auto;
65
+ flex: 1;
66
+ }
67
+ .chat-window-wrapper .chat-window-toggle {
68
+ flex: 0 0 auto;
69
+ background: var(--chat--toggle--background);
70
+ color: var(--chat--toggle--color);
71
+ cursor: pointer;
72
+ width: var(--chat--toggle--width, var(--chat--toggle--size));
73
+ height: var(--chat--toggle--height, var(--chat--toggle--size));
74
+ border-radius: var(--chat--toggle--border-radius, 50%);
75
+ display: inline-flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ margin-left: auto;
79
+ transition: transform var(--chat--transition-duration) ease, background var(--chat--transition-duration) ease;
80
+ }
81
+ .chat-window-wrapper .chat-window-toggle:hover, .chat-window-wrapper .chat-window-toggle:focus {
82
+ transform: scale(1.05);
83
+ background: var(--chat--toggle--hover--background);
84
+ }
85
+ .chat-window-wrapper .chat-window-toggle:active {
86
+ transform: scale(0.95);
87
+ background: var(--chat--toggle--active--background);
88
+ }
89
+
90
+ .chat-window-transition-enter-active, .chat-window-transition-leave-active {
91
+ transition: transform var(--chat--transition-duration) ease, opacity var(--chat--transition-duration) ease;
92
+ }
93
+ .chat-window-transition-enter-from, .chat-window-transition-leave-to {
94
+ transform: scale(0);
95
+ opacity: 0;
96
+ }
97
+
98
+ .chat-window-toggle-transition-enter-active, .chat-window-toggle-transition-leave-active {
99
+ transition: opacity var(--chat--transition-duration) ease;
100
+ }
101
+ .chat-window-toggle-transition-enter-from, .chat-window-toggle-transition-leave-to {
102
+ opacity: 0;
103
+ }
104
+ </style>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import Button from '@n8n/chat/components/Button.vue';
3
+ import { useI18n } from '@n8n/chat/composables';
4
+
5
+ const { t } = useI18n();
6
+ </script>
7
+ <template>
8
+ <div class="chat-get-started">
9
+ <Button @click="$emit('click:button')">
10
+ {{ t('getStarted') }}
11
+ </Button>
12
+ </div>
13
+ </template>
14
+
15
+ <style>
16
+ .chat-get-started {
17
+ padding-top: var(--chat--spacing);
18
+ padding-bottom: var(--chat--spacing);
19
+ display: flex;
20
+ justify-content: center;
21
+ align-items: center;
22
+ height: 100%;
23
+ }
24
+ </style>
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
- import { useI18n } from '@/composables';
3
- import PoweredBy from '@/components/PoweredBy.vue';
2
+ import { useI18n } from '@n8n/chat/composables';
3
+ import PoweredBy from '@n8n/chat/components/PoweredBy.vue';
4
4
 
5
5
  const { t, te } = useI18n();
6
6
  </script>
@@ -13,8 +13,8 @@ const { t, te } = useI18n();
13
13
  </div>
14
14
  </template>
15
15
 
16
- <style lang="scss">
16
+ <style>
17
17
  .chat-get-started-footer {
18
- padding: var(--chat--spacing);
18
+ padding: var(--chat--spacing);
19
19
  }
20
20
  </style>
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  // eslint-disable-next-line import/no-unresolved
3
3
  import IconSend from 'virtual:icons/mdi/send';
4
- import { useI18n, useChat } from '@/composables';
4
+ import { useI18n, useChat } from '@n8n/chat/composables';
5
5
  import { computed, ref } from 'vue';
6
6
 
7
7
  const chatStore = useChat();
@@ -49,45 +49,40 @@ async function onSubmitKeydown(event: KeyboardEvent) {
49
49
  </div>
50
50
  </template>
51
51
 
52
- <style lang="scss">
52
+ <style>
53
53
  .chat-input {
54
- display: flex;
55
- justify-content: center;
56
- align-items: center;
57
- width: 100%;
58
-
59
- textarea {
60
- font-family: inherit;
61
- font-size: inherit;
62
- width: 100%;
63
- border: 0;
64
- padding: var(--chat--spacing);
65
- max-height: var(--chat--textarea--height);
66
- resize: none;
67
- }
68
-
69
- .chat-input-send-button {
70
- height: var(--chat--textarea--height);
71
- width: var(--chat--textarea--height);
72
- background: white;
73
- cursor: pointer;
74
- color: var(--chat--color-secondary);
75
- border: 0;
76
- font-size: 24px;
77
- display: inline-flex;
78
- align-items: center;
79
- justify-content: center;
80
- transition: color var(--chat--transition-duration) ease;
81
-
82
- &:hover,
83
- &:focus {
84
- color: var(--chat--color-secondary-shade-50);
85
- }
86
-
87
- &[disabled] {
88
- cursor: default;
89
- color: var(--chat--color-disabled);
90
- }
91
- }
54
+ display: flex;
55
+ justify-content: center;
56
+ align-items: center;
57
+ width: 100%;
58
+ }
59
+ .chat-input textarea {
60
+ font-family: inherit;
61
+ font-size: inherit;
62
+ width: 100%;
63
+ border: 0;
64
+ padding: var(--chat--spacing);
65
+ max-height: var(--chat--textarea--height);
66
+ resize: none;
67
+ }
68
+ .chat-input .chat-input-send-button {
69
+ height: var(--chat--textarea--height);
70
+ width: var(--chat--textarea--height);
71
+ background: white;
72
+ cursor: pointer;
73
+ color: var(--chat--color-secondary);
74
+ border: 0;
75
+ font-size: 24px;
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ transition: color var(--chat--transition-duration) ease;
80
+ }
81
+ .chat-input .chat-input-send-button:hover, .chat-input .chat-input-send-button:focus {
82
+ color: var(--chat--color-secondary-shade-50);
83
+ }
84
+ .chat-input .chat-input-send-button[disabled] {
85
+ cursor: default;
86
+ color: var(--chat--color-disabled);
92
87
  }
93
88
  </style>
@@ -0,0 +1,66 @@
1
+ <script setup lang="ts">
2
+ import { onBeforeUnmount, onMounted, ref } from 'vue';
3
+ import { chatEventBus } from '@n8n/chat/event-buses';
4
+
5
+ const chatBodyRef = ref<HTMLElement | null>(null);
6
+
7
+ function scrollToBottom() {
8
+ const element = chatBodyRef.value as HTMLElement;
9
+ if (element) {
10
+ element.scrollTop = element.scrollHeight;
11
+ }
12
+ }
13
+
14
+ onMounted(() => {
15
+ chatEventBus.on('scrollToBottom', scrollToBottom);
16
+ window.addEventListener('resize', scrollToBottom);
17
+ });
18
+
19
+ onBeforeUnmount(() => {
20
+ chatEventBus.off('scrollToBottom', scrollToBottom);
21
+ window.removeEventListener('resize', scrollToBottom);
22
+ });
23
+ </script>
24
+ <template>
25
+ <main class="chat-layout">
26
+ <div v-if="$slots.header" class="chat-header">
27
+ <slot name="header" />
28
+ </div>
29
+ <div v-if="$slots.default" class="chat-body" ref="chatBodyRef">
30
+ <slot />
31
+ </div>
32
+ <div v-if="$slots.footer" class="chat-footer">
33
+ <slot name="footer" />
34
+ </div>
35
+ </main>
36
+ </template>
37
+
38
+ <style>
39
+ .chat-layout {
40
+ width: 100%;
41
+ height: 100%;
42
+ display: flex;
43
+ overflow-y: auto;
44
+ flex-direction: column;
45
+ font-family: var(--chat--font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif);
46
+ }
47
+ .chat-layout .chat-header {
48
+ padding: var(--chat--header--padding, var(--chat--spacing));
49
+ background: var(--chat--header--background, var(--chat--color-dark));
50
+ color: var(--chat--header--color, var(--chat--color-light));
51
+ }
52
+ .chat-layout .chat-body {
53
+ background: var(--chat--body--background, var(--chat--color-light));
54
+ flex: 1;
55
+ display: flex;
56
+ flex-direction: column;
57
+ overflow-y: auto;
58
+ position: relative;
59
+ min-height: 100px;
60
+ }
61
+ .chat-layout .chat-footer {
62
+ border-top: 1px solid var(--chat--color-light-shade-100);
63
+ background: var(--chat--footer--background, var(--chat--color-light));
64
+ color: var(--chat--footer--color, var(--chat--color-dark));
65
+ }
66
+ </style>
@@ -0,0 +1,94 @@
1
+ <script lang="ts" setup>
2
+ /* eslint-disable @typescript-eslint/naming-convention */
3
+ import type { ChatMessage } from '@n8n/chat/types';
4
+ import type { PropType } from 'vue';
5
+ import { computed, toRefs } from 'vue';
6
+ import VueMarkdown from 'vue-markdown-render';
7
+ import hljs from 'highlight.js/lib/core';
8
+
9
+ const props = defineProps({
10
+ message: {
11
+ type: Object as PropType<ChatMessage>,
12
+ required: true,
13
+ },
14
+ });
15
+
16
+ const { message } = toRefs(props);
17
+
18
+ const messageText = computed(() => {
19
+ return message.value.text || '&lt;Empty response&gt;';
20
+ });
21
+
22
+ const classes = computed(() => {
23
+ return {
24
+ 'chat-message-from-user': message.value.sender === 'user',
25
+ 'chat-message-from-bot': message.value.sender === 'bot',
26
+ };
27
+ });
28
+
29
+ const markdownOptions = {
30
+ highlight(str: string, lang: string) {
31
+ if (lang && hljs.getLanguage(lang)) {
32
+ try {
33
+ return hljs.highlight(str, { language: lang }).value;
34
+ } catch {}
35
+ }
36
+
37
+ return ''; // use external default escaping
38
+ },
39
+ };
40
+ </script>
41
+ <template>
42
+ <div class="chat-message" :class="classes">
43
+ <slot>
44
+ <vue-markdown
45
+ class="chat-message-markdown"
46
+ :source="messageText"
47
+ :options="markdownOptions"
48
+ />
49
+ </slot>
50
+ </div>
51
+ </template>
52
+
53
+ <style>
54
+ .chat-message {
55
+ display: block;
56
+ max-width: 80%;
57
+ padding: var(--chat--message--padding, var(--chat--spacing));
58
+ border-radius: var(--chat--message--border-radius, var(--chat--border-radius));
59
+ }
60
+ .chat-message + .chat-message {
61
+ margin-top: var(--chat--message--margin-bottom, calc(var(--chat--spacing) * 0.5));
62
+ }
63
+ .chat-message.chat-message-from-bot {
64
+ background-color: var(--chat--message--bot--background);
65
+ color: var(--chat--message--bot--color);
66
+ border-bottom-left-radius: 0;
67
+ }
68
+ .chat-message.chat-message-from-user {
69
+ background-color: var(--chat--message--user--background);
70
+ color: var(--chat--message--user--color);
71
+ margin-left: auto;
72
+ border-bottom-right-radius: 0;
73
+ }
74
+ .chat-message > .chat-message-markdown {
75
+ display: block;
76
+ box-sizing: border-box;
77
+ }
78
+ .chat-message > .chat-message-markdown > *:first-child {
79
+ margin-top: 0;
80
+ }
81
+ .chat-message > .chat-message-markdown > *:last-child {
82
+ margin-bottom: 0;
83
+ }
84
+ .chat-message > .chat-message-markdown pre {
85
+ font-family: inherit;
86
+ font-size: inherit;
87
+ margin: 0;
88
+ white-space: pre-wrap;
89
+ box-sizing: border-box;
90
+ padding: var(--chat--spacing);
91
+ background: var(--chat--message--pre--background);
92
+ border-radius: var(--chat--border-radius);
93
+ }
94
+ </style>
@@ -0,0 +1,101 @@
1
+ <script lang="ts" setup>
2
+ import type { ChatMessage } from '@n8n/chat/types';
3
+ import { Message } from './index';
4
+ import type { PropType } from 'vue';
5
+ import { computed } from 'vue';
6
+
7
+ const props = defineProps({
8
+ animation: {
9
+ type: String as PropType<'bouncing' | 'scaling'>,
10
+ default: 'bouncing',
11
+ },
12
+ });
13
+
14
+ const message: ChatMessage = {
15
+ id: 'typing',
16
+ text: '',
17
+ sender: 'bot',
18
+ createdAt: '',
19
+ };
20
+
21
+ const classes = computed(() => {
22
+ return {
23
+ // eslint-disable-next-line @typescript-eslint/naming-convention
24
+ 'chat-message-typing': true,
25
+ [`chat-message-typing-animation-${props.animation}`]: true,
26
+ };
27
+ });
28
+ </script>
29
+ <template>
30
+ <Message :class="classes" :message="message">
31
+ <div class="chat-message-typing-body">
32
+ <span class="chat-message-typing-circle"></span>
33
+ <span class="chat-message-typing-circle"></span>
34
+ <span class="chat-message-typing-circle"></span>
35
+ </div>
36
+ </Message>
37
+ </template>
38
+ <style>
39
+ .chat-message-typing {
40
+ max-width: 80px;
41
+ }
42
+ .chat-message-typing.chat-message-typing-animation-scaling .chat-message-typing-circle {
43
+ animation: chat-message-typing-animation-scaling 800ms ease-in-out infinite;
44
+ animation-delay: 3600ms;
45
+ }
46
+ .chat-message-typing.chat-message-typing-animation-bouncing .chat-message-typing-circle {
47
+ animation: chat-message-typing-animation-bouncing 800ms ease-in-out infinite;
48
+ animation-delay: 3600ms;
49
+ }
50
+ .chat-message-typing .chat-message-typing-body {
51
+ display: flex;
52
+ justify-content: center;
53
+ align-items: center;
54
+ }
55
+ .chat-message-typing .chat-message-typing-circle {
56
+ display: block;
57
+ height: 10px;
58
+ width: 10px;
59
+ border-radius: 50%;
60
+ background-color: var(--chat--color-typing);
61
+ margin: 3px;
62
+ }
63
+ .chat-message-typing .chat-message-typing-circle:nth-child(1) {
64
+ animation-delay: 0ms;
65
+ }
66
+ .chat-message-typing .chat-message-typing-circle:nth-child(2) {
67
+ animation-delay: 333ms;
68
+ }
69
+ .chat-message-typing .chat-message-typing-circle:nth-child(3) {
70
+ animation-delay: 666ms;
71
+ }
72
+
73
+ @keyframes chat-message-typing-animation-scaling {
74
+ 0% {
75
+ transform: scale(1);
76
+ }
77
+ 33% {
78
+ transform: scale(1);
79
+ }
80
+ 50% {
81
+ transform: scale(1.4);
82
+ }
83
+ 100% {
84
+ transform: scale(1);
85
+ }
86
+ }
87
+ @keyframes chat-message-typing-animation-bouncing {
88
+ 0% {
89
+ transform: translateY(0);
90
+ }
91
+ 33% {
92
+ transform: translateY(0);
93
+ }
94
+ 50% {
95
+ transform: translateY(-10px);
96
+ }
97
+ 100% {
98
+ transform: translateY(0);
99
+ }
100
+ }
101
+ </style>
@@ -1,9 +1,9 @@
1
1
  <script lang="ts" setup>
2
2
  import type { PropType } from 'vue';
3
- import Message from '@/components/Message.vue';
4
- import type { ChatMessage } from '@/types';
5
- import MessageTyping from '@/components/MessageTyping.vue';
6
- import { useChat } from '@/composables';
3
+ import Message from '@n8n/chat/components/Message.vue';
4
+ import type { ChatMessage } from '@n8n/chat/types';
5
+ import MessageTyping from '@n8n/chat/components/MessageTyping.vue';
6
+ import { useChat } from '@n8n/chat/composables';
7
7
 
8
8
  defineProps({
9
9
  messages: {
@@ -28,10 +28,10 @@ const { initialMessages, waitingForResponse } = chatStore;
28
28
  </div>
29
29
  </template>
30
30
 
31
- <style lang="scss">
31
+ <style>
32
32
  .chat-messages-list {
33
- margin-top: auto;
34
- display: block;
35
- padding: var(--chat--messages-list--padding, var(--chat--spacing));
33
+ margin-top: auto;
34
+ display: block;
35
+ padding: var(--chat--messages-list--padding, var(--chat--spacing));
36
36
  }
37
37
  </style>
@@ -5,13 +5,12 @@
5
5
  </div>
6
6
  </template>
7
7
 
8
- <style lang="scss">
8
+ <style>
9
9
  .chat-powered-by {
10
- text-align: center;
11
-
12
- a {
13
- color: var(--chat--color-primary);
14
- text-decoration: none;
15
- }
10
+ text-align: center;
11
+ }
12
+ .chat-powered-by a {
13
+ color: var(--chat--color-primary);
14
+ text-decoration: none;
16
15
  }
17
16
  </style>
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "Button", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _Button.default;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "Chat", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _Chat.default;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "ChatWindow", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _ChatWindow.default;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "GetStarted", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _GetStarted.default;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "GetStartedFooter", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _GetStartedFooter.default;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "Input", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _Input.default;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "Layout", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _Layout.default;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "Message", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _Message.default;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "MessagesList", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _MessagesList.default;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "PoweredBy", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _PoweredBy.default;
64
+ }
65
+ });
66
+ var _Button = _interopRequireDefault(require("./Button.vue"));
67
+ var _Chat = _interopRequireDefault(require("./Chat.vue"));
68
+ var _ChatWindow = _interopRequireDefault(require("./ChatWindow.vue"));
69
+ var _GetStarted = _interopRequireDefault(require("./GetStarted.vue"));
70
+ var _GetStartedFooter = _interopRequireDefault(require("./GetStartedFooter.vue"));
71
+ var _Input = _interopRequireDefault(require("./Input.vue"));
72
+ var _Layout = _interopRequireDefault(require("./Layout.vue"));
73
+ var _Message = _interopRequireDefault(require("./Message.vue"));
74
+ var _MessagesList = _interopRequireDefault(require("./MessagesList.vue"));
75
+ var _PoweredBy = _interopRequireDefault(require("./PoweredBy.vue"));
76
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,10 @@
1
+ export { default as Button } from "./Button.vue";
2
+ export { default as Chat } from "./Chat.vue";
3
+ export { default as ChatWindow } from "./ChatWindow.vue";
4
+ export { default as GetStarted } from "./GetStarted.vue";
5
+ export { default as GetStartedFooter } from "./GetStartedFooter.vue";
6
+ export { default as Input } from "./Input.vue";
7
+ export { default as Layout } from "./Layout.vue";
8
+ export { default as Message } from "./Message.vue";
9
+ export { default as MessagesList } from "./MessagesList.vue";
10
+ export { default as PoweredBy } from "./PoweredBy.vue";
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _useChat = require("./useChat");
7
+ Object.keys(_useChat).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _useChat[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _useChat[key];
14
+ }
15
+ });
16
+ });
17
+ var _useI18n = require("./useI18n");
18
+ Object.keys(_useI18n).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _useI18n[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _useI18n[key];
25
+ }
26
+ });
27
+ });
28
+ var _useOptions = require("./useOptions");
29
+ Object.keys(_useOptions).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _useOptions[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _useOptions[key];
36
+ }
37
+ });
38
+ });
@@ -0,0 +1,3 @@
1
+ export * from "./useChat.mjs";
2
+ export * from "./useI18n.mjs";
3
+ export * from "./useOptions.mjs";
@@ -0,0 +1 @@
1
+ export declare function useChat(): Chat;