@banta/sdk 4.3.2 → 4.3.3

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.
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('rxjs/operators'), require('@angular/core'), require('marked'), require('dompurify'), require('@angular/platform-browser'), require('@angular/common'), require('@angular/material/icon'), require('@angular/material/button'), require('@angular/material/form-field'), require('@angular/material/input'), require('@angular/forms'), require('@angular/material/dialog'), require('@banta/common'), require('@angular/router'), require('@angular/material/snack-bar'), require('@angular/material/menu'), require('@angular/material/progress-spinner'), require('@angular/cdk/text-field'), require('@angular/material/tooltip'), require('@angular/material/select')) :
3
- typeof define === 'function' && define.amd ? define('@banta/sdk', ['exports', 'rxjs', 'rxjs/operators', '@angular/core', 'marked', 'dompurify', '@angular/platform-browser', '@angular/common', '@angular/material/icon', '@angular/material/button', '@angular/material/form-field', '@angular/material/input', '@angular/forms', '@angular/material/dialog', '@banta/common', '@angular/router', '@angular/material/snack-bar', '@angular/material/menu', '@angular/material/progress-spinner', '@angular/cdk/text-field', '@angular/material/tooltip', '@angular/material/select'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.banta = global.banta || {}, global.banta.sdk = {}), global.rxjs, global.rxjs.operators, global.ng.core, global.marked, global.DOMPurify, global.ng.platformBrowser, global.ng.common, global.ng.material.icon, global.ng.material.button, global.ng.material.formField, global.ng.material.input, global.ng.forms, global.ng.material.dialog, global.common$1, global.ng.router, global.ng.material.snackBar, global.ng.material.menu, global.ng.material.progressSpinner, global.ng.cdk.textField, global.ng.material.tooltip, global.ng.material.select));
5
- }(this, (function (exports, rxjs, operators, core, marked, DOMPurify, platformBrowser, common, icon, button, formField, input, forms, dialog, common$1, router, snackBar, menu, progressSpinner, textField, tooltip, select) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('rxjs/operators'), require('@angular/core'), require('marked'), require('dompurify'), require('@angular/platform-browser'), require('@angular/common'), require('@angular/material/icon'), require('@angular/cdk/overlay'), require('@angular/material/button'), require('@angular/material/form-field'), require('@angular/material/input'), require('@angular/forms'), require('@angular/cdk/portal'), require('@angular/material/dialog'), require('@banta/common'), require('@angular/router'), require('@angular/material/snack-bar'), require('@angular/material/menu'), require('@angular/material/progress-spinner'), require('@angular/cdk/text-field'), require('@angular/material/tooltip'), require('@angular/material/select')) :
3
+ typeof define === 'function' && define.amd ? define('@banta/sdk', ['exports', 'rxjs', 'rxjs/operators', '@angular/core', 'marked', 'dompurify', '@angular/platform-browser', '@angular/common', '@angular/material/icon', '@angular/cdk/overlay', '@angular/material/button', '@angular/material/form-field', '@angular/material/input', '@angular/forms', '@angular/cdk/portal', '@angular/material/dialog', '@banta/common', '@angular/router', '@angular/material/snack-bar', '@angular/material/menu', '@angular/material/progress-spinner', '@angular/cdk/text-field', '@angular/material/tooltip', '@angular/material/select'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.banta = global.banta || {}, global.banta.sdk = {}), global.rxjs, global.rxjs.operators, global.ng.core, global.marked, global.DOMPurify, global.ng.platformBrowser, global.ng.common, global.ng.material.icon, global.ng.cdk.overlay, global.ng.material.button, global.ng.material.formField, global.ng.material.input, global.ng.forms, global.ng.cdk.portal, global.ng.material.dialog, global.common$1, global.ng.router, global.ng.material.snackBar, global.ng.material.menu, global.ng.material.progressSpinner, global.ng.cdk.textField, global.ng.material.tooltip, global.ng.material.select));
5
+ }(this, (function (exports, rxjs, operators, core, marked, DOMPurify, platformBrowser, common, icon, overlay, button, formField, input, forms, portal, dialog, common$1, router, snackBar, menu, progressSpinner, textField, tooltip, select) { 'use strict';
6
6
 
7
7
  function lazyConnection(options) {
8
8
  var obs = new rxjs.Observable(function (observer) {
@@ -7166,8 +7166,9 @@
7166
7166
 
7167
7167
  /// <reference types="@types/resize-observer-browser" />
7168
7168
  var EmojiSelectorButtonComponent = /** @class */ (function () {
7169
- function EmojiSelectorButtonComponent(elementRef) {
7169
+ function EmojiSelectorButtonComponent(elementRef, overlay) {
7170
7170
  this.elementRef = elementRef;
7171
+ this.overlay = overlay;
7171
7172
  this._selected = new rxjs.Subject();
7172
7173
  this.showEmojiPanel = false;
7173
7174
  }
@@ -7178,115 +7179,76 @@
7178
7179
  enumerable: false,
7179
7180
  configurable: true
7180
7181
  });
7181
- EmojiSelectorButtonComponent.prototype.ngOnDestroy = function () {
7182
- this.removeListener();
7183
- this.panelElement.nativeElement.remove();
7184
- };
7185
- Object.defineProperty(EmojiSelectorButtonComponent.prototype, "widthConstrained", {
7186
- get: function () { return this.width < 700; },
7182
+ Object.defineProperty(EmojiSelectorButtonComponent.prototype, "isOpen", {
7183
+ get: function () {
7184
+ return this.overlayRef;
7185
+ },
7187
7186
  enumerable: false,
7188
7187
  configurable: true
7189
7188
  });
7190
- EmojiSelectorButtonComponent.prototype.ngAfterViewInit = function () {
7191
- };
7192
- EmojiSelectorButtonComponent.prototype.putPanelAtRoot = function () {
7193
- // If we are in full-screen, placing the panel outside of the full-screen element will result in it
7194
- // always being behind said full-screen element, so we need to ensure we never place it further up the
7195
- // stack.
7196
- var root = document.fullscreenElement || document.body.querySelector('[ng-version]') || document.body;
7197
- root.appendChild(this.panelElement.nativeElement);
7198
- };
7199
- EmojiSelectorButtonComponent.prototype.removeListener = function () {
7200
- document.removeEventListener('click', this.clickListener);
7201
- window.removeEventListener('resize', this.resizeListener);
7202
- };
7203
- EmojiSelectorButtonComponent.prototype.place = function () {
7204
- // Not currently used as it can't be easily done handling all
7205
- // scrolling corner cases.
7206
- this.putPanelAtRoot();
7207
- var pos = this.buttonElement.nativeElement.getBoundingClientRect();
7208
- var size = this.panelElement.nativeElement.getBoundingClientRect();
7209
- var left = window.scrollX + pos.left + pos.width - size.width;
7210
- if (left < 0)
7211
- left = (window.scrollX + window.innerWidth) / 2 - size.width / 2;
7212
- var scrollY = window.scrollY;
7213
- if (document.fullscreenElement) {
7189
+ /**
7190
+ * Insert the given emoji.
7191
+ * @param str
7192
+ */
7193
+ EmojiSelectorButtonComponent.prototype.insert = function (str) {
7194
+ this._selected.next(str);
7195
+ };
7196
+ EmojiSelectorButtonComponent.prototype.close = function () {
7197
+ if (this.overlayRef) {
7198
+ this.overlayRef.dispose();
7199
+ this.overlayRef = null;
7200
+ return;
7214
7201
  }
7215
- Object.assign(this.panelElement.nativeElement.style, {
7216
- top: window.scrollY + pos.top + pos.height + "px",
7217
- left: Math.max(0, left) + "px"
7218
- });
7219
7202
  };
7220
7203
  EmojiSelectorButtonComponent.prototype.show = function () {
7221
7204
  var _this = this;
7222
- if (this.showEmojiPanel) {
7223
- this.showEmojiPanel = false;
7224
- return;
7205
+ if (this.isOpen) {
7206
+ this.close();
7225
7207
  }
7226
- this.showEmojiPanel = true;
7227
- //this.place();
7228
- setTimeout(function () {
7229
- var onResize = function () {
7230
- if (!_this.showEmojiPanel)
7231
- return;
7232
- _this.width = window.innerWidth;
7233
- _this.height = window.innerHeight;
7234
- var edgeOffset = 0;
7235
- var commentField = _this.elementRef.nativeElement.closest("banta-comment-field");
7236
- if (commentField) {
7237
- var size = commentField.getBoundingClientRect();
7238
- _this.width = size.width;
7239
- edgeOffset = window.innerWidth - size.right;
7240
- }
7241
- var buttonRect = _this.buttonElement.nativeElement.getBoundingClientRect();
7242
- var buttonRight = window.innerWidth - buttonRect.right - edgeOffset - 10;
7243
- if (_this.width < 700) {
7244
- _this.panelElement.nativeElement.style.right = -buttonRight + "px";
7245
- }
7246
- else {
7247
- _this.panelElement.nativeElement.style.right = '';
7248
- }
7249
- _this.panelElement.nativeElement.style.maxWidth = _this.width - 15 + "px";
7250
- };
7251
- _this.resizeListener = onResize;
7252
- onResize();
7253
- _this.clickListener = function (ev) {
7254
- var parent = ev.target;
7255
- var isInDialog = false;
7256
- while (parent) {
7257
- if (parent.matches('emoji-selector-panel'))
7258
- isInDialog = true;
7259
- parent = parent.parentElement;
7208
+ this.overlayRef = this.overlay.create({
7209
+ positionStrategy: this.overlay.position()
7210
+ .flexibleConnectedTo(this.elementRef)
7211
+ .withPositions([
7212
+ {
7213
+ originX: 'end',
7214
+ originY: 'bottom',
7215
+ overlayX: 'end',
7216
+ overlayY: 'top'
7260
7217
  }
7261
- if (isInDialog)
7262
- return;
7263
- _this.showEmojiPanel = false;
7264
- _this.removeListener();
7265
- };
7266
- document.addEventListener('click', _this.clickListener);
7267
- window.addEventListener('resize', _this.resizeListener);
7218
+ ])
7219
+ .withFlexibleDimensions(true),
7220
+ hasBackdrop: true,
7221
+ disposeOnNavigation: true,
7222
+ scrollStrategy: this.overlay.scrollStrategies.reposition({
7223
+ autoClose: true
7224
+ })
7268
7225
  });
7269
- };
7270
- EmojiSelectorButtonComponent.prototype.insert = function (str) {
7271
- this._selected.next(str);
7226
+ this.overlayRef.backdropClick().subscribe(function () {
7227
+ _this.close();
7228
+ });
7229
+ this.overlayRef.keydownEvents().subscribe(function (event) {
7230
+ if (event.key === 'Escape') {
7231
+ _this.close();
7232
+ }
7233
+ });
7234
+ this.overlayRef.attach(this.selectorPanelTemplate);
7272
7235
  };
7273
7236
  return EmojiSelectorButtonComponent;
7274
7237
  }());
7275
7238
  EmojiSelectorButtonComponent.decorators = [
7276
7239
  { type: core.Component, args: [{
7277
7240
  selector: 'emoji-selector-button',
7278
- template: "\n <button #button type=\"button\" mat-icon-button (click)=\"show()\">\n <mat-icon>emoji_emotions</mat-icon>\n </button>\n <emoji-selector-panel \n #panel\n (selected)=\"insert($event)\"\n [class.visible]=\"showEmojiPanel\"\n ></emoji-selector-panel>\n ",
7279
- styles: ["\n :host {\n display: block;\n position: relative;\n }\n\n emoji-selector-panel {\n position: absolute;\n top: 2.5em;\n right: 0;\n opacity: 0;\n pointer-events: none;\n z-index: 10;\n }\n\n emoji-selector-panel.visible {\n pointer-events: initial;\n opacity: 1;\n }\n\n button {\n color: #666\n }\n "]
7241
+ template: "\n <button #button type=\"button\" mat-icon-button (click)=\"show()\">\n <mat-icon>emoji_emotions</mat-icon>\n </button>\n <ng-template cdkPortal #selectorPanelTemplate=\"cdkPortal\">\n <emoji-selector-panel \n #panel\n (selected)=\"insert($event)\"\n ></emoji-selector-panel>\n </ng-template>\n ",
7242
+ styles: ["\n :host {\n display: block;\n position: relative;\n }\n\n button {\n color: #666\n }\n "]
7280
7243
  },] }
7281
7244
  ];
7282
7245
  EmojiSelectorButtonComponent.ctorParameters = function () { return [
7283
- { type: core.ElementRef }
7246
+ { type: core.ElementRef },
7247
+ { type: overlay.Overlay }
7284
7248
  ]; };
7285
7249
  EmojiSelectorButtonComponent.propDecorators = {
7286
- selected: [{ type: core.Output }],
7287
- panelElement: [{ type: core.ViewChild, args: ['panel', { read: core.ElementRef },] }],
7288
- buttonElement: [{ type: core.ViewChild, args: ['button', { read: core.ElementRef },] }],
7289
- widthConstrained: [{ type: core.HostBinding, args: ['class.width-constrained',] }]
7250
+ selectorPanelTemplate: [{ type: core.ViewChild, args: ['selectorPanelTemplate',] }],
7251
+ selected: [{ type: core.Output }]
7290
7252
  };
7291
7253
 
7292
7254
  var COMPONENTS$1 = [
@@ -7307,7 +7269,9 @@
7307
7269
  icon.MatIconModule,
7308
7270
  button.MatButtonModule,
7309
7271
  formField.MatFormFieldModule,
7310
- input.MatInputModule
7272
+ input.MatInputModule,
7273
+ overlay.OverlayModule,
7274
+ portal.PortalModule
7311
7275
  ],
7312
7276
  exports: COMPONENTS$1
7313
7277
  },] }
@@ -8397,13 +8361,21 @@
8397
8361
  }
8398
8362
  return "url(" + url + ")";
8399
8363
  };
8364
+ Object.defineProperty(CommentComponent.prototype, "replyCount", {
8365
+ get: function () {
8366
+ var _a;
8367
+ return ((_a = this.message.submessages) === null || _a === void 0 ? void 0 : _a.length) || this.message.submessageCount || 0;
8368
+ },
8369
+ enumerable: false,
8370
+ configurable: true
8371
+ });
8400
8372
  return CommentComponent;
8401
8373
  }());
8402
8374
  CommentComponent.decorators = [
8403
8375
  { type: core.Component, args: [{
8404
8376
  selector: 'banta-comment',
8405
- template: "\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n <button *ngIf=\"!mine\" mat-menu-item (click)=\"report()\">Report</button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canEdit\" mat-menu-item (click)=\"startEdit()\">Edit</button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete\" mat-menu-item (click)=\"delete()\">Delete</button>\r\n</mat-menu>\r\n\r\n<div class=\"message-content\">\r\n <div class=\"user\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <a href=\"javascript:;\" class=\"display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"username\" (click)=\"selectUsername(message.user)\">@{{message.user.username}}</a>\r\n <span class=\"user-tag\" *ngIf=\"message.user.tag\">{{message.user.tag}}</span>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n <div class=\"content\" *ngIf=\"!editing\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | markdownToHtml\"></span>\r\n\r\n <ng-container *ngIf=\"message.attachments?.length > 0\">\r\n <banta-lightbox #lightbox></banta-lightbox>\r\n <div class=\"attachments-row\" [class.single]=\"message.attachments?.length === 1\" *ngIf=\"message.attachments && message.attachments?.length > 0\">\r\n <a \r\n href=\"javascript:;\" \r\n (click)=\"showLightbox(attachment)\"\r\n *ngFor=\"let attachment of message.attachments\" \r\n >\r\n <img [src]=\"attachment.url\" alt=\"\">\r\n </a>\r\n </div>\r\n </ng-container>\r\n\r\n <ul class=\"message-facts small\">\r\n <li *ngIf=\"message.edits?.length > 0\">(Edited)</li>\r\n </ul>\r\n </div>\r\n <div class=\"content\" *ngIf=\"editing\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> &nbsp;\r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class=\"actions\">\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <ul class=\"message-facts\">\r\n <li *ngIf=\"message.edits?.length > 0\">Edited</li>\r\n </ul>\r\n <div class=\"spacer\"></div>\r\n <div class=\"counted-action\" *ngIf=\"showReplyAction\">\r\n <div class=\"count-indicator\">\r\n {{message.submessages?.length || message.submessageCount || 0}}\r\n </div>\r\n <button mat-icon-button matTooltip=\"Replies\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon [inline]=\"true\">comment</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"counted-action\" [class.active]=\"message.userState?.liked\">\r\n <div class=\"count-indicator\">\r\n {{message.likes}}\r\n </div>\r\n <button \r\n *ngIf=\"message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"true\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf=\"!message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"!permissions?.canLike\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon [inline]=\"true\">thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"counted-action\">\r\n <button mat-icon-button matTooltip=\"Share this comment\" matTooltipPosition=\"below\" (click)=\"share()\">\r\n <mat-icon [inline]=\"true\" >share</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon [inline]=\"true\">more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n",
8406
- styles: ["@-webkit-keyframes comment-appear{0%{transform:translate(100vw)}to{transform:translate(0)}}@keyframes comment-appear{0%{transform:translate(100vw)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;-webkit-animation-name:comment-appear;animation-name:comment-appear;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .message-content .content{margin-left:60px;margin-right:.5em}:host .message-content .attachments-row{margin-top:15px;display:flex;gap:10px}:host .message-content .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}:host.abbreviated .message-content .content{text-overflow:ellipsis;overflow-y:hidden}:host .actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .actions button{color:#666;flex-shrink:0}:host .actions banta-timestamp{color:#666;font-size:10pt;flex-shrink:0}.user{position:relative;margin:1em 0 0;display:flex;align-items:center}.user .display-name,.user .username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0}.user .display-name.username.username.username,.user .username.username.username.username{color:#666}.avatar{height:48px;width:48px;background-position:50%;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.counted-action{display:flex;align-items:center}.counted-action.active .count-indicator,.counted-action.active button{color:#00a5ff}.count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}.user-tag,:host-context(.mat-dark-theme) .user .display-name,:host-context(.mat-dark-theme) .user .username{color:#fff}.user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em}ul.message-facts.small{display:none}ul.message-facts.small li{margin-top:.5em}ul.message-facts.small li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width:400px){.avatar{height:32px;width:32px}.actions ul.message-facts{display:none}ul.message-facts.small{display:initial}:host .actions{margin-left:0;margin-top:.5em}:host .message-content .content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .avatar{height:32px;width:32px}:host-context(.banta-mobile) .actions ul.message-facts{display:none}:host-context(.banta-mobile) ul.message-facts.small{display:initial}:host-context(.banta-mobile) :host .actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .message-content .content{margin-left:44px;margin-right:.5em}"]
8377
+ template: "\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf=\"!mine\" mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canEdit\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n</mat-menu>\r\n\r\n<div class=\"message-content\">\r\n <div class=\"user\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <a href=\"javascript:;\" class=\"display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"username\" (click)=\"selectUsername(message.user)\">@{{message.user.username}}</a>\r\n <span class=\"user-tag\" *ngIf=\"message.user.tag\">{{message.user.tag}}</span>\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n <div class=\"content\" *ngIf=\"!editing\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | markdownToHtml\"></span>\r\n\r\n <ng-container *ngIf=\"message.attachments?.length > 0\">\r\n <banta-lightbox #lightbox></banta-lightbox>\r\n <div class=\"attachments-row\" [class.single]=\"message.attachments?.length === 1\" *ngIf=\"message.attachments && message.attachments?.length > 0\">\r\n <a \r\n href=\"javascript:;\" \r\n (click)=\"showLightbox(attachment)\"\r\n *ngFor=\"let attachment of message.attachments\" \r\n >\r\n <img [src]=\"attachment.url\" alt=\"\">\r\n </a>\r\n </div>\r\n </ng-container>\r\n\r\n <ul class=\"message-facts\">\r\n <li *ngIf=\"message.edits?.length > 0\">(Edited)</li>\r\n </ul>\r\n </div>\r\n <div class=\"content\" *ngIf=\"editing\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> &nbsp;\r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class=\"actions\">\r\n <div class=\"spacer\"></div>\r\n <div class=\"counted-action\" *ngIf=\"showReplyAction\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon [inline]=\"true\">comment</mat-icon>\r\n <span class=\"count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"counted-action\" [class.active]=\"message.userState?.liked\">\r\n <button \r\n *ngIf=\"message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"true\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf=\"!message.transientState?.liking\"\r\n mat-button \r\n [disabled]=\"!permissions?.canLike\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon [inline]=\"true\">thumb_up</mat-icon>\r\n <span class=\"count-indicator\" *ngIf=\"message.likes > 0\">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon [inline]=\"true\">more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n",
8378
+ styles: ["@-webkit-keyframes comment-appear{0%{transform:translate(100vw)}to{transform:translate(0)}}@keyframes comment-appear{0%{transform:translate(100vw)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;-webkit-animation-name:comment-appear;animation-name:comment-appear;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .message-content .content{margin-left:60px;margin-right:.5em}:host .message-content .attachments-row{margin-top:15px;display:flex;gap:10px}:host .message-content .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}:host.abbreviated .message-content .content{text-overflow:ellipsis;overflow-y:hidden}:host .actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .actions button,banta-timestamp{color:#666;flex-shrink:0}banta-timestamp{font-size:10pt;margin-left:1em}.user{position:relative;margin:1em 0 0;display:flex;align-items:center}.user .display-name,.user .username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0}.user .display-name.username.username.username,.user .username.username.username.username{color:#666}.avatar{height:48px;width:48px;background-position:50%;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.counted-action{display:flex;align-items:center}.counted-action.active .count-indicator,.counted-action.active button{color:#00a5ff}.counted-action button .count-indicator{margin-left:.5em}.count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}.user-tag,:host-context(.mat-dark-theme) .user .display-name,:host-context(.mat-dark-theme) .user .username{color:#fff}.user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em;margin-top:.5em}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width:400px){.avatar{height:32px;width:32px}:host .actions{margin-left:0;margin-top:.5em}:host .message-content .content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .message-content .content{margin-left:44px;margin-right:.5em}"]
8407
8379
  },] }
8408
8380
  ];
8409
8381
  CommentComponent.propDecorators = {
@@ -10119,7 +10091,9 @@
10119
10091
  BantaCommonModule,
10120
10092
  EmojiModule,
10121
10093
  tooltip.MatTooltipModule,
10122
- select.MatSelectModule
10094
+ select.MatSelectModule,
10095
+ overlay.OverlayModule,
10096
+ portal.PortalModule
10123
10097
  ],
10124
10098
  exports: COMPONENTS$3
10125
10099
  },] }
@@ -10533,7 +10507,9 @@
10533
10507
  formField.MatFormFieldModule,
10534
10508
  input.MatInputModule,
10535
10509
  progressSpinner.MatProgressSpinnerModule,
10536
- snackBar.MatSnackBarModule
10510
+ snackBar.MatSnackBarModule,
10511
+ overlay.OverlayModule,
10512
+ portal.PortalModule
10537
10513
  ],
10538
10514
  declarations: [
10539
10515
  BantaComponent,