@social.io/catalog 1.3.0 → 2.1.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 (130) hide show
  1. package/.smartconfig.json +51 -0
  2. package/dist_bundle/bundle.js +5455 -3248
  3. package/dist_ts_web/00_commitinfo_data.js +3 -3
  4. package/dist_ts_web/elements/index.d.ts +21 -3
  5. package/dist_ts_web/elements/index.js +28 -7
  6. package/dist_ts_web/elements/sio-ai-card.d.ts +39 -0
  7. package/dist_ts_web/elements/sio-ai-card.js +229 -0
  8. package/dist_ts_web/elements/sio-avatar.d.ts +46 -0
  9. package/dist_ts_web/elements/sio-avatar.js +379 -0
  10. package/dist_ts_web/elements/sio-bucket-header.d.ts +36 -0
  11. package/dist_ts_web/elements/sio-bucket-header.js +197 -0
  12. package/dist_ts_web/elements/sio-button.d.ts +7 -3
  13. package/dist_ts_web/elements/sio-button.js +253 -152
  14. package/dist_ts_web/elements/sio-channel-rail.d.ts +38 -0
  15. package/dist_ts_web/elements/sio-channel-rail.js +288 -0
  16. package/dist_ts_web/elements/sio-chip.d.ts +25 -0
  17. package/dist_ts_web/elements/sio-chip.js +188 -0
  18. package/dist_ts_web/elements/sio-cmdk.d.ts +59 -0
  19. package/dist_ts_web/elements/sio-cmdk.js +471 -0
  20. package/dist_ts_web/elements/sio-combox.d.ts +55 -1
  21. package/dist_ts_web/elements/sio-combox.js +458 -261
  22. package/dist_ts_web/elements/sio-composer.d.ts +48 -0
  23. package/dist_ts_web/elements/sio-composer.js +357 -0
  24. package/dist_ts_web/elements/sio-conversation-selector.d.ts +41 -1
  25. package/dist_ts_web/elements/sio-conversation-selector.js +426 -238
  26. package/dist_ts_web/elements/sio-conversation-view.d.ts +34 -6
  27. package/dist_ts_web/elements/sio-conversation-view.js +738 -564
  28. package/dist_ts_web/elements/sio-dropdown-menu.d.ts +6 -6
  29. package/dist_ts_web/elements/sio-dropdown-menu.js +223 -169
  30. package/dist_ts_web/elements/sio-fab.d.ts +23 -5
  31. package/dist_ts_web/elements/sio-fab.js +259 -235
  32. package/dist_ts_web/elements/sio-glass-toolbar.d.ts +22 -0
  33. package/dist_ts_web/elements/sio-glass-toolbar.js +178 -0
  34. package/dist_ts_web/elements/sio-icon.d.ts +1 -0
  35. package/dist_ts_web/elements/sio-icon.js +254 -94
  36. package/dist_ts_web/elements/sio-image-lightbox.d.ts +3 -4
  37. package/dist_ts_web/elements/sio-image-lightbox.js +282 -191
  38. package/dist_ts_web/elements/sio-inset-list.d.ts +28 -0
  39. package/dist_ts_web/elements/sio-inset-list.js +191 -0
  40. package/dist_ts_web/elements/sio-kbd.d.ts +16 -0
  41. package/dist_ts_web/elements/sio-kbd.js +117 -0
  42. package/dist_ts_web/elements/sio-list-row.d.ts +55 -0
  43. package/dist_ts_web/elements/sio-list-row.js +462 -0
  44. package/dist_ts_web/elements/sio-logo-render.d.ts +42 -0
  45. package/dist_ts_web/elements/sio-logo-render.js +306 -0
  46. package/dist_ts_web/elements/sio-logo.d.ts +64 -0
  47. package/dist_ts_web/elements/sio-logo.js +393 -0
  48. package/dist_ts_web/elements/sio-message-input.d.ts +25 -4
  49. package/dist_ts_web/elements/sio-message-input.js +231 -226
  50. package/dist_ts_web/elements/sio-paper-thumb.d.ts +24 -0
  51. package/dist_ts_web/elements/sio-paper-thumb.js +293 -0
  52. package/dist_ts_web/elements/sio-pdf-viewer.d.ts +2 -0
  53. package/dist_ts_web/elements/sio-pdf-viewer.js +344 -244
  54. package/dist_ts_web/elements/sio-segmented.d.ts +32 -0
  55. package/dist_ts_web/elements/sio-segmented.js +217 -0
  56. package/dist_ts_web/elements/sio-step-timeline.d.ts +28 -0
  57. package/dist_ts_web/elements/sio-step-timeline.js +222 -0
  58. package/dist_ts_web/elements/sio-tab-bar.d.ts +36 -0
  59. package/dist_ts_web/elements/sio-tab-bar.js +232 -0
  60. package/dist_ts_web/elements/sio-unread-badge.d.ts +25 -0
  61. package/dist_ts_web/elements/sio-unread-badge.js +203 -0
  62. package/dist_ts_web/elements/sio-waveform.d.ts +34 -0
  63. package/dist_ts_web/elements/sio-waveform.js +304 -0
  64. package/dist_ts_web/elements/tokens.d.ts +70 -0
  65. package/dist_ts_web/elements/tokens.js +277 -0
  66. package/dist_ts_web/pages/firstpage.d.ts +5 -0
  67. package/dist_ts_web/pages/firstpage.js +21 -2
  68. package/dist_ts_web/pages/mainpage.d.ts +6 -0
  69. package/dist_ts_web/pages/mainpage.js +111 -39
  70. package/{license → license.md} +3 -1
  71. package/package.json +23 -29
  72. package/readme.hints.md +82 -0
  73. package/readme.md +113 -146
  74. package/ts_web/00_commitinfo_data.ts +2 -2
  75. package/ts_web/elements/index.ts +31 -7
  76. package/ts_web/elements/sio-ai-card.ts +175 -0
  77. package/ts_web/elements/sio-avatar.ts +295 -0
  78. package/ts_web/elements/sio-bucket-header.ts +157 -0
  79. package/ts_web/elements/sio-button.ts +149 -127
  80. package/ts_web/elements/sio-channel-rail.ts +256 -0
  81. package/ts_web/elements/sio-chip.ts +134 -0
  82. package/ts_web/elements/sio-cmdk.ts +461 -0
  83. package/ts_web/elements/sio-combox.ts +327 -204
  84. package/ts_web/elements/sio-composer.ts +306 -0
  85. package/ts_web/elements/sio-conversation-selector.ts +350 -228
  86. package/ts_web/elements/sio-conversation-view.ts +573 -457
  87. package/ts_web/elements/sio-dropdown-menu.ts +112 -130
  88. package/ts_web/elements/sio-fab.ts +192 -227
  89. package/ts_web/elements/sio-glass-toolbar.ts +140 -0
  90. package/ts_web/elements/sio-icon.ts +147 -25
  91. package/ts_web/elements/sio-image-lightbox.ts +62 -64
  92. package/ts_web/elements/sio-inset-list.ts +140 -0
  93. package/ts_web/elements/sio-kbd.ts +80 -0
  94. package/ts_web/elements/sio-list-row.ts +393 -0
  95. package/ts_web/elements/sio-logo-render.ts +367 -0
  96. package/ts_web/elements/sio-logo.ts +311 -0
  97. package/ts_web/elements/sio-message-input.ts +142 -221
  98. package/ts_web/elements/sio-paper-thumb.ts +244 -0
  99. package/ts_web/elements/sio-pdf-viewer.ts +58 -60
  100. package/ts_web/elements/sio-segmented.ts +183 -0
  101. package/ts_web/elements/sio-step-timeline.ts +179 -0
  102. package/ts_web/elements/sio-tab-bar.ts +195 -0
  103. package/ts_web/elements/sio-unread-badge.ts +147 -0
  104. package/ts_web/elements/sio-waveform.ts +239 -0
  105. package/ts_web/elements/tokens.ts +297 -0
  106. package/ts_web/pages/firstpage.ts +20 -1
  107. package/ts_web/pages/mainpage.ts +111 -39
  108. package/dist_bundle/bundle.js.map +0 -7
  109. package/dist_ts_web/elements/00colors.d.ts +0 -108
  110. package/dist_ts_web/elements/00colors.js +0 -137
  111. package/dist_ts_web/elements/00fonts.d.ts +0 -60
  112. package/dist_ts_web/elements/00fonts.js +0 -129
  113. package/dist_ts_web/elements/00tokens.d.ts +0 -123
  114. package/dist_ts_web/elements/00tokens.js +0 -176
  115. package/dist_ts_web/elements/sio-conversation-list.d.ts +0 -20
  116. package/dist_ts_web/elements/sio-conversation-list.js +0 -495
  117. package/dist_ts_web/elements/sio-recorder.d.ts +0 -60
  118. package/dist_ts_web/elements/sio-recorder.js +0 -173
  119. package/dist_ts_web/elements/sio-subwidget-conversations.d.ts +0 -16
  120. package/dist_ts_web/elements/sio-subwidget-conversations.js +0 -350
  121. package/dist_ts_web/elements/sio-subwidget-onboardme.d.ts +0 -7
  122. package/dist_ts_web/elements/sio-subwidget-onboardme.js +0 -243
  123. package/dist_watch/bundle.js +0 -81694
  124. package/dist_watch/bundle.js.map +0 -7
  125. package/dist_watch/index.html +0 -25
  126. package/npmextra.json +0 -19
  127. package/ts_web/elements/00colors.ts +0 -164
  128. package/ts_web/elements/00fonts.ts +0 -145
  129. package/ts_web/elements/00tokens.ts +0 -197
  130. package/ts_web/elements/sio-recorder.ts +0 -213
@@ -1,245 +1,432 @@
1
- import { DeesElement, property, html, customElement, cssManager, css, unsafeCSS, state, } from '@design.estate/dees-element';
2
- // Import design tokens
3
- import { colors, bdTheme } from './00colors.js';
4
- import { spacing, radius, shadows, transitions } from './00tokens.js';
5
- import { fontFamilies, typography } from './00fonts.js';
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { DeesElement, html, property, state, customElement, css, } from '@design.estate/dees-element';
36
+ import { sioElementStyles, sioToolbarGlass } from './tokens.js';
6
37
  import { SioDropdownMenu } from './sio-dropdown-menu.js';
7
38
  import { SioMessageInput } from './sio-message-input.js';
8
- // Make sure components are loaded
39
+ import './sio-icon.js';
40
+ import './sio-avatar.js';
9
41
  SioDropdownMenu;
10
42
  SioMessageInput;
11
- @customElement('sio-conversation-view')
12
- export class SioConversationView extends DeesElement {
13
- static demo = () => html `
14
- <sio-conversation-view style="width: 600px; height: 600px;"></sio-conversation-view>
43
+ const demoConversation = {
44
+ id: 'orbit-launch',
45
+ title: 'Lena · Orbit',
46
+ agentInitials: 'LP',
47
+ agentTint: '#FF2D55',
48
+ dateStamp: 'Today, 14:02',
49
+ messages: [
50
+ {
51
+ id: '1',
52
+ text: 'Hey! 👋 You wrote about the launch banner — what would you like to change?',
53
+ sender: 'support',
54
+ time: '14:02',
55
+ },
56
+ {
57
+ id: '2',
58
+ text: 'The headline is cut off on tablet. Can we shorten it before Thursday?',
59
+ sender: 'user',
60
+ time: '14:03',
61
+ },
62
+ {
63
+ id: '3',
64
+ text: "Good catch. We can ship the short variant today — I'll send a preview here in ~10 min.",
65
+ sender: 'support',
66
+ time: '14:04',
67
+ },
68
+ { id: '4', text: 'Perfect, thanks!', sender: 'user', time: '14:04' },
69
+ ],
70
+ };
71
+ /**
72
+ * sio-conversation-view — the widget's conversation state
73
+ * (v7 SocialIOWidget.jsx SIOWidgetChat).
74
+ *
75
+ * Glass header (back chevron in tint, 30px agent avatar, name 14/600,
76
+ * status line green "Online now" / orange "Away · replies by email",
77
+ * overflow dots), centered 11px date stamp, bubbles at max-width 76%
78
+ * (mine: solid tint right; theirs: grouped fill left with 24px avatar),
79
+ * typing indicator, the orange mail-fallback notice when away, and the
80
+ * composer via sio-message-input (email capture while away).
81
+ *
82
+ * Events (bubbles, composed):
83
+ * back — back chevron
84
+ * send-message { message } — user sent a message
85
+ * email-submitted { email } — away email capture
86
+ * open-image / open-file { attachment } — attachment click
87
+ * conversation-action { action, conversationId } — overflow menu
88
+ */
89
+ let SioConversationView = (() => {
90
+ let _classDecorators = [customElement('sio-conversation-view')];
91
+ let _classDescriptor;
92
+ let _classExtraInitializers = [];
93
+ let _classThis;
94
+ let _classSuper = DeesElement;
95
+ let _conversation_decorators;
96
+ let _conversation_initializers = [];
97
+ let _conversation_extraInitializers = [];
98
+ let _away_decorators;
99
+ let _away_initializers = [];
100
+ let _away_extraInitializers = [];
101
+ let _typing_decorators;
102
+ let _typing_initializers = [];
103
+ let _typing_extraInitializers = [];
104
+ let _isDragging_decorators;
105
+ let _isDragging_initializers = [];
106
+ let _isDragging_extraInitializers = [];
107
+ let _pendingAttachments_decorators;
108
+ let _pendingAttachments_initializers = [];
109
+ let _pendingAttachments_extraInitializers = [];
110
+ var SioConversationView = class extends _classSuper {
111
+ static { _classThis = this; }
112
+ static {
113
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
114
+ _conversation_decorators = [property({ type: Object })];
115
+ _away_decorators = [property({ type: Boolean, reflect: true })];
116
+ _typing_decorators = [property({ type: Boolean })];
117
+ _isDragging_decorators = [state()];
118
+ _pendingAttachments_decorators = [state()];
119
+ __esDecorate(this, null, _conversation_decorators, { kind: "accessor", name: "conversation", static: false, private: false, access: { has: obj => "conversation" in obj, get: obj => obj.conversation, set: (obj, value) => { obj.conversation = value; } }, metadata: _metadata }, _conversation_initializers, _conversation_extraInitializers);
120
+ __esDecorate(this, null, _away_decorators, { kind: "accessor", name: "away", static: false, private: false, access: { has: obj => "away" in obj, get: obj => obj.away, set: (obj, value) => { obj.away = value; } }, metadata: _metadata }, _away_initializers, _away_extraInitializers);
121
+ __esDecorate(this, null, _typing_decorators, { kind: "accessor", name: "typing", static: false, private: false, access: { has: obj => "typing" in obj, get: obj => obj.typing, set: (obj, value) => { obj.typing = value; } }, metadata: _metadata }, _typing_initializers, _typing_extraInitializers);
122
+ __esDecorate(this, null, _isDragging_decorators, { kind: "accessor", name: "isDragging", static: false, private: false, access: { has: obj => "isDragging" in obj, get: obj => obj.isDragging, set: (obj, value) => { obj.isDragging = value; } }, metadata: _metadata }, _isDragging_initializers, _isDragging_extraInitializers);
123
+ __esDecorate(this, null, _pendingAttachments_decorators, { kind: "accessor", name: "pendingAttachments", static: false, private: false, access: { has: obj => "pendingAttachments" in obj, get: obj => obj.pendingAttachments, set: (obj, value) => { obj.pendingAttachments = value; } }, metadata: _metadata }, _pendingAttachments_initializers, _pendingAttachments_extraInitializers);
124
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
125
+ SioConversationView = _classThis = _classDescriptor.value;
126
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
127
+ }
128
+ static demo = () => html `
129
+ <div style="display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap;">
130
+ <div
131
+ style="width: 380px; height: 620px; border-radius: 20px; overflow: hidden; background: var(--sio-surface); box-shadow: 0 24px 64px rgba(0, 0, 0, 0.22), 0 0 0 0.5px rgba(0, 0, 0, 0.08);"
132
+ >
133
+ <sio-conversation-view .conversation=${demoConversation} typing></sio-conversation-view>
134
+ </div>
135
+ <div
136
+ style="width: 380px; height: 620px; border-radius: 20px; overflow: hidden; background: var(--sio-surface); box-shadow: 0 24px 64px rgba(0, 0, 0, 0.22), 0 0 0 0.5px rgba(0, 0, 0, 0.08);"
137
+ >
138
+ <sio-conversation-view
139
+ away
140
+ .conversation=${{
141
+ ...demoConversation,
142
+ dateStamp: 'Today, 18:36',
143
+ messages: [
144
+ {
145
+ id: '1',
146
+ text: 'Hi — my invoice from March still shows the old VAT ID. Can you re-issue it?',
147
+ sender: 'user',
148
+ time: '18:36',
149
+ },
150
+ ],
151
+ }}
152
+ ></sio-conversation-view>
153
+ </div>
154
+ </div>
15
155
  `;
16
- @property({ type: Object })
17
- accessor conversation = null;
18
- @state()
19
- accessor isTyping = false;
20
- @state()
21
- accessor isDragging = false;
22
- @state()
23
- accessor uploadingFiles = new Map();
24
- @state()
25
- accessor pendingAttachments = [];
26
- dropdownMenuItems = [
27
- { id: 'mute', label: 'Mute notifications', icon: 'bell-off' },
28
- { id: 'pin', label: 'Pin conversation', icon: 'pin' },
29
- { id: 'search', label: 'Search in chat', icon: 'search' },
30
- { id: 'divider1', label: '', divider: true },
31
- { id: 'export', label: 'Export chat', icon: 'download' },
32
- { id: 'archive', label: 'Archive conversation', icon: 'archive' },
33
- { id: 'divider2', label: '', divider: true },
34
- { id: 'clear', label: 'Clear history', icon: 'trash-2', destructive: true }
35
- ];
36
- static styles = [
37
- cssManager.defaultStyles,
38
- css `
156
+ #conversation_accessor_storage = __runInitializers(this, _conversation_initializers, null);
157
+ get conversation() { return this.#conversation_accessor_storage; }
158
+ set conversation(value) { this.#conversation_accessor_storage = value; }
159
+ #away_accessor_storage = (__runInitializers(this, _conversation_extraInitializers), __runInitializers(this, _away_initializers, false));
160
+ /** team is away — orange status, mail-fallback notice, email composer */
161
+ get away() { return this.#away_accessor_storage; }
162
+ set away(value) { this.#away_accessor_storage = value; }
163
+ #typing_accessor_storage = (__runInitializers(this, _away_extraInitializers), __runInitializers(this, _typing_initializers, false));
164
+ /** show the agent typing indicator */
165
+ get typing() { return this.#typing_accessor_storage; }
166
+ set typing(value) { this.#typing_accessor_storage = value; }
167
+ #isDragging_accessor_storage = (__runInitializers(this, _typing_extraInitializers), __runInitializers(this, _isDragging_initializers, false));
168
+ get isDragging() { return this.#isDragging_accessor_storage; }
169
+ set isDragging(value) { this.#isDragging_accessor_storage = value; }
170
+ #pendingAttachments_accessor_storage = (__runInitializers(this, _isDragging_extraInitializers), __runInitializers(this, _pendingAttachments_initializers, []));
171
+ get pendingAttachments() { return this.#pendingAttachments_accessor_storage; }
172
+ set pendingAttachments(value) { this.#pendingAttachments_accessor_storage = value; }
173
+ dropdownMenuItems = (__runInitializers(this, _pendingAttachments_extraInitializers), [
174
+ { id: 'mute', label: 'Mute notifications', icon: 'bell-off' },
175
+ { id: 'search', label: 'Search in chat', icon: 'search' },
176
+ { id: 'divider1', label: '', divider: true },
177
+ { id: 'export', label: 'Export chat', icon: 'download' },
178
+ { id: 'divider2', label: '', divider: true },
179
+ { id: 'clear', label: 'Clear history', icon: 'trash-2', destructive: true },
180
+ ]);
181
+ static styles = [
182
+ ...sioElementStyles,
183
+ css `
39
184
  :host {
40
185
  display: flex;
41
186
  flex-direction: column;
42
187
  height: 100%;
43
- background: ${bdTheme('background')};
44
- font-family: ${unsafeCSS(fontFamilies.sans)};
188
+ background: var(--sio-surface);
189
+ font-family: var(--sio-font-sf);
190
+ overflow: hidden;
45
191
  }
46
192
 
193
+ /* ── glass header ────────────────────────────────────────── */
47
194
  .header {
48
- padding: ${unsafeCSS(spacing["4"])};
49
- border-bottom: 1px solid ${bdTheme('border')};
50
- background: ${bdTheme('background')};
195
+ ${sioToolbarGlass}
196
+ flex-shrink: 0;
197
+ padding: 12px 16px;
51
198
  display: flex;
52
199
  align-items: center;
53
- gap: ${unsafeCSS(spacing["3"])};
54
- backdrop-filter: blur(10px);
55
- -webkit-backdrop-filter: blur(10px);
56
- position: sticky;
57
- top: 0;
200
+ gap: 10px;
201
+ position: relative;
58
202
  z-index: 10;
59
- overflow: visible;
60
203
  }
61
204
 
62
- .back-button {
63
- display: none;
205
+ .backButton {
206
+ border: none;
207
+ background: none;
208
+ padding: 0;
209
+ margin: 0;
210
+ display: flex;
211
+ align-items: center;
212
+ color: var(--sio-tint);
213
+ cursor: pointer;
64
214
  }
65
215
 
66
- @media (max-width: 600px) {
67
- .back-button {
68
- display: block;
69
- }
216
+ .backButton:hover {
217
+ color: var(--sio-tint-hover);
70
218
  }
71
219
 
72
- .header-title {
73
- font-size: 1.125rem;
74
- line-height: 1.5;
75
- font-weight: 600;
76
- margin: 0;
77
- color: ${bdTheme('foreground')};
220
+ .headerMain {
78
221
  flex: 1;
222
+ min-width: 0;
79
223
  }
80
224
 
81
- .header-actions {
82
- display: flex;
83
- gap: ${unsafeCSS(spacing["2"])};
84
- position: relative;
85
- overflow: visible;
225
+ .headerName {
226
+ font-size: 14px;
227
+ font-weight: 600;
228
+ color: var(--sio-label);
229
+ letter-spacing: -0.2px;
230
+ white-space: nowrap;
231
+ overflow: hidden;
232
+ text-overflow: ellipsis;
86
233
  }
87
234
 
88
- .messages-container {
89
- flex: 1;
90
- overflow-y: auto;
91
- padding: ${unsafeCSS(spacing["4"])};
92
- display: flex;
93
- flex-direction: column;
94
- gap: ${unsafeCSS(spacing["3"])};
235
+ .headerStatus {
236
+ font-size: 11.5px;
237
+ font-weight: 500;
238
+ color: var(--sio-green);
239
+ }
240
+
241
+ :host([away]) .headerStatus {
242
+ color: var(--sio-orange);
95
243
  }
96
244
 
97
- .message {
245
+ .overflowButton {
246
+ border: none;
247
+ background: none;
248
+ padding: 4px;
249
+ margin: 0;
98
250
  display: flex;
99
- align-items: flex-start;
100
- gap: ${unsafeCSS(spacing["3"])};
101
- max-width: 70%;
251
+ align-items: center;
252
+ color: var(--sio-label-3);
253
+ cursor: pointer;
102
254
  }
103
255
 
104
- .message.user {
105
- align-self: flex-end;
106
- flex-direction: row-reverse;
256
+ .overflowButton:hover {
257
+ color: var(--sio-label-2);
107
258
  }
108
259
 
109
- .message-bubble {
110
- padding: ${unsafeCSS(spacing["2.5"])} ${unsafeCSS(spacing["3.5"])};
111
- border-radius: ${unsafeCSS(radius["2xl"])};
112
- font-size: 0.9375rem;
113
- line-height: 1.6;
260
+ /* ── messages ────────────────────────────────────────────── */
261
+ .messages {
262
+ flex: 1;
263
+ min-height: 0;
114
264
  position: relative;
115
- box-shadow: ${unsafeCSS(shadows.sm)};
116
- max-width: 100%;
117
- word-wrap: break-word;
265
+ padding: 14px 14px 6px;
266
+ display: flex;
267
+ flex-direction: column;
268
+ gap: 8px;
269
+ overflow-y: auto;
118
270
  }
119
271
 
120
- .message.support .message-bubble {
121
- background: ${bdTheme('secondary')};
122
- color: ${bdTheme('secondaryForeground')};
123
- border-bottom-left-radius: ${unsafeCSS(spacing["1"])};
124
- border: 1px solid ${bdTheme('border')};
272
+ .dateStamp {
273
+ text-align: center;
274
+ font-size: 11px;
275
+ color: var(--sio-label-3);
276
+ margin-bottom: 2px;
277
+ font-variant-numeric: tabular-nums;
278
+ flex-shrink: 0;
125
279
  }
126
280
 
127
- .message.user .message-bubble {
128
- background: ${bdTheme('primary')};
129
- color: ${bdTheme('primaryForeground')};
130
- border-bottom-right-radius: ${unsafeCSS(spacing["1"])};
281
+ .row {
282
+ display: flex;
283
+ justify-content: flex-start;
284
+ align-items: flex-end;
285
+ gap: 8px;
286
+ flex-shrink: 0;
131
287
  }
132
288
 
133
- .message-time {
134
- font-size: 0.75rem;
135
- line-height: 1.5;
136
- color: ${bdTheme('mutedForeground')};
137
- margin-top: ${unsafeCSS(spacing["1"])};
289
+ .row.mine {
290
+ justify-content: flex-end;
138
291
  }
139
292
 
140
- .message.user .message-time {
141
- text-align: right;
293
+ .bubble {
294
+ max-width: 76%;
295
+ padding: 8px 12px;
296
+ border-radius: 16px;
297
+ font-size: 13.5px;
298
+ line-height: 1.4;
299
+ letter-spacing: -0.1px;
300
+ background: var(--sio-surface-2);
301
+ color: var(--sio-label);
302
+ word-wrap: break-word;
142
303
  }
143
304
 
144
- .typing-indicator {
145
- display: flex;
146
- align-items: center;
147
- gap: ${unsafeCSS(spacing["1"])};
148
- padding: ${unsafeCSS(spacing["2"])} ${unsafeCSS(spacing["3"])};
149
- background: ${bdTheme('muted')};
150
- border-radius: ${unsafeCSS(radius.lg)};
151
- width: fit-content;
305
+ .row.mine .bubble {
306
+ background: var(--sio-tint);
307
+ color: #fff; /* on-tint constant (v7 outgoing bubble) */
152
308
  }
153
309
 
154
- .typing-dot {
155
- width: 8px;
156
- height: 8px;
157
- background: ${bdTheme('mutedForeground')};
158
- border-radius: 50%;
159
- animation: typing 1.4s infinite;
310
+ /* typing indicator bubble */
311
+ .typingBubble {
312
+ padding: 10px 13px;
313
+ border-radius: 16px;
314
+ background: var(--sio-surface-2);
315
+ display: flex;
316
+ gap: 4px;
160
317
  }
161
318
 
162
- .typing-dot:nth-child(2) {
163
- animation-delay: 0.2s;
319
+ .typingBubble .dot {
320
+ width: 6px;
321
+ height: 6px;
322
+ border-radius: 3px;
323
+ background: var(--sio-label-3);
324
+ animation: typingPulse 1.2s ease-in-out infinite;
164
325
  }
165
326
 
166
- .typing-dot:nth-child(3) {
167
- animation-delay: 0.4s;
327
+ .typingBubble .dot:nth-child(1) {
328
+ opacity: 0.5;
329
+ }
330
+ .typingBubble .dot:nth-child(2) {
331
+ opacity: 0.7;
332
+ animation-delay: 0.15s;
333
+ }
334
+ .typingBubble .dot:nth-child(3) {
335
+ opacity: 0.9;
336
+ animation-delay: 0.3s;
168
337
  }
169
338
 
170
- @keyframes typing {
171
- 0%, 60%, 100% {
172
- opacity: 0.3;
173
- transform: scale(0.8);
339
+ @keyframes typingPulse {
340
+ 0%,
341
+ 60%,
342
+ 100% {
343
+ transform: translateY(0);
174
344
  }
175
345
  30% {
176
- opacity: 1;
177
- transform: scale(1);
346
+ transform: translateY(-2px);
178
347
  }
179
348
  }
180
349
 
181
- .input-container {
182
- padding: ${unsafeCSS(spacing["4"])};
183
- border-top: 1px solid ${bdTheme('border')};
184
- background: ${bdTheme('background')};
185
- backdrop-filter: blur(10px);
186
- -webkit-backdrop-filter: blur(10px);
350
+ /* mail-fallback notice — the social.io magic moment */
351
+ .awayNotice {
352
+ flex-shrink: 0;
353
+ margin-top: 4px;
354
+ padding: 10px 12px;
355
+ border-radius: var(--sio-radius-md);
356
+ background: color-mix(in oklab, var(--sio-orange) 10%, transparent);
357
+ display: flex;
358
+ gap: 9px;
359
+ align-items: flex-start;
187
360
  }
188
361
 
189
- .empty-state {
190
- flex: 1;
191
- display: flex;
192
- align-items: center;
193
- justify-content: center;
194
- flex-direction: column;
195
- gap: ${unsafeCSS(spacing["4"])};
196
- padding: ${unsafeCSS(spacing["8"])};
197
- text-align: center;
198
- color: ${bdTheme('mutedForeground')};
199
- animation: fadeIn 500ms ease-out;
362
+ .awayNotice sio-icon {
363
+ margin-top: 1px;
364
+ flex-shrink: 0;
365
+ color: var(--sio-orange);
200
366
  }
201
-
202
- @keyframes fadeIn {
203
- from {
204
- opacity: 0;
205
- }
206
- to {
207
- opacity: 1;
208
- }
367
+
368
+ .awayNotice .noticeText {
369
+ font-size: 12px;
370
+ line-height: 1.45;
371
+ color: var(--sio-label);
209
372
  }
210
373
 
211
- .empty-icon {
212
- font-size: 64px;
213
- opacity: 0.5;
374
+ .awayNotice .noticeText b {
375
+ font-weight: 600;
214
376
  }
215
377
 
216
- /* Scrollbar styling */
217
- .messages-container::-webkit-scrollbar {
218
- width: 6px;
378
+ /* ── attachments in bubbles ──────────────────────────────── */
379
+ .attachments {
380
+ margin-top: 6px;
381
+ display: flex;
382
+ flex-wrap: wrap;
383
+ gap: 6px;
219
384
  }
220
385
 
221
- .messages-container::-webkit-scrollbar-track {
222
- background: transparent;
386
+ .attachmentImage {
387
+ max-width: 180px;
388
+ border-radius: var(--sio-radius-md);
389
+ overflow: hidden;
390
+ cursor: pointer;
223
391
  }
224
392
 
225
- .messages-container::-webkit-scrollbar-thumb {
226
- background: ${bdTheme('border')};
227
- border-radius: 3px;
393
+ .attachmentImage img {
394
+ display: block;
395
+ width: 100%;
396
+ height: auto;
228
397
  }
229
398
 
230
- .messages-container::-webkit-scrollbar-thumb:hover {
231
- background: ${bdTheme('mutedForeground')};
399
+ .attachmentFile {
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 8px;
403
+ padding: 7px 10px;
404
+ background: color-mix(in oklab, var(--sio-label) 6%, transparent);
405
+ border-radius: var(--sio-radius);
406
+ font-size: 12px;
407
+ cursor: pointer;
232
408
  }
233
409
 
234
- /* File drop zone */
235
- .messages-container {
236
- position: relative;
410
+ .row.mine .attachmentFile {
411
+ background: rgba(255, 255, 255, 0.16); /* on-tint scrim */
412
+ color: #fff;
237
413
  }
238
-
239
- .drop-overlay {
414
+
415
+ .attachmentName {
416
+ font-weight: 500;
417
+ }
418
+
419
+ .attachmentSize {
420
+ font-size: 11px;
421
+ opacity: 0.7;
422
+ font-variant-numeric: tabular-nums;
423
+ }
424
+
425
+ /* ── drop overlay ────────────────────────────────────────── */
426
+ .dropOverlay {
240
427
  position: absolute;
241
428
  inset: 0;
242
- background: ${bdTheme('background')}95;
429
+ background: color-mix(in oklab, var(--sio-surface) 88%, transparent);
243
430
  backdrop-filter: blur(8px);
244
431
  -webkit-backdrop-filter: blur(8px);
245
432
  display: flex;
@@ -248,479 +435,466 @@ export class SioConversationView extends DeesElement {
248
435
  z-index: 100;
249
436
  pointer-events: none;
250
437
  opacity: 0;
251
- transition: opacity 200ms ease;
438
+ transition: opacity 160ms ease;
252
439
  }
253
440
 
254
- .drop-overlay.active {
441
+ .dropOverlay.active {
255
442
  opacity: 1;
256
443
  pointer-events: all;
257
444
  }
258
445
 
259
- .drop-zone {
260
- padding: ${unsafeCSS(spacing["8"])};
261
- border: 2px dashed ${bdTheme('border')};
262
- border-radius: ${unsafeCSS(radius.xl)};
263
- background: ${bdTheme('card')};
446
+ .dropZone {
447
+ padding: 24px 28px;
448
+ border: 1.5px dashed var(--sio-tint);
449
+ border-radius: var(--sio-radius-lg);
450
+ background: var(--sio-tint-soft);
264
451
  text-align: center;
265
- transition: ${unsafeCSS(transitions.all)};
452
+ color: var(--sio-tint);
266
453
  }
267
454
 
268
- .drop-overlay.active .drop-zone {
269
- border-color: ${bdTheme('primary')};
270
- background: ${bdTheme('accent')};
271
- transform: scale(1.02);
272
- }
273
-
274
- .drop-icon {
275
- font-size: 48px;
276
- color: ${bdTheme('primary')};
277
- margin-bottom: ${unsafeCSS(spacing["4"])};
455
+ .dropText {
456
+ margin-top: 8px;
457
+ font-size: 13.5px;
458
+ font-weight: 600;
459
+ color: var(--sio-label);
278
460
  }
279
461
 
280
- .drop-text {
281
- font-size: 1.125rem;
282
- font-weight: 500;
283
- color: ${bdTheme('foreground')};
284
- margin-bottom: ${unsafeCSS(spacing["2"])};
462
+ .dropHint {
463
+ margin-top: 2px;
464
+ font-size: 11.5px;
465
+ color: var(--sio-label-3);
285
466
  }
286
467
 
287
- .drop-hint {
288
- font-size: 0.875rem;
289
- color: ${bdTheme('mutedForeground')};
468
+ /* ── composer area ───────────────────────────────────────── */
469
+ .composerArea {
470
+ flex-shrink: 0;
290
471
  }
291
472
 
292
- /* File attachments */
293
- .message-attachments {
294
- margin-top: ${unsafeCSS(spacing["2"])};
473
+ .pendingAttachments {
474
+ padding: 8px 14px 0;
295
475
  display: flex;
296
- flex-wrap: wrap;
297
- gap: ${unsafeCSS(spacing["2"])};
298
- }
299
-
300
- .attachment-image {
301
- max-width: 200px;
302
- max-height: 200px;
303
- border-radius: ${unsafeCSS(radius.lg)};
304
- overflow: hidden;
305
- cursor: pointer;
306
- transition: ${unsafeCSS(transitions.all)};
307
- box-shadow: ${unsafeCSS(shadows.sm)};
308
- }
309
-
310
- .attachment-image:hover {
311
- transform: scale(1.02);
312
- box-shadow: ${unsafeCSS(shadows.md)};
313
- }
314
-
315
- .attachment-image img {
316
- width: 100%;
317
- height: 100%;
318
- object-fit: cover;
476
+ flex-direction: column;
477
+ gap: 6px;
319
478
  }
320
479
 
321
- .attachment-file {
480
+ .pendingAttachment {
322
481
  display: flex;
323
482
  align-items: center;
324
- gap: ${unsafeCSS(spacing["2"])};
325
- padding: ${unsafeCSS(spacing["2"])} ${unsafeCSS(spacing["3"])};
326
- background: ${bdTheme('secondary')};
327
- border: 1px solid ${bdTheme('border')};
328
- border-radius: ${unsafeCSS(radius.md)};
329
- font-size: 0.875rem;
330
- cursor: pointer;
331
- transition: ${unsafeCSS(transitions.all)};
483
+ gap: 8px;
484
+ padding: 6px 10px;
485
+ border-radius: var(--sio-radius);
486
+ background: var(--sio-surface-2);
487
+ color: var(--sio-label-2);
488
+ font-size: 12px;
332
489
  }
333
490
 
334
- .attachment-file:hover {
335
- background: ${bdTheme('accent')};
491
+ .pendingAttachment .info {
492
+ flex: 1;
493
+ min-width: 0;
336
494
  }
337
495
 
338
- .attachment-name {
496
+ .pendingAttachment .name {
339
497
  font-weight: 500;
340
- color: ${bdTheme('foreground')};
341
- }
342
-
343
- .attachment-size {
344
- color: ${bdTheme('mutedForeground')};
345
- font-size: 0.75rem;
498
+ color: var(--sio-label);
499
+ white-space: nowrap;
500
+ overflow: hidden;
501
+ text-overflow: ellipsis;
346
502
  }
347
503
 
348
- /* Pending attachments */
349
- .pending-attachments {
350
- padding: ${unsafeCSS(spacing["2"])} ${unsafeCSS(spacing["3"])};
351
- background: ${bdTheme('secondary')};
352
- border: 1px solid ${bdTheme('border')};
353
- border-radius: ${unsafeCSS(radius.lg)};
354
- margin-bottom: ${unsafeCSS(spacing["2"])};
504
+ .pendingAttachment .size {
505
+ font-size: 11px;
506
+ color: var(--sio-label-3);
507
+ font-variant-numeric: tabular-nums;
355
508
  }
356
509
 
357
- .pending-attachment {
510
+ .pendingAttachment .remove {
358
511
  display: flex;
359
- align-items: center;
360
- gap: ${unsafeCSS(spacing["2"])};
361
- padding: ${unsafeCSS(spacing["1"])} 0;
362
- }
363
-
364
- .pending-attachment-info {
365
- flex: 1;
366
- min-width: 0;
512
+ padding: 2px;
513
+ color: var(--sio-label-3);
514
+ cursor: pointer;
367
515
  }
368
516
 
369
- .pending-attachment-name {
370
- font-size: 0.875rem;
371
- font-weight: 500;
372
- color: ${bdTheme('foreground')};
373
- white-space: nowrap;
374
- overflow: hidden;
375
- text-overflow: ellipsis;
517
+ .pendingAttachment .remove:hover {
518
+ color: var(--sio-red);
376
519
  }
377
520
 
378
- .pending-attachment-size {
379
- font-size: 0.75rem;
380
- color: ${bdTheme('mutedForeground')};
521
+ /* ── empty state ─────────────────────────────────────────── */
522
+ .emptyState {
523
+ flex: 1;
524
+ display: flex;
525
+ flex-direction: column;
526
+ align-items: center;
527
+ justify-content: center;
528
+ gap: 10px;
529
+ padding: 32px;
530
+ text-align: center;
531
+ color: var(--sio-label-3);
381
532
  }
382
533
 
383
- .remove-attachment {
384
- padding: ${unsafeCSS(spacing["1"])};
385
- cursor: pointer;
386
- color: ${bdTheme('mutedForeground')};
387
- transition: ${unsafeCSS(transitions.all)};
534
+ .emptyState .emptyTitle {
535
+ font-size: 14px;
536
+ font-weight: 600;
537
+ color: var(--sio-label);
388
538
  }
389
539
 
390
- .remove-attachment:hover {
391
- color: ${bdTheme('destructive')};
540
+ .emptyState .emptyText {
541
+ font-size: 12.5px;
392
542
  }
393
543
  `,
394
- ];
395
- render() {
396
- if (!this.conversation) {
397
- return html `
398
- <div class="empty-state">
399
- <sio-icon class="empty-icon" icon="message-square"></sio-icon>
400
- <h3>Select a conversation</h3>
401
- <p>Choose a conversation from the sidebar to start messaging</p>
544
+ ];
545
+ render() {
546
+ if (!this.conversation) {
547
+ return html `
548
+ <div class="emptyState">
549
+ <sio-icon icon="message-circle" size="40"></sio-icon>
550
+ <div class="emptyTitle">No conversation selected</div>
551
+ <div class="emptyText">Pick a recent thread or send us a new message.</div>
402
552
  </div>
403
553
  `;
404
- }
405
- return html `
554
+ }
555
+ const initials = this.conversation.agentInitials || this.deriveInitials(this.conversation.title);
556
+ const tint = this.conversation.agentTint || 'var(--sio-tint)';
557
+ const showTyping = !this.away && this.typing;
558
+ return html `
406
559
  <div class="header">
407
- <sio-button
408
- class="back-button"
409
- type="ghost"
410
- size="sm"
411
- @click=${this.handleBack}
412
- >
413
- <sio-icon icon="arrow-left" size="16"></sio-icon>
414
- </sio-button>
415
- <h3 class="header-title">${this.conversation.title}</h3>
416
- <div class="header-actions">
417
- <sio-button type="ghost" size="sm">
418
- <sio-icon icon="phone" size="16"></sio-icon>
419
- </sio-button>
420
- <sio-dropdown-menu
421
- .items=${this.dropdownMenuItems}
422
- @item-selected=${this.handleDropdownAction}
423
- >
424
- <sio-button type="ghost" size="sm">
425
- <sio-icon icon="more-vertical" size="16"></sio-icon>
426
- </sio-button>
427
- </sio-dropdown-menu>
560
+ <button class="backButton" aria-label="Back" @click=${this.handleBack}>
561
+ <sio-icon icon="chevron-left" size="18" .strokeWidth=${2.2}></sio-icon>
562
+ </button>
563
+ <sio-avatar initials=${initials} tint=${tint} size="30"></sio-avatar>
564
+ <div class="headerMain">
565
+ <div class="headerName">${this.conversation.title}</div>
566
+ <div class="headerStatus">
567
+ ${this.away ? 'Away · replies by email' : 'Online now'}
568
+ </div>
428
569
  </div>
570
+ <sio-dropdown-menu .items=${this.dropdownMenuItems} @item-selected=${this.handleDropdownAction}>
571
+ <button class="overflowButton" aria-label="Conversation actions">
572
+ <sio-icon icon="ellipsis" size="16"></sio-icon>
573
+ </button>
574
+ </sio-dropdown-menu>
429
575
  </div>
430
576
 
431
- <div class="messages-container" id="messages"
577
+ <div
578
+ class="messages"
579
+ id="messages"
432
580
  @dragover=${this.handleDragOver}
581
+ @dragenter=${this.handleDragOver}
433
582
  @dragleave=${this.handleDragLeave}
434
583
  @drop=${this.handleDrop}
435
- @dragenter=${this.handleDragOver}
436
584
  >
437
- <div class="drop-overlay ${this.isDragging ? 'active' : ''}"
585
+ <div
586
+ class="dropOverlay ${this.isDragging ? 'active' : ''}"
438
587
  @drop=${this.handleDrop}
439
588
  @dragover=${(e) => e.preventDefault()}
440
589
  >
441
- <div class="drop-zone">
442
- <sio-icon class="drop-icon" icon="upload-cloud"></sio-icon>
443
- <div class="drop-text">Drop files here</div>
444
- <div class="drop-hint">Images and documents up to 10MB</div>
590
+ <div class="dropZone">
591
+ <sio-icon icon="upload-cloud" size="28"></sio-icon>
592
+ <div class="dropText">Drop files here</div>
593
+ <div class="dropHint">Images and documents up to 10MB</div>
445
594
  </div>
446
595
  </div>
447
- ${this.conversation.messages.map((msg, index) => html `
448
- <div class="message ${msg.sender}" style="animation-delay: ${index * 50}ms">
449
- <div class="message-content">
450
- <div class="message-bubble">
451
- ${msg.text}
452
- </div>
453
- ${msg.attachments && msg.attachments.length > 0 ? html `
454
- <div class="message-attachments">
455
- ${msg.attachments.map(attachment => this.isImage(attachment.type) ? html `
456
- <div class="attachment-image" @click=${() => this.openImage(attachment)}>
457
- <img src="${attachment.url}" alt="${attachment.name}" />
458
- </div>
459
- ` : attachment.type?.includes('pdf') || attachment.name?.toLowerCase().endsWith('.pdf') ? html `
460
- <div class="attachment-file" @click=${() => this.openImage(attachment)}>
461
- <sio-icon icon="file-text" size="16"></sio-icon>
462
- <div>
463
- <div class="attachment-name">${attachment.name}</div>
464
- <div class="attachment-size">${this.formatFileSize(attachment.size)}</div>
465
- </div>
466
- </div>
467
- ` : html `
468
- <div class="attachment-file" @click=${() => this.downloadFile(attachment)}>
469
- <sio-icon icon="file" size="16"></sio-icon>
470
- <div>
471
- <div class="attachment-name">${attachment.name}</div>
472
- <div class="attachment-size">${this.formatFileSize(attachment.size)}</div>
473
- </div>
596
+
597
+ ${this.conversation.dateStamp
598
+ ? html `<div class="dateStamp">${this.conversation.dateStamp}</div>`
599
+ : ''}
600
+ ${this.conversation.messages.map((message) => html `
601
+ <div class="row ${message.sender === 'user' ? 'mine' : ''}">
602
+ ${message.sender === 'support'
603
+ ? html `<sio-avatar initials=${initials} tint=${tint} size="24"></sio-avatar>`
604
+ : ''}
605
+ <div class="bubble">
606
+ ${message.text}
607
+ ${message.attachments && message.attachments.length > 0
608
+ ? html `
609
+ <div class="attachments">
610
+ ${message.attachments.map((attachment) => this.isImage(attachment.type)
611
+ ? html `
612
+ <div
613
+ class="attachmentImage"
614
+ @click=${() => this.openAttachment(attachment)}
615
+ >
616
+ <img src="${attachment.url}" alt="${attachment.name}" />
617
+ </div>
618
+ `
619
+ : html `
620
+ <div
621
+ class="attachmentFile"
622
+ @click=${() => this.isPdf(attachment)
623
+ ? this.openAttachment(attachment)
624
+ : this.downloadFile(attachment)}
625
+ >
626
+ <sio-icon
627
+ icon=${this.isPdf(attachment) ? 'file-text' : 'file'}
628
+ size="15"
629
+ ></sio-icon>
630
+ <div>
631
+ <div class="attachmentName">${attachment.name}</div>
632
+ <div class="attachmentSize">
633
+ ${this.formatFileSize(attachment.size)}
634
+ </div>
635
+ </div>
636
+ </div>
637
+ `)}
474
638
  </div>
475
- `)}
476
- </div>
477
- ` : ''}
478
- <div class="message-time">${msg.time}</div>
479
- </div>
480
- </div>
481
- `)}
482
-
483
- ${this.isTyping ? html `
484
- <div class="message support">
485
- <div class="typing-indicator">
486
- <div class="typing-dot"></div>
487
- <div class="typing-dot"></div>
488
- <div class="typing-dot"></div>
639
+ `
640
+ : ''}
641
+ </div>
489
642
  </div>
490
- </div>
491
- ` : ''}
492
- </div>
493
-
494
- <div class="input-container">
495
- ${this.pendingAttachments.length > 0 ? html `
496
- <div class="pending-attachments">
497
- ${this.pendingAttachments.map(attachment => html `
498
- <div class="pending-attachment">
499
- <sio-icon icon="${this.getFileIcon(attachment.type)}" size="16"></sio-icon>
500
- <div class="pending-attachment-info">
501
- <div class="pending-attachment-name">${attachment.name}</div>
502
- <div class="pending-attachment-size">${this.formatFileSize(attachment.size)}</div>
643
+ `)}
644
+ ${showTyping
645
+ ? html `
646
+ <div class="row">
647
+ <sio-avatar initials=${initials} tint=${tint} size="24"></sio-avatar>
648
+ <div class="typingBubble">
649
+ <span class="dot"></span>
650
+ <span class="dot"></span>
651
+ <span class="dot"></span>
503
652
  </div>
504
- <div class="remove-attachment" @click=${() => this.removeAttachment(attachment.id)}>
505
- <sio-icon icon="x" size="16"></sio-icon>
653
+ </div>
654
+ `
655
+ : ''}
656
+ ${this.away
657
+ ? html `
658
+ <div class="awayNotice">
659
+ <sio-icon icon="envelope" size="14" .strokeWidth=${1.7}></sio-icon>
660
+ <div class="noticeText">
661
+ <b>The team is away.</b> Leave your email and your message continues there —
662
+ same thread, no repeats.
506
663
  </div>
507
664
  </div>
508
- `)}
509
- </div>
510
- ` : ''}
665
+ `
666
+ : ''}
667
+ </div>
668
+
669
+ <div class="composerArea">
670
+ ${this.pendingAttachments.length > 0
671
+ ? html `
672
+ <div class="pendingAttachments">
673
+ ${this.pendingAttachments.map((attachment) => html `
674
+ <div class="pendingAttachment">
675
+ <sio-icon icon=${this.getFileIcon(attachment.type)} size="15"></sio-icon>
676
+ <div class="info">
677
+ <div class="name">${attachment.name}</div>
678
+ <div class="size">${this.formatFileSize(attachment.size)}</div>
679
+ </div>
680
+ <span class="remove" @click=${() => this.removeAttachment(attachment.id)}>
681
+ <sio-icon icon="x" size="14"></sio-icon>
682
+ </span>
683
+ </div>
684
+ `)}
685
+ </div>
686
+ `
687
+ : ''}
511
688
  <sio-message-input
689
+ variant=${this.away ? 'email' : 'message'}
690
+ placeholder=${this.away ? 'you@email.com' : 'Write a message…'}
512
691
  @send-message=${this.handleMessageSend}
513
692
  @files-selected=${this.handleFilesSelected}
514
693
  ></sio-message-input>
515
694
  </div>
516
695
  `;
517
- }
518
- handleBack() {
519
- this.dispatchEvent(new CustomEvent('back', {
520
- bubbles: true,
521
- composed: true
522
- }));
523
- }
524
- handleMessageSend(event) {
525
- const { text, attachments } = event.detail;
526
- if (!text.trim() && attachments.length === 0)
527
- return;
528
- const message = {
529
- id: Date.now().toString(),
530
- text: text.trim(),
531
- sender: 'user',
532
- time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
533
- status: 'sending',
534
- attachments: [...this.pendingAttachments]
696
+ }
697
+ updated() {
698
+ // keep the thread pinned to the latest message
699
+ const container = this.shadowRoot?.querySelector('#messages');
700
+ if (container) {
701
+ container.scrollTop = container.scrollHeight;
702
+ }
703
+ }
704
+ deriveInitials(title) {
705
+ return title
706
+ .split(/[\s·]+/)
707
+ .filter((part) => part.length > 0)
708
+ .slice(0, 2)
709
+ .map((part) => part[0].toUpperCase())
710
+ .join('');
711
+ }
712
+ handleBack = () => {
713
+ this.dispatchEvent(new CustomEvent('back', {
714
+ bubbles: true,
715
+ composed: true,
716
+ }));
535
717
  };
536
- // Dispatch event for parent to handle
537
- this.dispatchEvent(new CustomEvent('send-message', {
538
- detail: { message },
539
- bubbles: true,
540
- composed: true
541
- }));
542
- // Clear pending attachments
543
- this.pendingAttachments = [];
544
- // Simulate typing indicator (remove in production)
545
- setTimeout(() => {
546
- this.isTyping = true;
547
- setTimeout(() => {
548
- this.isTyping = false;
549
- }, 2000);
550
- }, 1000);
551
- }
552
- handleFilesSelected(event) {
553
- const { files } = event.detail;
554
- // Handle files if needed
555
- // For now, we're handling attachments separately in the parent component
556
- }
557
- updated() {
558
- // Scroll to bottom when new messages arrive
559
- const container = this.shadowRoot?.querySelector('#messages');
560
- if (container) {
561
- container.scrollTop = container.scrollHeight;
718
+ handleMessageSend = (event) => {
719
+ event.stopPropagation();
720
+ const text = event.detail.text.trim();
721
+ if (this.away) {
722
+ if (!text) {
723
+ return;
724
+ }
725
+ this.dispatchEvent(new CustomEvent('email-submitted', {
726
+ detail: { email: text },
727
+ bubbles: true,
728
+ composed: true,
729
+ }));
730
+ return;
731
+ }
732
+ if (!text && this.pendingAttachments.length === 0) {
733
+ return;
734
+ }
735
+ const message = {
736
+ id: Date.now().toString(),
737
+ text,
738
+ sender: 'user',
739
+ time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
740
+ status: 'sending',
741
+ attachments: [...this.pendingAttachments],
742
+ };
743
+ this.dispatchEvent(new CustomEvent('send-message', {
744
+ detail: { message },
745
+ bubbles: true,
746
+ composed: true,
747
+ }));
748
+ this.pendingAttachments = [];
749
+ };
750
+ handleFilesSelected = (event) => {
751
+ event.stopPropagation();
752
+ this.processFiles(event.detail.files);
753
+ };
754
+ // File handling
755
+ handleDragOver(e) {
756
+ e.preventDefault();
757
+ e.stopPropagation();
758
+ this.isDragging = true;
562
759
  }
563
- }
564
- // File handling methods
565
- handleDragOver(e) {
566
- e.preventDefault();
567
- e.stopPropagation();
568
- this.isDragging = true;
569
- }
570
- handleDragLeave(e) {
571
- e.preventDefault();
572
- e.stopPropagation();
573
- // Check if we're actually leaving the messages container
574
- const relatedTarget = e.relatedTarget;
575
- const container = e.currentTarget;
576
- if (!container.contains(relatedTarget)) {
760
+ handleDragLeave(e) {
761
+ e.preventDefault();
762
+ e.stopPropagation();
763
+ const relatedTarget = e.relatedTarget;
764
+ const container = e.currentTarget;
765
+ if (!container.contains(relatedTarget)) {
766
+ this.isDragging = false;
767
+ }
768
+ }
769
+ handleDrop(e) {
770
+ e.preventDefault();
771
+ e.stopPropagation();
577
772
  this.isDragging = false;
773
+ const files = Array.from(e.dataTransfer?.files || []);
774
+ if (files.length > 0) {
775
+ this.processFiles(files);
776
+ }
578
777
  }
579
- }
580
- handleDrop(e) {
581
- e.preventDefault();
582
- e.stopPropagation();
583
- this.isDragging = false;
584
- const files = Array.from(e.dataTransfer?.files || []);
585
- if (files.length > 0) {
586
- this.processFiles(files);
778
+ async processFiles(files) {
779
+ const maxSize = 10 * 1024 * 1024; // 10MB
780
+ const validFiles = files.filter((file) => {
781
+ if (file.size > maxSize) {
782
+ console.warn(`File ${file.name} exceeds 10MB limit`);
783
+ return false;
784
+ }
785
+ return true;
786
+ });
787
+ for (const file of validFiles) {
788
+ const id = `${Date.now()}-${Math.random()}`;
789
+ const url = await this.fileToDataUrl(file);
790
+ const attachment = {
791
+ id,
792
+ name: file.name,
793
+ size: file.size,
794
+ type: file.type,
795
+ url,
796
+ thumbnailUrl: this.isImage(file.type) ? url : undefined,
797
+ };
798
+ this.pendingAttachments = [...this.pendingAttachments, attachment];
799
+ }
587
800
  }
588
- }
589
- openFileSelector() {
590
- const fileInput = this.shadowRoot?.querySelector('#fileInput');
591
- if (fileInput) {
592
- fileInput.click();
801
+ fileToDataUrl(file) {
802
+ return new Promise((resolve, reject) => {
803
+ const reader = new FileReader();
804
+ reader.onload = () => resolve(reader.result);
805
+ reader.onerror = reject;
806
+ reader.readAsDataURL(file);
807
+ });
593
808
  }
594
- }
595
- handleFileSelect(e) {
596
- const input = e.target;
597
- const files = Array.from(input.files || []);
598
- this.processFiles(files);
599
- input.value = ''; // Clear input for re-selection
600
- }
601
- async processFiles(files) {
602
- const maxSize = 10 * 1024 * 1024; // 10MB
603
- const validFiles = files.filter(file => {
604
- if (file.size > maxSize) {
605
- console.warn(`File ${file.name} exceeds 10MB limit`);
606
- return false;
809
+ removeAttachment(id) {
810
+ this.pendingAttachments = this.pendingAttachments.filter((a) => a.id !== id);
811
+ }
812
+ isImage(type) {
813
+ return type.startsWith('image/');
814
+ }
815
+ isPdf(attachment) {
816
+ return (attachment.type?.includes('pdf') || attachment.name?.toLowerCase().endsWith('.pdf') || false);
817
+ }
818
+ formatFileSize(bytes) {
819
+ if (bytes === 0)
820
+ return '0 Bytes';
821
+ const k = 1024;
822
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
823
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
824
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
825
+ }
826
+ getFileIcon(type) {
827
+ if (this.isImage(type))
828
+ return 'image';
829
+ if (type.includes('pdf'))
830
+ return 'file-text';
831
+ if (type.includes('doc'))
832
+ return 'file-text';
833
+ if (type.includes('sheet') || type.includes('excel'))
834
+ return 'table';
835
+ return 'file';
836
+ }
837
+ openAttachment(attachment) {
838
+ if (this.isPdf(attachment)) {
839
+ this.dispatchEvent(new CustomEvent('open-file', {
840
+ detail: { attachment },
841
+ bubbles: true,
842
+ composed: true,
843
+ }));
844
+ }
845
+ else {
846
+ this.dispatchEvent(new CustomEvent('open-image', {
847
+ detail: { attachment },
848
+ bubbles: true,
849
+ composed: true,
850
+ }));
607
851
  }
608
- return true;
609
- });
610
- for (const file of validFiles) {
611
- const id = `${Date.now()}-${Math.random()}`;
612
- const url = await this.fileToDataUrl(file);
613
- const attachment = {
614
- id,
615
- name: file.name,
616
- size: file.size,
617
- type: file.type,
618
- url,
619
- thumbnailUrl: this.isImage(file.type) ? url : undefined
620
- };
621
- this.pendingAttachments = [...this.pendingAttachments, attachment];
622
852
  }
623
- }
624
- fileToDataUrl(file) {
625
- return new Promise((resolve, reject) => {
626
- const reader = new FileReader();
627
- reader.onload = () => resolve(reader.result);
628
- reader.onerror = reject;
629
- reader.readAsDataURL(file);
630
- });
631
- }
632
- removeAttachment(id) {
633
- this.pendingAttachments = this.pendingAttachments.filter(a => a.id !== id);
634
- }
635
- isImage(type) {
636
- return type.startsWith('image/');
637
- }
638
- formatFileSize(bytes) {
639
- if (bytes === 0)
640
- return '0 Bytes';
641
- const k = 1024;
642
- const sizes = ['Bytes', 'KB', 'MB', 'GB'];
643
- const i = Math.floor(Math.log(bytes) / Math.log(k));
644
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
645
- }
646
- getFileIcon(type) {
647
- if (this.isImage(type))
648
- return 'image';
649
- if (type.includes('pdf'))
650
- return 'file-text';
651
- if (type.includes('doc'))
652
- return 'file-text';
653
- if (type.includes('sheet') || type.includes('excel'))
654
- return 'table';
655
- return 'file';
656
- }
657
- openImage(attachment) {
658
- // Check if it's actually a PDF
659
- if (attachment.type?.includes('pdf') || attachment.name?.toLowerCase().endsWith('.pdf')) {
660
- this.dispatchEvent(new CustomEvent('open-file', {
661
- detail: { attachment },
662
- bubbles: true,
663
- composed: true
664
- }));
853
+ downloadFile(attachment) {
854
+ const a = document.createElement('a');
855
+ a.href = attachment.url;
856
+ a.download = attachment.name;
857
+ document.body.appendChild(a);
858
+ a.click();
859
+ document.body.removeChild(a);
665
860
  }
666
- else {
667
- this.dispatchEvent(new CustomEvent('open-image', {
668
- detail: { attachment },
861
+ handleDropdownAction = (event) => {
862
+ const { item } = event.detail;
863
+ this.dispatchEvent(new CustomEvent('conversation-action', {
864
+ detail: {
865
+ action: item.id,
866
+ conversationId: this.conversation?.id,
867
+ },
669
868
  bubbles: true,
670
- composed: true
869
+ composed: true,
671
870
  }));
672
- }
673
- }
674
- downloadFile(attachment) {
675
- const a = document.createElement('a');
676
- a.href = attachment.url;
677
- a.download = attachment.name;
678
- document.body.appendChild(a);
679
- a.click();
680
- document.body.removeChild(a);
681
- }
682
- handleDropdownAction(event) {
683
- const { item } = event.detail;
684
- // Dispatch event for parent to handle these actions
685
- this.dispatchEvent(new CustomEvent('conversation-action', {
686
- detail: {
687
- action: item.id,
688
- conversationId: this.conversation?.id
689
- },
690
- bubbles: true,
691
- composed: true
692
- }));
693
- // Log action for demo purposes
694
- console.log('Conversation action:', item.id, item.label);
695
- // Handle some actions locally for demo
696
- switch (item.id) {
697
- case 'search':
698
- // Could open a search overlay
699
- console.log('Opening search...');
700
- break;
701
- case 'export':
702
- // Export conversation as JSON/text
871
+ if (item.id === 'export') {
703
872
  this.exportConversation();
704
- break;
705
- }
706
- }
707
- exportConversation() {
708
- if (!this.conversation)
709
- return;
710
- const exportData = {
711
- conversation: this.conversation.title,
712
- exportDate: new Date().toISOString(),
713
- messages: this.conversation.messages
873
+ }
714
874
  };
715
- const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });
716
- const url = URL.createObjectURL(blob);
717
- const a = document.createElement('a');
718
- a.href = url;
719
- a.download = `${this.conversation.title.replace(/\s+/g, '-')}-${Date.now()}.json`;
720
- document.body.appendChild(a);
721
- a.click();
722
- document.body.removeChild(a);
723
- URL.revokeObjectURL(url);
724
- }
725
- }
726
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lvLWNvbnZlcnNhdGlvbi12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3Npby1jb252ZXJzYXRpb24tdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLFFBQVEsRUFDUixJQUFJLEVBQ0osYUFBYSxFQUViLFVBQVUsRUFDVixHQUFHLEVBQ0gsU0FBUyxFQUNULEtBQUssR0FDTixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLHVCQUF1QjtBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQTBCLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELGtDQUFrQztBQUNsQyxlQUFlLENBQUM7QUFDaEIsZUFBZSxDQUFDO0FBaUNoQixDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztBQUN2QyxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsV0FBVztJQUMzQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTs7R0FFOUIsQ0FBQztJQUVGLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BCLFFBQVEsQ0FBQyxZQUFZLEdBQTZCLElBQUksQ0FBQztJQUU5RCxDQUFDLEtBQUssRUFBRTtJQUNBLFFBQVEsQ0FBQyxRQUFRLEdBQVksS0FBSyxDQUFDO0lBRTNDLENBQUMsS0FBSyxFQUFFO0lBQ0EsUUFBUSxDQUFDLFVBQVUsR0FBWSxLQUFL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
875
+ exportConversation() {
876
+ if (!this.conversation)
877
+ return;
878
+ const exportData = {
879
+ conversation: this.conversation.title,
880
+ exportDate: new Date().toISOString(),
881
+ messages: this.conversation.messages,
882
+ };
883
+ const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });
884
+ const url = URL.createObjectURL(blob);
885
+ const a = document.createElement('a');
886
+ a.href = url;
887
+ a.download = `${this.conversation.title.replace(/\s+/g, '-')}-${Date.now()}.json`;
888
+ document.body.appendChild(a);
889
+ a.click();
890
+ document.body.removeChild(a);
891
+ URL.revokeObjectURL(url);
892
+ }
893
+ static {
894
+ __runInitializers(_classThis, _classExtraInitializers);
895
+ }
896
+ };
897
+ return SioConversationView = _classThis;
898
+ })();
899
+ export { SioConversationView };
900
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lvLWNvbnZlcnNhdGlvbi12aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3Npby1jb252ZXJzYXRpb24tdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osUUFBUSxFQUNSLEtBQUssRUFDTCxhQUFhLEVBQ2IsR0FBRyxHQUVKLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUEwQixNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLGVBQWUsQ0FBQztBQUN2QixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLGVBQWUsQ0FBQztBQUNoQixlQUFlLENBQUM7QUF1Q2hCLE1BQU0sZ0JBQWdCLEdBQXNCO0lBQzFDLEVBQUUsRUFBRSxjQUFjO0lBQ2xCLEtBQUssRUFBRSxjQUFjO0lBQ3JCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFNBQVMsRUFBRSxjQUFjO0lBQ3pCLFFBQVEsRUFBRTtRQUNSO1lBQ0UsRUFBRSxFQUFFLEdBQUc7WUFDUCxJQUFJLEVBQUUsNEVBQTRFO1lBQ2xGLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLElBQUksRUFBRSxPQUFPO1NBQ2Q7UUFDRDtZQUNFLEVBQUUsRUFBRSxHQUFHO1lBQ1AsSUFBSSxFQUFFLHVFQUF1RTtZQUM3RSxNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxPQUFPO1NBQ2Q7UUFDRDtZQUNFLEVBQUUsRUFBRSxHQUFHO1lBQ1AsSUFBSSxFQUFFLHdGQUF3RjtZQUM5RixNQUFNLEVBQUUsU0FBUztZQUNqQixJQUFJ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