@nyaruka/temba-components 0.67.3 → 0.68.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 (68) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/demo/index.html +5 -3
  3. package/dist/{314b925e.js → dd629ee4.js} +802 -122
  4. package/dist/index.js +802 -122
  5. package/dist/static/svg/index.svg +1 -1
  6. package/dist/sw.js +1 -1
  7. package/dist/sw.js.map +1 -1
  8. package/dist/templates/components-body.html +1 -1
  9. package/dist/templates/components-head.html +1 -1
  10. package/out-tsc/src/contacts/ContactTickets.js +4 -6
  11. package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
  12. package/out-tsc/src/contacts/events.js +3 -8
  13. package/out-tsc/src/contacts/events.js.map +1 -1
  14. package/out-tsc/src/imagepicker/CroppieCSS.js +254 -0
  15. package/out-tsc/src/imagepicker/CroppieCSS.js.map +1 -0
  16. package/out-tsc/src/imagepicker/ImagePicker.js +248 -0
  17. package/out-tsc/src/imagepicker/ImagePicker.js.map +1 -0
  18. package/out-tsc/src/interfaces.js.map +1 -1
  19. package/out-tsc/src/list/NotificationList.js +4 -0
  20. package/out-tsc/src/list/NotificationList.js.map +1 -1
  21. package/out-tsc/src/list/TembaMenu.js +1 -1
  22. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  23. package/out-tsc/src/list/TicketList.js +16 -12
  24. package/out-tsc/src/list/TicketList.js.map +1 -1
  25. package/out-tsc/src/mask/Mask.js +36 -0
  26. package/out-tsc/src/mask/Mask.js.map +1 -0
  27. package/out-tsc/src/utils/index.js +24 -16
  28. package/out-tsc/src/utils/index.js.map +1 -1
  29. package/out-tsc/src/vectoricon/index.js +5 -1
  30. package/out-tsc/src/vectoricon/index.js.map +1 -1
  31. package/out-tsc/src/webchat/WebChat.js +515 -0
  32. package/out-tsc/src/webchat/WebChat.js.map +1 -0
  33. package/out-tsc/src/webchat/index.js +7 -0
  34. package/out-tsc/src/webchat/index.js.map +1 -0
  35. package/out-tsc/temba-modules.js +6 -0
  36. package/out-tsc/temba-modules.js.map +1 -1
  37. package/package.json +4 -2
  38. package/screenshots/truth/contacts/tickets-assignment.png +0 -0
  39. package/screenshots/truth/contacts/tickets.png +0 -0
  40. package/screenshots/truth/menu/menu-focused-with items.png +0 -0
  41. package/screenshots/truth/menu/menu-refresh-1.png +0 -0
  42. package/screenshots/truth/menu/menu-refresh-2.png +0 -0
  43. package/screenshots/truth/menu/menu-root.png +0 -0
  44. package/screenshots/truth/menu/menu-submenu.png +0 -0
  45. package/screenshots/truth/menu/menu-tasks-nextup.png +0 -0
  46. package/screenshots/truth/menu/menu-tasks.png +0 -0
  47. package/src/contacts/ContactTickets.ts +4 -6
  48. package/src/contacts/events.ts +3 -9
  49. package/src/imagepicker/CroppieCSS.ts +254 -0
  50. package/src/imagepicker/ImagePicker.ts +272 -0
  51. package/src/interfaces.ts +2 -1
  52. package/src/list/NotificationList.ts +3 -0
  53. package/src/list/TembaMenu.ts +1 -1
  54. package/src/list/TicketList.ts +16 -12
  55. package/src/mask/Mask.ts +32 -0
  56. package/src/untyped.d.ts +1 -0
  57. package/src/utils/index.ts +26 -18
  58. package/src/vectoricon/index.ts +5 -1
  59. package/src/webchat/WebChat.ts +559 -0
  60. package/src/webchat/index.ts +6 -0
  61. package/static/svg/index.svg +1 -1
  62. package/static/svg/webchat.svg +1 -0
  63. package/static/svg/work/traced/camera-01.svg +1 -0
  64. package/static/svg/work/traced/send-03.svg +1 -0
  65. package/static/svg/work/used/camera-01.svg +4 -0
  66. package/static/svg/work/used/send-03.svg +3 -0
  67. package/svg.js +12 -8
  68. package/temba-modules.ts +6 -0
@@ -0,0 +1,515 @@
1
+ import { __decorate } from "tslib";
2
+ /* eslint-disable @typescript-eslint/no-this-alias */
3
+ import { LitElement, html, css } from 'lit';
4
+ import { property } from 'lit/decorators.js';
5
+ // how long of a window to show time between batches
6
+ const BATCH_TIME_WINDOW = 30 * 60 * 1000;
7
+ const TIME_FORMAT = { hour: 'numeric', minute: '2-digit' };
8
+ const DAY_FORMAT = {
9
+ weekday: undefined,
10
+ year: 'numeric',
11
+ month: 'short',
12
+ day: 'numeric',
13
+ };
14
+ const VERBOSE_FORMAT = {
15
+ weekday: undefined,
16
+ year: 'numeric',
17
+ month: 'short',
18
+ day: 'numeric',
19
+ hour: 'numeric',
20
+ minute: '2-digit',
21
+ };
22
+ export class WebChat extends LitElement {
23
+ static get styles() {
24
+ return css `
25
+ :host {
26
+ display: flex-inline;
27
+ align-items: center;
28
+ align-self: center;
29
+ --curvature: 0.6em;
30
+ --color-primary: hsla(208, 70%, 55%, 1);
31
+ }
32
+
33
+ .block {
34
+ margin-bottom: 1em;
35
+ }
36
+
37
+ .time {
38
+ text-align: center;
39
+ font-size: 0.8em;
40
+ color: #999;
41
+ margin-top: 2em;
42
+ border-top: 1px solid #f8f8f8;
43
+ padding: 1em;
44
+ margin-left: 4em;
45
+ margin-right: 4em;
46
+ }
47
+
48
+ .first .time {
49
+ margin-top: 0;
50
+ border-top: none;
51
+ padding-top: 0;
52
+ }
53
+
54
+ .row {
55
+ display: flex;
56
+ flex-direction: row;
57
+ align-items: flex-start;
58
+ }
59
+
60
+ .input-panel {
61
+ padding: 1em;
62
+ background: #fff;
63
+ }
64
+
65
+ .avatar {
66
+ margin-top: 0.6em;
67
+ margin-right: 0.6em;
68
+ flex-shrink: 0;
69
+ width: 2em;
70
+ height: 2em;
71
+ overflow: hidden;
72
+ border-radius: 100%;
73
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 3px 7px 0px,
74
+ rgba(0, 0, 0, 0.2) 0px 1px 2px 0px,
75
+ inset 0 0 0 0.15em rgba(0, 0, 0, 0.1);
76
+ }
77
+
78
+ .toggle {
79
+ flex-shrink: 0;
80
+ width: 4em;
81
+ height: 4em;
82
+ overflow: hidden;
83
+ border-radius: 100%;
84
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 1em 0.7em,
85
+ rgba(0, 0, 0, 0.2) 0px 1px 2px 0px,
86
+ inset 0 0 0 0.25em rgba(0, 0, 0, 0.1);
87
+ cursor: pointer;
88
+ transition: box-shadow 0.2s ease-out;
89
+ position: absolute;
90
+ bottom: 1em;
91
+ right: 1em;
92
+ }
93
+
94
+ .toggle:hover {
95
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 1em 0.7em,
96
+ rgba(0, 0, 0, 0.4) 0px 1px 2px 0px,
97
+ inset 0 0 0 0.25em rgba(0, 0, 0, 0.2);
98
+ }
99
+
100
+ .incoming .row {
101
+ flex-direction: row-reverse;
102
+ margin-left: 1em;
103
+ }
104
+
105
+ .bubble {
106
+ padding: 1em;
107
+ padding-bottom: 0.5em;
108
+ background: #fafafa;
109
+ border-radius: var(--curvature);
110
+ }
111
+
112
+ .bubble .name {
113
+ font-size: 0.9em;
114
+ font-weight: 400;
115
+ margin-bottom: 0.5em;
116
+ }
117
+
118
+ .outgoing .bubble {
119
+ border-top-left-radius: 0;
120
+ }
121
+
122
+ .incoming .bubble {
123
+ background: var(--color-primary);
124
+ color: white;
125
+ border-top-right-radius: 0;
126
+ }
127
+
128
+ .message {
129
+ margin-bottom: 0.5em;
130
+ }
131
+
132
+ .chat {
133
+ max-width: 50vw;
134
+ width: 28rem;
135
+ border-radius: var(--curvature);
136
+ overflow: hidden;
137
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 3px 7px 0px,
138
+ rgba(0, 0, 0, 0.2) 0px 1px 2px 0px, rgba(0, 0, 0, 0.1) 5em 5em 5em 5em;
139
+ position: absolute;
140
+ bottom: 2em;
141
+ right: 1em;
142
+ transition: all 0.2s ease-out;
143
+ transform: scale(0.9);
144
+ pointer-events: none;
145
+ opacity: 0;
146
+ }
147
+
148
+ .chat.open {
149
+ bottom: 6em;
150
+ opacity: 1;
151
+ transform: scale(1);
152
+ pointer-events: initial;
153
+ }
154
+
155
+ .messages {
156
+ background: #fff;
157
+ }
158
+
159
+ .scroll {
160
+ height: 40rem;
161
+ max-height: 60vh;
162
+ overflow: auto;
163
+ -webkit-overflow-scrolling: touch;
164
+ overflow-scrolling: touch;
165
+ padding: 1em 1em 0 1em;
166
+ }
167
+
168
+ .messages:before {
169
+ content: '';
170
+ background: /* Shadow TOP */ radial-gradient(
171
+ farthest-side at 50% 0,
172
+ rgba(0, 0, 0, 0.2),
173
+ rgba(0, 0, 0, 0)
174
+ )
175
+ center top;
176
+ height: 10px;
177
+ display: block;
178
+ position: absolute;
179
+ max-width: 50vw;
180
+ width: 28rem;
181
+ transition: opacity 0.1s ease-out;
182
+ }
183
+
184
+ .messages:after {
185
+ content: '';
186
+ background: /* Shadow BOTTOM */ radial-gradient(
187
+ farthest-side at 50% 100%,
188
+ rgba(0, 0, 0, 0.2),
189
+ rgba(0, 0, 0, 0)
190
+ )
191
+ center bottom;
192
+ height: 10px;
193
+ display: block;
194
+ position: absolute;
195
+ margin-top: -10px;
196
+ max-width: 50vw;
197
+ width: 28rem;
198
+ margin-right: 5em;
199
+ transition: opacity 0.1s ease-out;
200
+ }
201
+
202
+ .scroll-at-top .messages:before {
203
+ opacity: 0;
204
+ }
205
+
206
+ .scroll-at-bottom .messages:after {
207
+ opacity: 0;
208
+ }
209
+
210
+ .input {
211
+ border: none;
212
+ flex-grow: 1;
213
+ }
214
+
215
+ .input:focus {
216
+ outline: none;
217
+ }
218
+
219
+ input::placeholder {
220
+ opacity: 0.3;
221
+ }
222
+
223
+ .input.inactive {
224
+ //pointer-events: none;
225
+ //opacity: 0.3;
226
+ }
227
+
228
+ .active {
229
+ }
230
+
231
+ .send-icon {
232
+ color: #eee;
233
+ pointer-events: none;
234
+ transform: rotate(-45deg);
235
+ transition: transform 0.2s ease-out;
236
+ }
237
+
238
+ .pending .send-icon {
239
+ color: var(--color-primary);
240
+ pointer-events: initial;
241
+ transform: rotate(0deg);
242
+ }
243
+ `;
244
+ }
245
+ constructor() {
246
+ super();
247
+ this.messages = [];
248
+ // is the chat widget open
249
+ this.open = false;
250
+ this.hasPendingText = false;
251
+ this.hideTopScroll = true;
252
+ this.hideBottomScroll = true;
253
+ }
254
+ openSocket() {
255
+ console.log('opening socket..');
256
+ const webChat = this;
257
+ let url = `ws://localhost:8070/start?channel=${this.channel}`;
258
+ if (this.urn) {
259
+ url = `${url}&identifier=${this.urn}`;
260
+ }
261
+ this.sock = new WebSocket(url);
262
+ this.sock.onclose = function (event) {
263
+ console.log('socket closed');
264
+ webChat.active = false;
265
+ };
266
+ this.sock.onmessage = function (event) {
267
+ console.log(event.data);
268
+ const msg = JSON.parse(event.data);
269
+ if (msg.type === 'chat_started') {
270
+ if (webChat.urn !== msg.identifier) {
271
+ webChat.messages = [];
272
+ }
273
+ webChat.urn = msg.identifier;
274
+ webChat.active = true;
275
+ webChat.requestUpdate('messages');
276
+ }
277
+ else if (msg.type === 'chat_resumed') {
278
+ webChat.urn = msg.identifier;
279
+ webChat.active = true;
280
+ }
281
+ else if (msg.type === 'msg_out') {
282
+ msg['timestamp'] = new Date().getTime();
283
+ webChat.addMessage(msg);
284
+ webChat.requestUpdate('messages');
285
+ }
286
+ };
287
+ }
288
+ restoreFromLocal() {
289
+ console.log('Restoring from localStorage..');
290
+ const data = JSON.parse(localStorage.getItem('temba-chat') || '{}');
291
+ const urn = 'urn' in data ? data['urn'] : null;
292
+ if (urn && !this.urn) {
293
+ this.urn = urn;
294
+ const messages = 'messages' in data ? data['messages'] : [];
295
+ this.messages.push(...messages);
296
+ }
297
+ }
298
+ writeToLocal() {
299
+ console.log('Writing to localStorage..');
300
+ if (this.urn) {
301
+ const data = { urn: this.urn, messages: this.messages, version: 1 };
302
+ localStorage.setItem('temba-chat', JSON.stringify(data));
303
+ }
304
+ }
305
+ firstUpdated(changed) {
306
+ super.firstUpdated(changed);
307
+ }
308
+ focusInput() {
309
+ const input = this.shadowRoot.querySelector('.input');
310
+ input.focus();
311
+ }
312
+ updated(changed) {
313
+ super.updated(changed);
314
+ if (this.open && changed.has('open') && changed.get('open') !== undefined) {
315
+ const scroll = this.shadowRoot.querySelector('.scroll');
316
+ const hasScroll = scroll.scrollHeight > scroll.clientHeight;
317
+ this.hideBottomScroll = true;
318
+ this.hideTopScroll = !hasScroll;
319
+ this.scrollToBottom();
320
+ this.focusInput();
321
+ if (!this.active) {
322
+ this.openSocket();
323
+ }
324
+ }
325
+ if (changed.has('channel')) {
326
+ this.restoreFromLocal();
327
+ }
328
+ if (changed.has('messages')) {
329
+ console.log('messages changed', this.messages);
330
+ this.writeToLocal();
331
+ console.log(this.messages);
332
+ this.scrollToBottom();
333
+ }
334
+ }
335
+ addMessage(msg) {
336
+ let lastGroup = this.messages.length > 0 ? this.messages[this.messages.length - 1] : [];
337
+ const isSame = lastGroup.length === 0 || lastGroup[0].origin === msg.origin;
338
+ if (!isSame) {
339
+ lastGroup = [];
340
+ }
341
+ if (lastGroup.length === 0) {
342
+ this.messages.push(lastGroup);
343
+ }
344
+ lastGroup.push(msg);
345
+ }
346
+ openChat() {
347
+ this.open = true;
348
+ }
349
+ handleKeyUp(event) {
350
+ if (this.hasPendingText && event.key === 'Enter') {
351
+ this.sendPendingMessage();
352
+ }
353
+ this.hasPendingText = event.target.value.length > 0;
354
+ }
355
+ sendPendingMessage() {
356
+ if (this.active) {
357
+ const input = this.shadowRoot.querySelector('.input');
358
+ const text = input.value;
359
+ input.value = '';
360
+ const msg = {
361
+ type: 'msg_in',
362
+ text: text,
363
+ timestamp: new Date().getTime(),
364
+ };
365
+ this.addMessage(msg);
366
+ this.sock.send(JSON.stringify(msg));
367
+ this.requestUpdate('messages');
368
+ this.hasPendingText = input.value.length > 0;
369
+ }
370
+ }
371
+ scrollToBottom() {
372
+ const scroll = this.shadowRoot.querySelector('.scroll');
373
+ if (scroll) {
374
+ scroll.scrollTop = scroll.scrollHeight;
375
+ this.hideBottomScroll = true;
376
+ }
377
+ }
378
+ renderMessageGroup(messages, idx, groups) {
379
+ let lastBatchTime = null;
380
+ if (idx > 0) {
381
+ const lastGroup = groups[idx - 1];
382
+ if (lastGroup && lastGroup.length > 0) {
383
+ lastBatchTime = lastGroup[lastGroup.length - 1].timestamp;
384
+ }
385
+ }
386
+ const newBatchTime = messages[0].timestamp;
387
+ const showTime = newBatchTime - lastBatchTime > BATCH_TIME_WINDOW;
388
+ let timeDisplay = null;
389
+ if (showTime) {
390
+ let lastTime = null;
391
+ const newTime = new Date(newBatchTime);
392
+ if (lastBatchTime) {
393
+ lastTime = new Date(lastBatchTime);
394
+ }
395
+ const showDay = !lastTime || newTime.getDate() !== lastTime.getDate();
396
+ if (showDay) {
397
+ timeDisplay = html `<div class="time">
398
+ ${newTime.toLocaleDateString(undefined, DAY_FORMAT)}
399
+ </div>`;
400
+ }
401
+ else {
402
+ timeDisplay = html `<div class="time">
403
+ ${newTime.toLocaleTimeString(undefined, TIME_FORMAT)}
404
+ </div>`;
405
+ }
406
+ }
407
+ const blockTime = new Date(messages[messages.length - 1].timestamp);
408
+ const incoming = !messages[0].origin;
409
+ return html ` <div
410
+ class="block ${incoming ? 'incoming' : 'outgoing'} ${idx === 0
411
+ ? 'first'
412
+ : ''}"
413
+ title="${blockTime.toLocaleTimeString(undefined, VERBOSE_FORMAT)}"
414
+ >
415
+ ${timeDisplay}
416
+ <div class="row">
417
+ ${!incoming
418
+ ? html `
419
+ <div
420
+ class="avatar"
421
+ style="background: center / contain no-repeat url(https://dl-textit.s3.amazonaws.com/orgs/6418/media/5e81/5e814c83-bf33-43ea-b6c1-ee46f8acaf34/avatar.jpg)"
422
+ ></div>
423
+ `
424
+ : null}
425
+
426
+ <div class="bubble">
427
+ ${!incoming ? html `<div class="name">Henry McHelper</div>` : null}
428
+ ${messages.map(msg => html `<div class="message">${msg.text}</div>`)}
429
+ </div>
430
+ </div>
431
+ </div>`;
432
+ }
433
+ handleScroll(event) {
434
+ this.hideBottomScroll =
435
+ Math.round(event.target.scrollTop + event.target.clientHeight) >=
436
+ event.target.scrollHeight;
437
+ this.hideTopScroll = event.target.scrollTop === 0;
438
+ }
439
+ handleClickInputPanel(event) {
440
+ const input = this.shadowRoot.querySelector('.input');
441
+ input.focus();
442
+ }
443
+ toggleChat() {
444
+ this.open = !this.open;
445
+ }
446
+ render() {
447
+ return html `
448
+ <div
449
+ class="chat ${this.hideTopScroll ? 'scroll-at-top' : ''} ${this
450
+ .hideBottomScroll
451
+ ? 'scroll-at-bottom'
452
+ : ''} ${this.open ? 'open' : ''}"
453
+ >
454
+ <div class="messages">
455
+ <div class="scroll" @scroll=${this.handleScroll}>
456
+ ${this.messages
457
+ ? this.messages.map((msgGroup, idx, groups) => html `${this.renderMessageGroup(msgGroup, idx, groups)}`)
458
+ : null}
459
+ </div>
460
+ </div>
461
+ <div
462
+ class="row input-panel ${this.hasPendingText ? 'pending' : ''}"
463
+ @click=${this.handleClickInputPanel}
464
+ >
465
+ <input
466
+ class="input ${this.active ? 'active' : 'inactive'}"
467
+ type="text"
468
+ placeholder="Message.."
469
+ @keydown=${this.handleKeyUp}
470
+ />
471
+ <temba-icon
472
+ tabindex="1"
473
+ class="send-icon"
474
+ name="send"
475
+ size="1"
476
+ clickable
477
+ @click=${this.sendPendingMessage}
478
+ ></temba-icon>
479
+ </div>
480
+ </div>
481
+
482
+ <div @click=${this.toggleChat}>
483
+ <div
484
+ class="toggle"
485
+ style="background: center / contain no-repeat url(https://dl-textit.s3.amazonaws.com/orgs/6418/media/5e81/5e814c83-bf33-43ea-b6c1-ee46f8acaf34/avatar.jpg)"
486
+ ></div>
487
+ </div>
488
+ `;
489
+ }
490
+ }
491
+ __decorate([
492
+ property({ type: String })
493
+ ], WebChat.prototype, "channel", void 0);
494
+ __decorate([
495
+ property({ type: String })
496
+ ], WebChat.prototype, "urn", void 0);
497
+ __decorate([
498
+ property({ type: Array })
499
+ ], WebChat.prototype, "messages", void 0);
500
+ __decorate([
501
+ property({ type: Boolean })
502
+ ], WebChat.prototype, "active", void 0);
503
+ __decorate([
504
+ property({ type: Boolean })
505
+ ], WebChat.prototype, "open", void 0);
506
+ __decorate([
507
+ property({ type: Boolean })
508
+ ], WebChat.prototype, "hasPendingText", void 0);
509
+ __decorate([
510
+ property({ type: Boolean, attribute: false })
511
+ ], WebChat.prototype, "hideTopScroll", void 0);
512
+ __decorate([
513
+ property({ type: Boolean, attribute: false })
514
+ ], WebChat.prototype, "hideBottomScroll", void 0);
515
+ //# sourceMappingURL=WebChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebChat.js","sourceRoot":"","sources":["../../../src/webchat/WebChat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { LitElement, TemplateResult, html, css, PropertyValueMap } from 'lit';\nimport { property } from 'lit/decorators.js';\n\ninterface Message {\n text: string;\n type: string;\n identifier?: string;\n origin?: string;\n timestamp: number;\n}\n\n// how long of a window to show time between batches\nconst BATCH_TIME_WINDOW = 30 * 60 * 1000;\n\nconst TIME_FORMAT = { hour: 'numeric', minute: '2-digit' } as any;\nconst DAY_FORMAT = {\n weekday: undefined,\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n} as any;\nconst VERBOSE_FORMAT = {\n weekday: undefined,\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n} as any;\n\nexport class WebChat extends LitElement {\n static get styles() {\n return css`\n :host {\n display: flex-inline;\n align-items: center;\n align-self: center;\n --curvature: 0.6em;\n --color-primary: hsla(208, 70%, 55%, 1);\n }\n\n .block {\n margin-bottom: 1em;\n }\n\n .time {\n text-align: center;\n font-size: 0.8em;\n color: #999;\n margin-top: 2em;\n border-top: 1px solid #f8f8f8;\n padding: 1em;\n margin-left: 4em;\n margin-right: 4em;\n }\n\n .first .time {\n margin-top: 0;\n border-top: none;\n padding-top: 0;\n }\n\n .row {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n }\n\n .input-panel {\n padding: 1em;\n background: #fff;\n }\n\n .avatar {\n margin-top: 0.6em;\n margin-right: 0.6em;\n flex-shrink: 0;\n width: 2em;\n height: 2em;\n overflow: hidden;\n border-radius: 100%;\n box-shadow: rgba(0, 0, 0, 0.1) 0px 3px 7px 0px,\n rgba(0, 0, 0, 0.2) 0px 1px 2px 0px,\n inset 0 0 0 0.15em rgba(0, 0, 0, 0.1);\n }\n\n .toggle {\n flex-shrink: 0;\n width: 4em;\n height: 4em;\n overflow: hidden;\n border-radius: 100%;\n box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 1em 0.7em,\n rgba(0, 0, 0, 0.2) 0px 1px 2px 0px,\n inset 0 0 0 0.25em rgba(0, 0, 0, 0.1);\n cursor: pointer;\n transition: box-shadow 0.2s ease-out;\n position: absolute;\n bottom: 1em;\n right: 1em;\n }\n\n .toggle:hover {\n box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 1em 0.7em,\n rgba(0, 0, 0, 0.4) 0px 1px 2px 0px,\n inset 0 0 0 0.25em rgba(0, 0, 0, 0.2);\n }\n\n .incoming .row {\n flex-direction: row-reverse;\n margin-left: 1em;\n }\n\n .bubble {\n padding: 1em;\n padding-bottom: 0.5em;\n background: #fafafa;\n border-radius: var(--curvature);\n }\n\n .bubble .name {\n font-size: 0.9em;\n font-weight: 400;\n margin-bottom: 0.5em;\n }\n\n .outgoing .bubble {\n border-top-left-radius: 0;\n }\n\n .incoming .bubble {\n background: var(--color-primary);\n color: white;\n border-top-right-radius: 0;\n }\n\n .message {\n margin-bottom: 0.5em;\n }\n\n .chat {\n max-width: 50vw;\n width: 28rem;\n border-radius: var(--curvature);\n overflow: hidden;\n box-shadow: rgba(0, 0, 0, 0.1) 0px 3px 7px 0px,\n rgba(0, 0, 0, 0.2) 0px 1px 2px 0px, rgba(0, 0, 0, 0.1) 5em 5em 5em 5em;\n position: absolute;\n bottom: 2em;\n right: 1em;\n transition: all 0.2s ease-out;\n transform: scale(0.9);\n pointer-events: none;\n opacity: 0;\n }\n\n .chat.open {\n bottom: 6em;\n opacity: 1;\n transform: scale(1);\n pointer-events: initial;\n }\n\n .messages {\n background: #fff;\n }\n\n .scroll {\n height: 40rem;\n max-height: 60vh;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n overflow-scrolling: touch;\n padding: 1em 1em 0 1em;\n }\n\n .messages:before {\n content: '';\n background: /* Shadow TOP */ radial-gradient(\n farthest-side at 50% 0,\n rgba(0, 0, 0, 0.2),\n rgba(0, 0, 0, 0)\n )\n center top;\n height: 10px;\n display: block;\n position: absolute;\n max-width: 50vw;\n width: 28rem;\n transition: opacity 0.1s ease-out;\n }\n\n .messages:after {\n content: '';\n background: /* Shadow BOTTOM */ radial-gradient(\n farthest-side at 50% 100%,\n rgba(0, 0, 0, 0.2),\n rgba(0, 0, 0, 0)\n )\n center bottom;\n height: 10px;\n display: block;\n position: absolute;\n margin-top: -10px;\n max-width: 50vw;\n width: 28rem;\n margin-right: 5em;\n transition: opacity 0.1s ease-out;\n }\n\n .scroll-at-top .messages:before {\n opacity: 0;\n }\n\n .scroll-at-bottom .messages:after {\n opacity: 0;\n }\n\n .input {\n border: none;\n flex-grow: 1;\n }\n\n .input:focus {\n outline: none;\n }\n\n input::placeholder {\n opacity: 0.3;\n }\n\n .input.inactive {\n //pointer-events: none;\n //opacity: 0.3;\n }\n\n .active {\n }\n\n .send-icon {\n color: #eee;\n pointer-events: none;\n transform: rotate(-45deg);\n transition: transform 0.2s ease-out;\n }\n\n .pending .send-icon {\n color: var(--color-primary);\n pointer-events: initial;\n transform: rotate(0deg);\n }\n `;\n }\n\n @property({ type: String })\n channel: string;\n\n @property({ type: String })\n urn: string;\n\n @property({ type: Array })\n messages: Message[][] = [];\n\n // is our socket connection established\n @property({ type: Boolean })\n active: boolean;\n\n // is the chat widget open\n @property({ type: Boolean })\n open = false;\n\n @property({ type: Boolean })\n hasPendingText = false;\n\n @property({ type: Boolean, attribute: false })\n hideTopScroll = true;\n\n @property({ type: Boolean, attribute: false })\n hideBottomScroll = true;\n\n private sock: WebSocket;\n\n public constructor() {\n super();\n }\n\n private openSocket(): void {\n console.log('opening socket..');\n const webChat = this;\n let url = `ws://localhost:8070/start?channel=${this.channel}`;\n if (this.urn) {\n url = `${url}&identifier=${this.urn}`;\n }\n this.sock = new WebSocket(url);\n this.sock.onclose = function (event) {\n console.log('socket closed');\n webChat.active = false;\n };\n this.sock.onmessage = function (event) {\n console.log(event.data);\n const msg = JSON.parse(event.data) as Message;\n if (msg.type === 'chat_started') {\n if (webChat.urn !== msg.identifier) {\n webChat.messages = [];\n }\n webChat.urn = msg.identifier;\n webChat.active = true;\n webChat.requestUpdate('messages');\n } else if (msg.type === 'chat_resumed') {\n webChat.urn = msg.identifier;\n webChat.active = true;\n } else if (msg.type === 'msg_out') {\n msg['timestamp'] = new Date().getTime();\n webChat.addMessage(msg);\n webChat.requestUpdate('messages');\n }\n };\n }\n\n private restoreFromLocal(): void {\n console.log('Restoring from localStorage..');\n const data = JSON.parse(localStorage.getItem('temba-chat') || '{}');\n const urn = 'urn' in data ? data['urn'] : null;\n if (urn && !this.urn) {\n this.urn = urn;\n const messages = 'messages' in data ? data['messages'] : [];\n this.messages.push(...messages);\n }\n }\n\n private writeToLocal(): void {\n console.log('Writing to localStorage..');\n if (this.urn) {\n const data = { urn: this.urn, messages: this.messages, version: 1 };\n localStorage.setItem('temba-chat', JSON.stringify(data));\n }\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n private focusInput() {\n const input = this.shadowRoot.querySelector('.input') as any;\n input.focus();\n }\n\n public updated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changed);\n\n if (this.open && changed.has('open') && changed.get('open') !== undefined) {\n const scroll = this.shadowRoot.querySelector('.scroll');\n const hasScroll = scroll.scrollHeight > scroll.clientHeight;\n this.hideBottomScroll = true;\n this.hideTopScroll = !hasScroll;\n this.scrollToBottom();\n this.focusInput();\n\n if (!this.active) {\n this.openSocket();\n }\n }\n\n if (changed.has('channel')) {\n this.restoreFromLocal();\n }\n\n if (changed.has('messages')) {\n console.log('messages changed', this.messages);\n this.writeToLocal();\n console.log(this.messages);\n this.scrollToBottom();\n }\n }\n\n private addMessage(msg: Message) {\n let lastGroup =\n this.messages.length > 0 ? this.messages[this.messages.length - 1] : [];\n const isSame = lastGroup.length === 0 || lastGroup[0].origin === msg.origin;\n if (!isSame) {\n lastGroup = [];\n }\n if (lastGroup.length === 0) {\n this.messages.push(lastGroup);\n }\n lastGroup.push(msg);\n }\n\n public openChat(): void {\n this.open = true;\n }\n\n public handleKeyUp(event: any) {\n if (this.hasPendingText && event.key === 'Enter') {\n this.sendPendingMessage();\n }\n\n this.hasPendingText = event.target.value.length > 0;\n }\n\n private sendPendingMessage() {\n if (this.active) {\n const input = this.shadowRoot.querySelector('.input') as any;\n const text = input.value;\n input.value = '';\n\n const msg = {\n type: 'msg_in',\n text: text,\n timestamp: new Date().getTime(),\n };\n\n this.addMessage(msg);\n this.sock.send(JSON.stringify(msg));\n this.requestUpdate('messages');\n this.hasPendingText = input.value.length > 0;\n }\n }\n\n private scrollToBottom() {\n const scroll = this.shadowRoot.querySelector('.scroll');\n if (scroll) {\n scroll.scrollTop = scroll.scrollHeight;\n this.hideBottomScroll = true;\n }\n }\n\n private renderMessageGroup(\n messages: Message[],\n idx: number,\n groups: Message[][]\n ): TemplateResult {\n let lastBatchTime = null;\n if (idx > 0) {\n const lastGroup = groups[idx - 1];\n if (lastGroup && lastGroup.length > 0) {\n lastBatchTime = lastGroup[lastGroup.length - 1].timestamp;\n }\n }\n\n const newBatchTime = messages[0].timestamp;\n const showTime = newBatchTime - lastBatchTime > BATCH_TIME_WINDOW;\n\n let timeDisplay = null;\n if (showTime) {\n let lastTime = null;\n const newTime = new Date(newBatchTime);\n if (lastBatchTime) {\n lastTime = new Date(lastBatchTime);\n }\n const showDay = !lastTime || newTime.getDate() !== lastTime.getDate();\n if (showDay) {\n timeDisplay = html`<div class=\"time\">\n ${newTime.toLocaleDateString(undefined, DAY_FORMAT)}\n </div>`;\n } else {\n timeDisplay = html`<div class=\"time\">\n ${newTime.toLocaleTimeString(undefined, TIME_FORMAT)}\n </div>`;\n }\n }\n\n const blockTime = new Date(messages[messages.length - 1].timestamp);\n const incoming = !messages[0].origin;\n\n return html` <div\n class=\"block ${incoming ? 'incoming' : 'outgoing'} ${idx === 0\n ? 'first'\n : ''}\"\n title=\"${blockTime.toLocaleTimeString(undefined, VERBOSE_FORMAT)}\"\n >\n ${timeDisplay}\n <div class=\"row\">\n ${!incoming\n ? html`\n <div\n class=\"avatar\"\n style=\"background: center / contain no-repeat url(https://dl-textit.s3.amazonaws.com/orgs/6418/media/5e81/5e814c83-bf33-43ea-b6c1-ee46f8acaf34/avatar.jpg)\"\n ></div>\n `\n : null}\n\n <div class=\"bubble\">\n ${!incoming ? html`<div class=\"name\">Henry McHelper</div>` : null}\n ${messages.map(msg => html`<div class=\"message\">${msg.text}</div>`)}\n </div>\n </div>\n </div>`;\n }\n\n private handleScroll(event: any) {\n this.hideBottomScroll =\n Math.round(event.target.scrollTop + event.target.clientHeight) >=\n event.target.scrollHeight;\n this.hideTopScroll = event.target.scrollTop === 0;\n }\n\n private handleClickInputPanel(event: any) {\n const input = this.shadowRoot.querySelector('.input') as any;\n input.focus();\n }\n\n private toggleChat() {\n this.open = !this.open;\n }\n\n public render(): TemplateResult {\n return html`\n <div\n class=\"chat ${this.hideTopScroll ? 'scroll-at-top' : ''} ${this\n .hideBottomScroll\n ? 'scroll-at-bottom'\n : ''} ${this.open ? 'open' : ''}\"\n >\n <div class=\"messages\">\n <div class=\"scroll\" @scroll=${this.handleScroll}>\n ${this.messages\n ? this.messages.map(\n (msgGroup, idx, groups) =>\n html`${this.renderMessageGroup(msgGroup, idx, groups)}`\n )\n : null}\n </div>\n </div>\n <div\n class=\"row input-panel ${this.hasPendingText ? 'pending' : ''}\"\n @click=${this.handleClickInputPanel}\n >\n <input\n class=\"input ${this.active ? 'active' : 'inactive'}\"\n type=\"text\"\n placeholder=\"Message..\"\n @keydown=${this.handleKeyUp}\n />\n <temba-icon\n tabindex=\"1\"\n class=\"send-icon\"\n name=\"send\"\n size=\"1\"\n clickable\n @click=${this.sendPendingMessage}\n ></temba-icon>\n </div>\n </div>\n\n <div @click=${this.toggleChat}>\n <div\n class=\"toggle\"\n style=\"background: center / contain no-repeat url(https://dl-textit.s3.amazonaws.com/orgs/6418/media/5e81/5e814c83-bf33-43ea-b6c1-ee46f8acaf34/avatar.jpg)\"\n ></div>\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export const SVG_FINGERPRINT = 'febafb41c2fd60efa2bdaead993c7087';
2
+ // webchat spritesheet
3
+ export var WebChatIcon;
4
+ (function (WebChatIcon) {
5
+ WebChatIcon["send"] = "send-03";
6
+ })(WebChatIcon || (WebChatIcon = {}));
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webchat/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,kCAAkC,CAAC;AAElE,sBAAsB;AACtB,MAAM,CAAN,IAAY,WAEX;AAFD,WAAY,WAAW;IACrB,+BAAgB,CAAA;AAClB,CAAC,EAFW,WAAW,KAAX,WAAW,QAEtB","sourcesContent":["export const SVG_FINGERPRINT = 'febafb41c2fd60efa2bdaead993c7087';\n\n// webchat spritesheet\nexport enum WebChatIcon {\n send = 'send-03',\n}\n"]}
@@ -49,6 +49,9 @@ import { ColorPicker } from './src/colorpicker/ColorPicker';
49
49
  import { Resizer } from './src/resizer/Resizer';
50
50
  import { Thumbnail } from './src/thumbnail/Thumbnail';
51
51
  import { NotificationList } from './src/list/NotificationList';
52
+ import { WebChat } from './src/webchat/WebChat';
53
+ import { ImagePicker } from './src/imagepicker/ImagePicker';
54
+ import { Mask } from './src/mask/Mask';
52
55
  export function addCustomElement(name, comp) {
53
56
  if (!window.customElements.get(name)) {
54
57
  window.customElements.define(name, comp);
@@ -106,4 +109,7 @@ addCustomElement('temba-compose', Compose);
106
109
  addCustomElement('temba-color-picker', ColorPicker);
107
110
  addCustomElement('temba-resizer', Resizer);
108
111
  addCustomElement('temba-thumbnail', Thumbnail);
112
+ addCustomElement('temba-webchat', WebChat);
113
+ addCustomElement('temba-image-picker', ImagePicker);
114
+ addCustomElement('temba-mask', Mask);
109
115
  //# sourceMappingURL=temba-modules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"temba-modules.js","sourceRoot":"","sources":["../temba-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import { Checkbox } from './src/checkbox/Checkbox';\nimport { TextInput } from './src/textinput/TextInput';\nimport { Store } from './src/store/Store';\nimport { Select } from './src/select/Select';\nimport { Completion } from './src/completion/Completion';\nimport { Modax } from './src/dialog/Modax';\nimport { Dialog } from './src/dialog/Dialog';\nimport { Button } from './src/button/Button';\nimport { FormField } from './src/formfield/FormField';\nimport { Loading } from './src/loading/Loading';\nimport { CharCount } from './src/charcount/CharCount';\nimport { Options } from './src/options/Options';\nimport { ContactChat } from './src/contacts/ContactChat';\nimport { ContactHistory } from './src/contacts/ContactHistory';\nimport { TicketList } from './src/list/TicketList';\nimport { ContactDetails } from './src/contacts/ContactDetails';\nimport { TembaList } from './src/list/TembaList';\nimport { ContactSearch } from './src/contactsearch/ContactSearch';\nimport { VectorIcon } from './src/vectoricon/VectorIcon';\nimport { Alert } from './src/alert/Alert';\nimport { Omnibox } from './src/omnibox/Omnibox';\nimport { Tip } from './src/tip/Tip';\nimport { TembaMenu } from './src/list/TembaMenu';\nimport { Anchor } from './src/anchor/Anchor';\nimport { Dropdown } from './src/dropdown/Dropdown';\nimport { TabPane } from './src/tabpane/TabPane';\nimport { Tab } from './src/tabpane/Tab';\nimport Label from './src/label/Label';\nimport { ContactName } from './src/contacts/ContactName';\nimport { ContactUrn } from './src/contacts/ContactUrn';\nimport { ContactFields } from './src/contacts/ContactFields';\nimport { ContactFieldEditor } from './src/contacts/ContactFieldEditor';\n\nimport { ContactBadges } from './src/contacts/ContactBadges';\nimport { ContactPending } from './src/contacts/ContactPending';\nimport { ContactTickets } from './src/contacts/ContactTickets';\nimport { TembaSlider } from './src/slider/TembaSlider';\nimport { RunList } from './src/list/RunList';\nimport { FlowStoreElement } from './src/flow/FlowStoreElement';\nimport { ContactNameFetch } from './src/contacts/ContactNameFetch';\nimport DatePicker from './src/datepicker/DatePicker';\nimport { FieldManager } from './src/fields/FieldManager';\nimport { SortableList } from './src/list/SortableList';\nimport { ContentMenu } from './src/list/ContentMenu';\nimport { TembaDate } from './src/date/TembaDate';\nimport Remote from './src/remote/Remote';\nimport { Compose } from './src/compose/Compose';\nimport { Lightbox } from './src/lightbox/Lightbox';\nimport { ColorPicker } from './src/colorpicker/ColorPicker';\nimport { Resizer } from './src/resizer/Resizer';\nimport { Thumbnail } from './src/thumbnail/Thumbnail';\nimport { NotificationList } from './src/list/NotificationList';\n\nexport function addCustomElement(name: string, comp: any) {\n if (!window.customElements.get(name)) {\n window.customElements.define(name, comp);\n }\n}\n\naddCustomElement('temba-anchor', Anchor);\naddCustomElement('temba-alert', Alert);\naddCustomElement('temba-store', Store);\naddCustomElement('temba-textinput', TextInput);\naddCustomElement('temba-datepicker', DatePicker);\naddCustomElement('temba-date', TembaDate);\naddCustomElement('temba-completion', Completion);\naddCustomElement('temba-checkbox', Checkbox);\naddCustomElement('temba-select', Select);\naddCustomElement('temba-options', Options);\naddCustomElement('temba-loading', Loading);\naddCustomElement('temba-lightbox', Lightbox);\naddCustomElement('temba-button', Button);\naddCustomElement('temba-omnibox', Omnibox);\naddCustomElement('temba-tip', Tip);\naddCustomElement('temba-contact-name', ContactName);\naddCustomElement('temba-contact-name-fetch', ContactNameFetch);\naddCustomElement('temba-contact-field', ContactFieldEditor);\naddCustomElement('temba-contact-fields', ContactFields);\naddCustomElement('temba-field-manager', FieldManager);\naddCustomElement('temba-urn', ContactUrn);\naddCustomElement('temba-content-menu', ContentMenu);\n\naddCustomElement('temba-field', FormField);\naddCustomElement('temba-dialog', Dialog);\naddCustomElement('temba-modax', Modax);\naddCustomElement('temba-charcount', CharCount);\naddCustomElement('temba-contact-history', ContactHistory);\naddCustomElement('temba-contact-chat', ContactChat);\naddCustomElement('temba-contact-details', ContactDetails);\naddCustomElement('temba-ticket-list', TicketList);\naddCustomElement('temba-notification-list', NotificationList);\naddCustomElement('temba-list', TembaList);\naddCustomElement('temba-sortable-list', SortableList);\naddCustomElement('temba-run-list', RunList);\naddCustomElement('temba-flow-details', FlowStoreElement);\naddCustomElement('temba-label', Label);\naddCustomElement('temba-menu', TembaMenu);\naddCustomElement('temba-remote', Remote);\naddCustomElement('temba-contact-search', ContactSearch);\naddCustomElement('temba-icon', VectorIcon);\naddCustomElement('temba-dropdown', Dropdown);\naddCustomElement('temba-tabs', TabPane);\naddCustomElement('temba-tab', Tab);\naddCustomElement('temba-contact-badges', ContactBadges);\naddCustomElement('temba-contact-pending', ContactPending);\naddCustomElement('temba-contact-tickets', ContactTickets);\naddCustomElement('temba-slider', TembaSlider);\naddCustomElement('temba-content-menu', ContentMenu);\naddCustomElement('temba-compose', Compose);\naddCustomElement('temba-color-picker', ColorPicker);\naddCustomElement('temba-resizer', Resizer);\naddCustomElement('temba-thumbnail', Thumbnail);\n"]}
1
+ {"version":3,"file":"temba-modules.js","sourceRoot":"","sources":["../temba-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import { Checkbox } from './src/checkbox/Checkbox';\nimport { TextInput } from './src/textinput/TextInput';\nimport { Store } from './src/store/Store';\nimport { Select } from './src/select/Select';\nimport { Completion } from './src/completion/Completion';\nimport { Modax } from './src/dialog/Modax';\nimport { Dialog } from './src/dialog/Dialog';\nimport { Button } from './src/button/Button';\nimport { FormField } from './src/formfield/FormField';\nimport { Loading } from './src/loading/Loading';\nimport { CharCount } from './src/charcount/CharCount';\nimport { Options } from './src/options/Options';\nimport { ContactChat } from './src/contacts/ContactChat';\nimport { ContactHistory } from './src/contacts/ContactHistory';\nimport { TicketList } from './src/list/TicketList';\nimport { ContactDetails } from './src/contacts/ContactDetails';\nimport { TembaList } from './src/list/TembaList';\nimport { ContactSearch } from './src/contactsearch/ContactSearch';\nimport { VectorIcon } from './src/vectoricon/VectorIcon';\nimport { Alert } from './src/alert/Alert';\nimport { Omnibox } from './src/omnibox/Omnibox';\nimport { Tip } from './src/tip/Tip';\nimport { TembaMenu } from './src/list/TembaMenu';\nimport { Anchor } from './src/anchor/Anchor';\nimport { Dropdown } from './src/dropdown/Dropdown';\nimport { TabPane } from './src/tabpane/TabPane';\nimport { Tab } from './src/tabpane/Tab';\nimport Label from './src/label/Label';\nimport { ContactName } from './src/contacts/ContactName';\nimport { ContactUrn } from './src/contacts/ContactUrn';\nimport { ContactFields } from './src/contacts/ContactFields';\nimport { ContactFieldEditor } from './src/contacts/ContactFieldEditor';\n\nimport { ContactBadges } from './src/contacts/ContactBadges';\nimport { ContactPending } from './src/contacts/ContactPending';\nimport { ContactTickets } from './src/contacts/ContactTickets';\nimport { TembaSlider } from './src/slider/TembaSlider';\nimport { RunList } from './src/list/RunList';\nimport { FlowStoreElement } from './src/flow/FlowStoreElement';\nimport { ContactNameFetch } from './src/contacts/ContactNameFetch';\nimport DatePicker from './src/datepicker/DatePicker';\nimport { FieldManager } from './src/fields/FieldManager';\nimport { SortableList } from './src/list/SortableList';\nimport { ContentMenu } from './src/list/ContentMenu';\nimport { TembaDate } from './src/date/TembaDate';\nimport Remote from './src/remote/Remote';\nimport { Compose } from './src/compose/Compose';\nimport { Lightbox } from './src/lightbox/Lightbox';\nimport { ColorPicker } from './src/colorpicker/ColorPicker';\nimport { Resizer } from './src/resizer/Resizer';\nimport { Thumbnail } from './src/thumbnail/Thumbnail';\nimport { NotificationList } from './src/list/NotificationList';\nimport { WebChat } from './src/webchat/WebChat';\nimport { ImagePicker } from './src/imagepicker/ImagePicker';\nimport { Mask } from './src/mask/Mask';\n\nexport function addCustomElement(name: string, comp: any) {\n if (!window.customElements.get(name)) {\n window.customElements.define(name, comp);\n }\n}\n\naddCustomElement('temba-anchor', Anchor);\naddCustomElement('temba-alert', Alert);\naddCustomElement('temba-store', Store);\naddCustomElement('temba-textinput', TextInput);\naddCustomElement('temba-datepicker', DatePicker);\naddCustomElement('temba-date', TembaDate);\naddCustomElement('temba-completion', Completion);\naddCustomElement('temba-checkbox', Checkbox);\naddCustomElement('temba-select', Select);\naddCustomElement('temba-options', Options);\naddCustomElement('temba-loading', Loading);\naddCustomElement('temba-lightbox', Lightbox);\naddCustomElement('temba-button', Button);\naddCustomElement('temba-omnibox', Omnibox);\naddCustomElement('temba-tip', Tip);\naddCustomElement('temba-contact-name', ContactName);\naddCustomElement('temba-contact-name-fetch', ContactNameFetch);\naddCustomElement('temba-contact-field', ContactFieldEditor);\naddCustomElement('temba-contact-fields', ContactFields);\naddCustomElement('temba-field-manager', FieldManager);\naddCustomElement('temba-urn', ContactUrn);\naddCustomElement('temba-content-menu', ContentMenu);\n\naddCustomElement('temba-field', FormField);\naddCustomElement('temba-dialog', Dialog);\naddCustomElement('temba-modax', Modax);\naddCustomElement('temba-charcount', CharCount);\naddCustomElement('temba-contact-history', ContactHistory);\naddCustomElement('temba-contact-chat', ContactChat);\naddCustomElement('temba-contact-details', ContactDetails);\naddCustomElement('temba-ticket-list', TicketList);\naddCustomElement('temba-notification-list', NotificationList);\naddCustomElement('temba-list', TembaList);\naddCustomElement('temba-sortable-list', SortableList);\naddCustomElement('temba-run-list', RunList);\naddCustomElement('temba-flow-details', FlowStoreElement);\naddCustomElement('temba-label', Label);\naddCustomElement('temba-menu', TembaMenu);\naddCustomElement('temba-remote', Remote);\naddCustomElement('temba-contact-search', ContactSearch);\naddCustomElement('temba-icon', VectorIcon);\naddCustomElement('temba-dropdown', Dropdown);\naddCustomElement('temba-tabs', TabPane);\naddCustomElement('temba-tab', Tab);\naddCustomElement('temba-contact-badges', ContactBadges);\naddCustomElement('temba-contact-pending', ContactPending);\naddCustomElement('temba-contact-tickets', ContactTickets);\naddCustomElement('temba-slider', TembaSlider);\naddCustomElement('temba-content-menu', ContentMenu);\naddCustomElement('temba-compose', Compose);\naddCustomElement('temba-color-picker', ColorPicker);\naddCustomElement('temba-resizer', Resizer);\naddCustomElement('temba-thumbnail', Thumbnail);\naddCustomElement('temba-webchat', WebChat);\naddCustomElement('temba-image-picker', ImagePicker);\naddCustomElement('temba-mask', Mask);\n"]}