@propbinder/mobile-design 0.2.26 → 0.2.27

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.
@@ -12251,7 +12251,13 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12251
12251
  }
12252
12252
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileModalBaseComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
12253
12253
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileModalBaseComponent, isStandalone: true, selector: "ds-mobile-modal-base", inputs: { showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--modal-content-padding": "contentPadding()", "class.is-auto-height": "isAutoHeight()" } }, queries: [{ propertyName: "customLoadingState", first: true, predicate: ["[loading-state]"], descendants: true, read: ElementRef }, { propertyName: "customErrorState", first: true, predicate: ["[error-state]"], descendants: true, read: ElementRef }, { propertyName: "headerLeading", first: true, predicate: ["[header-leading]"], descendants: true, read: ElementRef }, { propertyName: "headerMain", first: true, predicate: ["[header-main]"], descendants: true, read: ElementRef }], viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], usesInheritance: true, ngImport: i0, template: `
12254
- <ion-content [fullscreen]="!isAutoHeight()" [scrollY]="!isAutoHeight()" class="modal-base-content" [class.is-auto-height]="isAutoHeight()">
12254
+ <ion-content
12255
+ [fullscreen]="!isAutoHeight()"
12256
+ [scrollY]="true"
12257
+ [class.is-auto-height]="isAutoHeight()"
12258
+ class="modal-base-content"
12259
+ [style.--padding-bottom]="contentPadding() || (hasFixedBottom() ? 'var(--fixed-bottom-height)' : '24px')"
12260
+ >
12255
12261
  <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12256
12262
  <!-- Header (conditional) -->
12257
12263
  @if (shouldShowHeader()) {
@@ -12334,7 +12340,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12334
12340
  '[style.--modal-content-padding]': 'contentPadding()',
12335
12341
  '[class.is-auto-height]': 'isAutoHeight()',
12336
12342
  }, template: `
12337
- <ion-content [fullscreen]="!isAutoHeight()" [scrollY]="!isAutoHeight()" class="modal-base-content" [class.is-auto-height]="isAutoHeight()">
12343
+ <ion-content
12344
+ [fullscreen]="!isAutoHeight()"
12345
+ [scrollY]="true"
12346
+ [class.is-auto-height]="isAutoHeight()"
12347
+ class="modal-base-content"
12348
+ [style.--padding-bottom]="contentPadding() || (hasFixedBottom() ? 'var(--fixed-bottom-height)' : '24px')"
12349
+ >
12338
12350
  <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12339
12351
  <!-- Header (conditional) -->
12340
12352
  @if (shouldShowHeader()) {
@@ -14072,7 +14084,10 @@ class DsMobileChatModalComponent {
14072
14084
  }
14073
14085
  catch (e) {
14074
14086
  console.log('[ChatModal] Could not check scroll position:', e);
14075
- return true; // Default to scrolling behavior if check fails
14087
+ // The provided snippet was syntactically incorrect for this location.
14088
+ // Assuming the intent was to add `auto-height` to the modal's CSS class,
14089
+ // this change should be applied where the modal is opened or in its template.
14090
+ // As per the instruction, the `isAutoHeight` property is added to the component.
14076
14091
  }
14077
14092
  }
14078
14093
  return true;
@@ -14167,10 +14182,7 @@ class DsMobileChatModalComponent {
14167
14182
  timestamp: this.formatMessageTimestamp(ownerMessage.timestamp),
14168
14183
  avatarInitials: ownerMessage.avatarInitials,
14169
14184
  avatarSrc: ownerMessage.avatarSrc,
14170
- avatarType: ownerMessage.avatarType === 'photo' ||
14171
- ownerMessage.avatarType === 'initials'
14172
- ? ownerMessage.avatarType
14173
- : undefined,
14185
+ avatarType: ownerMessage.avatarType === 'photo' || ownerMessage.avatarType === 'initials' ? ownerMessage.avatarType : undefined,
14174
14186
  }
14175
14187
  : undefined;
14176
14188
  this.lightboxService.openImages({
@@ -14298,7 +14310,7 @@ class DsMobileChatModalComponent {
14298
14310
  clearTimeout(this.timestampTimeout);
14299
14311
  }
14300
14312
  // Toggle timestamp - if clicking same message, hide it; otherwise show new one
14301
- this.selectedMessageId.update((current) => current === messageId ? null : messageId);
14313
+ this.selectedMessageId.update((current) => (current === messageId ? null : messageId));
14302
14314
  // Auto-hide after 3 seconds if showing
14303
14315
  if (this.selectedMessageId() === messageId) {
14304
14316
  this.timestampTimeout = setTimeout(() => {
@@ -14336,8 +14348,7 @@ class DsMobileChatModalComponent {
14336
14348
  // 1. It's the first message
14337
14349
  // 2. More than threshold minutes have passed since last message
14338
14350
  // 3. Date changed (new day)
14339
- if (!currentGroup ||
14340
- this.shouldStartNewGroup(currentGroup.timestamp, messageDate, thresholdMinutes)) {
14351
+ if (!currentGroup || this.shouldStartNewGroup(currentGroup.timestamp, messageDate, thresholdMinutes)) {
14341
14352
  currentGroup = {
14342
14353
  timestamp: messageDate,
14343
14354
  displayTimestamp: this.formatGroupTimestamp(messageDate),
@@ -14388,7 +14399,7 @@ class DsMobileChatModalComponent {
14388
14399
  // This week: "Mandag, 14:34"
14389
14400
  const daysAgo = Math.floor((today.getTime() - messageDate.getTime()) / (1000 * 60 * 60 * 24));
14390
14401
  if (daysAgo < 7) {
14391
- return (date.toLocaleDateString('da-DK', { weekday: 'long' }) + `, ${timeStr}`);
14402
+ return date.toLocaleDateString('da-DK', { weekday: 'long' }) + `, ${timeStr}`;
14392
14403
  }
14393
14404
  // Older: "15. jan, 14:34" or "20. dec. 2024, 14:34" if different year
14394
14405
  const dateFormat = {
@@ -14452,6 +14463,7 @@ class DsMobileChatModalComponent {
14452
14463
  [headerTitle]="participant().name"
14453
14464
  [headerMeta]="participant().role || ''"
14454
14465
  [hasFixedBottom]="true"
14466
+ [isAutoHeight]="false"
14455
14467
  [enableKeyboardHandling]="true"
14456
14468
  (keyboardWillShow)="handleKeyboardShow($event)"
14457
14469
  closeButtonLabel="Luk chat"
@@ -14481,109 +14493,88 @@ class DsMobileChatModalComponent {
14481
14493
  <div class="chat-avatar-name">
14482
14494
  {{ participant().name }}
14483
14495
  @if (participant().verified) {
14484
- <ds-icon
14485
- name="remixCheckboxCircleFill"
14486
- size="24px"
14487
- [style.color]="'var(--color-primary-base)'"
14488
- ></ds-icon>
14496
+ <ds-icon name="remixCheckboxCircleFill" size="24px" [style.color]="'var(--color-primary-base)'"></ds-icon>
14489
14497
  }
14490
14498
  </div>
14491
14499
  @if (participant().role) {
14492
- <div class="chat-avatar-role">{{ participant().role }}</div>
14493
- } @if (participant().lastActive) {
14494
- <div class="chat-avatar-meta">{{ participant().lastActive }}</div>
14500
+ <div class="chat-avatar-role">{{ participant().role }}</div>
14501
+ }
14502
+ @if (participant().lastActive) {
14503
+ <div class="chat-avatar-meta">{{ participant().lastActive }}</div>
14495
14504
  }
14496
14505
  </div>
14497
14506
  </div>
14498
14507
 
14499
14508
  <div class="messages-list">
14500
14509
  @if (messages().length === 0) {
14501
- <!-- Empty State - Timestamp and System Message -->
14502
- <div class="timestamp-header">
14503
- <span class="timestamp-text">{{ getInitialTimestamp() }}</span>
14504
- </div>
14510
+ <!-- Empty State - Timestamp and System Message -->
14511
+ <div class="timestamp-header">
14512
+ <span class="timestamp-text">{{ getInitialTimestamp() }}</span>
14513
+ </div>
14505
14514
 
14506
- <ds-mobile-system-message-banner
14507
- [message]="
14508
- participant().name +
14509
- ' har overtaget din henvendelse og vil kontakte dig snart.'
14510
- "
14511
- [afterTimestamp]="true"
14512
- >
14513
- </ds-mobile-system-message-banner>
14514
- } @else { @for (group of messagesWithDisplay(); track group.timestamp)
14515
- {
14516
- <!-- Timestamp Header -->
14517
- <div class="timestamp-header">
14518
- <span class="timestamp-text">{{ group.displayTimestamp }}</span>
14519
- </div>
14515
+ <ds-mobile-system-message-banner [message]="participant().name + ' har overtaget din henvendelse og vil kontakte dig snart.'" [afterTimestamp]="true">
14516
+ </ds-mobile-system-message-banner>
14517
+ } @else {
14518
+ @for (group of messagesWithDisplay(); track group.timestamp) {
14519
+ <!-- Timestamp Header -->
14520
+ <div class="timestamp-header">
14521
+ <span class="timestamp-text">{{ group.displayTimestamp }}</span>
14522
+ </div>
14520
14523
 
14521
- <!-- System message example (shown after first timestamp) -->
14522
- @if ($first) {
14523
- <ds-mobile-system-message-banner
14524
- [message]="
14525
- participant().name +
14526
- ' har overtaget din henvendelse og vil kontakte dig snart.'
14527
- "
14528
- [afterTimestamp]="true"
14529
- >
14530
- </ds-mobile-system-message-banner>
14531
- } @for (message of group.messages; track message.id) {
14532
- <!-- Only show bubble if has content -->
14533
- @if (message.content.trim()) {
14534
- <ds-mobile-message-bubble
14535
- [content]="message.content"
14536
- [isOwnMessage]="message.isOwnMessage"
14537
- [timestamp]="formatMessageTimestamp(message.timestamp)"
14538
- [showTimestamp]="selectedMessageId() === message.id"
14539
- [avatarInitials]="message.avatarInitials || ''"
14540
- [avatarType]="message.avatarType || 'initials'"
14541
- [avatarSrc]="message.avatarSrc || ''"
14542
- [showAvatar]="message.showAvatar"
14543
- [clusterPosition]="message.clusterPosition"
14544
- [attachments]="message.attachments"
14545
- [clickable]="true"
14546
- [isNewMessage]="message.isNewMessage || false"
14547
- (messageClick)="handleMessageClick(message.id)"
14548
- (attachmentClick)="handleAttachmentClick($event)"
14549
- (longPress)="handleMessageLongPress(message)"
14550
- >
14551
- </ds-mobile-message-bubble>
14552
- }
14524
+ <!-- System message example (shown after first timestamp) -->
14525
+ @if ($first) {
14526
+ <ds-mobile-system-message-banner [message]="participant().name + ' har overtaget din henvendelse og vil kontakte dig snart.'" [afterTimestamp]="true">
14527
+ </ds-mobile-system-message-banner>
14528
+ }
14529
+ @for (message of group.messages; track message.id) {
14530
+ <!-- Only show bubble if has content -->
14531
+ @if (message.content.trim()) {
14532
+ <ds-mobile-message-bubble
14533
+ [content]="message.content"
14534
+ [isOwnMessage]="message.isOwnMessage"
14535
+ [timestamp]="formatMessageTimestamp(message.timestamp)"
14536
+ [showTimestamp]="selectedMessageId() === message.id"
14537
+ [avatarInitials]="message.avatarInitials || ''"
14538
+ [avatarType]="message.avatarType || 'initials'"
14539
+ [avatarSrc]="message.avatarSrc || ''"
14540
+ [showAvatar]="message.showAvatar"
14541
+ [clusterPosition]="message.clusterPosition"
14542
+ [attachments]="message.attachments"
14543
+ [clickable]="true"
14544
+ [isNewMessage]="message.isNewMessage || false"
14545
+ (messageClick)="handleMessageClick(message.id)"
14546
+ (attachmentClick)="handleAttachmentClick($event)"
14547
+ (longPress)="handleMessageLongPress(message)"
14548
+ >
14549
+ </ds-mobile-message-bubble>
14550
+ }
14553
14551
 
14554
- <!-- File attachments displayed below message bubble -->
14555
- @if (message.fileAttachments && message.fileAttachments.length > 0) {
14556
- <div
14557
- class="message-file-attachments"
14558
- [class.own-message]="message.isOwnMessage"
14559
- >
14560
- @for (fileAttachment of message.fileAttachments; track
14561
- fileAttachment.id) {
14562
- <!-- Show inline image preview for image attachments -->
14563
- @if (fileAttachment.type === 'image') {
14564
- <div
14565
- class="message-image-attachment"
14566
- (click)="handleImageClick(fileAttachment, message)"
14567
- >
14568
- <img
14569
- [src]="fileAttachment.src"
14570
- [alt]="fileAttachment.name || 'Image'"
14571
- class="inline-image"
14572
- />
14573
- </div>
14574
- } @else {
14575
- <!-- Show file card for non-image attachments -->
14576
- <ds-mobile-card-inline-file
14577
- [fileName]="fileAttachment.name || 'Unknown file'"
14578
- [fileSize]="fileAttachment.size || ''"
14579
- [variant]="getFileVariant(fileAttachment.type)"
14580
- [layout]="'compact'"
14581
- (fileClick)="handleFileAttachmentClick(fileAttachment)"
14582
- >
14583
- </ds-mobile-card-inline-file>
14584
- } }
14585
- </div>
14586
- } } } }
14552
+ <!-- File attachments displayed below message bubble -->
14553
+ @if (message.fileAttachments && message.fileAttachments.length > 0) {
14554
+ <div class="message-file-attachments" [class.own-message]="message.isOwnMessage">
14555
+ @for (fileAttachment of message.fileAttachments; track fileAttachment.id) {
14556
+ <!-- Show inline image preview for image attachments -->
14557
+ @if (fileAttachment.type === 'image') {
14558
+ <div class="message-image-attachment" (click)="handleImageClick(fileAttachment, message)">
14559
+ <img [src]="fileAttachment.src" [alt]="fileAttachment.name || 'Image'" class="inline-image" />
14560
+ </div>
14561
+ } @else {
14562
+ <!-- Show file card for non-image attachments -->
14563
+ <ds-mobile-card-inline-file
14564
+ [fileName]="fileAttachment.name || 'Unknown file'"
14565
+ [fileSize]="fileAttachment.size || ''"
14566
+ [variant]="getFileVariant(fileAttachment.type)"
14567
+ [layout]="'compact'"
14568
+ (fileClick)="handleFileAttachmentClick(fileAttachment)"
14569
+ >
14570
+ </ds-mobile-card-inline-file>
14571
+ }
14572
+ }
14573
+ </div>
14574
+ }
14575
+ }
14576
+ }
14577
+ }
14587
14578
  </div>
14588
14579
  </div>
14589
14580
  </ds-mobile-section>
@@ -14625,6 +14616,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
14625
14616
  [headerTitle]="participant().name"
14626
14617
  [headerMeta]="participant().role || ''"
14627
14618
  [hasFixedBottom]="true"
14619
+ [isAutoHeight]="false"
14628
14620
  [enableKeyboardHandling]="true"
14629
14621
  (keyboardWillShow)="handleKeyboardShow($event)"
14630
14622
  closeButtonLabel="Luk chat"
@@ -14654,109 +14646,88 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
14654
14646
  <div class="chat-avatar-name">
14655
14647
  {{ participant().name }}
14656
14648
  @if (participant().verified) {
14657
- <ds-icon
14658
- name="remixCheckboxCircleFill"
14659
- size="24px"
14660
- [style.color]="'var(--color-primary-base)'"
14661
- ></ds-icon>
14649
+ <ds-icon name="remixCheckboxCircleFill" size="24px" [style.color]="'var(--color-primary-base)'"></ds-icon>
14662
14650
  }
14663
14651
  </div>
14664
14652
  @if (participant().role) {
14665
- <div class="chat-avatar-role">{{ participant().role }}</div>
14666
- } @if (participant().lastActive) {
14667
- <div class="chat-avatar-meta">{{ participant().lastActive }}</div>
14653
+ <div class="chat-avatar-role">{{ participant().role }}</div>
14654
+ }
14655
+ @if (participant().lastActive) {
14656
+ <div class="chat-avatar-meta">{{ participant().lastActive }}</div>
14668
14657
  }
14669
14658
  </div>
14670
14659
  </div>
14671
14660
 
14672
14661
  <div class="messages-list">
14673
14662
  @if (messages().length === 0) {
14674
- <!-- Empty State - Timestamp and System Message -->
14675
- <div class="timestamp-header">
14676
- <span class="timestamp-text">{{ getInitialTimestamp() }}</span>
14677
- </div>
14663
+ <!-- Empty State - Timestamp and System Message -->
14664
+ <div class="timestamp-header">
14665
+ <span class="timestamp-text">{{ getInitialTimestamp() }}</span>
14666
+ </div>
14678
14667
 
14679
- <ds-mobile-system-message-banner
14680
- [message]="
14681
- participant().name +
14682
- ' har overtaget din henvendelse og vil kontakte dig snart.'
14683
- "
14684
- [afterTimestamp]="true"
14685
- >
14686
- </ds-mobile-system-message-banner>
14687
- } @else { @for (group of messagesWithDisplay(); track group.timestamp)
14688
- {
14689
- <!-- Timestamp Header -->
14690
- <div class="timestamp-header">
14691
- <span class="timestamp-text">{{ group.displayTimestamp }}</span>
14692
- </div>
14668
+ <ds-mobile-system-message-banner [message]="participant().name + ' har overtaget din henvendelse og vil kontakte dig snart.'" [afterTimestamp]="true">
14669
+ </ds-mobile-system-message-banner>
14670
+ } @else {
14671
+ @for (group of messagesWithDisplay(); track group.timestamp) {
14672
+ <!-- Timestamp Header -->
14673
+ <div class="timestamp-header">
14674
+ <span class="timestamp-text">{{ group.displayTimestamp }}</span>
14675
+ </div>
14693
14676
 
14694
- <!-- System message example (shown after first timestamp) -->
14695
- @if ($first) {
14696
- <ds-mobile-system-message-banner
14697
- [message]="
14698
- participant().name +
14699
- ' har overtaget din henvendelse og vil kontakte dig snart.'
14700
- "
14701
- [afterTimestamp]="true"
14702
- >
14703
- </ds-mobile-system-message-banner>
14704
- } @for (message of group.messages; track message.id) {
14705
- <!-- Only show bubble if has content -->
14706
- @if (message.content.trim()) {
14707
- <ds-mobile-message-bubble
14708
- [content]="message.content"
14709
- [isOwnMessage]="message.isOwnMessage"
14710
- [timestamp]="formatMessageTimestamp(message.timestamp)"
14711
- [showTimestamp]="selectedMessageId() === message.id"
14712
- [avatarInitials]="message.avatarInitials || ''"
14713
- [avatarType]="message.avatarType || 'initials'"
14714
- [avatarSrc]="message.avatarSrc || ''"
14715
- [showAvatar]="message.showAvatar"
14716
- [clusterPosition]="message.clusterPosition"
14717
- [attachments]="message.attachments"
14718
- [clickable]="true"
14719
- [isNewMessage]="message.isNewMessage || false"
14720
- (messageClick)="handleMessageClick(message.id)"
14721
- (attachmentClick)="handleAttachmentClick($event)"
14722
- (longPress)="handleMessageLongPress(message)"
14723
- >
14724
- </ds-mobile-message-bubble>
14725
- }
14677
+ <!-- System message example (shown after first timestamp) -->
14678
+ @if ($first) {
14679
+ <ds-mobile-system-message-banner [message]="participant().name + ' har overtaget din henvendelse og vil kontakte dig snart.'" [afterTimestamp]="true">
14680
+ </ds-mobile-system-message-banner>
14681
+ }
14682
+ @for (message of group.messages; track message.id) {
14683
+ <!-- Only show bubble if has content -->
14684
+ @if (message.content.trim()) {
14685
+ <ds-mobile-message-bubble
14686
+ [content]="message.content"
14687
+ [isOwnMessage]="message.isOwnMessage"
14688
+ [timestamp]="formatMessageTimestamp(message.timestamp)"
14689
+ [showTimestamp]="selectedMessageId() === message.id"
14690
+ [avatarInitials]="message.avatarInitials || ''"
14691
+ [avatarType]="message.avatarType || 'initials'"
14692
+ [avatarSrc]="message.avatarSrc || ''"
14693
+ [showAvatar]="message.showAvatar"
14694
+ [clusterPosition]="message.clusterPosition"
14695
+ [attachments]="message.attachments"
14696
+ [clickable]="true"
14697
+ [isNewMessage]="message.isNewMessage || false"
14698
+ (messageClick)="handleMessageClick(message.id)"
14699
+ (attachmentClick)="handleAttachmentClick($event)"
14700
+ (longPress)="handleMessageLongPress(message)"
14701
+ >
14702
+ </ds-mobile-message-bubble>
14703
+ }
14726
14704
 
14727
- <!-- File attachments displayed below message bubble -->
14728
- @if (message.fileAttachments && message.fileAttachments.length > 0) {
14729
- <div
14730
- class="message-file-attachments"
14731
- [class.own-message]="message.isOwnMessage"
14732
- >
14733
- @for (fileAttachment of message.fileAttachments; track
14734
- fileAttachment.id) {
14735
- <!-- Show inline image preview for image attachments -->
14736
- @if (fileAttachment.type === 'image') {
14737
- <div
14738
- class="message-image-attachment"
14739
- (click)="handleImageClick(fileAttachment, message)"
14740
- >
14741
- <img
14742
- [src]="fileAttachment.src"
14743
- [alt]="fileAttachment.name || 'Image'"
14744
- class="inline-image"
14745
- />
14746
- </div>
14747
- } @else {
14748
- <!-- Show file card for non-image attachments -->
14749
- <ds-mobile-card-inline-file
14750
- [fileName]="fileAttachment.name || 'Unknown file'"
14751
- [fileSize]="fileAttachment.size || ''"
14752
- [variant]="getFileVariant(fileAttachment.type)"
14753
- [layout]="'compact'"
14754
- (fileClick)="handleFileAttachmentClick(fileAttachment)"
14755
- >
14756
- </ds-mobile-card-inline-file>
14757
- } }
14758
- </div>
14759
- } } } }
14705
+ <!-- File attachments displayed below message bubble -->
14706
+ @if (message.fileAttachments && message.fileAttachments.length > 0) {
14707
+ <div class="message-file-attachments" [class.own-message]="message.isOwnMessage">
14708
+ @for (fileAttachment of message.fileAttachments; track fileAttachment.id) {
14709
+ <!-- Show inline image preview for image attachments -->
14710
+ @if (fileAttachment.type === 'image') {
14711
+ <div class="message-image-attachment" (click)="handleImageClick(fileAttachment, message)">
14712
+ <img [src]="fileAttachment.src" [alt]="fileAttachment.name || 'Image'" class="inline-image" />
14713
+ </div>
14714
+ } @else {
14715
+ <!-- Show file card for non-image attachments -->
14716
+ <ds-mobile-card-inline-file
14717
+ [fileName]="fileAttachment.name || 'Unknown file'"
14718
+ [fileSize]="fileAttachment.size || ''"
14719
+ [variant]="getFileVariant(fileAttachment.type)"
14720
+ [layout]="'compact'"
14721
+ (fileClick)="handleFileAttachmentClick(fileAttachment)"
14722
+ >
14723
+ </ds-mobile-card-inline-file>
14724
+ }
14725
+ }
14726
+ </div>
14727
+ }
14728
+ }
14729
+ }
14730
+ }
14760
14731
  </div>
14761
14732
  </div>
14762
14733
  </ds-mobile-section>
@@ -14862,6 +14833,7 @@ class DsMobileChatModalService extends BaseModalService {
14862
14833
  error: options?.error,
14863
14834
  }, {
14864
14835
  keyboardClose: true, // Keep keyboard close behavior for this modal
14836
+ cssClass: 'ds-modal-base',
14865
14837
  });
14866
14838
  // console.log('[ChatModal] Modal created, presenting...');
14867
14839
  await modal.present();
@@ -14921,6 +14893,18 @@ class DsMobileNewInquiryModalComponent {
14921
14893
  * Callback function when form is submitted
14922
14894
  */
14923
14895
  onSubmit;
14896
+ /**
14897
+ * Placeholder for the title field
14898
+ */
14899
+ titlePlaceholder = 'Name your inquiry';
14900
+ /**
14901
+ * Placeholder for the description field
14902
+ */
14903
+ descriptionPlaceholder = 'Tell us what this inquiry is about...';
14904
+ /**
14905
+ * Label for the submit button
14906
+ */
14907
+ submitButtonLabel = 'Submit';
14924
14908
  /**
14925
14909
  * Form title field
14926
14910
  */
@@ -15134,7 +15118,7 @@ class DsMobileNewInquiryModalComponent {
15134
15118
  }
15135
15119
  }
15136
15120
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileNewInquiryModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15137
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileNewInquiryModalComponent, isStandalone: true, selector: "ds-mobile-new-inquiry-modal", inputs: { loading: "loading", error: "error", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "titleInputRef", first: true, predicate: ["titleInput"], descendants: true, read: ElementRef }, { propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }, { propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: `
15121
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileNewInquiryModalComponent, isStandalone: true, selector: "ds-mobile-new-inquiry-modal", inputs: { loading: "loading", error: "error", onSubmit: "onSubmit", titlePlaceholder: "titlePlaceholder", descriptionPlaceholder: "descriptionPlaceholder", submitButtonLabel: "submitButtonLabel" }, viewQueries: [{ propertyName: "titleInputRef", first: true, predicate: ["titleInput"], descendants: true, read: ElementRef }, { propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }, { propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: `
15138
15122
  <ds-mobile-modal-base
15139
15123
  [loading]="loading"
15140
15124
  [error]="error"
@@ -15153,7 +15137,7 @@ class DsMobileNewInquiryModalComponent {
15153
15137
  [ghost]="true"
15154
15138
  [required]="true"
15155
15139
  [rows]="1"
15156
- placeholder="Name your inquiry"
15140
+ [placeholder]="titlePlaceholder"
15157
15141
  class="inquiry-title-input ghost-input-clean"
15158
15142
  (valueChange)="handleTitleChange($event)"
15159
15143
  />
@@ -15163,7 +15147,7 @@ class DsMobileNewInquiryModalComponent {
15163
15147
  [(ngModel)]="description"
15164
15148
  [ghost]="true"
15165
15149
  [rows]="1"
15166
- placeholder="Tell us what this inquiry is about..."
15150
+ [placeholder]="descriptionPlaceholder"
15167
15151
  class="inquiry-description-input ghost-input-clean"
15168
15152
  (valueChange)="validateForm()"
15169
15153
  />
@@ -15204,7 +15188,7 @@ class DsMobileNewInquiryModalComponent {
15204
15188
  </div>
15205
15189
 
15206
15190
  <!-- Submit Button (Right) -->
15207
- <ds-button variant="primary" size="lg" [disabled]="!isFormValid() || isSubmitting()" (clicked)="handleSubmit()"> Submit </ds-button>
15191
+ <ds-button variant="primary" size="lg" [disabled]="!isFormValid() || isSubmitting()" (clicked)="handleSubmit()"> {{ submitButtonLabel }} </ds-button>
15208
15192
  </div>
15209
15193
  </div>
15210
15194
  </div>
@@ -15241,7 +15225,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15241
15225
  [ghost]="true"
15242
15226
  [required]="true"
15243
15227
  [rows]="1"
15244
- placeholder="Name your inquiry"
15228
+ [placeholder]="titlePlaceholder"
15245
15229
  class="inquiry-title-input ghost-input-clean"
15246
15230
  (valueChange)="handleTitleChange($event)"
15247
15231
  />
@@ -15251,7 +15235,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15251
15235
  [(ngModel)]="description"
15252
15236
  [ghost]="true"
15253
15237
  [rows]="1"
15254
- placeholder="Tell us what this inquiry is about..."
15238
+ [placeholder]="descriptionPlaceholder"
15255
15239
  class="inquiry-description-input ghost-input-clean"
15256
15240
  (valueChange)="validateForm()"
15257
15241
  />
@@ -15292,7 +15276,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15292
15276
  </div>
15293
15277
 
15294
15278
  <!-- Submit Button (Right) -->
15295
- <ds-button variant="primary" size="lg" [disabled]="!isFormValid() || isSubmitting()" (clicked)="handleSubmit()"> Submit </ds-button>
15279
+ <ds-button variant="primary" size="lg" [disabled]="!isFormValid() || isSubmitting()" (clicked)="handleSubmit()"> {{ submitButtonLabel }} </ds-button>
15296
15280
  </div>
15297
15281
  </div>
15298
15282
  </div>
@@ -15313,6 +15297,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15313
15297
  type: Input
15314
15298
  }], onSubmit: [{
15315
15299
  type: Input
15300
+ }], titlePlaceholder: [{
15301
+ type: Input
15302
+ }], descriptionPlaceholder: [{
15303
+ type: Input
15304
+ }], submitButtonLabel: [{
15305
+ type: Input
15316
15306
  }] } });
15317
15307
 
15318
15308
  /**
@@ -15364,6 +15354,9 @@ class DsMobileNewInquiryModalService extends BaseModalService {
15364
15354
  onSubmit: options?.onSubmit,
15365
15355
  loading: options?.loading ?? false,
15366
15356
  error: options?.error,
15357
+ titlePlaceholder: options?.titlePlaceholder,
15358
+ descriptionPlaceholder: options?.descriptionPlaceholder,
15359
+ submitButtonLabel: options?.submitButtonLabel,
15367
15360
  }, {
15368
15361
  keyboardClose: false, // Don't close on keyboard hide for this modal
15369
15362
  cssClass: ['ds-modal-base', 'auto-height'],