@product7/product7-js 0.2.9 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@product7/product7-js",
3
- "version": "0.2.9",
3
+ "version": "0.3.1",
4
4
  "description": "JavaScript SDK for integrating Product7 feedback widgets into any website",
5
5
  "main": "dist/product7-js.js",
6
6
  "module": "src/index.js",
@@ -136,6 +136,11 @@ export const componentsStyles = `
136
136
  transition-duration: 100ms;
137
137
  }
138
138
 
139
+ .sdk-btn-icon:focus-visible {
140
+ outline: 2px solid var(--color-primary);
141
+ outline-offset: 2px;
142
+ }
143
+
139
144
  .sdk-input {
140
145
  width: 100%;
141
146
  height: 40px;
@@ -7,7 +7,7 @@ export const messengerComponentsStyles = `
7
7
  .messenger-message {
8
8
  display: flex;
9
9
  gap: var(--spacing-2);
10
- max-width: 85%;
10
+ max-width: 75%;
11
11
  }
12
12
 
13
13
  .messenger-message-system {
@@ -28,11 +28,11 @@ export const messengerComponentsStyles = `
28
28
  }
29
29
 
30
30
  .messenger-message-system-text {
31
- font-size: 0.6875rem;
32
- color: var(--msg-text-tertiary);
31
+ font-size: 0.875rem;
32
+ font-weight: 500;
33
+ color: var(--msg-text-secondary);
33
34
  white-space: nowrap;
34
35
  padding: 0 var(--spacing-2);
35
- letter-spacing: 0.01em;
36
36
  }
37
37
 
38
38
  /* Rich join/leave system event */
@@ -41,8 +41,8 @@ export const messengerComponentsStyles = `
41
41
  display: flex;
42
42
  flex-direction: column;
43
43
  align-items: center;
44
- gap: var(--spacing-2);
45
- padding: var(--spacing-4) 0;
44
+ gap: 4px;
45
+ padding: var(--spacing-3) 0;
46
46
  width: 100%;
47
47
  text-align: center;
48
48
  }
@@ -51,39 +51,43 @@ export const messengerComponentsStyles = `
51
51
  width: 3rem;
52
52
  height: 3rem;
53
53
  border-radius: var(--radius-full);
54
- border: 2px solid var(--msg-border);
54
+ border: 1px solid var(--msg-border);
55
+ background: var(--msg-bg);
55
56
  display: flex;
56
57
  align-items: center;
57
58
  justify-content: center;
58
59
  font-size: 1.125rem;
59
60
  font-weight: var(--font-weight-semibold);
60
- color: #ffffff;
61
+ color: var(--msg-text);
61
62
  overflow: hidden;
62
63
  flex-shrink: 0;
64
+ margin-bottom: 4px;
63
65
  }
64
66
 
65
67
  .messenger-message-system-event-avatar img {
66
- width: 100%;
67
- height: 100%;
68
- object-fit: cover;
68
+ width: 60%;
69
+ height: 60%;
70
+ object-fit: contain;
69
71
  }
70
72
 
71
73
  .messenger-message-system-event-name {
72
- font-size: var(--font-size-sm);
74
+ font-size: 0.875rem;
73
75
  font-weight: var(--font-weight-semibold);
74
76
  color: var(--msg-text);
75
77
  line-height: 1.3;
76
78
  }
77
79
 
78
80
  .messenger-message-system-event-action {
79
- font-size: var(--font-size-xs);
80
- color: var(--msg-text-tertiary);
81
+ font-size: 0.875rem;
82
+ font-weight: 500;
83
+ color: var(--msg-text-secondary);
81
84
  margin-top: -2px;
82
85
  }
83
86
 
84
87
  .messenger-message-system-event-time {
85
- font-size: 0.6875rem;
86
- color: var(--msg-text-muted);
88
+ font-size: 0.875rem;
89
+ font-weight: 500;
90
+ color: var(--msg-text-tertiary);
87
91
  }
88
92
 
89
93
  .messenger-message-own {
@@ -136,8 +140,8 @@ export const messengerComponentsStyles = `
136
140
  }
137
141
 
138
142
  .messenger-message-content {
139
- font-size: var(--font-size-base);
140
- font-weight: var(--font-weight-semibold);
143
+ font-size: 0.875rem;
144
+ font-weight: 500;
141
145
  line-height: var(--line-height-relaxed);
142
146
  }
143
147
 
@@ -170,6 +174,14 @@ export const messengerComponentsStyles = `
170
174
  justify-content: flex-end;
171
175
  }
172
176
 
177
+ .messenger-message-sent-status {
178
+ color: var(--msg-text-muted);
179
+ }
180
+
181
+ .messenger-message-optimistic .messenger-message-bubble {
182
+ opacity: 0.7;
183
+ }
184
+
173
185
  .messenger-message-image {
174
186
  max-width: 220px;
175
187
  max-height: 200px;
@@ -227,6 +239,48 @@ export const messengerComponentsStyles = `
227
239
  font-weight: var(--font-weight-medium);
228
240
  }
229
241
 
242
+ /* ========================================
243
+ SCROLL PILL & CONNECTION BANNER
244
+ ======================================== */
245
+
246
+ .messenger-scroll-pill {
247
+ position: absolute;
248
+ bottom: 80px;
249
+ left: 50%;
250
+ transform: translateX(-50%);
251
+ display: flex;
252
+ align-items: center;
253
+ gap: var(--spacing-1);
254
+ padding: 6px 14px;
255
+ background: var(--color-primary);
256
+ color: #ffffff;
257
+ font-size: var(--font-size-xs);
258
+ font-weight: 500;
259
+ border-radius: var(--radius-full);
260
+ cursor: pointer;
261
+ box-shadow: var(--shadow-lg);
262
+ z-index: 10;
263
+ white-space: nowrap;
264
+ }
265
+
266
+ .messenger-connection-banner {
267
+ display: flex;
268
+ align-items: center;
269
+ justify-content: center;
270
+ gap: var(--spacing-2);
271
+ padding: 6px var(--spacing-4);
272
+ background: #fef3c7;
273
+ color: #92400e;
274
+ font-size: var(--font-size-xs);
275
+ font-weight: 500;
276
+ flex-shrink: 0;
277
+ }
278
+
279
+ .messenger-widget.theme-dark .messenger-connection-banner {
280
+ background: rgba(245, 158, 11, 0.15);
281
+ color: #fbbf24;
282
+ }
283
+
230
284
  /* ========================================
231
285
  CHAT HEADER
232
286
  ======================================== */
@@ -243,18 +297,20 @@ export const messengerComponentsStyles = `
243
297
  width: 2.25rem;
244
298
  height: 2.25rem;
245
299
  border-radius: var(--radius-lg);
246
- background: var(--color-neutral-100);
300
+ background: var(--msg-bg-surface);
301
+ border: 1px solid var(--msg-border);
247
302
  display: flex;
248
303
  align-items: center;
249
304
  justify-content: center;
250
305
  flex-shrink: 0;
251
306
  overflow: hidden;
307
+ padding: 4px;
252
308
  }
253
309
 
254
310
  .messenger-chat-header-avatar img {
255
311
  width: 100%;
256
312
  height: 100%;
257
- object-fit: cover;
313
+ object-fit: contain;
258
314
  }
259
315
 
260
316
  .messenger-chat-header-avatar svg {
@@ -314,6 +370,24 @@ export const messengerComponentsStyles = `
314
370
  margin-bottom: var(--spacing-4);
315
371
  }
316
372
 
373
+ .messenger-chat-empty-logo {
374
+ width: 48px;
375
+ height: 48px;
376
+ border-radius: var(--radius-xl);
377
+ overflow: hidden;
378
+ margin-bottom: var(--spacing-4);
379
+ display: flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ background: var(--msg-bg-surface);
383
+ }
384
+
385
+ .messenger-chat-empty-logo img {
386
+ width: 100%;
387
+ height: 100%;
388
+ object-fit: contain;
389
+ }
390
+
317
391
  .messenger-chat-empty h3 {
318
392
  margin: 0 0 var(--spacing-2);
319
393
  font-size: var(--font-size-base);
@@ -321,12 +395,6 @@ export const messengerComponentsStyles = `
321
395
  color: var(--msg-text);
322
396
  }
323
397
 
324
- .messenger-chat-empty p {
325
- margin: 0;
326
- font-size: var(--font-size-base);
327
- color: var(--msg-text-secondary);
328
- max-width: 240px;
329
- }
330
398
 
331
399
  /* ========================================
332
400
  COMPOSE AREA
@@ -407,6 +475,15 @@ export const messengerComponentsStyles = `
407
475
  color: var(--msg-text-tertiary);
408
476
  }
409
477
 
478
+ .messenger-compose-input:focus {
479
+ outline: none;
480
+ }
481
+
482
+ .messenger-chat-compose:focus-within {
483
+ border-color: var(--color-primary-border);
484
+ box-shadow: 0 0 0 3px var(--color-primary-light);
485
+ }
486
+
410
487
  .messenger-compose-bottom {
411
488
  display: flex;
412
489
  align-items: center;
@@ -131,6 +131,7 @@ export const messengerCoreStyles = `
131
131
  display: flex;
132
132
  flex-direction: column;
133
133
  overflow: hidden;
134
+ position: relative;
134
135
  }
135
136
 
136
137
  .messenger-avatar-stack {
@@ -85,6 +85,10 @@ export const messengerViewsStyles = `
85
85
  margin-left: var(--spacing-4);
86
86
  }
87
87
 
88
+ .messenger-home-avatars:empty {
89
+ display: none;
90
+ }
91
+
88
92
  .messenger-home-welcome {
89
93
  display: flex;
90
94
  flex-direction: column;
@@ -94,17 +98,19 @@ export const messengerViewsStyles = `
94
98
  }
95
99
 
96
100
  .messenger-home-greeting {
97
- font-size: 34px;
101
+ font-size: clamp(22px, 8vw, 34px);
98
102
  font-weight: var(--font-weight-bold);
99
103
  color: var(--msg-text);
100
104
  line-height: var(--line-height-tight);
105
+ word-break: break-word;
101
106
  }
102
107
 
103
108
  .messenger-home-question {
104
- font-size: 28px;
109
+ font-size: clamp(18px, 6.5vw, 28px);
105
110
  font-weight: var(--font-weight-bold);
106
111
  color: var(--msg-text);
107
112
  line-height: var(--line-height-tight);
113
+ word-break: break-word;
108
114
  }
109
115
 
110
116
  .messenger-home-body {
@@ -114,6 +120,112 @@ export const messengerViewsStyles = `
114
120
  z-index: 2;
115
121
  }
116
122
 
123
+ .messenger-home-recent-card {
124
+ background: var(--msg-bg);
125
+ border: 1px solid var(--msg-border);
126
+ border-radius: 10px;
127
+ padding: var(--spacing-3) var(--spacing-4);
128
+ margin-bottom: var(--spacing-2);
129
+ cursor: pointer;
130
+ transition: background var(--transition-base);
131
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
132
+ }
133
+
134
+ .messenger-home-recent-card:hover {
135
+ background: var(--msg-bg-hover);
136
+ }
137
+
138
+ .messenger-home-recent-card-label {
139
+ font-size: 0.875rem;
140
+ font-weight: 600;
141
+ color: var(--msg-text-tertiary);
142
+ margin-bottom: var(--spacing-2);
143
+ }
144
+
145
+ .messenger-home-recent-card-row {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: var(--spacing-3);
149
+ }
150
+
151
+ .messenger-home-recent-avatar {
152
+ width: 36px;
153
+ height: 36px;
154
+ border-radius: var(--radius-full);
155
+ flex-shrink: 0;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ font-size: var(--font-size-sm);
160
+ font-weight: var(--font-weight-semibold);
161
+ color: #ffffff;
162
+ overflow: hidden;
163
+ }
164
+
165
+ .messenger-home-recent-avatar img {
166
+ width: 100%;
167
+ height: 100%;
168
+ object-fit: cover;
169
+ }
170
+
171
+ .messenger-home-recent-avatar-logo {
172
+ background: var(--msg-bg-surface);
173
+ border: 1px solid var(--msg-border);
174
+ padding: 4px;
175
+ }
176
+
177
+ .messenger-home-recent-avatar-logo img {
178
+ object-fit: contain;
179
+ }
180
+
181
+ .messenger-home-recent-card-content {
182
+ flex: 1;
183
+ min-width: 0;
184
+ }
185
+
186
+ .messenger-home-recent-card-header {
187
+ display: flex;
188
+ align-items: center;
189
+ justify-content: space-between;
190
+ gap: var(--spacing-2);
191
+ margin-bottom: 2px;
192
+ }
193
+
194
+ .messenger-home-recent-card-name {
195
+ font-size: var(--font-size-sm);
196
+ font-weight: var(--font-weight-semibold);
197
+ color: var(--msg-text);
198
+ }
199
+
200
+ .messenger-home-recent-card-time {
201
+ font-size: var(--font-size-xs);
202
+ color: var(--msg-text-tertiary);
203
+ flex-shrink: 0;
204
+ }
205
+
206
+ .messenger-home-recent-card-preview {
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: space-between;
210
+ gap: var(--spacing-2);
211
+ }
212
+
213
+ .messenger-home-recent-card-message {
214
+ font-size: var(--font-size-sm);
215
+ color: var(--msg-text-secondary);
216
+ white-space: nowrap;
217
+ overflow: hidden;
218
+ text-overflow: ellipsis;
219
+ }
220
+
221
+ .messenger-home-recent-unread-dot {
222
+ width: 8px;
223
+ height: 8px;
224
+ border-radius: var(--radius-full);
225
+ background: var(--color-primary);
226
+ flex-shrink: 0;
227
+ }
228
+
117
229
  .messenger-home-message-btn {
118
230
  width: 100%;
119
231
  display: flex;
@@ -134,13 +246,11 @@ export const messengerViewsStyles = `
134
246
  }
135
247
 
136
248
  .messenger-home-message-btn:hover {
137
- background: var(--msg-bg-elevated);
138
- transform: translateX(4px);
139
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
249
+ background: var(--msg-bg-hover);
140
250
  }
141
251
 
142
252
  .messenger-home-message-btn:active {
143
- transform: translateX(4px) translateY(1px);
253
+ transform: translateY(1px);
144
254
  transition-duration: 100ms;
145
255
  }
146
256
 
@@ -158,14 +268,21 @@ export const messengerViewsStyles = `
158
268
  .messenger-home-continue-info {
159
269
  display: flex;
160
270
  flex-direction: column;
161
- gap: var(--spacing-1);
271
+ gap: 2px;
162
272
  text-align: left;
163
273
  flex: 1;
164
274
  }
165
275
 
166
276
  .messenger-home-continue-label {
167
- font-size: var(--font-size-base);
168
- font-weight: var(--font-weight-normal);
277
+ font-size: 0.875rem;
278
+ font-weight: var(--font-weight-semibold);
279
+ color: var(--msg-text);
280
+ }
281
+
282
+ .messenger-home-message-subtext {
283
+ font-size: var(--font-size-xs);
284
+ font-weight: 400;
285
+ color: var(--msg-text-secondary);
169
286
  }
170
287
 
171
288
  .messenger-home-continue-preview {
@@ -308,6 +425,8 @@ export const messengerViewsStyles = `
308
425
  height: 8px;
309
426
  border-radius: var(--radius-full);
310
427
  flex-shrink: 0;
428
+ align-self: center;
429
+ display: block;
311
430
  }
312
431
 
313
432
  .messenger-availability-online {
@@ -364,7 +483,7 @@ export const messengerViewsStyles = `
364
483
 
365
484
  .messenger-conversation-item {
366
485
  display: flex;
367
- align-items: flex-start;
486
+ align-items: center;
368
487
  gap: var(--spacing-3);
369
488
  padding: 10px var(--spacing-4);
370
489
  cursor: pointer;
@@ -382,31 +501,40 @@ export const messengerViewsStyles = `
382
501
 
383
502
  .messenger-conversation-avatars {
384
503
  flex-shrink: 0;
504
+ display: flex;
505
+ align-items: center;
506
+ align-self: stretch;
385
507
  }
386
508
 
387
509
  .messenger-conversation-content {
388
510
  flex: 1;
389
511
  min-width: 0;
512
+ display: flex;
513
+ flex-direction: column;
514
+ justify-content: center;
390
515
  }
391
516
 
392
517
  .messenger-conversation-header {
393
518
  display: flex;
394
519
  align-items: center;
395
520
  justify-content: space-between;
396
- margin-bottom: var(--spacing-1);
521
+ margin-bottom: 2px;
397
522
  gap: var(--spacing-3);
398
523
  }
399
524
 
400
525
  .messenger-conversation-title {
401
- font-size: var(--font-size-md);
402
- font-weight: var(--font-weight-medium);
526
+ font-size: var(--font-size-sm);
527
+ font-weight: var(--font-weight-semibold);
403
528
  color: var(--msg-text);
404
- line-height: var(--line-height-snug);
529
+ line-height: 1.4;
530
+ white-space: nowrap;
531
+ overflow: hidden;
532
+ text-overflow: ellipsis;
405
533
  }
406
534
 
407
535
  .messenger-conversation-time {
408
536
  font-size: var(--font-size-sm);
409
- color: var(--msg-text-secondary);
537
+ color: var(--msg-text-tertiary);
410
538
  flex-shrink: 0;
411
539
  }
412
540
 
@@ -417,18 +545,18 @@ export const messengerViewsStyles = `
417
545
  }
418
546
 
419
547
  .messenger-conversation-message {
420
- font-size: var(--font-size-base);
421
- font-weight: var(--font-weight-normal);
422
- color: var(--msg-text-tertiary);
548
+ font-size: var(--font-size-sm);
549
+ font-weight: 400;
550
+ color: var(--msg-text-secondary);
423
551
  white-space: nowrap;
424
552
  overflow: hidden;
425
553
  text-overflow: ellipsis;
426
- line-height: var(--line-height-normal);
554
+ line-height: 1.4;
427
555
  }
428
556
 
429
557
  .messenger-conversation-item.unread .messenger-conversation-message {
430
558
  color: var(--msg-text);
431
- font-weight: var(--font-weight-medium);
559
+ font-weight: 500;
432
560
  }
433
561
 
434
562
  .messenger-unread-dot {
@@ -439,35 +567,44 @@ export const messengerViewsStyles = `
439
567
  flex-shrink: 0;
440
568
  }
441
569
 
570
+ .messenger-conversation-item.closed .messenger-conversation-title,
571
+ .messenger-conversation-item.closed .messenger-conversation-message {
572
+ color: var(--msg-text-tertiary);
573
+ }
574
+
575
+ .messenger-conversation-resolved-badge {
576
+ font-size: 0.6875rem;
577
+ font-weight: 500;
578
+ color: var(--color-success-dark);
579
+ background: var(--color-success-light);
580
+ border-radius: var(--radius-full);
581
+ padding: 1px 7px;
582
+ flex-shrink: 0;
583
+ }
584
+
442
585
  .messenger-conversations-footer {
443
- padding: var(--spacing-4);
444
- border-top: none;
586
+ border-top: 1px solid var(--msg-border);
445
587
  }
446
588
 
447
589
  .messenger-new-message-btn {
448
- max-width: 220px;
449
- margin: 0 auto;
590
+ width: 100%;
450
591
  display: flex;
451
592
  align-items: center;
452
- justify-content: space-between;
453
- gap: var(--spacing-2);
454
- padding: var(--spacing-3) var(--spacing-4);
455
- background: var(--msg-bg);
593
+ gap: var(--spacing-3);
594
+ padding: 12px var(--spacing-4);
595
+ background: transparent;
456
596
  border: none;
457
- border-radius: var(--radius-xl);
458
597
  color: var(--msg-text);
459
- font-size: var(--font-size-base);
598
+ font-size: var(--font-size-sm);
460
599
  font-weight: var(--font-weight-medium);
461
600
  cursor: pointer;
462
- transition: all var(--transition-base);
601
+ transition: background var(--transition-base);
463
602
  font-family: inherit;
464
- box-shadow: var(--msg-shadow-card);
603
+ text-align: left;
465
604
  }
466
605
 
467
606
  .messenger-new-message-btn:hover {
468
607
  background: var(--msg-bg-hover);
469
- transform: translateX(4px);
470
- box-shadow: var(--msg-shadow-card-hover);
471
608
  }
472
609
 
473
610
  .messenger-new-message-btn:active {
@@ -61,6 +61,7 @@ export class MessengerWidget extends BaseWidget {
61
61
  changelogUrl: options.changelogUrl || null,
62
62
  helpUrl: options.helpUrl || null,
63
63
  roadmapUrl: options.roadmapUrl || null,
64
+ composePlaceholder: options.composePlaceholder || null,
64
65
  onSendMessage: options.onSendMessage || null,
65
66
  onFeedbackClick: options.onFeedbackClick || null,
66
67
  onArticleClick: options.onArticleClick || null,
@@ -493,6 +494,12 @@ export class MessengerWidget extends BaseWidget {
493
494
  this._wsUnsubscribers.push(
494
495
  this.wsService.on('disconnected', () => {
495
496
  console.log('[MessengerWidget] WebSocket disconnected');
497
+ this.messengerState._notify('connectionChange', { connected: false });
498
+ })
499
+ );
500
+ this._wsUnsubscribers.push(
501
+ this.wsService.on('connected', () => {
502
+ this.messengerState._notify('connectionChange', { connected: true });
496
503
  })
497
504
  );
498
505