@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 ||
|
|
6754
|
-
|
|
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:
|
|
6982
|
-
authorRole: '
|
|
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
|
-
|
|
7155
|
-
|
|
7156
|
-
|
|
7157
|
-
|
|
7158
|
-
|
|
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
|
-
|
|
7161
|
-
|
|
7162
|
-
|
|
7163
|
-
|
|
7164
|
-
|
|
7165
|
-
|
|
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
|
-
|
|
7175
|
-
|
|
7176
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7197
|
-
|
|
7198
|
-
|
|
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
|
-
|
|
7204
|
-
|
|
7205
|
-
|
|
7206
|
-
|
|
7207
|
-
|
|
7208
|
-
|
|
7209
|
-
|
|
7210
|
-
|
|
7211
|
-
|
|
7212
|
-
|
|
7213
|
-
|
|
7214
|
-
|
|
7215
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7246
|
-
|
|
7247
|
-
|
|
7248
|
-
|
|
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
|
-
|
|
7256
|
-
|
|
7257
|
-
|
|
7258
|
-
|
|
7259
|
-
|
|
7260
|
-
|
|
7261
|
-
|
|
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
|
-
|
|
7279
|
-
|
|
7280
|
-
|
|
7281
|
-
|
|
7282
|
-
|
|
7283
|
-
|
|
7284
|
-
|
|
7285
|
-
|
|
7286
|
-
|
|
7287
|
-
|
|
7288
|
-
|
|
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...' :
|
|
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
|
-
|
|
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
|
-
|
|
7377
|
-
|
|
7378
|
-
|
|
7379
|
-
|
|
7380
|
-
|
|
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
|
-
|
|
7383
|
-
|
|
7384
|
-
|
|
7385
|
-
|
|
7386
|
-
|
|
7387
|
-
|
|
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
|
-
|
|
7397
|
-
|
|
7398
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7419
|
-
|
|
7420
|
-
|
|
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
|
-
|
|
7426
|
-
|
|
7427
|
-
|
|
7428
|
-
|
|
7429
|
-
|
|
7430
|
-
|
|
7431
|
-
|
|
7432
|
-
|
|
7433
|
-
|
|
7434
|
-
|
|
7435
|
-
|
|
7436
|
-
|
|
7437
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7468
|
-
|
|
7469
|
-
|
|
7470
|
-
|
|
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
|
-
|
|
7478
|
-
|
|
7479
|
-
|
|
7480
|
-
|
|
7481
|
-
|
|
7482
|
-
|
|
7483
|
-
|
|
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
|
-
|
|
7501
|
-
|
|
7502
|
-
|
|
7503
|
-
|
|
7504
|
-
|
|
7505
|
-
|
|
7506
|
-
|
|
7507
|
-
|
|
7508
|
-
|
|
7509
|
-
|
|
7510
|
-
|
|
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...' :
|
|
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
|
-
|
|
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
|
|