@happyvertical/smrt-chat 0.34.5 → 0.34.7

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 (52) hide show
  1. package/dist/manifest.json +2 -2
  2. package/dist/smrt-knowledge.json +4 -4
  3. package/dist/svelte/components/agent/AgentChat.svelte +34 -49
  4. package/dist/svelte/components/agent/AgentChat.svelte.d.ts.map +1 -1
  5. package/dist/svelte/components/agent/AgentSelector.svelte +1 -0
  6. package/dist/svelte/components/agent/AgentSelector.svelte.d.ts.map +1 -1
  7. package/dist/svelte/components/agent/AgentSessionPanel.svelte +15 -16
  8. package/dist/svelte/components/agent/AgentSessionPanel.svelte.d.ts.map +1 -1
  9. package/dist/svelte/components/agent/ToolCallDisplay.svelte +1 -0
  10. package/dist/svelte/components/agent/ToolCallDisplay.svelte.d.ts.map +1 -1
  11. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte +29 -94
  12. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte.d.ts.map +1 -1
  13. package/dist/svelte/components/dialogs/SearchMessages.svelte +51 -36
  14. package/dist/svelte/components/dialogs/SearchMessages.svelte.d.ts.map +1 -1
  15. package/dist/svelte/components/layout/ChatLayout.svelte +1 -0
  16. package/dist/svelte/components/layout/ChatLayout.svelte.d.ts.map +1 -1
  17. package/dist/svelte/components/layout/MemberList.svelte +10 -15
  18. package/dist/svelte/components/layout/MemberList.svelte.d.ts.map +1 -1
  19. package/dist/svelte/components/layout/RoomHeader.svelte +13 -16
  20. package/dist/svelte/components/layout/RoomHeader.svelte.d.ts.map +1 -1
  21. package/dist/svelte/components/layout/RoomList.svelte +26 -17
  22. package/dist/svelte/components/layout/RoomList.svelte.d.ts.map +1 -1
  23. package/dist/svelte/components/messages/MessageInput.svelte +34 -48
  24. package/dist/svelte/components/messages/MessageInput.svelte.d.ts.map +1 -1
  25. package/dist/svelte/components/messages/MessageItem.svelte +52 -43
  26. package/dist/svelte/components/messages/MessageItem.svelte.d.ts.map +1 -1
  27. package/dist/svelte/components/messages/ThreadPanel.svelte +9 -9
  28. package/dist/svelte/components/messages/ThreadPanel.svelte.d.ts.map +1 -1
  29. package/dist/svelte/components/shared/FileUpload.svelte +23 -54
  30. package/dist/svelte/components/shared/FileUpload.svelte.d.ts.map +1 -1
  31. package/dist/svelte/components/shared/MentionAutocomplete.svelte +1 -0
  32. package/dist/svelte/components/shared/MentionAutocomplete.svelte.d.ts.map +1 -1
  33. package/dist/svelte/components/shared/ReactionPicker.svelte +15 -66
  34. package/dist/svelte/components/shared/ReactionPicker.svelte.d.ts.map +1 -1
  35. package/dist/svelte/components/tabs/ChatTab.svelte +20 -18
  36. package/dist/svelte/components/tabs/ChatTab.svelte.d.ts.map +1 -1
  37. package/dist/svelte/components/tabs/ChatTabList.svelte +13 -10
  38. package/dist/svelte/components/tabs/ChatTabList.svelte.d.ts.map +1 -1
  39. package/dist/svelte/components/tabs/MiniChat.svelte +21 -37
  40. package/dist/svelte/components/tabs/MiniChat.svelte.d.ts.map +1 -1
  41. package/dist/svelte/index.d.ts +1 -2
  42. package/dist/svelte/index.d.ts.map +1 -1
  43. package/dist/svelte/index.js +5 -4
  44. package/package.json +9 -8
  45. package/dist/svelte/components/shared/MessageBubble.svelte +0 -81
  46. package/dist/svelte/components/shared/MessageBubble.svelte.d.ts +0 -16
  47. package/dist/svelte/components/shared/MessageBubble.svelte.d.ts.map +0 -1
  48. package/dist/svelte/components/shared/TypingIndicator.svelte +0 -90
  49. package/dist/svelte/components/shared/TypingIndicator.svelte.d.ts +0 -12
  50. package/dist/svelte/components/shared/TypingIndicator.svelte.d.ts.map +0 -1
  51. package/dist/svelte/components/shared/__tests__/MessageBubble.test.js +0 -21
  52. package/dist/svelte/components/shared/__tests__/TypingIndicator.test.js +0 -27
@@ -84,6 +84,7 @@ function highlightMatch(
84
84
  >
85
85
  {#each suggestions as suggestion, i (suggestion.id)}
86
86
  {@const parts = highlightMatch(suggestion.name, query)}
87
+ <!-- raw-primitive-allow: role=option in a hand-rolled autocomplete listbox with roving active-index keyboard navigation (ArrowUp/Down/Enter/Tab) and onpointerenter active sync, wrapping rich content (avatar, highlighted name); no Button primitive owns this structural listbox-option pattern -->
87
88
  <button
88
89
  class="mention-autocomplete__item"
89
90
  class:mention-autocomplete__item--active={i === activeIndex}
@@ -1 +1 @@
1
- {"version":3,"file":"MentionAutocomplete.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/shared/MentionAutocomplete.svelte.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,KAAK;IACpB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAiFD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"MentionAutocomplete.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/shared/MentionAutocomplete.svelte.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,KAAK;IACpB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAkFD,QAAA,MAAM,mBAAmB,2CAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -1,8 +1,14 @@
1
1
  <script lang="ts">
2
2
  /**
3
- * ReactionPicker - Emoji reaction selector
4
- * Compact popup grid of common emojis.
3
+ * ReactionPicker chat's emoji reaction selector.
4
+ *
5
+ * A thin adapter over the canonical `@happyvertical/smrt-ui/chat`
6
+ * `ReactionPicker` (no duplicated markup/styles): it supplies chat's emoji
7
+ * palette and routes the group + per-emoji labels through chat's i18n catalog,
8
+ * and preserves the package's `onreact` / `isOpen` vocabulary + the
9
+ * `ModuleUIRegistry` registration.
5
10
  */
11
+ import { ReactionPicker as UIReactionPicker } from '@happyvertical/smrt-ui/chat';
6
12
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
7
13
  import { M } from '../../i18n.js';
8
14
 
@@ -35,69 +41,12 @@ const emojis = [
35
41
  '\u{274C}',
36
42
  '\u{1F4AF}',
37
43
  ];
38
-
39
- function handleSelect(emoji: string) {
40
- onreact(emoji);
41
- }
42
-
43
- function handleKeydown(event: KeyboardEvent, emoji: string) {
44
- if (event.key === 'Enter' || event.key === ' ') {
45
- event.preventDefault();
46
- handleSelect(emoji);
47
- }
48
- }
49
44
  </script>
50
45
 
51
- {#if isOpen}
52
- <div class="reaction-picker" role="group" aria-label={t(M['chat.reaction_picker.reactions'])}>
53
- {#each emojis as emoji}
54
- <button
55
- class="reaction-picker__item"
56
- type="button"
57
- onclick={() => handleSelect(emoji)}
58
- aria-label={t(M['chat.reaction_picker.react_with'], { emoji })}
59
- >
60
- {emoji}
61
- </button>
62
- {/each}
63
- </div>
64
- {/if}
65
-
66
- <style>
67
- .reaction-picker {
68
- display: grid;
69
- grid-template-columns: repeat(8, 1fr);
70
- gap: var(--smrt-spacing-1, 0.25rem);
71
- padding: var(--smrt-spacing-2, 0.375rem);
72
- background: var(--smrt-color-surface, #ffffff);
73
- border: 1px solid var(--smrt-color-outline-variant, #c4c6cf);
74
- border-radius: var(--smrt-radius-medium, 0.5rem);
75
- box-shadow: var(--smrt-elevation-2, 0 2px 6px rgba(0, 0, 0, 0.15));
76
- width: max-content;
77
- }
78
-
79
- .reaction-picker__item {
80
- display: flex;
81
- align-items: center;
82
- justify-content: center;
83
- width: 32px;
84
- height: 32px;
85
- border: none;
86
- border-radius: var(--smrt-radius-small, 0.25rem);
87
- background: transparent;
88
- cursor: pointer;
89
- font-size: var(--smrt-typography-body-large-size, 1.125rem);
90
- line-height: 1;
91
- padding: 0;
92
- transition: background var(--smrt-duration-short2, 150ms) var(--smrt-easing-standard, ease);
93
- }
94
-
95
- .reaction-picker__item:hover {
96
- background: var(--smrt-color-surface-container-high, #e1e3e8);
97
- }
98
-
99
- .reaction-picker__item:focus-visible {
100
- outline: 2px solid var(--smrt-color-primary, #005ac1);
101
- outline-offset: -2px;
102
- }
103
- </style>
46
+ <UIReactionPicker
47
+ {emojis}
48
+ {isOpen}
49
+ label={t(M['chat.reaction_picker.reactions'])}
50
+ emojiLabel={(emoji) => t(M['chat.reaction_picker.react_with'], { emoji })}
51
+ onpick={onreact}
52
+ />
@@ -1 +1 @@
1
- {"version":3,"file":"ReactionPicker.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/shared/ReactionPicker.svelte.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,KAAK;IACpB,yCAAyC;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,oCAAoC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAwDD,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ReactionPicker.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/shared/ReactionPicker.svelte.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,KAAK;IACpB,yCAAyC;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,oCAAoC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAoCD,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * Expands upward from the bottom tab bar.
6
6
  */
7
7
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
8
+ import { Button } from '@happyvertical/smrt-ui/ui';
8
9
  import { M } from '../../i18n.messages.js';
9
10
  import type { ChatMessageData, ChatTabState } from '../../types.js';
10
11
  import Avatar from '../shared/Avatar.svelte';
@@ -43,6 +44,7 @@ const {
43
44
  {#if tab.isExpanded}
44
45
  <div class="chat-tab chat-tab--expanded" aria-label={t(M['chat.chat_tab.chat_with'], { name: tab.room.name })}>
45
46
  <div class="chat-tab__header">
47
+ <!-- raw-primitive-allow: pressable header title wrapping rich content (room avatar component and name) that collapses the chat window on click; no Button primitive owns this structural avatar-header pattern -->
46
48
  <button
47
49
  class="chat-tab__header-btn"
48
50
  type="button"
@@ -58,7 +60,9 @@ const {
58
60
  </button>
59
61
 
60
62
  <div class="chat-tab__actions">
61
- <button
63
+ <Button
64
+ variant="ghost"
65
+ size="sm"
62
66
  class="chat-tab__icon-btn"
63
67
  type="button"
64
68
  onclick={oncollapse}
@@ -68,8 +72,10 @@ const {
68
72
  <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
69
73
  <rect x="3" y="12" width="10" height="2" rx="1" />
70
74
  </svg>
71
- </button>
72
- <button
75
+ </Button>
76
+ <Button
77
+ variant="ghost"
78
+ size="sm"
73
79
  class="chat-tab__icon-btn"
74
80
  type="button"
75
81
  onclick={onclose}
@@ -79,7 +85,7 @@ const {
79
85
  <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
80
86
  <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z" />
81
87
  </svg>
82
- </button>
88
+ </Button>
83
89
  </div>
84
90
  </div>
85
91
 
@@ -93,6 +99,7 @@ const {
93
99
  </div>
94
100
  </div>
95
101
  {:else}
102
+ <!-- raw-primitive-allow: large pressable collapsed-tab card wrapping rich content (room avatar component, name, unread badge) that expands the chat window on click; no Button primitive owns this structural selection-card pattern -->
96
103
  <button
97
104
  class="chat-tab chat-tab--collapsed"
98
105
  type="button"
@@ -164,29 +171,21 @@ const {
164
171
  flex-shrink: 0;
165
172
  }
166
173
 
167
- .chat-tab__icon-btn {
168
- display: inline-flex;
169
- align-items: center;
170
- justify-content: center;
174
+ /* :global() pierces into each Button's rendered <button> (see #1589). */
175
+ .chat-tab__actions :global(.chat-tab__icon-btn) {
171
176
  width: 28px;
172
177
  height: 28px;
173
- border: none;
178
+ padding: 0;
174
179
  background: none;
175
180
  color: inherit;
176
- cursor: pointer;
177
181
  border-radius: var(--smrt-radius-full, 9999px);
178
182
  transition: background var(--smrt-duration-short2, 150ms);
179
183
  }
180
184
 
181
- .chat-tab__icon-btn:hover {
185
+ .chat-tab__actions :global(.chat-tab__icon-btn:hover) {
182
186
  background: color-mix(in srgb, var(--smrt-color-on-primary) 15%, transparent);
183
187
  }
184
188
 
185
- .chat-tab__icon-btn:focus-visible {
186
- outline: 2px solid var(--smrt-color-on-primary, #ffffff);
187
- outline-offset: -2px;
188
- }
189
-
190
189
  .chat-tab__body {
191
190
  flex: 1;
192
191
  min-height: 0;
@@ -232,8 +231,11 @@ const {
232
231
  }
233
232
 
234
233
  @media (prefers-reduced-motion: reduce) {
235
- .chat-tab--collapsed,
236
- .chat-tab__icon-btn {
234
+ .chat-tab--collapsed {
235
+ transition: none;
236
+ }
237
+
238
+ .chat-tab__actions :global(.chat-tab__icon-btn) {
237
239
  transition: none;
238
240
  }
239
241
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTab.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/ChatTab.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKpE,MAAM,WAAW,KAAK;IACpB,gBAAgB;IAChB,GAAG,EAAE,YAAY,CAAC;IAClB,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wBAAwB;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AA+DD,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"ChatTab.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/ChatTab.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKpE,MAAM,WAAW,KAAK;IACpB,gBAAgB;IAChB,GAAG,EAAE,YAAY,CAAC;IAClB,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wBAAwB;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAkED,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * Horizontal bar of small avatars/names at bottom. Shows unread badges.
5
5
  */
6
6
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
7
+ import { Button } from '@happyvertical/smrt-ui/ui';
7
8
  import { M } from '../../i18n.messages.js';
8
9
  import type { ChatTabState } from '../../types.js';
9
10
  import Avatar from '../shared/Avatar.svelte';
@@ -26,6 +27,7 @@ const { tabs, onselect, onclose }: Props = $props();
26
27
  <nav class="tab-list" aria-label={t(M['chat.chat_tab_list.minimized_chats'])}>
27
28
  {#each tabs as tab (tab.roomId)}
28
29
  <div class="tab-list__item">
30
+ <!-- raw-primitive-allow: pressable circular avatar tab wrapping rich content (room avatar component and overlaid unread badge) that opens the chat on click; no Button primitive owns this structural avatar-tab pattern -->
29
31
  <button
30
32
  class="tab-list__btn"
31
33
  type="button"
@@ -44,7 +46,9 @@ const { tabs, onselect, onclose }: Props = $props();
44
46
  </span>
45
47
  {/if}
46
48
  </button>
47
- <button
49
+ <Button
50
+ variant="ghost"
51
+ size="sm"
48
52
  class="tab-list__close"
49
53
  type="button"
50
54
  onclick={(e) => { e.stopPropagation(); onclose(tab.roomId); }}
@@ -54,7 +58,7 @@ const { tabs, onselect, onclose }: Props = $props();
54
58
  <svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
55
59
  <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z" />
56
60
  </svg>
57
- </button>
61
+ </Button>
58
62
  </div>
59
63
  {/each}
60
64
  </nav>
@@ -119,33 +123,32 @@ const { tabs, onselect, onclose }: Props = $props();
119
123
  border: 2px solid var(--smrt-color-surface, #fefbff);
120
124
  }
121
125
 
122
- .tab-list__close {
126
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
127
+ .tab-list__item :global(.tab-list__close) {
123
128
  display: none;
124
129
  position: absolute;
125
130
  top: -4px;
126
131
  right: -4px;
127
132
  width: 18px;
128
133
  height: 18px;
129
- align-items: center;
130
- justify-content: center;
131
- border: none;
132
134
  background: var(--smrt-color-surface-variant, #e1e2ec);
133
135
  color: var(--smrt-color-on-surface-variant, #43474e);
134
136
  border-radius: var(--smrt-radius-full, 9999px);
135
- cursor: pointer;
136
137
  padding: 0;
137
138
  font-size: 0;
138
139
  }
139
140
 
140
- .tab-list__item:hover .tab-list__close {
141
+ .tab-list__item:hover :global(.tab-list__close),
142
+ .tab-list__item:focus-within :global(.tab-list__close) {
141
143
  display: inline-flex;
142
144
  }
143
145
 
144
- .tab-list__item:hover .tab-list__badge {
146
+ .tab-list__item:hover .tab-list__badge,
147
+ .tab-list__item:focus-within .tab-list__badge {
145
148
  display: none;
146
149
  }
147
150
 
148
- .tab-list__close:hover {
151
+ .tab-list__item :global(.tab-list__close:hover) {
149
152
  background: var(--smrt-color-error-container, #ffdad6);
150
153
  color: var(--smrt-color-on-error-container, #410002);
151
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTabList.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/ChatTabList.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,KAAK;IACpB,+BAA+B;IAC/B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,4BAA4B;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,kBAAkB;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAwCD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ChatTabList.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/ChatTabList.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,KAAK;IACpB,+BAA+B;IAC/B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,4BAA4B;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,kBAAkB;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AA0CD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -4,7 +4,9 @@
4
4
  * Simplified message list + input in minimal space.
5
5
  * No thread panel, no reactions. Just messages and a send box.
6
6
  */
7
+ import { Form, Input } from '@happyvertical/smrt-ui/forms';
7
8
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
9
+ import { Button } from '@happyvertical/smrt-ui/ui';
8
10
  import { M } from '../../i18n.messages.js';
9
11
  import type { ChatMessageData } from '../../types.js';
10
12
  import Avatar from '../shared/Avatar.svelte';
@@ -85,8 +87,8 @@ $effect(() => {
85
87
  {/if}
86
88
  </div>
87
89
 
88
- <form class="mini-chat__input-bar" onsubmit={handleSubmit}>
89
- <input
90
+ <Form class="mini-chat__input-bar" onsubmit={handleSubmit}>
91
+ <Input
90
92
  class="mini-chat__input"
91
93
  type="text"
92
94
  placeholder={t(M['chat.mini_chat.placeholder'])}
@@ -94,7 +96,8 @@ $effect(() => {
94
96
  onkeydown={handleKeydown}
95
97
  aria-label={t(M['chat.mini_chat.input_label'])}
96
98
  />
97
- <button
99
+ <Button
100
+ variant="ghost"
98
101
  class="mini-chat__send-btn"
99
102
  type="submit"
100
103
  disabled={!inputValue.trim()}
@@ -103,8 +106,8 @@ $effect(() => {
103
106
  <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
104
107
  <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z" />
105
108
  </svg>
106
- </button>
107
- </form>
109
+ </Button>
110
+ </Form>
108
111
  </div>
109
112
 
110
113
  <style>
@@ -183,7 +186,8 @@ $effect(() => {
183
186
  color: var(--smrt-color-outline, #74777f);
184
187
  }
185
188
 
186
- .mini-chat__input-bar {
189
+ /* :global() targets the Form primitive's rendered <form> (see #1589 scoping trap). */
190
+ :global(.mini-chat__input-bar) {
187
191
  display: flex;
188
192
  align-items: center;
189
193
  gap: var(--smrt-spacing-1, 4px);
@@ -192,61 +196,41 @@ $effect(() => {
192
196
  background: var(--smrt-color-surface, #fefbff);
193
197
  }
194
198
 
195
- .mini-chat__input {
199
+ /* Layout for the Input primitive's rendered <input> (tokenised styling comes
200
+ from the primitive; this only sizes/shapes it within the input bar). */
201
+ :global(.mini-chat__input) {
196
202
  flex: 1;
197
- border: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
198
203
  border-radius: var(--smrt-radius-full, 9999px);
199
- padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-3, 12px);
200
- font: var(--smrt-typography-body-small-font, 0.8125rem/1.4 sans-serif);
201
- color: var(--smrt-color-on-surface, #1a1c1e);
202
- background: var(--smrt-color-surface-container-low, #f7f7fb);
203
- outline: none;
204
204
  }
205
205
 
206
- .mini-chat__input:focus {
207
- border-color: var(--smrt-color-primary, #005ac1);
208
- box-shadow: 0 0 0 1px var(--smrt-color-primary, #005ac1);
209
- }
210
-
211
- .mini-chat__input::placeholder {
212
- color: var(--smrt-color-outline, #74777f);
213
- }
214
-
215
- .mini-chat__send-btn {
216
- display: inline-flex;
217
- align-items: center;
218
- justify-content: center;
206
+ /* :global() pierces into the Button child's rendered <button> (see #1589).
207
+ The ancestor is the Form primitive's <form>, also global. */
208
+ :global(.mini-chat__input-bar .mini-chat__send-btn) {
219
209
  width: 32px;
220
210
  height: 32px;
221
- border: none;
211
+ padding: 0;
222
212
  background: var(--smrt-color-primary, #005ac1);
223
213
  color: var(--smrt-color-on-primary, #ffffff);
224
214
  border-radius: var(--smrt-radius-full, 9999px);
225
- cursor: pointer;
226
215
  flex-shrink: 0;
227
216
  transition: opacity var(--smrt-duration-short2, 150ms);
228
217
  }
229
218
 
230
- .mini-chat__send-btn:disabled {
219
+ :global(.mini-chat__input-bar .mini-chat__send-btn:disabled) {
231
220
  opacity: 0.4;
232
- cursor: not-allowed;
233
221
  }
234
222
 
235
- .mini-chat__send-btn:not(:disabled):hover {
223
+ :global(.mini-chat__input-bar .mini-chat__send-btn:not(:disabled):hover) {
224
+ background: var(--smrt-color-primary, #005ac1);
236
225
  opacity: 0.85;
237
226
  }
238
227
 
239
- .mini-chat__send-btn:focus-visible {
240
- outline: 2px solid var(--smrt-color-primary, #005ac1);
241
- outline-offset: 2px;
242
- }
243
-
244
228
  @media (prefers-reduced-motion: reduce) {
245
229
  .mini-chat__messages {
246
230
  scroll-behavior: auto;
247
231
  }
248
232
 
249
- .mini-chat__send-btn {
233
+ :global(.mini-chat__input-bar .mini-chat__send-btn) {
250
234
  transition: none;
251
235
  }
252
236
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MiniChat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/MiniChat.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,WAAW,KAAK;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkFD,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"MiniChat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/MiniChat.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,WAAW,KAAK;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoFD,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -17,6 +17,7 @@
17
17
  * const Component = ModuleUIRegistry.get('@happyvertical/smrt-chat', 'chat-layout');
18
18
  * ```
19
19
  */
20
+ export { MessageBubble, TypingIndicator } from '@happyvertical/smrt-ui/chat';
20
21
  export { default as AgentChat } from './components/agent/AgentChat.svelte';
21
22
  export { default as AgentSelector } from './components/agent/AgentSelector.svelte';
22
23
  export { default as AgentSessionPanel } from './components/agent/AgentSessionPanel.svelte';
@@ -35,10 +36,8 @@ export { default as Avatar } from './components/shared/Avatar.svelte';
35
36
  export { default as FileUpload } from './components/shared/FileUpload.svelte';
36
37
  export { default as LinkPreview } from './components/shared/LinkPreview.svelte';
37
38
  export { default as MentionAutocomplete } from './components/shared/MentionAutocomplete.svelte';
38
- export { default as MessageBubble } from './components/shared/MessageBubble.svelte';
39
39
  export { default as ReactionPicker } from './components/shared/ReactionPicker.svelte';
40
40
  export { default as ReadReceipts } from './components/shared/ReadReceipts.svelte';
41
- export { default as TypingIndicator } from './components/shared/TypingIndicator.svelte';
42
41
  export { default as UserPresence } from './components/shared/UserPresence.svelte';
43
42
  export { default as ChatTab } from './components/tabs/ChatTab.svelte';
44
43
  export { default as ChatTabList } from './components/tabs/ChatTabList.svelte';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsCH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGxE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAwCH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGxE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -17,6 +17,7 @@
17
17
  * const Component = ModuleUIRegistry.get('@happyvertical/smrt-chat', 'chat-layout');
18
18
  * ```
19
19
  */
20
+ import { MessageBubble, TypingIndicator } from '@happyvertical/smrt-ui/chat';
20
21
  import { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';
21
22
  import { CHAT_MODULE_META } from '../ui.js';
22
23
  // Agent components
@@ -42,16 +43,18 @@ import Avatar from './components/shared/Avatar.svelte';
42
43
  import FileUpload from './components/shared/FileUpload.svelte';
43
44
  import LinkPreview from './components/shared/LinkPreview.svelte';
44
45
  import MentionAutocomplete from './components/shared/MentionAutocomplete.svelte';
45
- import MessageBubble from './components/shared/MessageBubble.svelte';
46
46
  import ReactionPicker from './components/shared/ReactionPicker.svelte';
47
47
  import ReadReceipts from './components/shared/ReadReceipts.svelte';
48
- import TypingIndicator from './components/shared/TypingIndicator.svelte';
49
48
  import UserPresence from './components/shared/UserPresence.svelte';
50
49
  // Tab components
51
50
  import ChatTab from './components/tabs/ChatTab.svelte';
52
51
  import ChatTabList from './components/tabs/ChatTabList.svelte';
53
52
  import ChatTabs from './components/tabs/ChatTabs.svelte';
54
53
  import MiniChat from './components/tabs/MiniChat.svelte';
54
+ // MessageBubble + TypingIndicator are re-exported from the canonical
55
+ // `@happyvertical/smrt-ui/chat` primitives (consolidated in #1589);
56
+ // ReactionPicker keeps a thin chat-local adapter for the package's i18n + palette.
57
+ export { MessageBubble, TypingIndicator } from '@happyvertical/smrt-ui/chat';
55
58
  export { default as AgentChat } from './components/agent/AgentChat.svelte';
56
59
  export { default as AgentSelector } from './components/agent/AgentSelector.svelte';
57
60
  export { default as AgentSessionPanel } from './components/agent/AgentSessionPanel.svelte';
@@ -71,10 +74,8 @@ export { default as Avatar } from './components/shared/Avatar.svelte';
71
74
  export { default as FileUpload } from './components/shared/FileUpload.svelte';
72
75
  export { default as LinkPreview } from './components/shared/LinkPreview.svelte';
73
76
  export { default as MentionAutocomplete } from './components/shared/MentionAutocomplete.svelte';
74
- export { default as MessageBubble } from './components/shared/MessageBubble.svelte';
75
77
  export { default as ReactionPicker } from './components/shared/ReactionPicker.svelte';
76
78
  export { default as ReadReceipts } from './components/shared/ReadReceipts.svelte';
77
- export { default as TypingIndicator } from './components/shared/TypingIndicator.svelte';
78
79
  export { default as UserPresence } from './components/shared/UserPresence.svelte';
79
80
  export { default as ChatTab } from './components/tabs/ChatTab.svelte';
80
81
  export { default as ChatTabList } from './components/tabs/ChatTabList.svelte';
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-chat",
3
- "version": "0.34.5",
3
+ "version": "0.34.7",
4
4
  "description": "Chat rooms, DMs, threads, and agent conversations for the SMRT framework",
5
5
  "type": "module",
6
+ "smrtRawPrimitives": "strict",
6
7
  "main": "./dist/index.js",
7
8
  "types": "./dist/index.d.ts",
8
9
  "exports": {
@@ -55,10 +56,10 @@
55
56
  "access": "public"
56
57
  },
57
58
  "dependencies": {
58
- "@happyvertical/smrt-core": "0.34.5",
59
- "@happyvertical/smrt-tenancy": "0.34.5",
60
- "@happyvertical/smrt-types": "0.34.5",
61
- "@happyvertical/smrt-ui": "0.34.5"
59
+ "@happyvertical/smrt-tenancy": "0.34.7",
60
+ "@happyvertical/smrt-core": "0.34.7",
61
+ "@happyvertical/smrt-types": "0.34.7",
62
+ "@happyvertical/smrt-ui": "0.34.7"
62
63
  },
63
64
  "peerDependencies": {
64
65
  "svelte": "^5.18.0"
@@ -78,9 +79,9 @@
78
79
  "typescript": "^5.9.3",
79
80
  "vite": "^7.3.1",
80
81
  "vitest": "^4.0.17",
81
- "@happyvertical/smrt-agents": "0.34.5",
82
- "@happyvertical/smrt-profiles": "0.34.5",
83
- "@happyvertical/smrt-vitest": "0.34.5"
82
+ "@happyvertical/smrt-agents": "0.34.7",
83
+ "@happyvertical/smrt-profiles": "0.34.7",
84
+ "@happyvertical/smrt-vitest": "0.34.7"
84
85
  },
85
86
  "scripts": {
86
87
  "build": "vite build --mode library && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json",
@@ -1,81 +0,0 @@
1
- <script lang="ts">
2
- /**
3
- * MessageBubble - Styled message bubble
4
- * Different styling for own messages, others' messages, agent, and system.
5
- */
6
-
7
- export interface Props {
8
- /** Message content text */
9
- content: string;
10
- /** Whether this message was sent by the current user */
11
- isOwn: boolean;
12
- /** Visual variant of the bubble */
13
- variant?: 'default' | 'agent' | 'system';
14
- }
15
-
16
- const { content, isOwn, variant = 'default' }: Props = $props();
17
- </script>
18
-
19
- <div
20
- class="bubble {variant}"
21
- class:own={isOwn}
22
- >
23
- <p class="bubble__content">{content}</p>
24
- </div>
25
-
26
- <style>
27
- .bubble {
28
- max-width: 75%;
29
- padding: var(--smrt-spacing-3, 0.75rem) var(--smrt-spacing-4, 1rem);
30
- border-radius: var(--smrt-radius-large, 1rem);
31
- word-break: break-word;
32
- line-height: 1.4;
33
- font-size: var(--smrt-typography-body-medium-size, 0.875rem);
34
- }
35
-
36
- .bubble__content {
37
- margin: 0;
38
- white-space: pre-wrap;
39
- }
40
-
41
- /* Default variant - received */
42
- .default {
43
- background: var(--smrt-color-surface-container, #f3f4f6);
44
- color: var(--smrt-color-on-surface, #1b1b1f);
45
- border-bottom-left-radius: var(--smrt-radius-small, 0.25rem);
46
- }
47
-
48
- /* Default variant - own message */
49
- .default.own {
50
- background: var(--smrt-color-primary, #005ac1);
51
- color: var(--smrt-color-on-primary, #ffffff);
52
- border-bottom-right-radius: var(--smrt-radius-small, 0.25rem);
53
- border-bottom-left-radius: var(--smrt-radius-large, 1rem);
54
- }
55
-
56
- /* Agent variant */
57
- .agent {
58
- background: var(--smrt-color-tertiary-container, #ffd8e4);
59
- color: var(--smrt-color-on-tertiary-container, #31111d);
60
- border-bottom-left-radius: var(--smrt-radius-small, 0.25rem);
61
- border-left: 3px solid var(--smrt-color-tertiary, #7d5260);
62
- }
63
-
64
- .agent.own {
65
- border-left: none;
66
- border-right: 3px solid var(--smrt-color-tertiary, #7d5260);
67
- border-bottom-right-radius: var(--smrt-radius-small, 0.25rem);
68
- border-bottom-left-radius: var(--smrt-radius-large, 1rem);
69
- }
70
-
71
- /* System variant */
72
- .system {
73
- max-width: 100%;
74
- background: transparent;
75
- color: var(--smrt-color-on-surface-variant, #43474e);
76
- text-align: center;
77
- font-size: var(--smrt-typography-body-small-size, 0.75rem);
78
- padding: var(--smrt-spacing-2, 0.375rem) var(--smrt-spacing-4, 1rem);
79
- border-radius: 0;
80
- }
81
- </style>
@@ -1,16 +0,0 @@
1
- /**
2
- * MessageBubble - Styled message bubble
3
- * Different styling for own messages, others' messages, agent, and system.
4
- */
5
- export interface Props {
6
- /** Message content text */
7
- content: string;
8
- /** Whether this message was sent by the current user */
9
- isOwn: boolean;
10
- /** Visual variant of the bubble */
11
- variant?: 'default' | 'agent' | 'system';
12
- }
13
- declare const MessageBubble: import("svelte").Component<Props, {}, "">;
14
- type MessageBubble = ReturnType<typeof MessageBubble>;
15
- export default MessageBubble;
16
- //# sourceMappingURL=MessageBubble.svelte.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MessageBubble.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/shared/MessageBubble.svelte.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,WAAW,KAAK;IACpB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC1C;AAeD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}