@propbinder/mobile-design 0.1.19 → 0.1.21

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,11 +6736,11 @@ 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" }] : []));
6740
- currentUserInitials = signal('LM', ...(ngDevMode ? [{ debugName: "currentUserInitials" }] : []));
6743
+ currentUserInitials = signal('', ...(ngDevMode ? [{ debugName: "currentUserInitials" }] : []));
6741
6744
  replyingTo = signal(null, ...(ngDevMode ? [{ debugName: "replyingTo" }] : []));
6742
6745
  editingComment = signal(null, ...(ngDevMode ? [{ debugName: "editingComment" }] : []));
6743
6746
  // Mention menu state
@@ -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,125 @@ 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...')"
7300
- [(ngModel)]="commentText"
7286
+ [placeholder]="editingComment() ? 'Rediger din kommentar...' : replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...'"
7287
+ [ngModel]="commentText()"
7288
+ (ngModelChange)="commentText.set($event)"
7301
7289
  (input)="handleInput($event)"
7302
7290
  (focus)="showKeyboard()"
7303
7291
  (click)="showKeyboard()"
7304
- rows="1"
7305
- ></textarea>
7292
+ rows="1"></textarea>
7306
7293
  </div>
7307
7294
  @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>
7295
+ <ds-icon-button icon="remixCheckLine" variant="primary" size="sm" (clicked)="submitComment()" aria-label="Send kommentar" class="send-button-fixed"> </ds-icon-button>
7316
7296
  }
7317
7297
  </div>
7318
7298
  </div>
7319
7299
  </div>
7320
7300
  }
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"] }] });
7301
+ `, 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
7302
  }
7323
7303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DsMobilePostDetailModalComponent, decorators: [{
7324
7304
  type: Component,
@@ -7333,7 +7313,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7333
7313
  PostMediaComponent,
7334
7314
  ActionLikeComponent,
7335
7315
  ActionCommentComponent,
7336
- DsMobileCommentComponent
7316
+ DsMobileCommentComponent,
7337
7317
  ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: `
7338
7318
  <ion-content [fullscreen]="true" [scrollY]="true" class="post-modal-content">
7339
7319
  <div class="post-modal-wrapper">
@@ -7342,12 +7322,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7342
7322
  <div class="header-content">
7343
7323
  <!-- Post author info -->
7344
7324
  <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
- />
7325
+ <ds-avatar [initials]="post().avatarInitials || ''" [type]="post().avatarType || 'initials'" [src]="post().avatarSrc || ''" size="md" />
7351
7326
  <div class="author-details">
7352
7327
  <div class="author-name">{{ post().authorName }}</div>
7353
7328
  <div class="author-meta">
@@ -7357,34 +7332,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7357
7332
  </div>
7358
7333
  </div>
7359
7334
  </div>
7360
-
7335
+
7361
7336
  <!-- 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>
7337
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (click)="close()" class="close-button" aria-label="Luk opslag"> </ds-icon-button>
7370
7338
  </div>
7371
7339
  </div>
7372
7340
 
7373
7341
  <!-- Post content -->
7374
7342
  <div class="post-detail-container">
7375
7343
  @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>
7344
+ <!-- Loading State -->
7345
+ <div class="post-loading-state">
7346
+ <div class="loading-spinner"></div>
7347
+ <p class="loading-text">Loading post...</p>
7348
+ </div>
7381
7349
  } @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>
7350
+ <!-- Error State -->
7351
+ <div class="post-error-state">
7352
+ <ds-icon name="remixErrorWarningLine" size="48px" [style.color]="'var(--color-destructive-base)'" />
7353
+ <h3 class="error-state-title">Error loading post</h3>
7354
+ <p class="error-state-description">{{ error }}</p>
7355
+ </div>
7388
7356
  } @else {
7389
7357
  <!-- Post Section -->
7390
7358
  <div class="post-section">
@@ -7393,156 +7361,131 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
7393
7361
  <div [innerHTML]="post().content"></div>
7394
7362
  </post-text>
7395
7363
  @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>
7364
+ <post-media>
7365
+ <img [src]="post().imageSrc" [alt]="post().imageAlt || 'Post image'" class="clickable-image" (click)="openImageLightbox()" />
7366
+ </post-media>
7404
7367
  }
7405
7368
  </div>
7406
-
7369
+
7407
7370
  <!-- Post actions -->
7408
7371
  <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()" />
7372
+ <action-like [active]="post().isLiked || false" [count]="post().likeCount || 0" />
7373
+ <action-comment [count]="post().commentCount || 0" (commentClick)="focusCommentInput()" />
7415
7374
  </div>
7416
7375
  </div>
7417
-
7418
- <!-- Comments Section -->
7419
- <div class="comments-section">
7420
- @if (post().comments && post().comments!.length > 0) {
7376
+
7377
+ <!-- Comments Section -->
7378
+ <div class="comments-section">
7379
+ @if (post().comments && post().comments!.length > 0) {
7421
7380
  <h2 class="comments-header">{{ post().comments!.length }} {{ post().comments!.length === 1 ? 'reply' : 'replies' }}</h2>
7422
-
7381
+
7423
7382
  <div class="comments-list">
7424
7383
  @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)" />
7384
+ <ds-mobile-comment
7385
+ [authorName]="comment.authorName"
7386
+ [authorRole]="comment.authorRole"
7387
+ [timestamp]="comment.timestamp"
7388
+ [avatarInitials]="comment.avatarInitials"
7389
+ [content]="comment.content"
7390
+ [isLiked]="comment.isLiked || false"
7391
+ [likeCount]="comment.likeCount || 0"
7392
+ [clickable]="true"
7393
+ [isOwnComment]="comment.isOwnComment || false"
7394
+ (replyClick)="handleReply(comment.authorName, comment.content)"
7395
+ (editClick)="handleEditComment(comment.authorName, comment.content, comment.timestamp)"
7396
+ (longPress)="handleCommentLongPress(comment.authorName, comment.content, comment.isOwnComment || false)" />
7438
7397
  }
7439
7398
  </div>
7440
- } @else {
7399
+ } @else {
7441
7400
  <!-- Empty State -->
7442
7401
  <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
- />
7402
+ <img src="/Assets/Empty%20state-chat.png" alt="Ingen kommentarer endnu" class="empty-state-image" />
7448
7403
  <h3 class="empty-state-title">Ingen svar endnu</h3>
7449
7404
  <p class="empty-state-description">Vær den første til at svare på dette opslag</p>
7450
7405
  </div>
7406
+ }
7407
+
7408
+ <!-- Bottom spacer for fixed composer -->
7409
+ <div class="composer-spacer"></div>
7410
+ </div>
7451
7411
  }
7452
-
7453
- <!-- Bottom spacer for fixed composer -->
7454
- <div class="composer-spacer"></div>
7455
- </div>
7456
- }
7457
7412
  </div>
7458
7413
  </div>
7459
7414
  </ion-content>
7460
-
7415
+
7461
7416
  <!-- Fixed comment composer -->
7462
7417
  @if (!loading && !error) {
7463
7418
  <div class="comment-composer-fixed">
7464
7419
  <div class="comment-composer">
7465
7420
  <!-- Edit indicator -->
7466
7421
  @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>
7422
+ <div class="edit-indicator">
7423
+ <div class="edit-indicator-content">
7424
+ <ds-icon name="remixEditLine" size="16px" />
7425
+ <span class="edit-text">Redigerer kommentar</span>
7475
7426
  </div>
7427
+ <button class="cancel-edit" (click)="cancelEdit()">
7428
+ <ds-icon name="remixCloseLine" size="16px" />
7429
+ </button>
7430
+ </div>
7476
7431
  } @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>
7432
+ <!-- Reply indicator -->
7433
+ <div class="reply-indicator">
7434
+ <div class="reply-indicator-content">
7435
+ <ds-icon name="remixReplyLine" size="16px" />
7436
+ <span class="reply-to-text">
7437
+ Svarer til <span class="reply-author">{{ replyingTo()!.authorName }}</span>
7438
+ </span>
7488
7439
  </div>
7440
+ <button class="cancel-reply" (click)="cancelReply()">
7441
+ <ds-icon name="remixCloseLine" size="16px" />
7442
+ </button>
7443
+ </div>
7489
7444
  }
7490
-
7445
+
7491
7446
  <div class="composer-content">
7492
- <ds-avatar
7493
- [initials]="currentUserInitials()"
7494
- [type]="'initials'"
7495
- size="md"
7496
- />
7447
+ <ds-avatar [initials]="currentUserInitials()" [type]="'initials'" size="md" />
7497
7448
  <div class="composer-input-wrapper">
7498
7449
  <!-- Mention menu -->
7499
7450
  @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>
7451
+ <div class="mention-menu">
7452
+ @for (user of filteredUsers(); track user.name) {
7453
+ <button class="mention-menu-item" (click)="selectMention(user.name)">
7454
+ <ds-avatar [initials]="user.initials" [type]="'initials'" size="sm" />
7455
+ <div class="mention-user-info">
7456
+ <span class="mention-user-name">{{ user.name }}</span>
7457
+ <span class="mention-user-role">{{ user.role }}</span>
7458
+ </div>
7459
+ </button>
7460
+ }
7461
+ </div>
7516
7462
  }
7517
-
7463
+
7518
7464
  <textarea
7519
7465
  #commentInput
7520
7466
  class="composer-input"
7521
- [placeholder]="editingComment() ? 'Rediger din kommentar...' : (replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...')"
7522
- [(ngModel)]="commentText"
7467
+ [placeholder]="editingComment() ? 'Rediger din kommentar...' : replyingTo() ? 'Tilføj et svar...' : 'Tilføj et svar...'"
7468
+ [ngModel]="commentText()"
7469
+ (ngModelChange)="commentText.set($event)"
7523
7470
  (input)="handleInput($event)"
7524
7471
  (focus)="showKeyboard()"
7525
7472
  (click)="showKeyboard()"
7526
- rows="1"
7527
- ></textarea>
7473
+ rows="1"></textarea>
7528
7474
  </div>
7529
7475
  @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>
7476
+ <ds-icon-button icon="remixCheckLine" variant="primary" size="sm" (clicked)="submitComment()" aria-label="Send kommentar" class="send-button-fixed"> </ds-icon-button>
7538
7477
  }
7539
7478
  </div>
7540
7479
  </div>
7541
7480
  </div>
7542
7481
  }
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"] }]
7482
+ `, 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
7483
  }], ctorParameters: () => [{ type: i1.ModalController }, { type: DsMobileLightboxService }, { type: DsMobileBottomSheetService }], propDecorators: { postData: [{
7545
7484
  type: Input
7485
+ }], currentUserName: [{
7486
+ type: Input
7487
+ }], currentUserInitialsInput: [{
7488
+ type: Input
7546
7489
  }], onSubmitComment: [{
7547
7490
  type: Input
7548
7491
  }], loading: [{
@@ -7611,13 +7554,16 @@ class DsMobilePostDetailModalService {
7611
7554
  */
7612
7555
  async open(postData, options) {
7613
7556
  console.log('[PostDetailModal] Opening with data:', postData);
7557
+ console.log('[PostDetailModal] options.onSubmitComment =', options?.onSubmitComment);
7614
7558
  const modal = await this.modalController.create({
7615
7559
  component: DsMobilePostDetailModalComponent,
7616
7560
  componentProps: {
7617
7561
  postData: postData,
7618
7562
  loading: options?.loading ?? false,
7619
7563
  error: options?.error,
7620
- onSubmitComment: options?.onSubmitComment
7564
+ onSubmitComment: options?.onSubmitComment,
7565
+ currentUserName: options?.currentUserName ?? '',
7566
+ currentUserInitialsInput: options?.currentUserInitials ?? ''
7621
7567
  },
7622
7568
  cssClass: 'ds-post-detail-modal',
7623
7569
  mode: 'ios',
@@ -7628,7 +7574,7 @@ class DsMobilePostDetailModalService {
7628
7574
  keyboardClose: true,
7629
7575
  // Control the presenting element animation
7630
7576
  enterAnimation: undefined, // Use default
7631
- leaveAnimation: undefined // Use default
7577
+ leaveAnimation: undefined, // Use default
7632
7578
  });
7633
7579
  console.log('[PostDetailModal] Modal created, presenting...');
7634
7580
  await modal.present();
@@ -7657,7 +7603,7 @@ class DsMobilePostDetailModalService {
7657
7603
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DsMobilePostDetailModalService, decorators: [{
7658
7604
  type: Injectable,
7659
7605
  args: [{
7660
- providedIn: 'root'
7606
+ providedIn: 'root',
7661
7607
  }]
7662
7608
  }], ctorParameters: () => [{ type: i1.ModalController }] });
7663
7609