stream-chat-angular 5.0.0-v5.8 → 5.0.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 (118) hide show
  1. package/assets/i18n/en.d.ts +1 -0
  2. package/assets/version.d.ts +1 -1
  3. package/esm2020/assets/i18n/en.mjs +3 -2
  4. package/esm2020/assets/version.mjs +2 -2
  5. package/esm2020/lib/attachment-list/attachment-list.component.mjs +3 -3
  6. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +3 -3
  7. package/esm2020/lib/attachment.service.mjs +103 -7
  8. package/esm2020/lib/avatar/avatar.component.mjs +3 -9
  9. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +3 -11
  10. package/esm2020/lib/channel/channel.component.mjs +5 -6
  11. package/esm2020/lib/channel-header/channel-header.component.mjs +3 -3
  12. package/esm2020/lib/channel-list/channel-list.component.mjs +5 -6
  13. package/esm2020/lib/channel-preview/channel-preview.component.mjs +3 -3
  14. package/esm2020/lib/channel-query.mjs +77 -0
  15. package/esm2020/lib/channel.service.mjs +197 -135
  16. package/esm2020/lib/chat-client.service.mjs +33 -11
  17. package/esm2020/lib/custom-templates.service.mjs +6 -10
  18. package/esm2020/lib/icon/icon.component.mjs +3 -7
  19. package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +4 -7
  20. package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +6 -22
  21. package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +5 -23
  22. package/esm2020/lib/message/message.component.mjs +129 -16
  23. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +39 -14
  24. package/esm2020/lib/message-actions.service.mjs +66 -2
  25. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +16 -6
  26. package/esm2020/lib/message-input/message-input.component.mjs +76 -74
  27. package/esm2020/lib/message-input/textarea/textarea.component.mjs +13 -1
  28. package/esm2020/lib/message-list/message-list.component.mjs +83 -15
  29. package/esm2020/lib/message-reactions/message-reactions.component.mjs +7 -78
  30. package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
  31. package/esm2020/lib/message-reactions.service.mjs +3 -4
  32. package/esm2020/lib/modal/modal.component.mjs +1 -1
  33. package/esm2020/lib/stream-chat.module.mjs +8 -8
  34. package/esm2020/lib/thread/thread.component.mjs +3 -3
  35. package/esm2020/lib/types.mjs +1 -1
  36. package/esm2020/lib/voice-recording/voice-recording.component.mjs +3 -3
  37. package/esm2020/public-api.mjs +3 -2
  38. package/fesm2015/stream-chat-angular.mjs +2747 -2338
  39. package/fesm2015/stream-chat-angular.mjs.map +1 -1
  40. package/fesm2020/stream-chat-angular.mjs +2687 -2284
  41. package/fesm2020/stream-chat-angular.mjs.map +1 -1
  42. package/lib/attachment.service.d.ts +11 -4
  43. package/lib/avatar/avatar.component.d.ts +1 -5
  44. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -5
  45. package/lib/channel-query.d.ts +26 -0
  46. package/lib/channel.service.d.ts +86 -57
  47. package/lib/chat-client.service.d.ts +7 -3
  48. package/lib/custom-templates.service.d.ts +8 -12
  49. package/lib/icon/icon.component.d.ts +2 -6
  50. package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -5
  51. package/lib/loading-indicator/loading-indicator.component.d.ts +1 -10
  52. package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -11
  53. package/lib/message/message.component.d.ts +31 -9
  54. package/lib/message-actions-box/message-actions-box.component.d.ts +11 -6
  55. package/lib/message-actions.service.d.ts +3 -2
  56. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -0
  57. package/lib/message-input/message-input.component.d.ts +19 -7
  58. package/lib/message-input/textarea/textarea.component.d.ts +1 -0
  59. package/lib/message-list/message-list.component.d.ts +11 -6
  60. package/lib/message-reactions/message-reactions.component.d.ts +6 -30
  61. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +35 -0
  62. package/lib/stream-chat.module.d.ts +5 -5
  63. package/lib/types.d.ts +28 -29
  64. package/package.json +5 -5
  65. package/public-api.d.ts +2 -1
  66. package/src/assets/assets/EmojiOneColor.woff2 +0 -0
  67. package/src/assets/assets/NotoColorEmoji-flags.woff2 +0 -0
  68. package/src/assets/assets/Poweredby_100px-White_VertText.png +0 -0
  69. package/src/assets/assets/icons/stream-chat-icons.eot +0 -0
  70. package/src/assets/assets/icons/stream-chat-icons.svg +46 -0
  71. package/src/assets/assets/icons/stream-chat-icons.ttf +0 -0
  72. package/src/assets/assets/icons/stream-chat-icons.woff +0 -0
  73. package/src/assets/assets/icons/stream-chat-icons.woff2 +0 -0
  74. package/src/assets/assets/str-chat__reaction-list-sprite@1x.png +0 -0
  75. package/src/assets/assets/str-chat__reaction-list-sprite@2x.png +0 -0
  76. package/src/assets/assets/str-chat__reaction-list-sprite@3x.png +0 -0
  77. package/src/assets/i18n/en.ts +2 -1
  78. package/src/assets/styles/css/index.css +2 -2
  79. package/src/assets/styles/css/index.layout.css +2 -2
  80. package/src/assets/styles/scss/AttachmentList/AttachmentList-layout.scss +74 -12
  81. package/src/assets/styles/scss/AttachmentList/AttachmentList-theme.scss +52 -0
  82. package/src/assets/styles/scss/AttachmentPreviewList/AttachmentPreviewList-layout.scss +24 -9
  83. package/src/assets/styles/scss/AttachmentPreviewList/AttachmentPreviewList-theme.scss +29 -0
  84. package/src/assets/styles/scss/AudioRecorder/AudioRecorder-layout.scss +89 -0
  85. package/src/assets/styles/scss/AudioRecorder/AudioRecorder-theme.scss +51 -0
  86. package/src/assets/styles/scss/Autocomplete/Autocomplete-layout.scss +1 -1
  87. package/src/assets/styles/scss/Avatar/Avatar-layout.scss +46 -0
  88. package/src/assets/styles/scss/Channel/Channel-layout.scss +1 -0
  89. package/src/assets/styles/scss/Channel/Channel-theme.scss +1 -0
  90. package/src/assets/styles/scss/ChannelList/ChannelList-layout.scss +2 -2
  91. package/src/assets/styles/scss/ChannelList/ChannelList-theme.scss +4 -2
  92. package/src/assets/styles/scss/ChannelPreview/ChannelPreview-layout.scss +2 -0
  93. package/src/assets/styles/scss/ChannelPreview/ChannelPreview-theme.scss +1 -0
  94. package/src/assets/styles/scss/EditMessageForm/EditMessageForm-theme.scss +9 -9
  95. package/src/assets/styles/scss/Icon/Icon-layout.scss +87 -0
  96. package/src/assets/styles/scss/Icon/Icon-theme.scss +13 -0
  97. package/src/assets/styles/scss/ImageCarousel/ImageCarousel-layout.scss +1 -0
  98. package/src/assets/styles/scss/ImageCarousel/ImageCarousel-theme.scss +1 -0
  99. package/src/assets/styles/scss/LoadingIndicator/LoadingIndicator-layout.scss +10 -1
  100. package/src/assets/styles/scss/LoadingIndicator/LoadingIndicator-theme.scss +6 -4
  101. package/src/assets/styles/scss/Message/Message-layout.scss +45 -6
  102. package/src/assets/styles/scss/Message/Message-theme.scss +6 -0
  103. package/src/assets/styles/scss/MessageInput/MessageInput-layout.scss +33 -1
  104. package/src/assets/styles/scss/MessageInput/MessageInput-theme.scss +65 -2
  105. package/src/assets/styles/scss/MessageList/MessageList-theme.scss +2 -0
  106. package/src/assets/styles/scss/MessageReactions/MessageReactionsSelector-layout.scss +18 -0
  107. package/src/assets/styles/scss/MessageReactions/MessageReactionsSelector-theme.scss +5 -0
  108. package/src/assets/styles/scss/Modal/Modal-layout.scss +1 -0
  109. package/src/assets/styles/scss/Modal/Modal-theme.scss +6 -0
  110. package/src/assets/styles/scss/_base.scss +4 -2
  111. package/src/assets/styles/scss/_emoji-replacement.scss +4 -2
  112. package/src/assets/styles/scss/_icons.scss +24 -2
  113. package/src/assets/styles/scss/_variables.scss +2 -0
  114. package/src/assets/styles/scss/index.layout.scss +2 -0
  115. package/src/assets/styles/scss/index.scss +2 -0
  116. package/src/assets/version.ts +1 -1
  117. package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +0 -83
  118. package/lib/edit-message-form/edit-message-form.component.d.ts +0 -31
@@ -1,10 +1,19 @@
1
- // todo: this is a copy of src/styles/LoadingIndicator.scss - find a shared folder for it
1
+ .str-chat {
2
+ /* The size of the loading indicator, only available in Angular v5+ */
3
+ --str-chat__loading-indicator-size: calc(var(--str-chat__spacing-px) * 15);
4
+ }
5
+
2
6
  .str-chat__loading-indicator {
3
7
  display: flex;
4
8
  align-items: center;
5
9
  justify-content: center;
6
10
  animation: rotate 1s linear infinite;
7
11
 
12
+ svg {
13
+ width: var(--str-chat__loading-indicator-size);
14
+ height: var(--str-chat__loading-indicator-size);
15
+ }
16
+
8
17
  @-webkit-keyframes rotate {
9
18
  from {
10
19
  -webkit-transform: rotate(0deg);
@@ -1,11 +1,13 @@
1
+ .str-chat {
2
+ /* The color of the loading indicator */
3
+ --str-chat__loading-indicator-color: var(--str-chat__primary-color);
4
+ }
5
+
1
6
  .str-chat__loading-indicator {
2
7
  svg {
3
8
  linearGradient {
4
9
  stop:last-child {
5
- stop-color: var(
6
- --str-chat__loading-indicator-color,
7
- var(--str-chat__primary-color, #006cff)
8
- );
10
+ stop-color: var(--str-chat__loading-indicator-color);
9
11
  }
10
12
  }
11
13
  }
@@ -1,7 +1,7 @@
1
1
  @use '../utils';
2
2
 
3
3
  .str-chat {
4
- /* The width/height of the message options buttons */
4
+ /* The width/height of the message options button(s), for Angular SDK it's only used on desktop devices starting from version 5 */
5
5
  --str-chat__message-options-button-size: calc(var(--str-chat__spacing-px) * 26);
6
6
 
7
7
  /* The maximum allowed width of the message component */
@@ -26,9 +26,19 @@
26
26
  }
27
27
 
28
28
  .str-chat__message {
29
+ --str-chat-message-options-size: calc(3 * var(--str-chat__message-options-button-size));
30
+
31
+ &.str-chat__message-without-touch-support {
32
+ --str-chat-message-options-size: calc(1 * var(--str-chat__message-options-button-size));
33
+ }
34
+
29
35
  .str-chat__message-bubble {
30
36
  max-width: var(--str-chat__message-max-width);
31
37
  }
38
+
39
+ .str-chat__message-options {
40
+ --str-chat-icon-height: calc(var(--str-chat__message-options-button-size) * 0.7);
41
+ }
32
42
  }
33
43
 
34
44
  .str-chat__message.str-chat__message--has-attachment {
@@ -123,7 +133,7 @@
123
133
  align-items: flex-start;
124
134
  justify-content: flex-end;
125
135
  flex-direction: row-reverse;
126
- width: calc(3 * var(--str-chat__message-options-button-size));
136
+ width: var(--str-chat-message-options-size);
127
137
 
128
138
  .str-chat__message-actions-box-button,
129
139
  .str-chat__message-reply-in-thread-button,
@@ -218,6 +228,7 @@
218
228
  }
219
229
 
220
230
  .str-chat__message-status {
231
+ --str-chat-icon-height: calc(var(--str-chat__spacing-px) * 15);
221
232
  @include utils.flex-row-center;
222
233
  column-gap: var(--str-chat__spacing-0_5);
223
234
  position: relative;
@@ -282,8 +293,8 @@
282
293
  }
283
294
 
284
295
  // Message options display - default mode: they appear when .str-chat__li is hovered
285
- .str-chat__ul:not(.str-chat__message-options-in-bubble),
286
- .str-chat__virtual-list:not(.str-chat__message-options-in-bubble) {
296
+ .str-chat__ul:not(.str-chat__message-options-in-bubble, .str-chat__message-with-touch-support),
297
+ .str-chat__virtual-list:not(.str-chat__message-options-in-bubble, .str-chat__message-with-touch-support) {
287
298
  /* This rule won't be applied in browsers that don't support :has() */
288
299
  .str-chat__li:hover:not(:has(.str-chat__reaction-list:hover, .str-chat__modal--open)),
289
300
  .str-chat__li:focus-within:not(:has(.str-chat__reaction-list:focus-within, .str-chat__modal--open)) {
@@ -350,11 +361,11 @@
350
361
  }
351
362
 
352
363
  .str-chat__message--other .str-chat__message-inner {
353
- margin-inline-end: calc(var(--str-chat__message-options-button-size) * 3);
364
+ margin-inline-end: var(--str-chat-message-options-size);
354
365
  }
355
366
 
356
367
  .str-chat__message--me .str-chat__message-inner {
357
- margin-inline-start: calc(var(--str-chat__message-options-button-size) * 3);
368
+ margin-inline-start: var(--str-chat-message-options-size);
358
369
  }
359
370
 
360
371
  .str-chat__li--middle,
@@ -453,6 +464,7 @@
453
464
  }
454
465
 
455
466
  .str-chat__unread-messages-notification {
467
+ --str-chat-icon-height: calc(var(--str-chat__spacing-px) * 16);
456
468
  position: absolute;
457
469
  top: 0.75rem;
458
470
  z-index: 2;
@@ -506,3 +518,30 @@
506
518
  .str-chat__message-text--pointer-cursor {
507
519
  cursor: pointer;
508
520
  }
521
+
522
+ .str-chat__message-with-touch-support {
523
+ .str-chat__message-bubble {
524
+ -webkit-touch-callout: none;
525
+ -webkit-user-select: none;
526
+ user-select: none;
527
+ }
528
+
529
+ &.str-chat__message-menu-opened {
530
+ .str-chat__attachments-container,
531
+ .str-chat__message-text-inner {
532
+ pointer-events: none;
533
+ }
534
+ }
535
+
536
+ .str-chat__message-inner {
537
+ margin-inline: 0;
538
+ }
539
+
540
+ .str-chat__message-options {
541
+ display: none;
542
+ }
543
+
544
+ .stream-chat-angular__image-modal-host {
545
+ -webkit-touch-callout: default;
546
+ }
547
+ }
@@ -220,12 +220,15 @@
220
220
  }
221
221
 
222
222
  .str-chat__message-options {
223
+ --str-chat-icon-color: var(--str-chat__message-options-color);
224
+
223
225
  .str-chat__message-actions-box-button,
224
226
  .str-chat__message-reply-in-thread-button,
225
227
  .str-chat__message-reactions-button {
226
228
  // remove default button styles (React SDK uses button compared to div in Angular SDK)
227
229
  @include utils.button-reset;
228
230
  border-radius: var(--str-chat__message-options-border-radius);
231
+ color: var(--str-chat__message-options-color);
229
232
 
230
233
  .str-chat__message-action-icon path {
231
234
  fill: var(--str-chat__message-options-color);
@@ -272,6 +275,7 @@
272
275
  }
273
276
 
274
277
  .str-chat__message-status {
278
+ --str-chat-icon-color: var(--str-chat__message-status-color);
275
279
  color: var(--str-chat__message-status-color);
276
280
  font: var(--str-chat__body-text);
277
281
 
@@ -297,6 +301,7 @@
297
301
  }
298
302
 
299
303
  .str-chat__message-error-icon {
304
+ --str-chat-icon-color: var(--str-chat__message-error-message-color);
300
305
  /* stylelint-disable-next-line selector-max-id */
301
306
  svg #background {
302
307
  fill: var(--str-chat__message-error-message-color);
@@ -393,6 +398,7 @@
393
398
  }
394
399
 
395
400
  .str-chat__unread-messages-notification {
401
+ --str-chat-icon-color: var(--str-chat__on-primary-color);
396
402
  background-color: var(--str-chat__text-low-emphasis-color);
397
403
  border-radius: 1.125rem;
398
404
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  .str-chat__message-input {
4
4
  $send-button-size: calc(var(--str-chat__spacing-px) * 45);
5
+ $start-audio-recording-button-size: calc(var(--str-chat__spacing-px) * 40);
5
6
 
6
7
  @include utils.flex-col-center;
7
8
  width: 100%;
@@ -46,6 +47,7 @@
46
47
  justify-content: center;
47
48
 
48
49
  .str-chat__file-input-container {
50
+ --str-chat-icon-height: calc(var(--str-chat__spacing-px) * 24);
49
51
  @include utils.flex-row-center;
50
52
  width: calc(var(--str-chat__spacing-px) * 45);
51
53
  height: calc(var(--str-chat__spacing-px) * 45);
@@ -132,6 +134,7 @@
132
134
  }
133
135
 
134
136
  .str-chat__send-button {
137
+ --str-chat-icon-height: calc(var(--str-chat__spacing-px) * 32);
135
138
  @include utils.flex-row-center;
136
139
  cursor: pointer;
137
140
  padding: 0;
@@ -145,6 +148,19 @@
145
148
  }
146
149
  }
147
150
 
151
+ .str-chat__start-recording-audio-button {
152
+ @include utils.flex-row-center;
153
+ cursor: pointer;
154
+ padding: 0;
155
+ width: $start-audio-recording-button-size;
156
+ height: $start-audio-recording-button-size;
157
+ min-width: $start-audio-recording-button-size;
158
+
159
+ svg {
160
+ height: calc(var(--str-chat__spacing-px) * 25);
161
+ }
162
+ }
163
+
148
164
  .str-chat__message-input-cooldown {
149
165
  @include utils.flex-row-center;
150
166
  margin-inline-start: var(--str-chat__spacing-2);
@@ -161,6 +177,21 @@
161
177
  .str-chat__quoted-message-preview {
162
178
  padding: var(--str-chat__spacing-2);
163
179
  }
180
+
181
+ .str-chat__recording-permission-denied-notification {
182
+ position: absolute;
183
+ left: 0.5rem;
184
+ max-width: 100%;
185
+ bottom: 100%;
186
+ padding: 1rem;
187
+ margin-inline: 0.5rem;
188
+ z-index: 2;
189
+
190
+ .str-chat__recording-permission-denied-notification__dismiss-button-container {
191
+ display: flex;
192
+ justify-content: flex-end;
193
+ }
194
+ }
164
195
  }
165
196
 
166
197
  .str-chat__message-input-angular-host {
@@ -179,7 +210,8 @@
179
210
  flex-grow: initial;
180
211
  }
181
212
 
182
- [dir='rtl'] .str-chat__send-button {
213
+ [dir='rtl'] .str-chat__send-button,
214
+ [dir='rtl'] .str-chat__start-recording-audio-button {
183
215
  svg {
184
216
  transform: scale(-1, 1);
185
217
  }
@@ -86,7 +86,37 @@
86
86
  --str-chat__message-send-disabled-color: var(--str-chat__disabled-color);
87
87
 
88
88
  /* The background color of the send button in disabled state */
89
- --str-chat__message-send-disabled-background-color: transparent;
89
+ --str-chat__message-send-disabled-background-color: var(--str-chat__disabled-color);
90
+
91
+ /* The border radius used for the borders of the audio recording button */
92
+ --str-chat__start-recording-audio-button-border-radius: var(--str-chat__border-radius-circle);
93
+
94
+ /* The text/icon color of the audio recording button */
95
+ --str-chat__start-recording-audio-button-color: var(--str-chat__text-low-emphasis-color);
96
+
97
+ /* The background color of the audio recording button */
98
+ --str-chat__start-recording-audio-button-background-color: transparent;
99
+
100
+ /* Top border of the audio recording button */
101
+ --str-chat__start-recording-audio-button-border-block-start: 0;
102
+
103
+ /* Bottom border of the audio recording button */
104
+ --str-chat__start-recording-audio-button-border-block-end: 0;
105
+
106
+ /* Left (right in RTL layout) border of the audio recording button */
107
+ --str-chat__start-recording-audio-button-border-inline-start: 0;
108
+
109
+ /* Right (left in RTL layout) border of the audio recording button */
110
+ --str-chat__start-recording-audio-button-border-inline-end: 0;
111
+
112
+ /* Box shadow applied to the audio recording button */
113
+ --str-chat__start-recording-audio-button-box-shadow: none;
114
+
115
+ /* The color of the audio recording button in disabled state */
116
+ --str-chat__start-recording-audio-button-disabled-color: var(--str-chat__disabled-color);
117
+
118
+ /* The background color of the audio recording button in disabled state */
119
+ --str-chat__start-recording-audio-button-disabled-background-color: transparent;
90
120
 
91
121
  /* The border radius used for the borders of the tool buttons of the message input (such as attachment upload button) */
92
122
  --str-chat__message-input-tools-border-radius: var(--str-chat__border-radius-circle);
@@ -151,6 +181,7 @@
151
181
  }
152
182
 
153
183
  .str-chat__file-input-container {
184
+ --str-chat-icon-color: var(--str-chat__message-input-tools-color);
154
185
  @include utils.component-layer-overrides('message-input-tools');
155
186
 
156
187
  svg path {
@@ -179,6 +210,7 @@
179
210
  }
180
211
 
181
212
  .str-chat__send-button {
213
+ --str-chat-icon-color: var(--str-chat__message-send-color);
182
214
  @include utils.component-layer-overrides('message-send');
183
215
 
184
216
  svg path {
@@ -186,7 +218,8 @@
186
218
  }
187
219
 
188
220
  &:disabled {
189
- background-color: var(--str-chat__message-send-disabled-background-color);
221
+ --str-chat-icon-color: var(--str-chat__message-send-disabled-color);
222
+ background-color: transparent;
190
223
 
191
224
  svg path {
192
225
  fill: var(--str-chat__message-send-disabled-color);
@@ -194,6 +227,14 @@
194
227
  }
195
228
  }
196
229
 
230
+ .str-chat__start-recording-audio-button {
231
+ @include utils.component-layer-overrides('start-recording-audio-button');
232
+
233
+ &:disabled {
234
+ background-color: var(--str-chat__message-send-disabled-background-color);
235
+ }
236
+ }
237
+
197
238
  .str-chat__message-input-cooldown {
198
239
  @include utils.component-layer-overrides('cooldown');
199
240
  font: var(--str-chat__subtitle-medium-text);
@@ -218,4 +259,26 @@
218
259
  }
219
260
  }
220
261
  }
262
+
263
+ .str-chat__recording-permission-denied-notification {
264
+ background-color: var(--str-chat__text-color);
265
+ border-radius: var(--str-chat__border-radius-md);
266
+ color: var(--str-chat__background-color);
267
+
268
+ .str-chat__recording-permission-denied-notification__heading,
269
+ .str-chat__recording-permission-denied-notification__dismiss-button {
270
+ font: var(--str-chat__subtitle2-medium-text);
271
+ }
272
+
273
+ .str-chat__recording-permission-denied-notification__message {
274
+ font: var(--str-chat__subtitle-text);
275
+ }
276
+
277
+ .str-chat__recording-permission-denied-notification__dismiss-button {
278
+ @include utils.button-reset;
279
+ color: var(--str-chat__background-color);
280
+ cursor: pointer;
281
+ text-transform: uppercase;
282
+ }
283
+ }
221
284
  }
@@ -91,6 +91,8 @@
91
91
  }
92
92
 
93
93
  .str-chat__jump-to-latest-message {
94
+ --str-chat-icon-color: var(--str-chat__jump-to-latest-message-unread-count-background-color);
95
+
94
96
  .str-chat__circle-fab {
95
97
  @include utils.component-layer-overrides('jump-to-latest-message');
96
98
  @include utils.circle-fab-overrides('jump-to-latest-message');
@@ -6,6 +6,24 @@
6
6
  position: absolute;
7
7
  inset-block-end: 100%;
8
8
 
9
+ &.str-chat-angular-v5__reaction-selector {
10
+ margin: var(--str-chat__spacing-2);
11
+ position: static;
12
+ justify-content: flex-start;
13
+
14
+ .str-chat__message-reactions-options {
15
+ max-width: 100%;
16
+ overflow-y: hidden;
17
+ overflow-x: auto;
18
+ scrollbar-width: none;
19
+ padding: 0;
20
+
21
+ .str-chat__message-reactions-option {
22
+ flex-shrink: 0;
23
+ }
24
+ }
25
+ }
26
+
9
27
  .str-chat__message-reactions-options {
10
28
  list-style: none;
11
29
  display: flex;
@@ -62,6 +62,11 @@
62
62
 
63
63
  /* Box shadow applied to the component */
64
64
  --str-chat__message-reactions-option-box-shadow: none;
65
+
66
+ .str-chat-angular-v5__reaction-selector {
67
+ --str-chat__message-reactions-options-box-shadow: none;
68
+ --str-chat__message-reactions-options-border-radius: 0;
69
+ }
65
70
  }
66
71
 
67
72
  .str-chat__reaction-selector {
@@ -18,6 +18,7 @@
18
18
  }
19
19
 
20
20
  .str-chat__modal__close-button {
21
+ --str-chat-icon-height: calc(var(--str-chat__spacing-px) * 28);
21
22
  @include utils.flex-row-center;
22
23
  padding: var(--str-chat__spacing-2);
23
24
  position: absolute;
@@ -47,8 +47,14 @@
47
47
  }
48
48
 
49
49
  .str-chat__modal__close-button {
50
+ --str-chat-icon-color: var(--str-chat__modal-close-icon-color);
50
51
  @include utils.button-reset;
51
52
 
53
+ .str-chat__icon {
54
+ background-color: var(--str-chat__modal-close-icon-background);
55
+ border-radius: 999px;
56
+ }
57
+
52
58
  svg {
53
59
  path {
54
60
  fill: var(--str-chat__modal-close-icon-color);
@@ -1,17 +1,19 @@
1
1
  .str-chat {
2
2
  box-sizing: border-box;
3
+ font-family: var(--str-chat__font-family);
3
4
 
4
5
  * {
5
- font-family: var(--str-chat__font-family);
6
6
  box-sizing: border-box;
7
7
  }
8
8
 
9
9
  // Overriding styles of ngx-popperjs/ngx-float-ui
10
- .ngxp__container, .float-ui-container {
10
+ .ngxp__container,
11
+ .float-ui-container {
11
12
  z-index: 1;
12
13
  padding: 0 !important;
13
14
  box-shadow: none !important;
14
15
  border-color: transparent !important;
16
+ max-width: 100vw;
15
17
 
16
18
  .ngxp__arrow {
17
19
  display: none;
@@ -1,5 +1,7 @@
1
- /* declare a font faces for our Emoji Replacement font, based on the default font used by Stream Chat React */
2
- $assetsPath: '../../assets' !default;
1
+ @use 'variables';
2
+
3
+ $assetsPath: variables.$assetsPath !default;
4
+
3
5
  $emoji-flag-unicode-range: U+1F1E6-1F1FF;
4
6
 
5
7
  /* png based woff for most browsers */
@@ -1,3 +1,25 @@
1
+ @use 'variables';
2
+
1
3
  .str-chat {
2
- --str-chat__image-fallback-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9ImN1cnJlbnRDb2xvciIgY2xhc3M9InN0ci1jaGF0X19pbWFnZS1mYWxsYmFja19faWNvbiIgdmlld0JveD0iMCAwIDE4IDE4Ij48cGF0aCBkPSJNMTYgMnYxNEgyVjJoMTRabTAtMkgyQy45IDAgMCAuOSAwIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTItMi0yWm0tNC44NiA4Ljg2LTMgMy44N0w2IDEwLjE0IDMgMTRoMTJsLTMuODYtNS4xNFoiLz48L3N2Zz4=");
3
- }
4
+ --str-chat__image-fallback-icon: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9ImN1cnJlbnRDb2xvciIgY2xhc3M9InN0ci1jaGF0X19pbWFnZS1mYWxsYmFja19faWNvbiIgdmlld0JveD0iMCAwIDE4IDE4Ij48cGF0aCBkPSJNMTYgMnYxNEgyVjJoMTRabTAtMkgyQy45IDAgMCAuOSAwIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTItMi0yWm0tNC44NiA4Ljg2LTMgMy44N0w2IDEwLjE0IDMgMTRoMTJsLTMuODYtNS4xNFoiLz48L3N2Zz4=');
5
+ }
6
+
7
+ @font-face {
8
+ font-family: 'stream-chat-icons';
9
+ src: url('#{variables.$assetsPath}/icons/stream-chat-icons.eot');
10
+ src: url('#{variables.$assetsPath}/icons/stream-chat-icons.eot#iefix') format('embedded-opentype'),
11
+ url('#{variables.$assetsPath}/icons/stream-chat-icons.woff') format('woff2'),
12
+ url('#{variables.$assetsPath}/icons/stream-chat-icons.woff') format('woff'),
13
+ url('#{variables.$assetsPath}/icons/stream-chat-icons.ttf') format('truetype'),
14
+ url('#{variables.$assetsPath}/icons/stream-chat-icons.svg#stream-chat-icons') format('svg');
15
+ font-weight: normal;
16
+ font-style: normal;
17
+ }
18
+ /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
19
+ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
20
+ @media screen and (-webkit-min-device-pixel-ratio: 0) {
21
+ @font-face {
22
+ font-family: 'stream-chat-icons';
23
+ src: url('#{variables.$assetsPath}/icons/stream-chat-icons.svg#stream-chat-icons') format('svg');
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ /* declare asset path, useful if you want to create your own style bundle */
2
+ $assetsPath: '../../assets' !default;
@@ -6,6 +6,7 @@
6
6
  @use 'AttachmentList/AttachmentList-layout';
7
7
  @use 'AttachmentPreviewList/AttachmentPreviewList-layout';
8
8
  @use 'Autocomplete/Autocomplete-layout';
9
+ @use 'AudioRecorder/AudioRecorder-layout';
9
10
  @use 'BaseImage/BaseImage-layout';
10
11
  @use 'Channel/Channel-layout';
11
12
  @use 'ChannelHeader/ChannelHeader-layout';
@@ -16,6 +17,7 @@
16
17
  @use 'common/CircleFAButton/CircleFAButton-layout';
17
18
  @use 'EditMessageForm/EditMessageForm-layout';
18
19
  @use 'ImageCarousel/ImageCarousel-layout';
20
+ @use 'Icon/Icon-layout';
19
21
  @use 'LinkPreview/LinkPreview-layout';
20
22
  @use 'LoadingIndicator/LoadingIndicator-layout';
21
23
  @use 'Message/Message-layout';
@@ -9,6 +9,7 @@
9
9
  @use 'Avatar/Avatar-theme';
10
10
  @use 'AttachmentList/AttachmentList-theme';
11
11
  @use 'AttachmentPreviewList/AttachmentPreviewList-theme';
12
+ @use 'AudioRecorder/AudioRecorder-theme';
12
13
  @use 'Autocomplete/Autocomplete-theme';
13
14
  @use 'BaseImage/BaseImage-theme';
14
15
  @use 'Channel/Channel-theme.scss';
@@ -17,6 +18,7 @@
17
18
  @use 'ChannelPreview/ChannelPreview-theme';
18
19
  @use 'ChannelSearch/ChannelSearch-theme';
19
20
  @use 'EditMessageForm/EditMessageForm-theme';
21
+ @use 'Icon/Icon-theme';
20
22
  @use 'ImageCarousel/ImageCarousel-theme';
21
23
  @use 'LinkPreview/LinkPreview-theme';
22
24
  @use 'LoadingIndicator/LoadingIndicator-theme';
@@ -1 +1 @@
1
- export const version = '5.0.0-v5.8';
1
+ export const version = '5.0.0';
@@ -1,83 +0,0 @@
1
- import { Component, HostBinding, ViewChild, } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../custom-templates.service";
5
- import * as i2 from "../message-actions.service";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@ngx-translate/core";
8
- import * as i5 from "../message-input/message-input.component";
9
- import * as i6 from "../notification-list/notification-list.component";
10
- import * as i7 from "../modal/modal.component";
11
- /**
12
- * The edit message form displays a modal that's opened when a user edits a message. The component uses the [`MessageActionsService`](../../services/MessageActionsService) to know which message is being edited.
13
- *
14
- * By default this is displayed within the [`stream-channel` component](../../components/ChannelComponent).
15
- */
16
- export class EditMessageFormComponent {
17
- constructor(customTemplatesService, messageActionsService) {
18
- this.customTemplatesService = customTemplatesService;
19
- this.messageActionsService = messageActionsService;
20
- this.class = 'str-chat-angular__edit-message-form';
21
- this.isModalOpen = false;
22
- this.sendMessageSubject = new Subject();
23
- this.subscriptions = [];
24
- this.sendMessage$ = this.sendMessageSubject.asObservable();
25
- }
26
- ngOnInit() {
27
- this.messageActionsService.messageToEdit$.subscribe((message) => {
28
- if ((message && !this.isModalOpen) || (!message && this.isModalOpen)) {
29
- this.message = message;
30
- this.isModalOpen = !!message;
31
- }
32
- });
33
- }
34
- ngOnDestroy() {
35
- this.subscriptions.forEach((s) => s.unsubscribe());
36
- }
37
- getEditModalContext() {
38
- return {
39
- isOpen: this.isModalOpen,
40
- isOpenChangeHandler: (isOpen) => {
41
- this.isModalOpen = isOpen;
42
- if (!this.isModalOpen) {
43
- this.dismissed();
44
- }
45
- },
46
- content: this.modalContent,
47
- };
48
- }
49
- getMessageInputContext() {
50
- return {
51
- message: this.message,
52
- messageUpdateHandler: () => {
53
- this.dismissed();
54
- },
55
- isFileUploadEnabled: undefined,
56
- areMentionsEnabled: undefined,
57
- isMultipleFileUploadEnabled: undefined,
58
- mentionScope: undefined,
59
- mode: undefined,
60
- sendMessage$: this.sendMessage$,
61
- };
62
- }
63
- sendClicked() {
64
- this.sendMessageSubject.next();
65
- }
66
- dismissed() {
67
- this.isModalOpen = false;
68
- this.message = undefined;
69
- this.messageActionsService.messageToEdit$.next(undefined);
70
- }
71
- }
72
- EditMessageFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: EditMessageFormComponent, deps: [{ token: i1.CustomTemplatesService }, { token: i2.MessageActionsService }], target: i0.ɵɵFactoryTarget.Component });
73
- EditMessageFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: EditMessageFormComponent, selector: "stream-edit-message-form", host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["editMessageForm"], descendants: true, static: true }], ngImport: i0, template: "<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getEditModalContext()\n \"\n></ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n *ngIf=\"isOpen\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #editMessageForm>\n <div class=\"str-chat__edit-message-form\">\n <ng-template\n #defaultInput\n let-messageInput=\"message\"\n let-messageUpdateHandler=\"messageUpdateHandler\"\n let-sendMessage$Input=\"sendMessage$\"\n >\n <stream-message-input\n [message]=\"messageInput\"\n [sendMessage$]=\"sendMessage$Input\"\n (messageUpdate)=\"messageUpdateHandler()\"\n ></stream-message-input>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageInputTemplate$ | async) || defaultInput;\n context: getMessageInputContext()\n \"\n >\n </ng-container>\n\n <stream-notification-list></stream-notification-list>\n <div\n class=\"\n str-chat__message-team-form-footer\n str-chat__message-team-form-footer-angular\n \"\n >\n <div class=\"str-chat__edit-message-form-options\">\n <button\n class=\"str-chat__edit-message-cancel\"\n translate\n data-testid=\"cancel-button\"\n (click)=\"dismissed()\"\n >\n streamChat.Cancel\n </button>\n <button\n type=\"submit\"\n translate\n class=\"str-chat__edit-message-send\"\n data-testid=\"send-button\"\n (click)=\"sendClicked()\"\n (keyup.enter)=\"sendClicked()\"\n >\n streamChat.Send\n </button>\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i5.MessageInputComponent, selector: "stream-message-input", inputs: ["isFileUploadEnabled", "areMentionsEnabled", "mentionScope", "mode", "isMultipleFileUploadEnabled", "message", "sendMessage$", "inputMode", "autoFocus"], outputs: ["messageUpdate"] }, { kind: "component", type: i6.NotificationListComponent, selector: "stream-notification-list" }, { kind: "component", type: i7.ModalComponent, selector: "stream-modal", inputs: ["isOpen", "content"], outputs: ["isOpenChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
74
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: EditMessageFormComponent, decorators: [{
75
- type: Component,
76
- args: [{ selector: 'stream-edit-message-form', template: "<ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.modalTemplate$ | async) || defaultModal;\n context: getEditModalContext()\n \"\n></ng-container>\n\n<ng-template\n #defaultModal\n let-isOpen=\"isOpen\"\n let-isOpenChangeHandler=\"isOpenChangeHandler\"\n let-content=\"content\"\n>\n <stream-modal\n *ngIf=\"isOpen\"\n [isOpen]=\"isOpen\"\n [content]=\"content\"\n (isOpenChange)=\"isOpenChangeHandler($event)\"\n >\n </stream-modal>\n</ng-template>\n\n<ng-template #editMessageForm>\n <div class=\"str-chat__edit-message-form\">\n <ng-template\n #defaultInput\n let-messageInput=\"message\"\n let-messageUpdateHandler=\"messageUpdateHandler\"\n let-sendMessage$Input=\"sendMessage$\"\n >\n <stream-message-input\n [message]=\"messageInput\"\n [sendMessage$]=\"sendMessage$Input\"\n (messageUpdate)=\"messageUpdateHandler()\"\n ></stream-message-input>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.messageInputTemplate$ | async) || defaultInput;\n context: getMessageInputContext()\n \"\n >\n </ng-container>\n\n <stream-notification-list></stream-notification-list>\n <div\n class=\"\n str-chat__message-team-form-footer\n str-chat__message-team-form-footer-angular\n \"\n >\n <div class=\"str-chat__edit-message-form-options\">\n <button\n class=\"str-chat__edit-message-cancel\"\n translate\n data-testid=\"cancel-button\"\n (click)=\"dismissed()\"\n >\n streamChat.Cancel\n </button>\n <button\n type=\"submit\"\n translate\n class=\"str-chat__edit-message-send\"\n data-testid=\"send-button\"\n (click)=\"sendClicked()\"\n (keyup.enter)=\"sendClicked()\"\n >\n streamChat.Send\n </button>\n </div>\n </div>\n </div>\n</ng-template>\n" }]
77
- }], ctorParameters: function () { return [{ type: i1.CustomTemplatesService }, { type: i2.MessageActionsService }]; }, propDecorators: { class: [{
78
- type: HostBinding
79
- }], modalContent: [{
80
- type: ViewChild,
81
- args: ['editMessageForm', { static: true }]
82
- }] } });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1tZXNzYWdlLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2VkaXQtbWVzc2FnZS1mb3JtL2VkaXQtbWVzc2FnZS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9lZGl0LW1lc3NhZ2UtZm9ybS9lZGl0LW1lc3NhZ2UtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFJWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQUd6RDs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHdCQUF3QjtJQVVuQyxZQUNXLHNCQUE4QyxFQUMvQyxxQkFBNEM7UUFEM0MsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUMvQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBWHZDLFVBQUssR0FBRyxxQ0FBcUMsQ0FBQztRQUU3RCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUlaLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDekMsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBTXpDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM5RCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNwRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQzlCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNyQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQ2xCO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVELHNCQUFzQjtRQUNwQixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLENBQUM7WUFDRCxtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsMkJBQTJCLEVBQUUsU0FBUztZQUN0QyxZQUFZLEVBQUUsU0FBUztZQUN2QixJQUFJLEVBQUUsU0FBUztZQUNmLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUN6QixJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDOztxSEFsRVUsd0JBQXdCO3lHQUF4Qix3QkFBd0IsZ1BDdkJyQyx3OURBMEVBOzJGRG5EYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsMEJBQTBCO2lKQUtyQixLQUFLO3NCQUFuQixXQUFXO2dCQUtKLFlBQVk7c0JBRG5CLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBIb3N0QmluZGluZyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdlSW5wdXRDb250ZXh0LCBNb2RhbENvbnRleHQsIFN0cmVhbU1lc3NhZ2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2VBY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2UtYWN0aW9ucy5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgZWRpdCBtZXNzYWdlIGZvcm0gZGlzcGxheXMgYSBtb2RhbCB0aGF0J3Mgb3BlbmVkIHdoZW4gYSB1c2VyIGVkaXRzIGEgbWVzc2FnZS4gVGhlIGNvbXBvbmVudCB1c2VzIHRoZSBbYE1lc3NhZ2VBY3Rpb25zU2VydmljZWBdKC4uLy4uL3NlcnZpY2VzL01lc3NhZ2VBY3Rpb25zU2VydmljZSkgdG8ga25vdyB3aGljaCBtZXNzYWdlIGlzIGJlaW5nIGVkaXRlZC5cbiAqXG4gKiBCeSBkZWZhdWx0IHRoaXMgaXMgZGlzcGxheWVkIHdpdGhpbiB0aGUgW2BzdHJlYW0tY2hhbm5lbGAgY29tcG9uZW50XSguLi8uLi9jb21wb25lbnRzL0NoYW5uZWxDb21wb25lbnQpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdHJlYW0tZWRpdC1tZXNzYWdlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdC1tZXNzYWdlLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0TWVzc2FnZUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygpIGNsYXNzID0gJ3N0ci1jaGF0LWFuZ3VsYXJfX2VkaXQtbWVzc2FnZS1mb3JtJztcbiAgc2VuZE1lc3NhZ2UkOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICBpc01vZGFsT3BlbiA9IGZhbHNlO1xuICBtZXNzYWdlPzogU3RyZWFtTWVzc2FnZTtcbiAgQFZpZXdDaGlsZCgnZWRpdE1lc3NhZ2VGb3JtJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBtb2RhbENvbnRlbnQhOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgcHJpdmF0ZSBzZW5kTWVzc2FnZVN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VBY3Rpb25zU2VydmljZTogTWVzc2FnZUFjdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UkID0gdGhpcy5zZW5kTWVzc2FnZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VBY3Rpb25zU2VydmljZS5tZXNzYWdlVG9FZGl0JC5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmICgobWVzc2FnZSAmJiAhdGhpcy5pc01vZGFsT3BlbikgfHwgKCFtZXNzYWdlICYmIHRoaXMuaXNNb2RhbE9wZW4pKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuaXNNb2RhbE9wZW4gPSAhIW1lc3NhZ2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGdldEVkaXRNb2RhbENvbnRleHQoKTogTW9kYWxDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNPcGVuOiB0aGlzLmlzTW9kYWxPcGVuLFxuICAgICAgaXNPcGVuQ2hhbmdlSGFuZGxlcjogKGlzT3BlbikgPT4ge1xuICAgICAgICB0aGlzLmlzTW9kYWxPcGVuID0gaXNPcGVuO1xuICAgICAgICBpZiAoIXRoaXMuaXNNb2RhbE9wZW4pIHtcbiAgICAgICAgICB0aGlzLmRpc21pc3NlZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29udGVudDogdGhpcy5tb2RhbENvbnRlbnQsXG4gICAgfTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VJbnB1dENvbnRleHQoKTogTWVzc2FnZUlucHV0Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VVcGRhdGVIYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzbWlzc2VkKCk7XG4gICAgICB9LFxuICAgICAgaXNGaWxlVXBsb2FkRW5hYmxlZDogdW5kZWZpbmVkLFxuICAgICAgYXJlTWVudGlvbnNFbmFibGVkOiB1bmRlZmluZWQsXG4gICAgICBpc011bHRpcGxlRmlsZVVwbG9hZEVuYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICAgIG1lbnRpb25TY29wZTogdW5kZWZpbmVkLFxuICAgICAgbW9kZTogdW5kZWZpbmVkLFxuICAgICAgc2VuZE1lc3NhZ2UkOiB0aGlzLnNlbmRNZXNzYWdlJCxcbiAgICB9O1xuICB9XG5cbiAgc2VuZENsaWNrZWQoKSB7XG4gICAgdGhpcy5zZW5kTWVzc2FnZVN1YmplY3QubmV4dCgpO1xuICB9XG5cbiAgZGlzbWlzc2VkKCkge1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZXNzYWdlQWN0aW9uc1NlcnZpY2UubWVzc2FnZVRvRWRpdCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyXG4gICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubW9kYWxUZW1wbGF0ZSQgfCBhc3luYykgfHwgZGVmYXVsdE1vZGFsO1xuICAgIGNvbnRleHQ6IGdldEVkaXRNb2RhbENvbnRleHQoKVxuICBcIlxuPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGVcbiAgI2RlZmF1bHRNb2RhbFxuICBsZXQtaXNPcGVuPVwiaXNPcGVuXCJcbiAgbGV0LWlzT3BlbkNoYW5nZUhhbmRsZXI9XCJpc09wZW5DaGFuZ2VIYW5kbGVyXCJcbiAgbGV0LWNvbnRlbnQ9XCJjb250ZW50XCJcbj5cbiAgPHN0cmVhbS1tb2RhbFxuICAgICpuZ0lmPVwiaXNPcGVuXCJcbiAgICBbaXNPcGVuXT1cImlzT3BlblwiXG4gICAgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgKGlzT3BlbkNoYW5nZSk9XCJpc09wZW5DaGFuZ2VIYW5kbGVyKCRldmVudClcIlxuICA+XG4gIDwvc3RyZWFtLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlZGl0TWVzc2FnZUZvcm0+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fZWRpdC1tZXNzYWdlLWZvcm1cIj5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICNkZWZhdWx0SW5wdXRcbiAgICAgIGxldC1tZXNzYWdlSW5wdXQ9XCJtZXNzYWdlXCJcbiAgICAgIGxldC1tZXNzYWdlVXBkYXRlSGFuZGxlcj1cIm1lc3NhZ2VVcGRhdGVIYW5kbGVyXCJcbiAgICAgIGxldC1zZW5kTWVzc2FnZSRJbnB1dD1cInNlbmRNZXNzYWdlJFwiXG4gICAgPlxuICAgICAgPHN0cmVhbS1tZXNzYWdlLWlucHV0XG4gICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VJbnB1dFwiXG4gICAgICAgIFtzZW5kTWVzc2FnZSRdPVwic2VuZE1lc3NhZ2UkSW5wdXRcIlxuICAgICAgICAobWVzc2FnZVVwZGF0ZSk9XCJtZXNzYWdlVXBkYXRlSGFuZGxlcigpXCJcbiAgICAgID48L3N0cmVhbS1tZXNzYWdlLWlucHV0PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgKGN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubWVzc2FnZUlucHV0VGVtcGxhdGUkIHwgYXN5bmMpIHx8IGRlZmF1bHRJbnB1dDtcbiAgICAgICAgY29udGV4dDogZ2V0TWVzc2FnZUlucHV0Q29udGV4dCgpXG4gICAgICBcIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxzdHJlYW0tbm90aWZpY2F0aW9uLWxpc3Q+PC9zdHJlYW0tbm90aWZpY2F0aW9uLWxpc3Q+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJcbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2UtdGVhbS1mb3JtLWZvb3RlclxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS10ZWFtLWZvcm0tZm9vdGVyLWFuZ3VsYXJcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19lZGl0LW1lc3NhZ2UtZm9ybS1vcHRpb25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19lZGl0LW1lc3NhZ2UtY2FuY2VsXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImNhbmNlbC1idXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJkaXNtaXNzZWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICBzdHJlYW1DaGF0LkNhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2VkaXQtbWVzc2FnZS1zZW5kXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInNlbmQtYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VuZENsaWNrZWQoKVwiXG4gICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlbmRDbGlja2VkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgc3RyZWFtQ2hhdC5TZW5kXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==