@propbinder/mobile-design 0.1.19 → 0.1.20

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.
@@ -6712,6 +6712,9 @@ class DsMobilePostDetailModalComponent {
6712
6712
  bottomSheet;
6713
6713
  // Post data passed from service
6714
6714
  postData;
6715
+ // Current user info for comment composer
6716
+ currentUserName = '';
6717
+ currentUserInitialsInput = '';
6715
6718
  // Callback for submitting a new comment
6716
6719
  onSubmitComment;
6717
6720
  /**
@@ -6733,7 +6736,7 @@ class DsMobilePostDetailModalComponent {
6733
6736
  authorRole: '',
6734
6737
  timestamp: '',
6735
6738
  content: '',
6736
- comments: []
6739
+ comments: [],
6737
6740
  }, ...(ngDevMode ? [{ debugName: "post" }] : []));
6738
6741
  // Comment composer state
6739
6742
  commentText = signal('', ...(ngDevMode ? [{ debugName: "commentText" }] : []));
@@ -6750,18 +6753,22 @@ class DsMobilePostDetailModalComponent {
6750
6753
  // Add post author
6751
6754
  users.push({
6752
6755
  name: post.authorName,
6753
- initials: post.avatarInitials || post.authorName.split(' ').map(n => n[0]).join(''),
6754
- role: post.authorRole
6756
+ initials: post.avatarInitials ||
6757
+ post.authorName
6758
+ .split(' ')
6759
+ .map((n) => n[0])
6760
+ .join(''),
6761
+ role: post.authorRole,
6755
6762
  });
6756
6763
  // Add unique commenters
6757
6764
  const commenterNames = new Set();
6758
- post.comments?.forEach(comment => {
6765
+ post.comments?.forEach((comment) => {
6759
6766
  if (!commenterNames.has(comment.authorName)) {
6760
6767
  commenterNames.add(comment.authorName);
6761
6768
  users.push({
6762
6769
  name: comment.authorName,
6763
6770
  initials: comment.avatarInitials,
6764
- role: comment.authorRole
6771
+ role: comment.authorRole,
6765
6772
  });
6766
6773
  }
6767
6774
  });
@@ -6772,7 +6779,7 @@ class DsMobilePostDetailModalComponent {
6772
6779
  const query = this.mentionQuery().toLowerCase();
6773
6780
  if (!query)
6774
6781
  return this.availableUsers();
6775
- return this.availableUsers().filter(user => user.name.toLowerCase().includes(query));
6782
+ return this.availableUsers().filter((user) => user.name.toLowerCase().includes(query));
6776
6783
  }, ...(ngDevMode ? [{ debugName: "filteredUsers" }] : []));
6777
6784
  constructor(modalController, lightbox, bottomSheet) {
6778
6785
  this.modalController = modalController;
@@ -6784,6 +6791,21 @@ class DsMobilePostDetailModalComponent {
6784
6791
  if (this.postData) {
6785
6792
  this.post.set(this.postData);
6786
6793
  }
6794
+ // Set current user initials
6795
+ if (this.currentUserInitialsInput) {
6796
+ this.currentUserInitials.set(this.currentUserInitialsInput);
6797
+ }
6798
+ else if (this.currentUserName) {
6799
+ // fallback: derive from name
6800
+ const initials = this.currentUserName
6801
+ .trim()
6802
+ .split(/\s+/)
6803
+ .map(p => p[0])
6804
+ .join('')
6805
+ .substring(0, 2)
6806
+ .toUpperCase();
6807
+ this.currentUserInitials.set(initials);
6808
+ }
6787
6809
  // Set up keyboard listeners to update CSS variable for composer positioning
6788
6810
  this.setupKeyboardListeners();
6789
6811
  }
@@ -6809,22 +6831,22 @@ class DsMobilePostDetailModalComponent {
6809
6831
  setupKeyboardListeners() {
6810
6832
  Keyboard.addListener('keyboardWillShow', (info) => {
6811
6833
  document.documentElement.style.setProperty('--keyboard-height', `${info.keyboardHeight}px`);
6812
- }).catch(e => console.log('Keyboard listeners not available:', e));
6834
+ }).catch((e) => console.log('Keyboard listeners not available:', e));
6813
6835
  Keyboard.addListener('keyboardWillHide', () => {
6814
6836
  document.documentElement.style.setProperty('--keyboard-height', '0px');
6815
- }).catch(e => console.log('Keyboard listeners not available:', e));
6837
+ }).catch((e) => console.log('Keyboard listeners not available:', e));
6816
6838
  }
6817
6839
  /**
6818
6840
  * Clean up keyboard event listeners
6819
6841
  */
6820
6842
  cleanupKeyboardListeners() {
6821
- Keyboard.removeAllListeners().catch(e => console.log('Keyboard cleanup not available:', e));
6843
+ Keyboard.removeAllListeners().catch((e) => console.log('Keyboard cleanup not available:', e));
6822
6844
  }
6823
6845
  /**
6824
6846
  * Show the keyboard when user interacts with input
6825
6847
  */
6826
6848
  showKeyboard() {
6827
- Keyboard.show().catch(e => console.log('Keyboard.show() not available'));
6849
+ Keyboard.show().catch((e) => console.log('Keyboard.show() not available'));
6828
6850
  }
6829
6851
  /**
6830
6852
  * Focus the comment input when comment icon is tapped
@@ -6956,43 +6978,42 @@ class DsMobilePostDetailModalComponent {
6956
6978
  console.log('[PostDetailModal] Updating comment:', text);
6957
6979
  const editing = this.editingComment();
6958
6980
  // Update the existing comment
6959
- const updatedComments = currentPost.comments?.map(comment => {
6960
- if (comment.authorName === editing.authorName &&
6961
- comment.content === editing.originalContent &&
6962
- comment.timestamp === editing.timestamp) {
6981
+ const updatedComments = currentPost.comments?.map((comment) => {
6982
+ if (comment.authorName === editing.authorName && comment.content === editing.originalContent && comment.timestamp === editing.timestamp) {
6963
6983
  return {
6964
6984
  ...comment,
6965
6985
  content: text,
6966
- timestamp: 'Just now (edited)'
6986
+ timestamp: 'Just now (edited)',
6967
6987
  };
6968
6988
  }
6969
6989
  return comment;
6970
6990
  });
6971
6991
  this.post.set({
6972
6992
  ...currentPost,
6973
- comments: updatedComments
6993
+ comments: updatedComments,
6974
6994
  });
6975
6995
  // Clear edit state
6976
6996
  this.editingComment.set(null);
6977
6997
  }
6978
6998
  else {
6979
6999
  console.log('[PostDetailModal] Submitting comment:', finalText);
7000
+ console.log('[PostDetailModal] onSubmitComment =', this.onSubmitComment);
6980
7001
  const newComment = {
6981
- authorName: 'Lars Mikkelsen',
6982
- authorRole: 'You',
7002
+ authorName: this.currentUserName || 'Dig',
7003
+ authorRole: 'Dig',
6983
7004
  timestamp: 'Just now',
6984
7005
  avatarInitials: this.currentUserInitials(),
6985
7006
  content: finalText,
6986
7007
  isLiked: false,
6987
7008
  likeCount: 0,
6988
- isOwnComment: true
7009
+ isOwnComment: true,
6989
7010
  };
6990
7011
  // Add comment to the list
6991
7012
  const updatedComments = [...(currentPost.comments || []), newComment];
6992
7013
  this.post.set({
6993
7014
  ...currentPost,
6994
7015
  comments: updatedComments,
6995
- commentCount: updatedComments.length
7016
+ commentCount: updatedComments.length,
6996
7017
  });
6997
7018
  // Clear reply state
6998
7019
  this.replyingTo.set(null);
@@ -7027,7 +7048,7 @@ class DsMobilePostDetailModalComponent {
7027
7048
  avatarInitials: postData.avatarInitials || '',
7028
7049
  avatarType: postData.avatarType || 'initials',
7029
7050
  avatarSrc: postData.avatarSrc || '',
7030
- timestamp: postData.timestamp
7051
+ timestamp: postData.timestamp,
7031
7052
  };
7032
7053
  this.lightbox.open({
7033
7054
  images: [
@@ -7039,13 +7060,13 @@ class DsMobilePostDetailModalComponent {
7039
7060
  description: postData.content,
7040
7061
  isLiked: postData.isLiked || false,
7041
7062
  likeCount: postData.likeCount || 0,
7042
- commentCount: postData.commentCount || 0
7043
- }
7063
+ commentCount: postData.commentCount || 0,
7064
+ },
7044
7065
  ],
7045
7066
  author: authorMeta,
7046
7067
  enableZoom: true,
7047
7068
  showControls: false,
7048
- showInfo: true
7069
+ showInfo: true,
7049
7070
  });
7050
7071
  }
7051
7072
  /**
@@ -7055,13 +7076,13 @@ class DsMobilePostDetailModalComponent {
7055
7076
  const sheet = await this.bottomSheet.create({
7056
7077
  component: DsMobileActionsBottomSheetComponent,
7057
7078
  componentProps: {
7058
- isOwnContent: isOwnComment
7079
+ isOwnContent: isOwnComment,
7059
7080
  },
7060
7081
  breakpoints: [0, 1],
7061
7082
  initialBreakpoint: 1,
7062
7083
  handle: true,
7063
7084
  backdropDismiss: true,
7064
- cssClass: 'auto-height'
7085
+ cssClass: 'auto-height',
7065
7086
  });
7066
7087
  const result = await sheet.onWillDismiss();
7067
7088
  if (result.role === 'select' && result.data) {
@@ -7071,13 +7092,13 @@ class DsMobilePostDetailModalComponent {
7071
7092
  case 'like':
7072
7093
  console.log('Like comment by', authorName);
7073
7094
  // Find and toggle like on the comment
7074
- const updatedComments = currentPost.comments?.map(comment => {
7095
+ const updatedComments = currentPost.comments?.map((comment) => {
7075
7096
  if (comment.authorName === authorName && comment.content === content) {
7076
7097
  const isLiked = !comment.isLiked;
7077
7098
  return {
7078
7099
  ...comment,
7079
7100
  isLiked,
7080
- likeCount: isLiked ? (comment.likeCount || 0) + 1 : Math.max(0, (comment.likeCount || 0) - 1)
7101
+ likeCount: isLiked ? (comment.likeCount || 0) + 1 : Math.max(0, (comment.likeCount || 0) - 1),
7081
7102
  };
7082
7103
  }
7083
7104
  return comment;
@@ -7091,7 +7112,7 @@ class DsMobilePostDetailModalComponent {
7091
7112
  case 'edit':
7092
7113
  console.log('Edit comment by', authorName);
7093
7114
  // Find the full comment data to get timestamp
7094
- const commentToEdit = currentPost.comments?.find(comment => comment.authorName === authorName && comment.content === content);
7115
+ const commentToEdit = currentPost.comments?.find((comment) => comment.authorName === authorName && comment.content === content);
7095
7116
  if (commentToEdit) {
7096
7117
  this.handleEditComment(authorName, content, commentToEdit.timestamp);
7097
7118
  }
@@ -7100,11 +7121,11 @@ class DsMobilePostDetailModalComponent {
7100
7121
  console.log('Delete comment by', authorName);
7101
7122
  // Show confirmation before deleting
7102
7123
  if (confirm('Are you sure you want to delete this comment?')) {
7103
- const updatedCommentsAfterDelete = currentPost.comments?.filter(comment => !(comment.authorName === authorName && comment.content === content));
7124
+ const updatedCommentsAfterDelete = currentPost.comments?.filter((comment) => !(comment.authorName === authorName && comment.content === content));
7104
7125
  this.post.set({
7105
7126
  ...currentPost,
7106
7127
  comments: updatedCommentsAfterDelete,
7107
- commentCount: updatedCommentsAfterDelete?.length || 0
7128
+ commentCount: updatedCommentsAfterDelete?.length || 0,
7108
7129
  });
7109
7130
  }
7110
7131
  break;
@@ -7112,7 +7133,7 @@ class DsMobilePostDetailModalComponent {
7112
7133
  }
7113
7134
  }
7114
7135
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DsMobilePostDetailModalComponent, deps: [{ token: i1.ModalController }, { token: DsMobileLightboxService }, { token: DsMobileBottomSheetService }], target: i0.ɵɵFactoryTarget.Component });
7115
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: DsMobilePostDetailModalComponent, isStandalone: true, selector: "ds-mobile-post-detail-modal", inputs: { postData: "postData", onSubmitComment: "onSubmitComment", loading: "loading", error: "error" }, viewQueries: [{ propertyName: "commentInput", first: true, predicate: ["commentInput"], descendants: true }], ngImport: i0, template: `
7136
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: DsMobilePostDetailModalComponent, isStandalone: true, selector: "ds-mobile-post-detail-modal", inputs: { postData: "postData", currentUserName: "currentUserName", currentUserInitialsInput: "currentUserInitialsInput", onSubmitComment: "onSubmitComment", loading: "loading", error: "error" }, viewQueries: [{ propertyName: "commentInput", first: true, predicate: ["commentInput"], descendants: true }], ngImport: i0, template: `
7116
7137
  <ion-content [fullscreen]="true" [scrollY]="true" class="post-modal-content">
7117
7138
  <div class="post-modal-wrapper">
7118
7139
  <!-- Header with post author info -->
@@ -7120,12 +7141,7 @@ class DsMobilePostDetailModalComponent {
7120
7141
  <div class="header-content">
7121
7142
  <!-- Post author info -->
7122
7143
  <div class="post-author-info">
7123
- <ds-avatar
7124
- [initials]="post().avatarInitials || ''"
7125
- [type]="post().avatarType || 'initials'"
7126
- [src]="post().avatarSrc || ''"
7127
- size="md"
7128
- />
7144
+ <ds-avatar [initials]="post().avatarInitials || ''" [type]="post().avatarType || 'initials'" [src]="post().avatarSrc || ''" size="md" />
7129
7145
  <div class="author-details">
7130
7146
  <div class="author-name">{{ post().authorName }}</div>
7131
7147
  <div class="author-meta">
@@ -7135,34 +7151,27 @@ class DsMobilePostDetailModalComponent {
7135
7151
  </div>
7136
7152
  </div>
7137
7153
  </div>
7138
-
7154
+
7139
7155
  <!-- Close button -->
7140
- <ds-icon-button
7141
- icon="remixCloseLine"
7142
- variant="secondary"
7143
- size="lg"
7144
- (click)="close()"
7145
- class="close-button"
7146
- aria-label="Luk opslag">
7147
- </ds-icon-button>
7156
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (click)="close()" class="close-button" aria-label="Luk opslag"> </ds-icon-button>
7148
7157
  </div>
7149
7158
  </div>
7150
7159
 
7151
7160
  <!-- Post content -->
7152
7161
  <div class="post-detail-container">
7153
7162
  @if (loading) {
7154
- <!-- Loading State -->
7155
- <div class="post-loading-state">
7156
- <div class="loading-spinner"></div>
7157
- <p class="loading-text">Loading post...</p>
7158
- </div>
7163
+ <!-- Loading State -->
7164
+ <div class="post-loading-state">
7165
+ <div class="loading-spinner"></div>
7166
+ <p class="loading-text">Loading post...</p>
7167
+ </div>
7159
7168
  } @else if (error) {
7160
- <!-- Error State -->
7161
- <div class="post-error-state">
7162
- <ds-icon name="remixErrorWarningLine" size="48px" [style.color]="'var(--color-destructive-base)'" />
7163
- <h3 class="error-state-title">Error loading post</h3>
7164
- <p class="error-state-description">{{ error }}</p>
7165
- </div>
7169
+ <!-- Error State -->
7170
+ <div class="post-error-state">
7171
+ <ds-icon name="remixErrorWarningLine" size="48px" [style.color]="'var(--color-destructive-base)'" />
7172
+ <h3 class="error-state-title">Error loading post</h3>
7173
+ <p class="error-state-description">{{ error }}</p>
7174
+ </div>
7166
7175
  } @else {
7167
7176
  <!-- Post Section -->
7168
7177
  <div class="post-section">
@@ -7171,154 +7180,124 @@ class DsMobilePostDetailModalComponent {
7171
7180
  <div [innerHTML]="post().content"></div>
7172
7181
  </post-text>
7173
7182
  @if (post().imageSrc) {
7174
- <post-media>
7175
- <img
7176
- [src]="post().imageSrc"
7177
- [alt]="post().imageAlt || 'Post image'"
7178
- class="clickable-image"
7179
- (click)="openImageLightbox()"
7180
- />
7181
- </post-media>
7183
+ <post-media>
7184
+ <img [src]="post().imageSrc" [alt]="post().imageAlt || 'Post image'" class="clickable-image" (click)="openImageLightbox()" />
7185
+ </post-media>
7182
7186
  }
7183
7187
  </div>
7184
-
7188
+
7185
7189
  <!-- Post actions -->
7186
7190
  <div class="post-actions">
7187
- <action-like
7188
- [active]="post().isLiked || false"
7189
- [count]="post().likeCount || 0" />
7190
- <action-comment
7191
- [count]="post().commentCount || 0"
7192
- (commentClick)="focusCommentInput()" />
7191
+ <action-like [active]="post().isLiked || false" [count]="post().likeCount || 0" />
7192
+ <action-comment [count]="post().commentCount || 0" (commentClick)="focusCommentInput()" />
7193
7193
  </div>
7194
7194
  </div>
7195
-
7196
- <!-- Comments Section -->
7197
- <div class="comments-section">
7198
- @if (post().comments && post().comments!.length > 0) {
7195
+
7196
+ <!-- Comments Section -->
7197
+ <div class="comments-section">
7198
+ @if (post().comments && post().comments!.length > 0) {
7199
7199
  <h2 class="comments-header">{{ post().comments!.length }} {{ post().comments!.length === 1 ? 'reply' : 'replies' }}</h2>
7200
-
7200
+
7201
7201
  <div class="comments-list">
7202
7202
  @for (comment of post().comments!; track comment.authorName + comment.timestamp) {
7203
- <ds-mobile-comment
7204
- [authorName]="comment.authorName"
7205
- [authorRole]="comment.authorRole"
7206
- [timestamp]="comment.timestamp"
7207
- [avatarInitials]="comment.avatarInitials"
7208
- [content]="comment.content"
7209
- [isLiked]="comment.isLiked || false"
7210
- [likeCount]="comment.likeCount || 0"
7211
- [clickable]="true"
7212
- [isOwnComment]="comment.isOwnComment || false"
7213
- (replyClick)="handleReply(comment.authorName, comment.content)"
7214
- (editClick)="handleEditComment(comment.authorName, comment.content, comment.timestamp)"
7215
- (longPress)="handleCommentLongPress(comment.authorName, comment.content, comment.isOwnComment || false)" />
7203
+ <ds-mobile-comment
7204
+ [authorName]="comment.authorName"
7205
+ [authorRole]="comment.authorRole"
7206
+ [timestamp]="comment.timestamp"
7207
+ [avatarInitials]="comment.avatarInitials"
7208
+ [content]="comment.content"
7209
+ [isLiked]="comment.isLiked || false"
7210
+ [likeCount]="comment.likeCount || 0"
7211
+ [clickable]="true"
7212
+ [isOwnComment]="comment.isOwnComment || false"
7213
+ (replyClick)="handleReply(comment.authorName, comment.content)"
7214
+ (editClick)="handleEditComment(comment.authorName, comment.content, comment.timestamp)"
7215
+ (longPress)="handleCommentLongPress(comment.authorName, comment.content, comment.isOwnComment || false)" />
7216
7216
  }
7217
7217
  </div>
7218
- } @else {
7218
+ } @else {
7219
7219
  <!-- Empty State -->
7220
7220
  <div class="comments-empty-state">
7221
- <img
7222
- src="/Assets/Empty%20state-chat.png"
7223
- alt="Ingen kommentarer endnu"
7224
- class="empty-state-image"
7225
- />
7221
+ <img src="/Assets/Empty%20state-chat.png" alt="Ingen kommentarer endnu" class="empty-state-image" />
7226
7222
  <h3 class="empty-state-title">Ingen svar endnu</h3>
7227
7223
  <p class="empty-state-description">Vær den første til at svare på dette opslag</p>
7228
7224
  </div>
7225
+ }
7226
+
7227
+ <!-- Bottom spacer for fixed composer -->
7228
+ <div class="composer-spacer"></div>
7229
+ </div>
7229
7230
  }
7230
-
7231
- <!-- Bottom spacer for fixed composer -->
7232
- <div class="composer-spacer"></div>
7233
- </div>
7234
- }
7235
7231
  </div>
7236
7232
  </div>
7237
7233
  </ion-content>
7238
-
7234
+
7239
7235
  <!-- Fixed comment composer -->
7240
7236
  @if (!loading && !error) {
7241
7237
  <div class="comment-composer-fixed">
7242
7238
  <div class="comment-composer">
7243
7239
  <!-- Edit indicator -->
7244
7240
  @if (editingComment()) {
7245
- <div class="edit-indicator">
7246
- <div class="edit-indicator-content">
7247
- <ds-icon name="remixEditLine" size="16px" />
7248
- <span class="edit-text">Redigerer kommentar</span>
7249
- </div>
7250
- <button class="cancel-edit" (click)="cancelEdit()">
7251
- <ds-icon name="remixCloseLine" size="16px" />
7252
- </button>
7241
+ <div class="edit-indicator">
7242
+ <div class="edit-indicator-content">
7243
+ <ds-icon name="remixEditLine" size="16px" />
7244
+ <span class="edit-text">Redigerer kommentar</span>
7253
7245
  </div>
7246
+ <button class="cancel-edit" (click)="cancelEdit()">
7247
+ <ds-icon name="remixCloseLine" size="16px" />
7248
+ </button>
7249
+ </div>
7254
7250
  } @else if (replyingTo()) {
7255
- <!-- Reply indicator -->
7256
- <div class="reply-indicator">
7257
- <div class="reply-indicator-content">
7258
- <ds-icon name="remixReplyLine" size="16px" />
7259
- <span class="reply-to-text">
7260
- Svarer til <span class="reply-author">{{ replyingTo()!.authorName }}</span>
7261
- </span>
7262
- </div>
7263
- <button class="cancel-reply" (click)="cancelReply()">
7264
- <ds-icon name="remixCloseLine" size="16px" />
7265
- </button>
7251
+ <!-- Reply indicator -->
7252
+ <div class="reply-indicator">
7253
+ <div class="reply-indicator-content">
7254
+ <ds-icon name="remixReplyLine" size="16px" />
7255
+ <span class="reply-to-text">
7256
+ Svarer til <span class="reply-author">{{ replyingTo()!.authorName }}</span>
7257
+ </span>
7266
7258
  </div>
7259
+ <button class="cancel-reply" (click)="cancelReply()">
7260
+ <ds-icon name="remixCloseLine" size="16px" />
7261
+ </button>
7262
+ </div>
7267
7263
  }
7268
-
7264
+
7269
7265
  <div class="composer-content">
7270
- <ds-avatar
7271
- [initials]="currentUserInitials()"
7272
- [type]="'initials'"
7273
- size="md"
7274
- />
7266
+ <ds-avatar [initials]="currentUserInitials()" [type]="'initials'" size="md" />
7275
7267
  <div class="composer-input-wrapper">
7276
7268
  <!-- Mention menu -->
7277
7269
  @if (showMentionMenu() && filteredUsers().length > 0 && !editingComment()) {
7278
- <div class="mention-menu">
7279
- @for (user of filteredUsers(); track user.name) {
7280
- <button
7281
- class="mention-menu-item"
7282
- (click)="selectMention(user.name)">
7283
- <ds-avatar
7284
- [initials]="user.initials"
7285
- [type]="'initials'"
7286
- size="sm" />
7287
- <div class="mention-user-info">
7288
- <span class="mention-user-name">{{ user.name }}</span>
7289
- <span class="mention-user-role">{{ user.role }}</span>
7290
- </div>
7291
- </button>
7292
- }
7293
- </div>
7270
+ <div class="mention-menu">
7271
+ @for (user of filteredUsers(); track user.name) {
7272
+ <button class="mention-menu-item" (click)="selectMention(user.name)">
7273
+ <ds-avatar [initials]="user.initials" [type]="'initials'" size="sm" />
7274
+ <div class="mention-user-info">
7275
+ <span class="mention-user-name">{{ user.name }}</span>
7276
+ <span class="mention-user-role">{{ user.role }}</span>
7277
+ </div>
7278
+ </button>
7279
+ }
7280
+ </div>
7294
7281
  }
7295
-
7282
+
7296
7283
  <textarea
7297
7284
  #commentInput
7298
7285
  class="composer-input"
7299
- [placeholder]="editingComment() ? 'Rediger din kommentar...' : (replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...')"
7286
+ [placeholder]="editingComment() ? 'Rediger din kommentar...' : replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...'"
7300
7287
  [(ngModel)]="commentText"
7301
7288
  (input)="handleInput($event)"
7302
7289
  (focus)="showKeyboard()"
7303
7290
  (click)="showKeyboard()"
7304
- rows="1"
7305
- ></textarea>
7291
+ rows="1"></textarea>
7306
7292
  </div>
7307
7293
  @if (commentText().trim().length > 0) {
7308
- <ds-icon-button
7309
- icon="remixCheckLine"
7310
- variant="primary"
7311
- size="sm"
7312
- (clicked)="submitComment()"
7313
- aria-label="Send kommentar"
7314
- class="send-button-fixed">
7315
- </ds-icon-button>
7294
+ <ds-icon-button icon="remixCheckLine" variant="primary" size="sm" (clicked)="submitComment()" aria-label="Send kommentar" class="send-button-fixed"> </ds-icon-button>
7316
7295
  }
7317
7296
  </div>
7318
7297
  </div>
7319
7298
  </div>
7320
7299
  }
7321
- `, isInline: true, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-sm);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}\n", ":host{display:block;position:relative;height:100%;width:100%}.post-modal-content{--background: var(--color-background-neutral-primary, #ffffff)}.post-modal-wrapper{display:flex;flex-direction:column;min-height:100%;min-height:100dvh;background:var(--color-background-neutral-primary, #ffffff)}.post-modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:0 16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:72px}.post-author-info{display:flex;align-items:center;gap:12px;flex:1;min-width:0}.author-details{display:flex;flex-direction:column;min-width:0;flex:1}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.post-detail-container{display:flex;flex-direction:column;gap:16px;width:100%;max-width:640px;margin:0 auto;padding:16px 0 20px;flex:1}.post-section{width:100%;border-bottom:1px solid var(--border-color-default);padding:0 0 16px}.post-content-only{font-size:var(--font-size-sm);line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px;padding:0 20px}.post-content-only post-media{margin-top:16px}.post-actions{display:flex;align-items:center;gap:16px;padding:0 20px}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.clickable-image:active{transform:scale(.98);opacity:.9}.comments-section{display:flex;flex-direction:column;margin-left:0;margin-right:0;padding:0 20px}.comments-header{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0 0 16px;padding-left:0;padding-right:0}.comments-list{display:flex;flex-direction:column}.comments-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.composer-spacer{height:calc(81px + env(safe-area-inset-bottom,0px))}.bottom-spacer{height:0px}.comment-composer-fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s ease-out;max-width:100vw}.comment-composer{pointer-events:auto;background:var(--color-background-neutral-primary, #ffffff);border-top:1px solid var(--border-color-default);padding:12px 16px;padding-bottom:max(12px,env(safe-area-inset-bottom,0px));width:100%;display:flex;flex-direction:column;gap:8px;box-shadow:100px 150px 0 150px var(--color-background-neutral-primary, #ffffff)}.edit-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-brand-subtle, #f0edfe);border-radius:8px;animation:slideDown .2s ease-out}.edit-indicator-content{display:flex;align-items:center;gap:8px;color:var(--color-brand-base, #6B5FF5);flex:1;min-width:0}.edit-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:500;line-height:18px;color:var(--color-brand-base, #6B5FF5)}.cancel-edit{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-brand-base, #6B5FF5);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-edit:active{background:var(--color-brand-subtle, #e0dbfe)}.reply-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:8px;animation:slideDown .2s ease-out}.reply-indicator-content{display:flex;align-items:center;gap:4px;color:var(--color-text-secondary, #737373);flex:1;min-width:0}.reply-to-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.reply-author{color:var(--color-brand-base, #6B5FF5);font-weight:600}.cancel-reply{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary, #737373);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-reply:active{background:var(--color-background-neutral-secondary, #f5f5f5)}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.composer-content{display:flex;align-items:flex-start;gap:12px;width:100%;position:relative}.composer-content ds-avatar{position:relative;top:6px}.composer-input-wrapper{flex:1;display:flex;align-items:flex-start;gap:8px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:24px;padding:12px 48px 12px 16px;min-height:44px;position:relative}.mention-menu{position:absolute;bottom:100%;left:0;right:0;background:var(--color-background-neutral-primary, #ffffff);border-radius:12px;box-shadow:0 4px 12px #00000026;margin-bottom:8px;max-height:200px;overflow-y:auto;z-index:10;animation:slideUp .2s ease-out}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.mention-menu-item{display:flex;align-items:center;gap:12px;padding:12px;border:none;background:none;width:100%;text-align:left;cursor:pointer;transition:background .2s ease;border-bottom:1px solid var(--border-color-default)}.mention-menu-item:last-child{border-bottom:none}.mention-menu-item:active{background:var(--color-background-neutral-secondary, #f5f5f5)}.mention-user-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.mention-user-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;color:var(--color-text-primary, #1a1a1a)}.mention-user-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373)}.composer-input{flex:1;border:none;background:transparent;font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:20px;color:var(--color-text-primary, #1a1a1a);outline:none;resize:none;min-height:20px;max-height:120px;overflow-y:auto;padding:0;margin:0}.composer-input::placeholder{color:var(--color-text-tertiary, #a0a0a0);font-size:var(--font-size-sm)}.send-button-fixed{position:absolute;top:6px;right:6px;z-index:10;flex-shrink:0;animation:slideInFromRight .2s ease-out}.send-button-fixed::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}.composer-input-wrapper ds-icon-button{flex-shrink:0;animation:slideInFromRight .2s ease-out}.composer-input-wrapper ds-icon-button::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}@keyframes slideInFromRight{0%{opacity:0;transform:translate(20px) scale(.8)}to{opacity:1;transform:translate(0) scale(1)}}@supports (padding: env(safe-area-inset-bottom)){.post-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}.post-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.post-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsAvatarComponent, selector: "ds-avatar", inputs: ["type", "size", "initials", "src", "alt", "iconName", "iconColor"] }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostMediaComponent, selector: "post-media" }, { kind: "component", type: ActionLikeComponent, selector: "action-like", inputs: ["active", "count"], outputs: ["activeChange", "countChange", "likeClick"] }, { kind: "component", type: ActionCommentComponent, selector: "action-comment", inputs: ["count"], outputs: ["commentClick"] }, { kind: "component", type: DsMobileCommentComponent, selector: "ds-mobile-comment", inputs: ["authorName", "authorRole", "timestamp", "content", "avatarInitials", "avatarType", "clickable", "isOwnComment", "isLiked", "likeCount"], outputs: ["isLikedChange", "likeCountChange", "commentClick", "replyClick", "editClick", "longPress"] }] });
7300
+ `, isInline: true, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-sm);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}\n", ":host{display:block;position:relative;height:100%;width:100%}.post-modal-content{--background: var(--color-background-neutral-primary, #ffffff)}.post-modal-wrapper{display:flex;flex-direction:column;min-height:100%;min-height:100dvh;background:var(--color-background-neutral-primary, #ffffff)}.post-modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:0 16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:72px}.post-author-info{display:flex;align-items:center;gap:12px;flex:1;min-width:0}.author-details{display:flex;flex-direction:column;min-width:0;flex:1}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.post-detail-container{display:flex;flex-direction:column;gap:16px;width:100%;max-width:640px;margin:0 auto;padding:16px 0 20px;flex:1}.post-section{width:100%;border-bottom:1px solid var(--border-color-default);padding:0 0 16px}.post-content-only{font-size:var(--font-size-sm);line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px;padding:0 20px}.post-content-only post-media{margin-top:16px}.post-actions{display:flex;align-items:center;gap:16px;padding:0 20px}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.clickable-image:active{transform:scale(.98);opacity:.9}.comments-section{display:flex;flex-direction:column;margin-left:0;margin-right:0;padding:0 20px}.comments-header{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0 0 16px;padding-left:0;padding-right:0}.comments-list{display:flex;flex-direction:column}.comments-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.composer-spacer{height:calc(81px + env(safe-area-inset-bottom,0px))}.bottom-spacer{height:0px}.comment-composer-fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s ease-out;max-width:100vw}.comment-composer{pointer-events:auto;background:var(--color-background-neutral-primary, #ffffff);border-top:1px solid var(--border-color-default);padding:12px 16px;padding-bottom:max(12px,env(safe-area-inset-bottom,0px));width:100%;display:flex;flex-direction:column;gap:8px;box-shadow:100px 150px 0 150px var(--color-background-neutral-primary, #ffffff)}.edit-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-brand-subtle, #f0edfe);border-radius:8px;animation:slideDown .2s ease-out}.edit-indicator-content{display:flex;align-items:center;gap:8px;color:var(--color-brand-base, #6b5ff5);flex:1;min-width:0}.edit-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:500;line-height:18px;color:var(--color-brand-base, #6b5ff5)}.cancel-edit{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-brand-base, #6b5ff5);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-edit:active{background:var(--color-brand-subtle, #e0dbfe)}.reply-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:8px;animation:slideDown .2s ease-out}.reply-indicator-content{display:flex;align-items:center;gap:4px;color:var(--color-text-secondary, #737373);flex:1;min-width:0}.reply-to-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.reply-author{color:var(--color-brand-base, #6b5ff5);font-weight:600}.cancel-reply{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary, #737373);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-reply:active{background:var(--color-background-neutral-secondary, #f5f5f5)}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.composer-content{display:flex;align-items:flex-start;gap:12px;width:100%;position:relative}.composer-content ds-avatar{position:relative;top:6px}.composer-input-wrapper{flex:1;display:flex;align-items:flex-start;gap:8px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:24px;padding:12px 48px 12px 16px;min-height:44px;position:relative}.mention-menu{position:absolute;bottom:100%;left:0;right:0;background:var(--color-background-neutral-primary, #ffffff);border-radius:12px;box-shadow:0 4px 12px #00000026;margin-bottom:8px;max-height:200px;overflow-y:auto;z-index:10;animation:slideUp .2s ease-out}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.mention-menu-item{display:flex;align-items:center;gap:12px;padding:12px;border:none;background:none;width:100%;text-align:left;cursor:pointer;transition:background .2s ease;border-bottom:1px solid var(--border-color-default)}.mention-menu-item:last-child{border-bottom:none}.mention-menu-item:active{background:var(--color-background-neutral-secondary, #f5f5f5)}.mention-user-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.mention-user-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;color:var(--color-text-primary, #1a1a1a)}.mention-user-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373)}.composer-input{flex:1;border:none;background:transparent;font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:20px;color:var(--color-text-primary, #1a1a1a);outline:none;resize:none;min-height:20px;max-height:120px;overflow-y:auto;padding:0;margin:0}.composer-input::placeholder{color:var(--color-text-tertiary, #a0a0a0);font-size:var(--font-size-sm)}.send-button-fixed{position:absolute;top:6px;right:6px;z-index:10;flex-shrink:0;animation:slideInFromRight .2s ease-out}.send-button-fixed::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}.composer-input-wrapper ds-icon-button{flex-shrink:0;animation:slideInFromRight .2s ease-out}.composer-input-wrapper ds-icon-button::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}@keyframes slideInFromRight{0%{opacity:0;transform:translate(20px) scale(.8)}to{opacity:1;transform:translate(0) scale(1)}}@supports (padding: env(safe-area-inset-bottom)){.post-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}.post-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.post-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsAvatarComponent, selector: "ds-avatar", inputs: ["type", "size", "initials", "src", "alt", "iconName", "iconColor"] }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostMediaComponent, selector: "post-media" }, { kind: "component", type: ActionLikeComponent, selector: "action-like", inputs: ["active", "count"], outputs: ["activeChange", "countChange", "likeClick"] }, { kind: "component", type: ActionCommentComponent, selector: "action-comment", inputs: ["count"], outputs: ["commentClick"] }, { kind: "component", type: DsMobileCommentComponent, selector: "ds-mobile-comment", inputs: ["authorName", "authorRole", "timestamp", "content", "avatarInitials", "avatarType", "clickable", "isOwnComment", "isLiked", "likeCount"], outputs: ["isLikedChange", "likeCountChange", "commentClick", "replyClick", "editClick", "longPress"] }] });
7322
7301
  }
7323
7302
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DsMobilePostDetailModalComponent, decorators: [{
7324
7303
  type: Component,
@@ -7333,7 +7312,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7333
7312
  PostMediaComponent,
7334
7313
  ActionLikeComponent,
7335
7314
  ActionCommentComponent,
7336
- DsMobileCommentComponent
7315
+ DsMobileCommentComponent,
7337
7316
  ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: `
7338
7317
  <ion-content [fullscreen]="true" [scrollY]="true" class="post-modal-content">
7339
7318
  <div class="post-modal-wrapper">
@@ -7342,12 +7321,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7342
7321
  <div class="header-content">
7343
7322
  <!-- Post author info -->
7344
7323
  <div class="post-author-info">
7345
- <ds-avatar
7346
- [initials]="post().avatarInitials || ''"
7347
- [type]="post().avatarType || 'initials'"
7348
- [src]="post().avatarSrc || ''"
7349
- size="md"
7350
- />
7324
+ <ds-avatar [initials]="post().avatarInitials || ''" [type]="post().avatarType || 'initials'" [src]="post().avatarSrc || ''" size="md" />
7351
7325
  <div class="author-details">
7352
7326
  <div class="author-name">{{ post().authorName }}</div>
7353
7327
  <div class="author-meta">
@@ -7357,34 +7331,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7357
7331
  </div>
7358
7332
  </div>
7359
7333
  </div>
7360
-
7334
+
7361
7335
  <!-- Close button -->
7362
- <ds-icon-button
7363
- icon="remixCloseLine"
7364
- variant="secondary"
7365
- size="lg"
7366
- (click)="close()"
7367
- class="close-button"
7368
- aria-label="Luk opslag">
7369
- </ds-icon-button>
7336
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (click)="close()" class="close-button" aria-label="Luk opslag"> </ds-icon-button>
7370
7337
  </div>
7371
7338
  </div>
7372
7339
 
7373
7340
  <!-- Post content -->
7374
7341
  <div class="post-detail-container">
7375
7342
  @if (loading) {
7376
- <!-- Loading State -->
7377
- <div class="post-loading-state">
7378
- <div class="loading-spinner"></div>
7379
- <p class="loading-text">Loading post...</p>
7380
- </div>
7343
+ <!-- Loading State -->
7344
+ <div class="post-loading-state">
7345
+ <div class="loading-spinner"></div>
7346
+ <p class="loading-text">Loading post...</p>
7347
+ </div>
7381
7348
  } @else if (error) {
7382
- <!-- Error State -->
7383
- <div class="post-error-state">
7384
- <ds-icon name="remixErrorWarningLine" size="48px" [style.color]="'var(--color-destructive-base)'" />
7385
- <h3 class="error-state-title">Error loading post</h3>
7386
- <p class="error-state-description">{{ error }}</p>
7387
- </div>
7349
+ <!-- Error State -->
7350
+ <div class="post-error-state">
7351
+ <ds-icon name="remixErrorWarningLine" size="48px" [style.color]="'var(--color-destructive-base)'" />
7352
+ <h3 class="error-state-title">Error loading post</h3>
7353
+ <p class="error-state-description">{{ error }}</p>
7354
+ </div>
7388
7355
  } @else {
7389
7356
  <!-- Post Section -->
7390
7357
  <div class="post-section">
@@ -7393,156 +7360,130 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7393
7360
  <div [innerHTML]="post().content"></div>
7394
7361
  </post-text>
7395
7362
  @if (post().imageSrc) {
7396
- <post-media>
7397
- <img
7398
- [src]="post().imageSrc"
7399
- [alt]="post().imageAlt || 'Post image'"
7400
- class="clickable-image"
7401
- (click)="openImageLightbox()"
7402
- />
7403
- </post-media>
7363
+ <post-media>
7364
+ <img [src]="post().imageSrc" [alt]="post().imageAlt || 'Post image'" class="clickable-image" (click)="openImageLightbox()" />
7365
+ </post-media>
7404
7366
  }
7405
7367
  </div>
7406
-
7368
+
7407
7369
  <!-- Post actions -->
7408
7370
  <div class="post-actions">
7409
- <action-like
7410
- [active]="post().isLiked || false"
7411
- [count]="post().likeCount || 0" />
7412
- <action-comment
7413
- [count]="post().commentCount || 0"
7414
- (commentClick)="focusCommentInput()" />
7371
+ <action-like [active]="post().isLiked || false" [count]="post().likeCount || 0" />
7372
+ <action-comment [count]="post().commentCount || 0" (commentClick)="focusCommentInput()" />
7415
7373
  </div>
7416
7374
  </div>
7417
-
7418
- <!-- Comments Section -->
7419
- <div class="comments-section">
7420
- @if (post().comments && post().comments!.length > 0) {
7375
+
7376
+ <!-- Comments Section -->
7377
+ <div class="comments-section">
7378
+ @if (post().comments && post().comments!.length > 0) {
7421
7379
  <h2 class="comments-header">{{ post().comments!.length }} {{ post().comments!.length === 1 ? 'reply' : 'replies' }}</h2>
7422
-
7380
+
7423
7381
  <div class="comments-list">
7424
7382
  @for (comment of post().comments!; track comment.authorName + comment.timestamp) {
7425
- <ds-mobile-comment
7426
- [authorName]="comment.authorName"
7427
- [authorRole]="comment.authorRole"
7428
- [timestamp]="comment.timestamp"
7429
- [avatarInitials]="comment.avatarInitials"
7430
- [content]="comment.content"
7431
- [isLiked]="comment.isLiked || false"
7432
- [likeCount]="comment.likeCount || 0"
7433
- [clickable]="true"
7434
- [isOwnComment]="comment.isOwnComment || false"
7435
- (replyClick)="handleReply(comment.authorName, comment.content)"
7436
- (editClick)="handleEditComment(comment.authorName, comment.content, comment.timestamp)"
7437
- (longPress)="handleCommentLongPress(comment.authorName, comment.content, comment.isOwnComment || false)" />
7383
+ <ds-mobile-comment
7384
+ [authorName]="comment.authorName"
7385
+ [authorRole]="comment.authorRole"
7386
+ [timestamp]="comment.timestamp"
7387
+ [avatarInitials]="comment.avatarInitials"
7388
+ [content]="comment.content"
7389
+ [isLiked]="comment.isLiked || false"
7390
+ [likeCount]="comment.likeCount || 0"
7391
+ [clickable]="true"
7392
+ [isOwnComment]="comment.isOwnComment || false"
7393
+ (replyClick)="handleReply(comment.authorName, comment.content)"
7394
+ (editClick)="handleEditComment(comment.authorName, comment.content, comment.timestamp)"
7395
+ (longPress)="handleCommentLongPress(comment.authorName, comment.content, comment.isOwnComment || false)" />
7438
7396
  }
7439
7397
  </div>
7440
- } @else {
7398
+ } @else {
7441
7399
  <!-- Empty State -->
7442
7400
  <div class="comments-empty-state">
7443
- <img
7444
- src="/Assets/Empty%20state-chat.png"
7445
- alt="Ingen kommentarer endnu"
7446
- class="empty-state-image"
7447
- />
7401
+ <img src="/Assets/Empty%20state-chat.png" alt="Ingen kommentarer endnu" class="empty-state-image" />
7448
7402
  <h3 class="empty-state-title">Ingen svar endnu</h3>
7449
7403
  <p class="empty-state-description">Vær den første til at svare på dette opslag</p>
7450
7404
  </div>
7405
+ }
7406
+
7407
+ <!-- Bottom spacer for fixed composer -->
7408
+ <div class="composer-spacer"></div>
7409
+ </div>
7451
7410
  }
7452
-
7453
- <!-- Bottom spacer for fixed composer -->
7454
- <div class="composer-spacer"></div>
7455
- </div>
7456
- }
7457
7411
  </div>
7458
7412
  </div>
7459
7413
  </ion-content>
7460
-
7414
+
7461
7415
  <!-- Fixed comment composer -->
7462
7416
  @if (!loading && !error) {
7463
7417
  <div class="comment-composer-fixed">
7464
7418
  <div class="comment-composer">
7465
7419
  <!-- Edit indicator -->
7466
7420
  @if (editingComment()) {
7467
- <div class="edit-indicator">
7468
- <div class="edit-indicator-content">
7469
- <ds-icon name="remixEditLine" size="16px" />
7470
- <span class="edit-text">Redigerer kommentar</span>
7471
- </div>
7472
- <button class="cancel-edit" (click)="cancelEdit()">
7473
- <ds-icon name="remixCloseLine" size="16px" />
7474
- </button>
7421
+ <div class="edit-indicator">
7422
+ <div class="edit-indicator-content">
7423
+ <ds-icon name="remixEditLine" size="16px" />
7424
+ <span class="edit-text">Redigerer kommentar</span>
7475
7425
  </div>
7426
+ <button class="cancel-edit" (click)="cancelEdit()">
7427
+ <ds-icon name="remixCloseLine" size="16px" />
7428
+ </button>
7429
+ </div>
7476
7430
  } @else if (replyingTo()) {
7477
- <!-- Reply indicator -->
7478
- <div class="reply-indicator">
7479
- <div class="reply-indicator-content">
7480
- <ds-icon name="remixReplyLine" size="16px" />
7481
- <span class="reply-to-text">
7482
- Svarer til <span class="reply-author">{{ replyingTo()!.authorName }}</span>
7483
- </span>
7484
- </div>
7485
- <button class="cancel-reply" (click)="cancelReply()">
7486
- <ds-icon name="remixCloseLine" size="16px" />
7487
- </button>
7431
+ <!-- Reply indicator -->
7432
+ <div class="reply-indicator">
7433
+ <div class="reply-indicator-content">
7434
+ <ds-icon name="remixReplyLine" size="16px" />
7435
+ <span class="reply-to-text">
7436
+ Svarer til <span class="reply-author">{{ replyingTo()!.authorName }}</span>
7437
+ </span>
7488
7438
  </div>
7439
+ <button class="cancel-reply" (click)="cancelReply()">
7440
+ <ds-icon name="remixCloseLine" size="16px" />
7441
+ </button>
7442
+ </div>
7489
7443
  }
7490
-
7444
+
7491
7445
  <div class="composer-content">
7492
- <ds-avatar
7493
- [initials]="currentUserInitials()"
7494
- [type]="'initials'"
7495
- size="md"
7496
- />
7446
+ <ds-avatar [initials]="currentUserInitials()" [type]="'initials'" size="md" />
7497
7447
  <div class="composer-input-wrapper">
7498
7448
  <!-- Mention menu -->
7499
7449
  @if (showMentionMenu() && filteredUsers().length > 0 && !editingComment()) {
7500
- <div class="mention-menu">
7501
- @for (user of filteredUsers(); track user.name) {
7502
- <button
7503
- class="mention-menu-item"
7504
- (click)="selectMention(user.name)">
7505
- <ds-avatar
7506
- [initials]="user.initials"
7507
- [type]="'initials'"
7508
- size="sm" />
7509
- <div class="mention-user-info">
7510
- <span class="mention-user-name">{{ user.name }}</span>
7511
- <span class="mention-user-role">{{ user.role }}</span>
7512
- </div>
7513
- </button>
7514
- }
7515
- </div>
7450
+ <div class="mention-menu">
7451
+ @for (user of filteredUsers(); track user.name) {
7452
+ <button class="mention-menu-item" (click)="selectMention(user.name)">
7453
+ <ds-avatar [initials]="user.initials" [type]="'initials'" size="sm" />
7454
+ <div class="mention-user-info">
7455
+ <span class="mention-user-name">{{ user.name }}</span>
7456
+ <span class="mention-user-role">{{ user.role }}</span>
7457
+ </div>
7458
+ </button>
7459
+ }
7460
+ </div>
7516
7461
  }
7517
-
7462
+
7518
7463
  <textarea
7519
7464
  #commentInput
7520
7465
  class="composer-input"
7521
- [placeholder]="editingComment() ? 'Rediger din kommentar...' : (replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...')"
7466
+ [placeholder]="editingComment() ? 'Rediger din kommentar...' : replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...'"
7522
7467
  [(ngModel)]="commentText"
7523
7468
  (input)="handleInput($event)"
7524
7469
  (focus)="showKeyboard()"
7525
7470
  (click)="showKeyboard()"
7526
- rows="1"
7527
- ></textarea>
7471
+ rows="1"></textarea>
7528
7472
  </div>
7529
7473
  @if (commentText().trim().length > 0) {
7530
- <ds-icon-button
7531
- icon="remixCheckLine"
7532
- variant="primary"
7533
- size="sm"
7534
- (clicked)="submitComment()"
7535
- aria-label="Send kommentar"
7536
- class="send-button-fixed">
7537
- </ds-icon-button>
7474
+ <ds-icon-button icon="remixCheckLine" variant="primary" size="sm" (clicked)="submitComment()" aria-label="Send kommentar" class="send-button-fixed"> </ds-icon-button>
7538
7475
  }
7539
7476
  </div>
7540
7477
  </div>
7541
7478
  </div>
7542
7479
  }
7543
- `, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-sm);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}\n", ":host{display:block;position:relative;height:100%;width:100%}.post-modal-content{--background: var(--color-background-neutral-primary, #ffffff)}.post-modal-wrapper{display:flex;flex-direction:column;min-height:100%;min-height:100dvh;background:var(--color-background-neutral-primary, #ffffff)}.post-modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:0 16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:72px}.post-author-info{display:flex;align-items:center;gap:12px;flex:1;min-width:0}.author-details{display:flex;flex-direction:column;min-width:0;flex:1}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.post-detail-container{display:flex;flex-direction:column;gap:16px;width:100%;max-width:640px;margin:0 auto;padding:16px 0 20px;flex:1}.post-section{width:100%;border-bottom:1px solid var(--border-color-default);padding:0 0 16px}.post-content-only{font-size:var(--font-size-sm);line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px;padding:0 20px}.post-content-only post-media{margin-top:16px}.post-actions{display:flex;align-items:center;gap:16px;padding:0 20px}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.clickable-image:active{transform:scale(.98);opacity:.9}.comments-section{display:flex;flex-direction:column;margin-left:0;margin-right:0;padding:0 20px}.comments-header{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0 0 16px;padding-left:0;padding-right:0}.comments-list{display:flex;flex-direction:column}.comments-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.composer-spacer{height:calc(81px + env(safe-area-inset-bottom,0px))}.bottom-spacer{height:0px}.comment-composer-fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s ease-out;max-width:100vw}.comment-composer{pointer-events:auto;background:var(--color-background-neutral-primary, #ffffff);border-top:1px solid var(--border-color-default);padding:12px 16px;padding-bottom:max(12px,env(safe-area-inset-bottom,0px));width:100%;display:flex;flex-direction:column;gap:8px;box-shadow:100px 150px 0 150px var(--color-background-neutral-primary, #ffffff)}.edit-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-brand-subtle, #f0edfe);border-radius:8px;animation:slideDown .2s ease-out}.edit-indicator-content{display:flex;align-items:center;gap:8px;color:var(--color-brand-base, #6B5FF5);flex:1;min-width:0}.edit-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:500;line-height:18px;color:var(--color-brand-base, #6B5FF5)}.cancel-edit{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-brand-base, #6B5FF5);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-edit:active{background:var(--color-brand-subtle, #e0dbfe)}.reply-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:8px;animation:slideDown .2s ease-out}.reply-indicator-content{display:flex;align-items:center;gap:4px;color:var(--color-text-secondary, #737373);flex:1;min-width:0}.reply-to-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.reply-author{color:var(--color-brand-base, #6B5FF5);font-weight:600}.cancel-reply{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary, #737373);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-reply:active{background:var(--color-background-neutral-secondary, #f5f5f5)}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.composer-content{display:flex;align-items:flex-start;gap:12px;width:100%;position:relative}.composer-content ds-avatar{position:relative;top:6px}.composer-input-wrapper{flex:1;display:flex;align-items:flex-start;gap:8px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:24px;padding:12px 48px 12px 16px;min-height:44px;position:relative}.mention-menu{position:absolute;bottom:100%;left:0;right:0;background:var(--color-background-neutral-primary, #ffffff);border-radius:12px;box-shadow:0 4px 12px #00000026;margin-bottom:8px;max-height:200px;overflow-y:auto;z-index:10;animation:slideUp .2s ease-out}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.mention-menu-item{display:flex;align-items:center;gap:12px;padding:12px;border:none;background:none;width:100%;text-align:left;cursor:pointer;transition:background .2s ease;border-bottom:1px solid var(--border-color-default)}.mention-menu-item:last-child{border-bottom:none}.mention-menu-item:active{background:var(--color-background-neutral-secondary, #f5f5f5)}.mention-user-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.mention-user-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;color:var(--color-text-primary, #1a1a1a)}.mention-user-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373)}.composer-input{flex:1;border:none;background:transparent;font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:20px;color:var(--color-text-primary, #1a1a1a);outline:none;resize:none;min-height:20px;max-height:120px;overflow-y:auto;padding:0;margin:0}.composer-input::placeholder{color:var(--color-text-tertiary, #a0a0a0);font-size:var(--font-size-sm)}.send-button-fixed{position:absolute;top:6px;right:6px;z-index:10;flex-shrink:0;animation:slideInFromRight .2s ease-out}.send-button-fixed::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}.composer-input-wrapper ds-icon-button{flex-shrink:0;animation:slideInFromRight .2s ease-out}.composer-input-wrapper ds-icon-button::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}@keyframes slideInFromRight{0%{opacity:0;transform:translate(20px) scale(.8)}to{opacity:1;transform:translate(0) scale(1)}}@supports (padding: env(safe-area-inset-bottom)){.post-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}.post-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.post-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}\n"] }]
7480
+ `, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-sm);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}\n", ":host{display:block;position:relative;height:100%;width:100%}.post-modal-content{--background: var(--color-background-neutral-primary, #ffffff)}.post-modal-wrapper{display:flex;flex-direction:column;min-height:100%;min-height:100dvh;background:var(--color-background-neutral-primary, #ffffff)}.post-modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:0 16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:72px}.post-author-info{display:flex;align-items:center;gap:12px;flex:1;min-width:0}.author-details{display:flex;flex-direction:column;min-width:0;flex:1}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.post-detail-container{display:flex;flex-direction:column;gap:16px;width:100%;max-width:640px;margin:0 auto;padding:16px 0 20px;flex:1}.post-section{width:100%;border-bottom:1px solid var(--border-color-default);padding:0 0 16px}.post-content-only{font-size:var(--font-size-sm);line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px;padding:0 20px}.post-content-only post-media{margin-top:16px}.post-actions{display:flex;align-items:center;gap:16px;padding:0 20px}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.clickable-image:active{transform:scale(.98);opacity:.9}.comments-section{display:flex;flex-direction:column;margin-left:0;margin-right:0;padding:0 20px}.comments-header{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0 0 16px;padding-left:0;padding-right:0}.comments-list{display:flex;flex-direction:column}.comments-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.composer-spacer{height:calc(81px + env(safe-area-inset-bottom,0px))}.bottom-spacer{height:0px}.comment-composer-fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s ease-out;max-width:100vw}.comment-composer{pointer-events:auto;background:var(--color-background-neutral-primary, #ffffff);border-top:1px solid var(--border-color-default);padding:12px 16px;padding-bottom:max(12px,env(safe-area-inset-bottom,0px));width:100%;display:flex;flex-direction:column;gap:8px;box-shadow:100px 150px 0 150px var(--color-background-neutral-primary, #ffffff)}.edit-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-brand-subtle, #f0edfe);border-radius:8px;animation:slideDown .2s ease-out}.edit-indicator-content{display:flex;align-items:center;gap:8px;color:var(--color-brand-base, #6b5ff5);flex:1;min-width:0}.edit-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:500;line-height:18px;color:var(--color-brand-base, #6b5ff5)}.cancel-edit{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-brand-base, #6b5ff5);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-edit:active{background:var(--color-brand-subtle, #e0dbfe)}.reply-indicator{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:8px;animation:slideDown .2s ease-out}.reply-indicator-content{display:flex;align-items:center;gap:4px;color:var(--color-text-secondary, #737373);flex:1;min-width:0}.reply-to-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.reply-author{color:var(--color-brand-base, #6b5ff5);font-weight:600}.cancel-reply{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary, #737373);border-radius:4px;transition:background .2s ease;flex-shrink:0}.cancel-reply:active{background:var(--color-background-neutral-secondary, #f5f5f5)}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.composer-content{display:flex;align-items:flex-start;gap:12px;width:100%;position:relative}.composer-content ds-avatar{position:relative;top:6px}.composer-input-wrapper{flex:1;display:flex;align-items:flex-start;gap:8px;background:var(--color-background-neutral-secondary, #f5f5f5);border-radius:24px;padding:12px 48px 12px 16px;min-height:44px;position:relative}.mention-menu{position:absolute;bottom:100%;left:0;right:0;background:var(--color-background-neutral-primary, #ffffff);border-radius:12px;box-shadow:0 4px 12px #00000026;margin-bottom:8px;max-height:200px;overflow-y:auto;z-index:10;animation:slideUp .2s ease-out}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.mention-menu-item{display:flex;align-items:center;gap:12px;padding:12px;border:none;background:none;width:100%;text-align:left;cursor:pointer;transition:background .2s ease;border-bottom:1px solid var(--border-color-default)}.mention-menu-item:last-child{border-bottom:none}.mention-menu-item:active{background:var(--color-background-neutral-secondary, #f5f5f5)}.mention-user-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.mention-user-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;color:var(--color-text-primary, #1a1a1a)}.mention-user-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:18px;color:var(--color-text-secondary, #737373)}.composer-input{flex:1;border:none;background:transparent;font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:20px;color:var(--color-text-primary, #1a1a1a);outline:none;resize:none;min-height:20px;max-height:120px;overflow-y:auto;padding:0;margin:0}.composer-input::placeholder{color:var(--color-text-tertiary, #a0a0a0);font-size:var(--font-size-sm)}.send-button-fixed{position:absolute;top:6px;right:6px;z-index:10;flex-shrink:0;animation:slideInFromRight .2s ease-out}.send-button-fixed::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}.composer-input-wrapper ds-icon-button{flex-shrink:0;animation:slideInFromRight .2s ease-out}.composer-input-wrapper ds-icon-button::ng-deep button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;padding:0!important;border-radius:50%!important}@keyframes slideInFromRight{0%{opacity:0;transform:translate(20px) scale(.8)}to{opacity:1;transform:translate(0) scale(1)}}@supports (padding: env(safe-area-inset-bottom)){.post-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}.post-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.post-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}\n"] }]
7544
7481
  }], ctorParameters: () => [{ type: i1.ModalController }, { type: DsMobileLightboxService }, { type: DsMobileBottomSheetService }], propDecorators: { postData: [{
7545
7482
  type: Input
7483
+ }], currentUserName: [{
7484
+ type: Input
7485
+ }], currentUserInitialsInput: [{
7486
+ type: Input
7546
7487
  }], onSubmitComment: [{
7547
7488
  type: Input
7548
7489
  }], loading: [{
@@ -7611,13 +7552,16 @@ class DsMobilePostDetailModalService {
7611
7552
  */
7612
7553
  async open(postData, options) {
7613
7554
  console.log('[PostDetailModal] Opening with data:', postData);
7555
+ console.log('[PostDetailModal] options.onSubmitComment =', options?.onSubmitComment);
7614
7556
  const modal = await this.modalController.create({
7615
7557
  component: DsMobilePostDetailModalComponent,
7616
7558
  componentProps: {
7617
7559
  postData: postData,
7618
7560
  loading: options?.loading ?? false,
7619
7561
  error: options?.error,
7620
- onSubmitComment: options?.onSubmitComment
7562
+ onSubmitComment: options?.onSubmitComment,
7563
+ currentUserName: options?.currentUserName ?? '',
7564
+ currentUserInitials: options?.currentUserInitials ?? '',
7621
7565
  },
7622
7566
  cssClass: 'ds-post-detail-modal',
7623
7567
  mode: 'ios',
@@ -7628,7 +7572,7 @@ class DsMobilePostDetailModalService {
7628
7572
  keyboardClose: true,
7629
7573
  // Control the presenting element animation
7630
7574
  enterAnimation: undefined, // Use default
7631
- leaveAnimation: undefined // Use default
7575
+ leaveAnimation: undefined, // Use default
7632
7576
  });
7633
7577
  console.log('[PostDetailModal] Modal created, presenting...');
7634
7578
  await modal.present();
@@ -7657,7 +7601,7 @@ class DsMobilePostDetailModalService {
7657
7601
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DsMobilePostDetailModalService, decorators: [{
7658
7602
  type: Injectable,
7659
7603
  args: [{
7660
- providedIn: 'root'
7604
+ providedIn: 'root',
7661
7605
  }]
7662
7606
  }], ctorParameters: () => [{ type: i1.ModalController }] });
7663
7607