@propbinder/mobile-design 0.2.48 → 0.2.52

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.
@@ -6350,6 +6350,14 @@ class DsMobileCommentComponent {
6350
6350
  return ma;
6351
6351
  return this.isDesktop();
6352
6352
  }, ...(ngDevMode ? [{ debugName: "shouldShowMoreButton" }] : []));
6353
+ /**
6354
+ * Label for the reply action button
6355
+ */
6356
+ replyLabel = input('Svar', ...(ngDevMode ? [{ debugName: "replyLabel" }] : []));
6357
+ /**
6358
+ * Label for the edit action button
6359
+ */
6360
+ editLabel = input('Rediger', ...(ngDevMode ? [{ debugName: "editLabel" }] : []));
6353
6361
  /**
6354
6362
  * Whether this comment belongs to the current user
6355
6363
  */
@@ -6523,7 +6531,7 @@ class DsMobileCommentComponent {
6523
6531
  this.longPress.emit();
6524
6532
  }
6525
6533
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileCommentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6526
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileCommentComponent, isStandalone: true, selector: "ds-mobile-comment", inputs: { authorName: { classPropertyName: "authorName", publicName: "authorName", isSignal: true, isRequired: true, transformFunction: null }, authorRole: { classPropertyName: "authorRole", publicName: "authorRole", isSignal: true, isRequired: true, transformFunction: null }, timestamp: { classPropertyName: "timestamp", publicName: "timestamp", isSignal: true, isRequired: true, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, avatarInitials: { classPropertyName: "avatarInitials", publicName: "avatarInitials", isSignal: true, isRequired: false, transformFunction: null }, avatarType: { classPropertyName: "avatarType", publicName: "avatarType", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, moreActions: { classPropertyName: "moreActions", publicName: "moreActions", isSignal: true, isRequired: false, transformFunction: null }, isOwnComment: { classPropertyName: "isOwnComment", publicName: "isOwnComment", isSignal: true, isRequired: false, transformFunction: null }, isLiked: { classPropertyName: "isLiked", publicName: "isLiked", isSignal: true, isRequired: false, transformFunction: null }, likeCount: { classPropertyName: "likeCount", publicName: "likeCount", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { likeToggled: "likeToggled", commentClick: "commentClick", replyClick: "replyClick", editClick: "editClick", longPress: "longPress" }, host: { listeners: { "click": "handleCommentClick($event)", "touchstart": "handleTouchStart($event)", "touchend": "handleTouchEnd($event)", "touchmove": "handleTouchMove($event)", "contextmenu": "handleContextMenu($event)" }, properties: { "class.clickable": "clickable()" } }, ngImport: i0, template: `
6534
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileCommentComponent, isStandalone: true, selector: "ds-mobile-comment", inputs: { authorName: { classPropertyName: "authorName", publicName: "authorName", isSignal: true, isRequired: true, transformFunction: null }, authorRole: { classPropertyName: "authorRole", publicName: "authorRole", isSignal: true, isRequired: true, transformFunction: null }, timestamp: { classPropertyName: "timestamp", publicName: "timestamp", isSignal: true, isRequired: true, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, avatarInitials: { classPropertyName: "avatarInitials", publicName: "avatarInitials", isSignal: true, isRequired: false, transformFunction: null }, avatarType: { classPropertyName: "avatarType", publicName: "avatarType", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, moreActions: { classPropertyName: "moreActions", publicName: "moreActions", isSignal: true, isRequired: false, transformFunction: null }, replyLabel: { classPropertyName: "replyLabel", publicName: "replyLabel", isSignal: true, isRequired: false, transformFunction: null }, editLabel: { classPropertyName: "editLabel", publicName: "editLabel", isSignal: true, isRequired: false, transformFunction: null }, isOwnComment: { classPropertyName: "isOwnComment", publicName: "isOwnComment", isSignal: true, isRequired: false, transformFunction: null }, isLiked: { classPropertyName: "isLiked", publicName: "isLiked", isSignal: true, isRequired: false, transformFunction: null }, likeCount: { classPropertyName: "likeCount", publicName: "likeCount", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { likeToggled: "likeToggled", commentClick: "commentClick", replyClick: "replyClick", editClick: "editClick", longPress: "longPress" }, host: { listeners: { "click": "handleCommentClick($event)", "touchstart": "handleTouchStart($event)", "touchend": "handleTouchEnd($event)", "touchmove": "handleTouchMove($event)", "contextmenu": "handleContextMenu($event)" }, properties: { "class.clickable": "clickable()" } }, ngImport: i0, template: `
6527
6535
  <div class="avatar-wrapper">
6528
6536
  <ds-avatar [initials]="avatarInitials()" [type]="avatarType()" size="sm" />
6529
6537
  </div>
@@ -6553,9 +6561,9 @@ class DsMobileCommentComponent {
6553
6561
  <div class="comment-text" [innerHTML]="formattedContent()"></div>
6554
6562
 
6555
6563
  <div class="comment-actions">
6556
- <div class="action-reply" (click)="handleReply()">Reply</div>
6564
+ <div class="action-reply" (click)="handleReply()">{{ replyLabel() }}</div>
6557
6565
  @if (isOwnComment()) {
6558
- <div class="action-edit" (click)="handleEdit()">Edit</div>
6566
+ <div class="action-edit" (click)="handleEdit()">{{ editLabel() }}</div>
6559
6567
  }
6560
6568
  </div>
6561
6569
  </div>
@@ -6600,14 +6608,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6600
6608
  <div class="comment-text" [innerHTML]="formattedContent()"></div>
6601
6609
 
6602
6610
  <div class="comment-actions">
6603
- <div class="action-reply" (click)="handleReply()">Reply</div>
6611
+ <div class="action-reply" (click)="handleReply()">{{ replyLabel() }}</div>
6604
6612
  @if (isOwnComment()) {
6605
- <div class="action-edit" (click)="handleEdit()">Edit</div>
6613
+ <div class="action-edit" (click)="handleEdit()">{{ editLabel() }}</div>
6606
6614
  }
6607
6615
  </div>
6608
6616
  </div>
6609
6617
  `, 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-base);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}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ":host{display:flex;gap:12px;padding:8px;position:relative;border-radius:16px;transition:all .2s ease;background:var(--color-background-primary, #ffffff);margin-bottom:8px;margin-left:-8px;margin-right:-8px}:host:last-child{margin-bottom:0}:host:after{content:\"\";position:absolute;bottom:-4px;left:44px;right:8px;height:1px;background:var(--border-color-default)}:host:last-child:after{display:none}:host.clickable{cursor:pointer}:host.clickable:active{background:var(--color-background-neutral-primary-hover, #f5f5f5)}.avatar-wrapper{position:relative;display:flex;align-items:flex-start;justify-content:center;flex-shrink:0}.comment-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.comment-header{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}.header-actions{display:flex;align-items:center;gap:4px;margin-left:auto}.desktop-more-button::ng-deep button{border-radius:50%!important}.action-like{display:flex;align-items:center;gap:2px;color:var(--color-text-secondary, #737373);cursor:pointer;transition:color .2s ease;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:500;line-height:18px}.like-count{opacity:1}.like-count.hidden{opacity:0}.action-like.active{color:#f91880}.icon-wrapper{position:relative;display:flex;align-items:center;justify-content:center}.icon-pulse{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:0;pointer-events:none}.icon-pulse.animating{animation:pulse .4s cubic-bezier(.4,0,.2,1)}@keyframes pulse{0%{transform:translate(-50%,-50%) scale(1);opacity:.8}to{transform:translate(-50%,-50%) scale(2.5);opacity:0}}.comment-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:22px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:pre-wrap;word-wrap:break-word}.comment-text ::ng-deep .mention{color:var(--color-accent, #6b5ff5)!important;font-weight:600}.comment-actions{display:flex;align-items:center;gap:12px;margin-top:4px}.action-reply{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:500;line-height:18px;color:var(--color-text-secondary, #737373);cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:color .2s ease}.action-reply:hover{color:var(--color-text-primary, #1a1a1a)}.action-edit{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:500;line-height:18px;color:var(--color-text-secondary, #737373);cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:color .2s ease}.action-edit:hover{color:var(--color-text-primary, #1a1a1a)}\n"] }]
6610
- }], ctorParameters: () => [], propDecorators: { authorName: [{ type: i0.Input, args: [{ isSignal: true, alias: "authorName", required: true }] }], authorRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "authorRole", required: true }] }], timestamp: [{ type: i0.Input, args: [{ isSignal: true, alias: "timestamp", required: true }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], avatarInitials: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarInitials", required: false }] }], avatarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarType", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], moreActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreActions", required: false }] }], isOwnComment: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOwnComment", required: false }] }], isLiked: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLiked", required: false }] }], likeToggled: [{ type: i0.Output, args: ["likeToggled"] }], likeCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "likeCount", required: false }] }], commentClick: [{ type: i0.Output, args: ["commentClick"] }], replyClick: [{ type: i0.Output, args: ["replyClick"] }], editClick: [{ type: i0.Output, args: ["editClick"] }], longPress: [{ type: i0.Output, args: ["longPress"] }] } });
6618
+ }], ctorParameters: () => [], propDecorators: { authorName: [{ type: i0.Input, args: [{ isSignal: true, alias: "authorName", required: true }] }], authorRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "authorRole", required: true }] }], timestamp: [{ type: i0.Input, args: [{ isSignal: true, alias: "timestamp", required: true }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], avatarInitials: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarInitials", required: false }] }], avatarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarType", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], moreActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreActions", required: false }] }], replyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "replyLabel", required: false }] }], editLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "editLabel", required: false }] }], isOwnComment: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOwnComment", required: false }] }], isLiked: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLiked", required: false }] }], likeToggled: [{ type: i0.Output, args: ["likeToggled"] }], likeCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "likeCount", required: false }] }], commentClick: [{ type: i0.Output, args: ["commentClick"] }], replyClick: [{ type: i0.Output, args: ["replyClick"] }], editClick: [{ type: i0.Output, args: ["editClick"] }], longPress: [{ type: i0.Output, args: ["longPress"] }] } });
6611
6619
 
6612
6620
  /**
6613
6621
  * DsMobilePostComposerComponent
@@ -14230,7 +14238,7 @@ class DsMobilePostDetailModalComponent {
14230
14238
  </div>
14231
14239
  </div>
14232
14240
  </ds-mobile-modal-base>
14233
- `, 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-base);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}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ".post-detail-container{display:flex;flex-direction:column;gap:0;width:100%;padding:0}.post-section{width:100%;border-bottom:none;padding:0}.post-content-only{font-size:var(--font-size-sm);line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px}.post-content-only post-media{margin-top:16px}.post-actions{display:flex;align-items:center;gap:16px}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;-o-object-fit:cover;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}.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}.comment-composer{pointer-events:auto;background:var(--color-background-neutral-primary, #ffffff);border-top:1px solid var(--border-color-default);padding:12px 16px;width:100%;display:flex;flex-direction:column;gap:8px}.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-accent, #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-accent, #6b5ff5)}.cancel-edit{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-accent, #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-accent, #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;overflow-x:hidden;padding:0;margin:0}.composer-input::-moz-placeholder{color:var(--color-text-tertiary, #a0a0a0);font-size:var(--font-size-sm)}.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;opacity:0;transform:translate(20px) scale(.8);pointer-events:none;transition:opacity .15s ease-in,transform .15s ease-in}.send-button-fixed.show{opacity:1;transform:translate(0) scale(1);pointer-events:auto;animation:slideInFromRight var(--spring-bouncy)}@media (prefers-reduced-motion: no-preference){.send-button-fixed{transition:opacity .15s ease-in,transform .15s ease-in}}.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}@keyframes slideInFromRight{0%{opacity:0;transform:translate(20px) scale(.8)}to{opacity:1;transform:translate(0) scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.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$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { 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: 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", "moreActions", "isOwnComment", "isLiked", "likeCount"], outputs: ["likeToggled", "commentClick", "replyClick", "editClick", "longPress"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["showHeader"] }, { kind: "component", type: DsMobileEmptyStateComponent, selector: "ds-mobile-empty-state", inputs: ["imageSrc", "imageAlt", "title", "description"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
14241
+ `, 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-base);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}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ".post-detail-container{display:flex;flex-direction:column;gap:0;width:100%;padding:0}.post-section{width:100%;border-bottom:none;padding:0}.post-content-only{font-size:var(--font-size-sm);line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px}.post-content-only post-media{margin-top:16px}.post-actions{display:flex;align-items:center;gap:16px}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;-o-object-fit:cover;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}.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}.comment-composer{pointer-events:auto;background:var(--color-background-neutral-primary, #ffffff);border-top:1px solid var(--border-color-default);padding:12px 16px;width:100%;display:flex;flex-direction:column;gap:8px}.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-accent, #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-accent, #6b5ff5)}.cancel-edit{background:none;border:none;padding:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--color-accent, #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-accent, #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;overflow-x:hidden;padding:0;margin:0}.composer-input::-moz-placeholder{color:var(--color-text-tertiary, #a0a0a0);font-size:var(--font-size-sm)}.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;opacity:0;transform:translate(20px) scale(.8);pointer-events:none;transition:opacity .15s ease-in,transform .15s ease-in}.send-button-fixed.show{opacity:1;transform:translate(0) scale(1);pointer-events:auto;animation:slideInFromRight var(--spring-bouncy)}@media (prefers-reduced-motion: no-preference){.send-button-fixed{transition:opacity .15s ease-in,transform .15s ease-in}}.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}@keyframes slideInFromRight{0%{opacity:0;transform:translate(20px) scale(.8)}to{opacity:1;transform:translate(0) scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.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$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { 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: 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", "moreActions", "replyLabel", "editLabel", "isOwnComment", "isLiked", "likeCount"], outputs: ["likeToggled", "commentClick", "replyClick", "editClick", "longPress"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["showHeader"] }, { kind: "component", type: DsMobileEmptyStateComponent, selector: "ds-mobile-empty-state", inputs: ["imageSrc", "imageAlt", "title", "description"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
14234
14242
  }
14235
14243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobilePostDetailModalComponent, decorators: [{
14236
14244
  type: Component,
@@ -16647,6 +16655,10 @@ class DsMobileBookingModalComponent {
16647
16655
  * Defaults to 60 (2 months). Override via componentProps when opening the modal.
16648
16656
  */
16649
16657
  daysAhead = 60;
16658
+ selectFromCalendarText = 'Vælg fra kalender';
16659
+ confirmBookingText = 'Bekræft booking';
16660
+ availableDates;
16661
+ availableTimeSlots;
16650
16662
  swiperComponent;
16651
16663
  // Signals for reactive state management
16652
16664
  dateOptions = signal([], ...(ngDevMode ? [{ debugName: "dateOptions" }] : []));
@@ -16709,9 +16721,28 @@ class DsMobileBookingModalComponent {
16709
16721
  };
16710
16722
  }, ...(ngDevMode ? [{ debugName: "dateDisabledFn" }] : []));
16711
16723
  /**
16712
- * Generate mock date and time data
16724
+ * Generate mock date and time data or use provided available data
16713
16725
  */
16714
16726
  generateMockData() {
16727
+ if (this.availableDates && this.availableDates.length > 0) {
16728
+ this.dateOptions.set(this.availableDates);
16729
+ const firstAvailableDate = this.availableDates.find(d => d.state !== 'disabled') || this.availableDates[0];
16730
+ if (firstAvailableDate) {
16731
+ // Ensure strictly one selected
16732
+ const updatedDates = this.availableDates.map(date => ({
16733
+ ...date,
16734
+ state: date.id === firstAvailableDate.id ? 'selected' :
16735
+ (date.state === 'disabled' ? 'disabled' : 'default')
16736
+ }));
16737
+ this.dateOptions.set(updatedDates);
16738
+ const selectedRef = updatedDates.find(d => d.id === firstAvailableDate.id);
16739
+ if (selectedRef) {
16740
+ this.selectedDate.set(selectedRef);
16741
+ this.generateTimeSlots(selectedRef.fullDate, selectedRef.date);
16742
+ }
16743
+ }
16744
+ return;
16745
+ }
16715
16746
  const dates = [];
16716
16747
  const today = new Date();
16717
16748
  const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
@@ -16740,7 +16771,7 @@ class DsMobileBookingModalComponent {
16740
16771
  // Set the first available date as selected and generate time slots for it
16741
16772
  if (firstAvailableDate) {
16742
16773
  this.selectedDate.set(firstAvailableDate);
16743
- this.generateTimeSlots(firstAvailableDate.fullDate);
16774
+ this.generateTimeSlots(firstAvailableDate.fullDate, firstAvailableDate.date);
16744
16775
  }
16745
16776
  else {
16746
16777
  // Fallback to today if no available dates
@@ -16748,9 +16779,13 @@ class DsMobileBookingModalComponent {
16748
16779
  }
16749
16780
  }
16750
16781
  /**
16751
- * Generate time slots based on selected date
16782
+ * Generate time slots based on selected date and dynamic available timeslots
16752
16783
  */
16753
- generateTimeSlots(date) {
16784
+ generateTimeSlots(date, dateStringKey) {
16785
+ if (this.availableTimeSlots && dateStringKey && this.availableTimeSlots[dateStringKey]) {
16786
+ this.timeSlots.set(this.availableTimeSlots[dateStringKey]);
16787
+ return;
16788
+ }
16754
16789
  const slots = [];
16755
16790
  const currentHour = new Date().getHours();
16756
16791
  const isToday = date.toDateString() === new Date().toDateString();
@@ -16789,7 +16824,7 @@ class DsMobileBookingModalComponent {
16789
16824
  this.dateOptions.set(updatedDates);
16790
16825
  this.selectedDate.set(selectedDate);
16791
16826
  // Regenerate time slots for the selected date
16792
- this.generateTimeSlots(selectedDate.fullDate);
16827
+ this.generateTimeSlots(selectedDate.fullDate, selectedDate.date);
16793
16828
  // Reset time selection
16794
16829
  this.selectedTimeSlot.set(null);
16795
16830
  }
@@ -16851,7 +16886,7 @@ class DsMobileBookingModalComponent {
16851
16886
  await this.modalController.dismiss(null, 'cancel');
16852
16887
  }
16853
16888
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileBookingModalComponent, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Component });
16854
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileBookingModalComponent, isStandalone: true, selector: "ds-mobile-booking-modal", inputs: { facilityId: "facilityId", facilityTitle: "facilityTitle", daysAhead: "daysAhead" }, viewQueries: [{ propertyName: "swiperComponent", first: true, predicate: DsMobileSwiperComponent, descendants: true }], ngImport: i0, template: `
16889
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileBookingModalComponent, isStandalone: true, selector: "ds-mobile-booking-modal", inputs: { facilityId: "facilityId", facilityTitle: "facilityTitle", daysAhead: "daysAhead", selectFromCalendarText: "selectFromCalendarText", confirmBookingText: "confirmBookingText", availableDates: "availableDates", availableTimeSlots: "availableTimeSlots" }, viewQueries: [{ propertyName: "swiperComponent", first: true, predicate: DsMobileSwiperComponent, descendants: true }], ngImport: i0, template: `
16855
16890
  <ds-mobile-modal-base
16856
16891
  headerTitle="Hvornår skal det være?"
16857
16892
  [showCloseButton]="true"
@@ -16865,7 +16900,7 @@ class DsMobileBookingModalComponent {
16865
16900
  [isDateDisabled]="dateDisabledFn()"
16866
16901
  (dateChange)="jumpToDate($event)">
16867
16902
  <span class="calendar-link">
16868
- Vælg fra kalender
16903
+ {{ selectFromCalendarText }}
16869
16904
  <ds-icon name="remixArrowRightSLine" size="16px" />
16870
16905
  </span>
16871
16906
  </ds-datepicker>
@@ -16919,7 +16954,7 @@ class DsMobileBookingModalComponent {
16919
16954
  [disabled]="!canConfirm()"
16920
16955
  [loading]="isConfirming()"
16921
16956
  (clicked)="handleConfirm()">
16922
- Bekræft booking
16957
+ {{ confirmBookingText }}
16923
16958
  </ds-button>
16924
16959
  </div>
16925
16960
  </ds-mobile-modal-base>
@@ -16949,7 +16984,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
16949
16984
  [isDateDisabled]="dateDisabledFn()"
16950
16985
  (dateChange)="jumpToDate($event)">
16951
16986
  <span class="calendar-link">
16952
- Vælg fra kalender
16987
+ {{ selectFromCalendarText }}
16953
16988
  <ds-icon name="remixArrowRightSLine" size="16px" />
16954
16989
  </span>
16955
16990
  </ds-datepicker>
@@ -17003,7 +17038,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
17003
17038
  [disabled]="!canConfirm()"
17004
17039
  [loading]="isConfirming()"
17005
17040
  (clicked)="handleConfirm()">
17006
- Bekræft booking
17041
+ {{ confirmBookingText }}
17007
17042
  </ds-button>
17008
17043
  </div>
17009
17044
  </ds-mobile-modal-base>
@@ -17014,6 +17049,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
17014
17049
  type: Input
17015
17050
  }], daysAhead: [{
17016
17051
  type: Input
17052
+ }], selectFromCalendarText: [{
17053
+ type: Input
17054
+ }], confirmBookingText: [{
17055
+ type: Input
17056
+ }], availableDates: [{
17057
+ type: Input
17058
+ }], availableTimeSlots: [{
17059
+ type: Input
17017
17060
  }], swiperComponent: [{
17018
17061
  type: ViewChild,
17019
17062
  args: [DsMobileSwiperComponent]
@@ -17237,22 +17280,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
17237
17280
  type: Input
17238
17281
  }] } });
17239
17282
 
17240
- /**
17241
- * DsMobileBookingModalService
17242
- *
17243
- * Service for managing the booking modal flow:
17244
- * 1. Opens the booking modal for date/time selection
17245
- * 2. On confirmation, opens the confirmation bottom sheet
17246
- *
17247
- * @example
17248
- * ```typescript
17249
- * constructor(private bookingModalService: DsMobileBookingModalService) {}
17250
- *
17251
- * async openBooking() {
17252
- * await this.bookingModalService.open('facility-1', 'Boremaskinen');
17253
- * }
17254
- * ```
17255
- */
17256
17283
  class DsMobileBookingModalService extends BaseModalService {
17257
17284
  constructor(modalController) {
17258
17285
  super(modalController);
@@ -17260,18 +17287,25 @@ class DsMobileBookingModalService extends BaseModalService {
17260
17287
  /**
17261
17288
  * Open the booking modal for a facility
17262
17289
  *
17263
- * @param facilityId The ID of the facility to book
17264
- * @param facilityTitle The display name of the facility
17265
- * @param facilityThumbnail Optional thumbnail image URL
17266
- * @param daysAhead Number of days ahead available for selection (defaults to 14)
17290
+ * @param options The booking modal options including dynamic data and texts
17267
17291
  * @returns Promise that resolves when the booking flow is complete
17268
17292
  */
17269
- async open(facilityId, facilityTitle, facilityThumbnail, daysAhead) {
17270
- const modal = await this.createModal(DsMobileBookingModalComponent, {
17271
- facilityId,
17272
- facilityTitle,
17273
- ...(daysAhead !== undefined && { daysAhead })
17274
- }, { keyboardClose: true });
17293
+ async open(options) {
17294
+ const componentProps = {
17295
+ facilityId: options.facilityId,
17296
+ facilityTitle: options.facilityTitle,
17297
+ };
17298
+ if (options.daysAhead !== undefined)
17299
+ componentProps.daysAhead = options.daysAhead;
17300
+ if (options.availableDates !== undefined)
17301
+ componentProps.availableDates = options.availableDates;
17302
+ if (options.availableTimeSlots !== undefined)
17303
+ componentProps.availableTimeSlots = options.availableTimeSlots;
17304
+ if (options.labels?.selectFromCalendar)
17305
+ componentProps.selectFromCalendarText = options.labels.selectFromCalendar;
17306
+ if (options.labels?.confirmBooking)
17307
+ componentProps.confirmBookingText = options.labels.confirmBooking;
17308
+ const modal = await this.createModal(DsMobileBookingModalComponent, componentProps, { keyboardClose: true });
17275
17309
  await modal.present();
17276
17310
  const result = await modal.onWillDismiss();
17277
17311
  // If user confirmed the booking, dismiss all modals and show confirmation sheet
@@ -17279,7 +17313,7 @@ class DsMobileBookingModalService extends BaseModalService {
17279
17313
  // Dismiss all open modals (booking modal + facility detail modal)
17280
17314
  await this.dismissAllModals();
17281
17315
  // Show confirmation sheet after all modals are dismissed
17282
- await this.openConfirmationSheet(result.data, facilityThumbnail);
17316
+ await this.openConfirmationSheet(result.data, options.facilityThumbnail);
17283
17317
  }
17284
17318
  }
17285
17319
  /**
@@ -19128,7 +19162,11 @@ class DsMobileFacilityDetailModalComponent {
19128
19162
  * Opens the booking modal for date/time selection
19129
19163
  */
19130
19164
  async handleBookNow() {
19131
- await this.bookingModalService.open(this.facilityData.id, this.facilityData.facilityTitle, this.facilityData.heroImage);
19165
+ await this.bookingModalService.open({
19166
+ facilityId: this.facilityData.id,
19167
+ facilityTitle: this.facilityData.facilityTitle,
19168
+ facilityThumbnail: this.facilityData.heroImage
19169
+ });
19132
19170
  }
19133
19171
  /**
19134
19172
  * Close the modal
@@ -19637,7 +19675,7 @@ class DsMobileHandbookDetailModalComponent {
19637
19675
  @for (item of getDisplayItems(); track item.title + $index) {
19638
19676
  <ds-mobile-section [headline]="item.title || ''" contentGap="20px">
19639
19677
  @if (item.description) {
19640
- <p class="item-description" [innerHTML]="item.description"></p>
19678
+ <div class="item-description" [innerHTML]="item.description"></div>
19641
19679
  }
19642
19680
 
19643
19681
  <!-- Images -->
@@ -19694,7 +19732,7 @@ class DsMobileHandbookDetailModalComponent {
19694
19732
  </ds-mobile-section>
19695
19733
  }
19696
19734
  </ds-mobile-modal-base>
19697
- `, isInline: true, styles: [".handbook-detail-container{display:flex;flex-direction:column;width:100%;flex:1}.handbook-item{width:100%;display:flex;flex-direction:column;gap:24px;padding:0;border-bottom:none}.handbook-item.last-item{border-bottom:none}.item-text-group{display:flex;flex-direction:column;gap:8px}.item-title{font-family:Brockmann,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:20px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-image{width:100%;max-width:100%;height:280px;-o-object-fit:cover;object-fit:cover;border-radius:12px;display:block}.contacts-attachments-group{display:flex;flex-direction:column;gap:8px}.handbook-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}.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)}.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)}@supports (padding: env(safe-area-inset-bottom)){.handbook-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsMobileHandbookFolderMiniComponent, selector: "ds-mobile-handbook-folder-mini", inputs: ["variant", "customColor", "iconName"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "contactPerson", "phoneNumber", "layout", "clickable", "showChevron"], outputs: ["contactClick"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["showHeader"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
19735
+ `, isInline: true, styles: [".handbook-detail-container{display:flex;flex-direction:column;width:100%;flex:1}.handbook-item{width:100%;display:flex;flex-direction:column;gap:24px;padding:0;border-bottom:none}.handbook-item.last-item{border-bottom:none}.item-text-group{display:flex;flex-direction:column;gap:8px}.item-title{font-family:Brockmann,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin:0}::ng-deep .item-description p{margin:0 0 12px}::ng-deep .item-description p:last-child{margin-bottom:0}::ng-deep .item-description strong,::ng-deep .item-description b{font-weight:600}::ng-deep .item-description em,::ng-deep .item-description i{font-style:italic}::ng-deep .item-description u{text-decoration:underline;text-underline-offset:2px}::ng-deep .item-description h1,::ng-deep .item-description h2,::ng-deep .item-description h3,::ng-deep .item-description h4{font-family:Brockmann,sans-serif;font-weight:600;line-height:1.4;color:var(--color-text-primary, #1a1a1a);margin:0;padding-top:16px;padding-bottom:4px}::ng-deep .item-description h1:first-child,::ng-deep .item-description h2:first-child,::ng-deep .item-description h3:first-child,::ng-deep .item-description h4:first-child{padding-top:0}::ng-deep .item-description h1{font-size:var(--font-size-xl, 20px)}::ng-deep .item-description h2{font-size:var(--font-size-lg, 18px)}::ng-deep .item-description h3,::ng-deep .item-description h4{font-size:var(--font-size-base, 16px)}::ng-deep .item-description ul,::ng-deep .item-description ol{padding-left:20px;margin:0 0 12px}::ng-deep .item-description ul:last-child,::ng-deep .item-description ol:last-child{margin-bottom:0}::ng-deep .item-description li{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin-bottom:4px}::ng-deep .item-description li:last-child{margin-bottom:0}.item-image{width:100%;max-width:100%;height:280px;-o-object-fit:cover;object-fit:cover;border-radius:12px;display:block}.contacts-attachments-group{display:flex;flex-direction:column;gap:8px}.handbook-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}.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)}.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)}@supports (padding: env(safe-area-inset-bottom)){.handbook-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsMobileHandbookFolderMiniComponent, selector: "ds-mobile-handbook-folder-mini", inputs: ["variant", "customColor", "iconName"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "contactPerson", "phoneNumber", "layout", "clickable", "showChevron"], outputs: ["contactClick"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["showHeader"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
19698
19736
  }
19699
19737
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileHandbookDetailModalComponent, decorators: [{
19700
19738
  type: Component,
@@ -19717,7 +19755,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
19717
19755
  @for (item of getDisplayItems(); track item.title + $index) {
19718
19756
  <ds-mobile-section [headline]="item.title || ''" contentGap="20px">
19719
19757
  @if (item.description) {
19720
- <p class="item-description" [innerHTML]="item.description"></p>
19758
+ <div class="item-description" [innerHTML]="item.description"></div>
19721
19759
  }
19722
19760
 
19723
19761
  <!-- Images -->
@@ -19774,7 +19812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
19774
19812
  </ds-mobile-section>
19775
19813
  }
19776
19814
  </ds-mobile-modal-base>
19777
- `, styles: [".handbook-detail-container{display:flex;flex-direction:column;width:100%;flex:1}.handbook-item{width:100%;display:flex;flex-direction:column;gap:24px;padding:0;border-bottom:none}.handbook-item.last-item{border-bottom:none}.item-text-group{display:flex;flex-direction:column;gap:8px}.item-title{font-family:Brockmann,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:20px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-image{width:100%;max-width:100%;height:280px;-o-object-fit:cover;object-fit:cover;border-radius:12px;display:block}.contacts-attachments-group{display:flex;flex-direction:column;gap:8px}.handbook-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}.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)}.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)}@supports (padding: env(safe-area-inset-bottom)){.handbook-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}\n"] }]
19815
+ `, styles: [".handbook-detail-container{display:flex;flex-direction:column;width:100%;flex:1}.handbook-item{width:100%;display:flex;flex-direction:column;gap:24px;padding:0;border-bottom:none}.handbook-item.last-item{border-bottom:none}.item-text-group{display:flex;flex-direction:column;gap:8px}.item-title{font-family:Brockmann,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin:0}::ng-deep .item-description p{margin:0 0 12px}::ng-deep .item-description p:last-child{margin-bottom:0}::ng-deep .item-description strong,::ng-deep .item-description b{font-weight:600}::ng-deep .item-description em,::ng-deep .item-description i{font-style:italic}::ng-deep .item-description u{text-decoration:underline;text-underline-offset:2px}::ng-deep .item-description h1,::ng-deep .item-description h2,::ng-deep .item-description h3,::ng-deep .item-description h4{font-family:Brockmann,sans-serif;font-weight:600;line-height:1.4;color:var(--color-text-primary, #1a1a1a);margin:0;padding-top:16px;padding-bottom:4px}::ng-deep .item-description h1:first-child,::ng-deep .item-description h2:first-child,::ng-deep .item-description h3:first-child,::ng-deep .item-description h4:first-child{padding-top:0}::ng-deep .item-description h1{font-size:var(--font-size-xl, 20px)}::ng-deep .item-description h2{font-size:var(--font-size-lg, 18px)}::ng-deep .item-description h3,::ng-deep .item-description h4{font-size:var(--font-size-base, 16px)}::ng-deep .item-description ul,::ng-deep .item-description ol{padding-left:20px;margin:0 0 12px}::ng-deep .item-description ul:last-child,::ng-deep .item-description ol:last-child{margin-bottom:0}::ng-deep .item-description li{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin-bottom:4px}::ng-deep .item-description li:last-child{margin-bottom:0}.item-image{width:100%;max-width:100%;height:280px;-o-object-fit:cover;object-fit:cover;border-radius:12px;display:block}.contacts-attachments-group{display:flex;flex-direction:column;gap:8px}.handbook-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}.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)}.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)}@supports (padding: env(safe-area-inset-bottom)){.handbook-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}\n"] }]
19778
19816
  }], ctorParameters: () => [{ type: i1.ModalController }], propDecorators: { handbookData: [{
19779
19817
  type: Input
19780
19818
  }], loading: [{
@@ -21992,7 +22030,7 @@ class MobileHandbookPageComponent {
21992
22030
  utilitiesItems = [
21993
22031
  {
21994
22032
  title: 'El',
21995
- description: 'Hovedeltavle placeret i kælderrum B-12. Nødafbryderknap er ved hovedindgangen. Alle kredsløb er mærket.',
22033
+ description: '<p>Hovedeltavle placeret i <strong>kælderrum B-12</strong>. Nødafbryderknap er ved hovedindgangen. Alle kredsløb er mærket.</p><p><em>Bemærk: Der må ikke foretages ændringer på eltavlen uden tilladelse fra ejendomsadministrationen.</em></p><p>Ved <u>strømsvigt</u> kontakt venligst ElektroTek ApS på nedenstående nummer.</p>',
21996
22034
  contacts: [
21997
22035
  {
21998
22036
  name: 'ElektroTek ApS',
@@ -22009,7 +22047,7 @@ class MobileHandbookPageComponent {
22009
22047
  },
22010
22048
  {
22011
22049
  title: 'Vandforsyning',
22012
- description: 'Hovedvandhane er placeret i kælderens tekniske rum. Individuelle lejlighedsafspærringer er i gangpanelerne. Vandtryk overvåges automatisk.',
22050
+ description: '<p>Hovedvandhane er placeret i kælderens <strong>tekniske rum</strong>. Individuelle lejlighedsafspærringer er i gangpanelerne.</p><p>Vandtryk overvåges <em>automatisk</em> af bygningens system.</p><p><strong><em>Vigtigt:</em></strong> Ved vandskade, luk <u>straks</u> for hovedvandhanen og kontakt VVS Hansen.</p>',
22013
22051
  contacts: [
22014
22052
  {
22015
22053
  name: 'VVS Hansen',
@@ -22021,7 +22059,7 @@ class MobileHandbookPageComponent {
22021
22059
  },
22022
22060
  {
22023
22061
  title: 'Varmesystem',
22024
- description: 'Fjernvarmetilslutning i kælder. Termostater i hver enhed kan justeres individuelt. Systemet vedligeholdes kvartalsvis af certificerede teknikere.',
22062
+ description: '<p>Fjernvarmetilslutning i kælder. Termostater i hver enhed kan justeres individuelt.</p><p>Systemet vedligeholdes <strong>kvartalsvis</strong> af certificerede teknikere.</p><p><em>Tip: Sæt termostaten til 21°C for optimal komfort og energibesparelse.</em></p>',
22025
22063
  contacts: [
22026
22064
  {
22027
22065
  name: 'Varme Service A/S',
@@ -25682,7 +25720,7 @@ class MobilePostDetailPageComponent {
25682
25720
  </div>
25683
25721
  </div>
25684
25722
  </ds-mobile-page-details>
25685
- `, isInline: true, styles: [".post-detail-container{display:flex;flex-direction:column;gap:16px;max-width:640px}.post-section{border-bottom:1px solid var(--border-color-default);padding-bottom:16px}.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:-8px;margin-right:-8px}.comments-header{font-family:Brockmann,sans-serif;font-size:18px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px;padding-left:8px;padding-right:8px}.comments-list{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "component", type: DsMobilePageDetailsComponent, selector: "ds-mobile-page-details", inputs: ["title", "backRoute", "contentPadding", "tabs", "activeTab", "showRefresh", "scrollThreshold", "headerFadeDistance"], outputs: ["back", "tabChange", "refresh", "scroll"] }, { kind: "component", type: DsMobileInteractiveListItemPostComponent, selector: "ds-mobile-interactive-list-item-post", inputs: ["authorName", "authorRole", "timestamp", "avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "showBadge", "variant", "align", "clickable", "enableLongPress", "moreActions"], outputs: ["postClick", "commentClick", "longPress"] }, { kind: "component", type: PostContentComponent, selector: "post-content" }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostMediaComponent, selector: "post-media" }, { kind: "component", type: PostActionsComponent, selector: "post-actions" }, { 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", "moreActions", "isOwnComment", "isLiked", "likeCount"], outputs: ["likeToggled", "commentClick", "replyClick", "editClick", "longPress"] }] });
25723
+ `, isInline: true, styles: [".post-detail-container{display:flex;flex-direction:column;gap:16px;max-width:640px}.post-section{border-bottom:1px solid var(--border-color-default);padding-bottom:16px}.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:-8px;margin-right:-8px}.comments-header{font-family:Brockmann,sans-serif;font-size:18px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin-bottom:16px;padding-left:8px;padding-right:8px}.comments-list{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "component", type: DsMobilePageDetailsComponent, selector: "ds-mobile-page-details", inputs: ["title", "backRoute", "contentPadding", "tabs", "activeTab", "showRefresh", "scrollThreshold", "headerFadeDistance"], outputs: ["back", "tabChange", "refresh", "scroll"] }, { kind: "component", type: DsMobileInteractiveListItemPostComponent, selector: "ds-mobile-interactive-list-item-post", inputs: ["authorName", "authorRole", "timestamp", "avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "showBadge", "variant", "align", "clickable", "enableLongPress", "moreActions"], outputs: ["postClick", "commentClick", "longPress"] }, { kind: "component", type: PostContentComponent, selector: "post-content" }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostMediaComponent, selector: "post-media" }, { kind: "component", type: PostActionsComponent, selector: "post-actions" }, { 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", "moreActions", "replyLabel", "editLabel", "isOwnComment", "isLiked", "likeCount"], outputs: ["likeToggled", "commentClick", "replyClick", "editClick", "longPress"] }] });
25686
25724
  }
25687
25725
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobilePostDetailPageComponent, decorators: [{
25688
25726
  type: Component,