@propbinder/mobile-design 0.2.6 → 0.2.7

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.
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { AfterViewInit, OnInit, ElementRef, OnDestroy, EventEmitter, ApplicationRef, EnvironmentInjector, Type, AfterContentInit, ChangeDetectorRef } from '@angular/core';
2
+ import { AfterViewInit, OnInit, ElementRef, Injector, TemplateRef, OnDestroy, EventEmitter, ApplicationRef, EnvironmentInjector, Type, AfterContentInit, ChangeDetectorRef } from '@angular/core';
3
3
  import { ModalController, IonContent, NavController, GestureController, ModalOptions as ModalOptions$1 } from '@ionic/angular/standalone';
4
4
  import { ImpactStyle } from '@capacitor/haptics';
5
5
  import { DsTextareaComponent } from '@propbinder/design-system';
@@ -71,6 +71,9 @@ interface ActionItem {
71
71
  title: string;
72
72
  icon: string;
73
73
  destructive?: boolean;
74
+ subtitle?: string;
75
+ showChevron?: boolean;
76
+ flagIcon?: string;
74
77
  }
75
78
  interface ActionGroup {
76
79
  actions: ActionItem[];
@@ -231,6 +234,27 @@ declare class DsMobileBottomSheetService {
231
234
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsMobileBottomSheetService>;
232
235
  }
233
236
 
237
+ /**
238
+ * DsMobileBottomSheetWrapperComponent
239
+ *
240
+ * A wrapper component that provides common layout styling for all bottom sheets.
241
+ * Handles safe area insets and provides consistent layout structure.
242
+ *
243
+ * Usage:
244
+ * Wrap your bottom sheet content with this component using ng-content projection.
245
+ *
246
+ * @example
247
+ * ```html
248
+ * <ds-mobile-bottom-sheet-wrapper>
249
+ * <!-- Your bottom sheet content here -->
250
+ * </ds-mobile-bottom-sheet-wrapper>
251
+ * ```
252
+ */
253
+ declare class DsMobileBottomSheetWrapperComponent {
254
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileBottomSheetWrapperComponent, never>;
255
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileBottomSheetWrapperComponent, "ds-mobile-bottom-sheet-wrapper", never, {}, {}, never, ["*"], true, never>;
256
+ }
257
+
234
258
  /**
235
259
  * DsMobilePostCreateBottomSheetComponent
236
260
  *
@@ -294,6 +318,127 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
294
318
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePostCreateBottomSheetComponent, "ds-mobile-post-create-bottom-sheet", never, {}, {}, never, never, true, never>;
295
319
  }
296
320
 
321
+ interface Language {
322
+ code: string;
323
+ nativeName: string;
324
+ englishName: string;
325
+ flagIcon: string;
326
+ }
327
+ /**
328
+ * DsMobileProfileActionsSheetComponent
329
+ *
330
+ * Bottom sheet for profile actions with navigable language selection.
331
+ * Features a smooth slide-in navigation pattern for sub-menus.
332
+ *
333
+ * @example
334
+ * ```typescript
335
+ * const sheet = await this.modalController.create({
336
+ * component: DsMobileProfileActionsSheetComponent,
337
+ * componentProps: {
338
+ * actionGroups: [...],
339
+ * currentLanguage: 'da',
340
+ * availableLanguages: [...]
341
+ * },
342
+ * breakpoints: [0, 1],
343
+ * initialBreakpoint: 1,
344
+ * handle: true,
345
+ * cssClass: ['ds-bottom-sheet', 'auto-height']
346
+ * });
347
+ *
348
+ * const result = await sheet.onWillDismiss();
349
+ * if (result.data?.action) {
350
+ * // Handle the action (e.g., 'language:da', 'profile', 'logout')
351
+ * }
352
+ * ```
353
+ */
354
+ declare class DsMobileProfileActionsSheetComponent {
355
+ private modalController;
356
+ private injector;
357
+ /**
358
+ * Action groups to display in main view
359
+ */
360
+ actionGroups: ActionGroup[];
361
+ /**
362
+ * Currently selected language code
363
+ */
364
+ currentLanguage: string;
365
+ /**
366
+ * Initial language (for tracking changes)
367
+ */
368
+ private initialLanguage;
369
+ /**
370
+ * Currently selected language in the view (before confirmation)
371
+ */
372
+ selectedLanguage: _angular_core.WritableSignal<string>;
373
+ /**
374
+ * Check if language has changed
375
+ */
376
+ hasLanguageChanged: _angular_core.Signal<boolean>;
377
+ /**
378
+ * Available languages for selection
379
+ */
380
+ availableLanguages: Language[];
381
+ /**
382
+ * Current view state
383
+ */
384
+ currentView: _angular_core.WritableSignal<"main" | "language">;
385
+ /**
386
+ * Reference to the view container for height calculations
387
+ */
388
+ viewContainer?: ElementRef<HTMLDivElement>;
389
+ /**
390
+ * Reference to the profile actions sheet wrapper
391
+ */
392
+ sheetWrapper?: ElementRef<HTMLDivElement>;
393
+ /**
394
+ * Current container height (for dynamic transitions)
395
+ */
396
+ containerHeight: _angular_core.WritableSignal<number | null>;
397
+ /**
398
+ * Is animating between views
399
+ */
400
+ isAnimating: _angular_core.WritableSignal<boolean>;
401
+ constructor(modalController: ModalController, injector: Injector);
402
+ /**
403
+ * Handle action item click
404
+ */
405
+ handleActionClick(actionItem: ActionItem): void;
406
+ /**
407
+ * Navigate back to main view
408
+ */
409
+ navigateBack(): void;
410
+ /**
411
+ * Confirm language selection and dismiss
412
+ */
413
+ confirmLanguageSelection(): void;
414
+ /**
415
+ * Handle language selection (update selection, don't dismiss)
416
+ */
417
+ selectLanguage(languageCode: string): void;
418
+ /**
419
+ * Get current language flag icon
420
+ */
421
+ getCurrentLanguageFlag(): string;
422
+ /**
423
+ * Update container height based on active view
424
+ */
425
+ private updateHeight;
426
+ /**
427
+ * Animate view transition with height change
428
+ */
429
+ private animateViewTransition;
430
+ /**
431
+ * Helper to create delay promise
432
+ */
433
+ private delay;
434
+ /**
435
+ * Handle regular action selection
436
+ */
437
+ selectAction(action: string): void;
438
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileProfileActionsSheetComponent, never>;
439
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileProfileActionsSheetComponent, "ds-mobile-profile-actions-sheet", never, { "actionGroups": { "alias": "actionGroups"; "required": false; }; "currentLanguage": { "alias": "currentLanguage"; "required": false; }; "availableLanguages": { "alias": "availableLanguages"; "required": false; }; }, {}, never, never, true, never>;
440
+ }
441
+
297
442
  /**
298
443
  * DsMobilePageMainComponent
299
444
  *
@@ -716,6 +861,13 @@ declare class TileValueComponent {
716
861
  * ```
717
862
  */
718
863
  declare class DsMobileCommentComponent {
864
+ private platformId;
865
+ /**
866
+ * Detect if viewport is desktop size
867
+ * Use viewport width for breakpoint detection (show button on tablet and above)
868
+ */
869
+ isDesktop: _angular_core.WritableSignal<boolean>;
870
+ constructor();
719
871
  /**
720
872
  * Author's display name
721
873
  */
@@ -751,7 +903,7 @@ declare class DsMobileCommentComponent {
751
903
  /**
752
904
  * Whether the comment is liked by current user
753
905
  */
754
- isLiked: _angular_core.ModelSignal<boolean>;
906
+ isLiked: _angular_core.InputSignal<boolean>;
755
907
  /**
756
908
  * Emits when like is toggled (after UI is opdateret)
757
909
  */
@@ -762,7 +914,15 @@ declare class DsMobileCommentComponent {
762
914
  /**
763
915
  * Number of likes
764
916
  */
765
- likeCount: _angular_core.ModelSignal<number>;
917
+ likeCount: _angular_core.InputSignal<number>;
918
+ /**
919
+ * Internal signal to track like state for UI updates
920
+ */
921
+ internalIsLiked: _angular_core.WritableSignal<boolean>;
922
+ /**
923
+ * Internal signal to track like count for UI updates
924
+ */
925
+ internalLikeCount: _angular_core.WritableSignal<number>;
766
926
  /**
767
927
  * Signal to control pulse animation
768
928
  */
@@ -822,7 +982,7 @@ declare class DsMobileCommentComponent {
822
982
  */
823
983
  handleMoreButtonClick(event: Event): void;
824
984
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCommentComponent, never>;
825
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCommentComponent, "ds-mobile-comment", never, { "authorName": { "alias": "authorName"; "required": true; "isSignal": true; }; "authorRole": { "alias": "authorRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "content": { "alias": "content"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "isOwnComment": { "alias": "isOwnComment"; "required": false; "isSignal": true; }; "isLiked": { "alias": "isLiked"; "required": false; "isSignal": true; }; "likeCount": { "alias": "likeCount"; "required": false; "isSignal": true; }; }, { "isLiked": "isLikedChange"; "likeToggled": "likeToggled"; "likeCount": "likeCountChange"; "commentClick": "commentClick"; "replyClick": "replyClick"; "editClick": "editClick"; "longPress": "longPress"; }, never, never, true, never>;
985
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCommentComponent, "ds-mobile-comment", never, { "authorName": { "alias": "authorName"; "required": true; "isSignal": true; }; "authorRole": { "alias": "authorRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "content": { "alias": "content"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "isOwnComment": { "alias": "isOwnComment"; "required": false; "isSignal": true; }; "isLiked": { "alias": "isLiked"; "required": false; "isSignal": true; }; "likeCount": { "alias": "likeCount"; "required": false; "isSignal": true; }; }, { "likeToggled": "likeToggled"; "commentClick": "commentClick"; "replyClick": "replyClick"; "editClick": "editClick"; "longPress": "longPress"; }, never, never, true, never>;
826
986
  }
827
987
 
828
988
  /**
@@ -889,6 +1049,7 @@ interface AttachmentData {
889
1049
  type: AttachmentFileType;
890
1050
  name?: string;
891
1051
  size?: string;
1052
+ isLoading?: boolean;
892
1053
  }
893
1054
  /**
894
1055
  * DsMobileAttachmentPreviewComponent
@@ -936,12 +1097,164 @@ declare class DsMobileAttachmentPreviewComponent {
936
1097
  getIconName(): string;
937
1098
  /**
938
1099
  * Handle remove button click
1100
+ * Uses mousedown to prevent keyboard from closing
939
1101
  */
940
- handleRemove(): void;
1102
+ handleRemove(event?: MouseEvent): void;
941
1103
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileAttachmentPreviewComponent, never>;
942
1104
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileAttachmentPreviewComponent, "ds-mobile-attachment-preview", never, { "attachment": { "alias": "attachment"; "required": true; "isSignal": true; }; }, { "remove": "remove"; }, never, never, true, never>;
943
1105
  }
944
1106
 
1107
+ interface DsMobileDropdownItem {
1108
+ id: string;
1109
+ /** Optional leading icon */
1110
+ leadingIcon?: string;
1111
+ /** Optional trailing icon */
1112
+ trailingIcon?: string;
1113
+ /** Main label text */
1114
+ label?: string;
1115
+ /** Whether the item is disabled */
1116
+ disabled?: boolean;
1117
+ /** Optional action callback */
1118
+ action?: () => void;
1119
+ /** Custom data for template rendering */
1120
+ data?: any;
1121
+ }
1122
+ type DropdownPosition = 'above' | 'below';
1123
+ type DropdownAlign = 'start' | 'end';
1124
+ /**
1125
+ * DsMobileDropdownComponent
1126
+ *
1127
+ * A mobile-optimized dropdown component for action menus, mention lists, and selection lists.
1128
+ * Uses Ionic Popover for robust mobile positioning and backdrop management.
1129
+ *
1130
+ * Features:
1131
+ * - Vertical list layout with leading/main/trailing slots
1132
+ * - Custom template support via content projection
1133
+ * - Mobile-friendly touch interactions (mousedown events)
1134
+ * - Ionic-powered backdrop overlay for dismissal
1135
+ * - Configurable positioning (above/below) and alignment (start/end)
1136
+ * - Max height with scroll support
1137
+ * - Smooth enter/exit animations
1138
+ *
1139
+ * @example
1140
+ * Basic dropdown with default items:
1141
+ * ```html
1142
+ * <button (click)="toggleMenu()">Open Menu</button>
1143
+ * <ds-mobile-dropdown
1144
+ * [items]="menuItems"
1145
+ * [isOpen]="isMenuOpen()"
1146
+ * position="below"
1147
+ * align="start"
1148
+ * (itemSelected)="handleSelection($event)"
1149
+ * (closed)="closeMenu()">
1150
+ * </ds-mobile-dropdown>
1151
+ * ```
1152
+ *
1153
+ * @example
1154
+ * Custom template for mention menu with avatars:
1155
+ * ```html
1156
+ * <textarea (input)="handleInput($event)"></textarea>
1157
+ * <ds-mobile-dropdown
1158
+ * [items]="users"
1159
+ * [isOpen]="showMentions()"
1160
+ * position="above"
1161
+ * [maxHeight]="200"
1162
+ * (itemSelected)="selectUser($event)"
1163
+ * (closed)="closeMentions()">
1164
+ * <ng-template #itemTemplate let-item>
1165
+ * <ds-avatar
1166
+ * [initials]="item.data.initials"
1167
+ * size="sm" />
1168
+ * <div class="user-info">
1169
+ * <span>{{ item.data.name }}</span>
1170
+ * <span>{{ item.data.role }}</span>
1171
+ * </div>
1172
+ * </ng-template>
1173
+ * </ds-mobile-dropdown>
1174
+ * ```
1175
+ */
1176
+ declare class DsMobileDropdownComponent {
1177
+ private elementRef;
1178
+ constructor();
1179
+ /**
1180
+ * Content projection for custom item template
1181
+ */
1182
+ customItemTemplate?: TemplateRef<any>;
1183
+ /**
1184
+ * Optional trigger element ID for Ionic Popover positioning
1185
+ */
1186
+ trigger: _angular_core.InputSignal<string | undefined>;
1187
+ /**
1188
+ * Optional element to keep focused (prevent keyboard from dismissing)
1189
+ * Pass ElementRef to maintain focus when popover opens
1190
+ */
1191
+ keepFocusOn: _angular_core.InputSignal<ElementRef<any> | undefined>;
1192
+ /**
1193
+ * Array of dropdown items to display
1194
+ */
1195
+ items: _angular_core.InputSignal<DsMobileDropdownItem[]>;
1196
+ /**
1197
+ * Whether the dropdown is open
1198
+ */
1199
+ isOpen: _angular_core.InputSignal<boolean>;
1200
+ /**
1201
+ * Position relative to parent container
1202
+ * - 'above': Appears above the anchor
1203
+ * - 'below': Appears below the anchor
1204
+ */
1205
+ position: _angular_core.InputSignal<DropdownPosition>;
1206
+ /**
1207
+ * Horizontal alignment
1208
+ * - 'start': Left-aligned (default)
1209
+ * - 'end': Right-aligned
1210
+ */
1211
+ align: _angular_core.InputSignal<DropdownAlign>;
1212
+ /**
1213
+ * Maximum height in pixels before scrolling
1214
+ */
1215
+ maxHeight: _angular_core.InputSignal<number>;
1216
+ /**
1217
+ * Message to show when items array is empty
1218
+ */
1219
+ emptyMessage: _angular_core.InputSignal<string>;
1220
+ /**
1221
+ * ARIA label for the dropdown menu
1222
+ */
1223
+ ariaLabel: _angular_core.InputSignal<string>;
1224
+ /**
1225
+ * Emits when an item is selected
1226
+ */
1227
+ itemSelected: _angular_core.OutputEmitterRef<DsMobileDropdownItem>;
1228
+ /**
1229
+ * Emits when the dropdown should be closed (backdrop click)
1230
+ */
1231
+ closed: _angular_core.OutputEmitterRef<void>;
1232
+ /**
1233
+ * Computed dropdown CSS classes
1234
+ */
1235
+ dropdownClasses: _angular_core.Signal<string>;
1236
+ /**
1237
+ * Computed offset Y for Ionic Popover
1238
+ * Uses CSS variable for precise control
1239
+ */
1240
+ offsetY: _angular_core.Signal<"-4px" | "4px">;
1241
+ /**
1242
+ * Computed offset X for Ionic Popover
1243
+ * Negative value to shift left by trigger position + add 20px left margin
1244
+ */
1245
+ offsetX: _angular_core.Signal<string>;
1246
+ /**
1247
+ * Get CSS classes for a dropdown item
1248
+ */
1249
+ getItemClass(item: DsMobileDropdownItem): string;
1250
+ /**
1251
+ * Handle item click with mousedown to prevent keyboard loss
1252
+ */
1253
+ handleItemClick(item: DsMobileDropdownItem, event: MouseEvent): void;
1254
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileDropdownComponent, never>;
1255
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileDropdownComponent, "ds-mobile-dropdown", never, { "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "keepFocusOn": { "alias": "keepFocusOn"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; "closed": "closed"; }, ["customItemTemplate"], never, true, never>;
1256
+ }
1257
+
945
1258
  /**
946
1259
  * DsMobileMessageComposerComponent
947
1260
  *
@@ -1022,7 +1335,7 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1022
1335
  /**
1023
1336
  * ViewChild for message input
1024
1337
  */
1025
- messageInput?: ElementRef<HTMLTextAreaElement>;
1338
+ messageInputRef?: ElementRef<HTMLTextAreaElement>;
1026
1339
  /**
1027
1340
  * ViewChild for file input
1028
1341
  */
@@ -1035,6 +1348,10 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1035
1348
  * Attachments signal
1036
1349
  */
1037
1350
  attachments: _angular_core.WritableSignal<AttachmentData[]>;
1351
+ /**
1352
+ * Attachment menu open state
1353
+ */
1354
+ isAttachmentMenuOpen: _angular_core.WritableSignal<boolean>;
1038
1355
  /**
1039
1356
  * Editing message state (optional)
1040
1357
  */
@@ -1066,6 +1383,14 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1066
1383
  initials: string;
1067
1384
  role: string;
1068
1385
  }[]>;
1386
+ /**
1387
+ * Convert filtered users to dropdown items
1388
+ */
1389
+ mentionDropdownItems: _angular_core.Signal<DsMobileDropdownItem[]>;
1390
+ /**
1391
+ * Attachment menu items
1392
+ */
1393
+ attachmentMenuItems: _angular_core.Signal<DsMobileDropdownItem[]>;
1069
1394
  /**
1070
1395
  * Emits when a message is sent
1071
1396
  */
@@ -1094,6 +1419,11 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1094
1419
  * Emits when attachment button is clicked
1095
1420
  */
1096
1421
  attachmentClicked: _angular_core.OutputEmitterRef<void>;
1422
+ /**
1423
+ * Emits when attachments array changes (added or removed)
1424
+ * Parent components (like chat modal) can use this to scroll to bottom
1425
+ */
1426
+ attachmentsChanged: _angular_core.OutputEmitterRef<void>;
1097
1427
  ngAfterViewInit(): void;
1098
1428
  ngOnDestroy(): void;
1099
1429
  /**
@@ -1116,6 +1446,18 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1116
1446
  * Handle input changes and detect @ mentions
1117
1447
  */
1118
1448
  handleInput(event: Event): void;
1449
+ /**
1450
+ * Handle mention selection from dropdown
1451
+ */
1452
+ handleMentionSelect(item: DsMobileDropdownItem): void;
1453
+ /**
1454
+ * Close mention menu
1455
+ */
1456
+ closeMentionMenu(): void;
1457
+ /**
1458
+ * Handle attachment menu selection from dropdown
1459
+ */
1460
+ handleAttachmentMenuSelect(item: DsMobileDropdownItem): void;
1119
1461
  /**
1120
1462
  * Select a user from mention menu
1121
1463
  */
@@ -1145,9 +1487,25 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1145
1487
  */
1146
1488
  focus(): void;
1147
1489
  /**
1148
- * Handle attachment button click
1490
+ * Toggle attachment menu open/closed
1491
+ * Uses mousedown/touchstart to prevent focus loss from textarea
1492
+ */
1493
+ toggleAttachmentMenu(event?: MouseEvent | TouchEvent): void;
1494
+ /**
1495
+ * Close attachment menu
1149
1496
  */
1150
- handleAttachmentClick(): void;
1497
+ closeAttachmentMenu(event?: MouseEvent): void;
1498
+ /**
1499
+ * Handle add photo button click from menu
1500
+ * Uses Capacitor Camera API to open photo library directly
1501
+ * Allows multiple photo selection
1502
+ */
1503
+ handleAddPhoto(event?: MouseEvent): Promise<void>;
1504
+ /**
1505
+ * Handle add file button click from menu
1506
+ * Opens file picker
1507
+ */
1508
+ handleAddFile(event?: MouseEvent): void;
1151
1509
  /**
1152
1510
  * Detect file type from file name or mime type
1153
1511
  */
@@ -1162,6 +1520,7 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1162
1520
  handleFileSelect(event: Event): void;
1163
1521
  /**
1164
1522
  * Remove an attachment from the list
1523
+ * Keeps keyboard open by maintaining focus
1165
1524
  */
1166
1525
  removeAttachment(attachmentId: string): void;
1167
1526
  /**
@@ -1169,7 +1528,7 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
1169
1528
  */
1170
1529
  sendMessage(): void;
1171
1530
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileMessageComposerComponent, never>;
1172
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileMessageComposerComponent, "ds-mobile-message-composer", never, { "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "sendButtonLabel": { "alias": "sendButtonLabel"; "required": false; "isSignal": true; }; "attachmentButtonLabel": { "alias": "attachmentButtonLabel"; "required": false; "isSignal": true; }; "showAttachmentButton": { "alias": "showAttachmentButton"; "required": false; "isSignal": true; }; "editIndicatorText": { "alias": "editIndicatorText"; "required": false; "isSignal": true; }; "replyIndicatorText": { "alias": "replyIndicatorText"; "required": false; "isSignal": true; }; "enableMentions": { "alias": "enableMentions"; "required": false; "isSignal": true; }; "mentionUsers": { "alias": "mentionUsers"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; }, { "messageSent": "messageSent"; "editCancelled": "editCancelled"; "replyCancelled": "replyCancelled"; "mentionSelected": "mentionSelected"; "attachmentClicked": "attachmentClicked"; }, never, never, true, never>;
1531
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileMessageComposerComponent, "ds-mobile-message-composer", never, { "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "sendButtonLabel": { "alias": "sendButtonLabel"; "required": false; "isSignal": true; }; "attachmentButtonLabel": { "alias": "attachmentButtonLabel"; "required": false; "isSignal": true; }; "showAttachmentButton": { "alias": "showAttachmentButton"; "required": false; "isSignal": true; }; "editIndicatorText": { "alias": "editIndicatorText"; "required": false; "isSignal": true; }; "replyIndicatorText": { "alias": "replyIndicatorText"; "required": false; "isSignal": true; }; "enableMentions": { "alias": "enableMentions"; "required": false; "isSignal": true; }; "mentionUsers": { "alias": "mentionUsers"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; }, { "messageSent": "messageSent"; "editCancelled": "editCancelled"; "replyCancelled": "replyCancelled"; "mentionSelected": "mentionSelected"; "attachmentClicked": "attachmentClicked"; "attachmentsChanged": "attachmentsChanged"; }, never, never, true, never>;
1173
1532
  }
1174
1533
 
1175
1534
  /**
@@ -1253,6 +1612,14 @@ declare class DsMobileMessageBubbleComponent {
1253
1612
  * Avatar photo source (for photo type)
1254
1613
  */
1255
1614
  avatarSrc: _angular_core.InputSignal<string>;
1615
+ /**
1616
+ * Whether to show the avatar (for clustering logic)
1617
+ */
1618
+ showAvatar: _angular_core.InputSignal<boolean>;
1619
+ /**
1620
+ * Cluster position for border radius styling
1621
+ */
1622
+ clusterPosition: _angular_core.InputSignal<"single" | "first" | "middle" | "last">;
1256
1623
  /**
1257
1624
  * Whether to show read receipt (only for user's messages)
1258
1625
  */
@@ -1264,6 +1631,10 @@ declare class DsMobileMessageBubbleComponent {
1264
1631
  * Whether the message is clickable
1265
1632
  */
1266
1633
  clickable: _angular_core.InputSignal<boolean>;
1634
+ /**
1635
+ * Whether this is a newly sent message (triggers appearance animation)
1636
+ */
1637
+ isNewMessage: _angular_core.InputSignal<boolean>;
1267
1638
  /**
1268
1639
  * Emits when attachment is clicked
1269
1640
  */
@@ -1286,6 +1657,10 @@ declare class DsMobileMessageBubbleComponent {
1286
1657
  private readonly LONG_PRESS_DURATION;
1287
1658
  private readonly MOVE_THRESHOLD;
1288
1659
  private clickStartTime;
1660
+ /**
1661
+ * Tap animation state
1662
+ */
1663
+ isTapped: boolean;
1289
1664
  /**
1290
1665
  * Handle attachment click
1291
1666
  */
@@ -1311,7 +1686,7 @@ declare class DsMobileMessageBubbleComponent {
1311
1686
  */
1312
1687
  handleContextMenu(event: Event): void;
1313
1688
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileMessageBubbleComponent, never>;
1314
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileMessageBubbleComponent, "ds-mobile-message-bubble", never, { "content": { "alias": "content"; "required": true; "isSignal": true; }; "isOwnMessage": { "alias": "isOwnMessage"; "required": false; "isSignal": true; }; "senderName": { "alias": "senderName"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "showTimestamp": { "alias": "showTimestamp"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "attachmentClick": "attachmentClick"; "longPress": "longPress"; "messageClick": "messageClick"; }, never, never, true, never>;
1689
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileMessageBubbleComponent, "ds-mobile-message-bubble", never, { "content": { "alias": "content"; "required": true; "isSignal": true; }; "isOwnMessage": { "alias": "isOwnMessage"; "required": false; "isSignal": true; }; "senderName": { "alias": "senderName"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "showTimestamp": { "alias": "showTimestamp"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "showAvatar": { "alias": "showAvatar"; "required": false; "isSignal": true; }; "clusterPosition": { "alias": "clusterPosition"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "isNewMessage": { "alias": "isNewMessage"; "required": false; "isSignal": true; }; }, { "attachmentClick": "attachmentClick"; "longPress": "longPress"; "messageClick": "messageClick"; }, never, never, true, never>;
1315
1690
  }
1316
1691
 
1317
1692
  /**
@@ -2244,256 +2619,6 @@ declare class DsMobileTabsComponent implements OnInit {
2244
2619
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileTabsComponent, "ds-mobile-tabs", never, { "tabs": { "alias": "tabs"; "required": false; }; "avatarType": { "alias": "avatarType"; "required": false; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; }; }, { "avatarClick": "avatarClick"; }, never, never, true, never>;
2245
2620
  }
2246
2621
 
2247
- /**
2248
- * DsMobileCardInlineComponent
2249
- *
2250
- * A versatile, always-interactive inline card component for standalone or small-group usage.
2251
- * Designed for tappable card-like elements such as file attachments, contact cards, etc.
2252
- * Not intended for long scrolling lists - use ds-mobile-list-item for that purpose.
2253
- *
2254
- * Features:
2255
- * - Always interactive/tappable (unless disabled)
2256
- * - Two layout variants: default (column) and compact (row)
2257
- * - Flexible content projection with leading/main/trailing slots
2258
- * - Consistent styling with rounded corners and neutral background
2259
- * - Built-in hover and active states
2260
- * - Accessibility features (role, tabindex, aria attributes)
2261
- *
2262
- * @example
2263
- * ```html
2264
- * <!-- Default variant (column layout) -->
2265
- * <ds-mobile-card-inline
2266
- * [variant]="'default'"
2267
- * (cardClick)="handleClick()">
2268
- *
2269
- * <div content-leading>
2270
- * <ds-avatar initials="JD" />
2271
- * </div>
2272
- *
2273
- * <div content-main>
2274
- * <div class="title">Document Title</div>
2275
- * <div class="subtitle">PDF · 1.2 MB</div>
2276
- * </div>
2277
- *
2278
- * <ds-icon content-trailing name="remixArrowRightSLine" />
2279
- * </ds-mobile-card-inline>
2280
- *
2281
- * <!-- Compact variant (row layout) -->
2282
- * <ds-mobile-card-inline
2283
- * [variant]="'compact'"
2284
- * (cardClick)="handleClick()">
2285
- *
2286
- * <ds-avatar content-leading size="sm" />
2287
- *
2288
- * <div content-main>
2289
- * <span class="name">File.pdf</span>
2290
- * <span class="size">245 KB</span>
2291
- * </div>
2292
- *
2293
- * <ds-icon content-trailing name="remixArrowRightSLine" />
2294
- * </ds-mobile-card-inline>
2295
- *
2296
- * <!-- Disabled state -->
2297
- * <ds-mobile-card-inline [disabled]="true">
2298
- * <div content-main>Disabled card</div>
2299
- * </ds-mobile-card-inline>
2300
- * ```
2301
- */
2302
- declare class DsMobileCardInlineComponent {
2303
- /**
2304
- * Display variant
2305
- * - 'default' - Column layout with standard padding (gap: 12px, padding: 10px 12px)
2306
- * - 'compact' - Row layout with reduced padding (gap: 8px, padding: 10px)
2307
- */
2308
- variant: _angular_core.InputSignal<"default" | "compact">;
2309
- /**
2310
- * Whether the card is disabled
2311
- * Disables all interactions and reduces opacity
2312
- */
2313
- disabled: _angular_core.InputSignal<boolean>;
2314
- /**
2315
- * Emits when the card is clicked (if not disabled)
2316
- */
2317
- cardClick: _angular_core.OutputEmitterRef<void>;
2318
- /**
2319
- * Handle click events
2320
- */
2321
- handleClick(event: Event): void;
2322
- /**
2323
- * Handle keyboard events (Enter/Space)
2324
- */
2325
- handleKeyDown(event: KeyboardEvent): void;
2326
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCardInlineComponent, never>;
2327
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCardInlineComponent, "ds-mobile-card-inline", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "cardClick": "cardClick"; }, never, ["[content-leading]", "[content-main]", "*", "[content-trailing]"], true, never>;
2328
- }
2329
-
2330
- /**
2331
- * DsMobileCardInlineBannerComponent
2332
- *
2333
- * Specialized interactive component for displaying notification banners.
2334
- * Used to show unread message notifications above inquiry details.
2335
- *
2336
- * Features:
2337
- * - Neutral background matching file/contact cards
2338
- * - Avatar icon with message symbol
2339
- * - Title and timestamp
2340
- * - Unread count badge
2341
- * - Chevron for navigation indication
2342
- *
2343
- * @example
2344
- * ```html
2345
- * <ds-mobile-card-inline-banner
2346
- * [title]="'New messages'"
2347
- * [timestamp]="'2 min ago'"
2348
- * [unreadCount]="3"
2349
- * (bannerClick)="navigateToMessages()">
2350
- * </ds-mobile-card-inline-banner>
2351
- * ```
2352
- */
2353
- declare class DsMobileCardInlineBannerComponent {
2354
- /**
2355
- * Banner title (e.g., "New messages", "Unread messages")
2356
- */
2357
- title: _angular_core.InputSignal<string>;
2358
- /**
2359
- * Timestamp text (e.g., "2 min ago", "Just now")
2360
- */
2361
- timestamp: _angular_core.InputSignal<string>;
2362
- /**
2363
- * Number of unread items (optional, shows badge if > 0)
2364
- */
2365
- unreadCount: _angular_core.InputSignal<number>;
2366
- /**
2367
- * Layout variant
2368
- * - 'default' - Standard padding and column layout
2369
- * - 'compact' - Reduced padding and row layout
2370
- */
2371
- layout: _angular_core.InputSignal<"default" | "compact">;
2372
- /**
2373
- * Emits when the banner is clicked
2374
- */
2375
- bannerClick: _angular_core.OutputEmitterRef<void>;
2376
- handleBannerClick(): void;
2377
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCardInlineBannerComponent, never>;
2378
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCardInlineBannerComponent, "ds-mobile-card-inline-banner", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": false; "isSignal": true; }; "unreadCount": { "alias": "unreadCount"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, { "bannerClick": "bannerClick"; }, never, never, true, never>;
2379
- }
2380
-
2381
- /**
2382
- * DsMobileCardInlineContactComponent
2383
- *
2384
- * Specialized interactive component for displaying contacts.
2385
- * Displays contact name with avatar initials and metadata (person name + phone number).
2386
- * Similar styling to file attachments with rounded corners and hover states.
2387
- *
2388
- * @example
2389
- * ```html
2390
- * <ds-mobile-card-inline-contact
2391
- * [name]="'Mortensen & Søn ApS'"
2392
- * [initials]="'M'"
2393
- * [contactPerson]="'John Mortensen'"
2394
- * [phoneNumber]="'+45 12 34 56 78'"
2395
- * [clickable]="true"
2396
- * (contactClick)="openContact()">
2397
- * </ds-mobile-card-inline-contact>
2398
- * ```
2399
- */
2400
- declare class DsMobileCardInlineContactComponent {
2401
- /**
2402
- * Contact/company name
2403
- */
2404
- name: _angular_core.InputSignal<string>;
2405
- /**
2406
- * Avatar initials (usually 1-2 letters)
2407
- */
2408
- initials: _angular_core.InputSignal<string>;
2409
- /**
2410
- * Contact person name (optional)
2411
- */
2412
- contactPerson: _angular_core.InputSignal<string>;
2413
- /**
2414
- * Phone number (optional)
2415
- */
2416
- phoneNumber: _angular_core.InputSignal<string>;
2417
- /**
2418
- * Layout variant
2419
- * - 'default' - Standard padding and column layout
2420
- * - 'compact' - Reduced padding and row layout
2421
- */
2422
- layout: _angular_core.InputSignal<"default" | "compact">;
2423
- /**
2424
- * Whether the contact item is clickable
2425
- */
2426
- clickable: _angular_core.InputSignal<boolean>;
2427
- /**
2428
- * Whether to show chevron icon
2429
- */
2430
- showChevron: _angular_core.InputSignal<boolean>;
2431
- /**
2432
- * Emits when the contact item is clicked (if clickable)
2433
- */
2434
- contactClick: _angular_core.OutputEmitterRef<void>;
2435
- handleContactClick(): void;
2436
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCardInlineContactComponent, never>;
2437
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCardInlineContactComponent, "ds-mobile-card-inline-contact", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "initials": { "alias": "initials"; "required": true; "isSignal": true; }; "contactPerson": { "alias": "contactPerson"; "required": false; "isSignal": true; }; "phoneNumber": { "alias": "phoneNumber"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; }, { "contactClick": "contactClick"; }, never, never, true, never>;
2438
- }
2439
-
2440
- /**
2441
- * DsMobileCardInlineFileComponent
2442
- *
2443
- * File attachment display for various document types.
2444
- * Shows file info card with icon, filename, and file size.
2445
- * Supports PDF and generic document formats.
2446
- * Emits click event to open file in viewer.
2447
- *
2448
- * @example
2449
- * ```html
2450
- * <ds-mobile-card-inline-file
2451
- * [fileName]="'Document.pdf'"
2452
- * [fileSize]="'1.2 MB'"
2453
- * [variant]="'pdf'"
2454
- * [layout]="'compact'"
2455
- * (fileClick)="openFile()">
2456
- * </ds-mobile-card-inline-file>
2457
- * ```
2458
- */
2459
- declare class DsMobileCardInlineFileComponent {
2460
- /**
2461
- * File name
2462
- */
2463
- fileName: _angular_core.InputSignal<string>;
2464
- /**
2465
- * File size display (e.g., "1.2 MB")
2466
- */
2467
- fileSize: _angular_core.InputSignal<string>;
2468
- /**
2469
- * File type variant
2470
- * - 'pdf' - PDF document (red icon)
2471
- * - 'doc' - Generic document (blue icon)
2472
- */
2473
- variant: _angular_core.InputSignal<"pdf" | "doc">;
2474
- /**
2475
- * Layout variant
2476
- * - 'default' - Standard padding and column layout
2477
- * - 'compact' - Reduced padding and row layout
2478
- */
2479
- layout: _angular_core.InputSignal<"default" | "compact">;
2480
- /**
2481
- * Emits when the file attachment is clicked
2482
- */
2483
- fileClick: _angular_core.OutputEmitterRef<void>;
2484
- /**
2485
- * Get the appropriate icon name based on variant
2486
- */
2487
- getIconName(): string;
2488
- /**
2489
- * Get the file type label based on variant
2490
- */
2491
- getFileTypeLabel(): string;
2492
- handleClick(): void;
2493
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCardInlineFileComponent, never>;
2494
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCardInlineFileComponent, "ds-mobile-card-inline-file", never, { "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "fileSize": { "alias": "fileSize"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, { "fileClick": "fileClick"; }, never, never, true, never>;
2495
- }
2496
-
2497
2622
  /**
2498
2623
  * Media file types supported by the lightbox
2499
2624
  */
@@ -3236,6 +3361,10 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3236
3361
  * ResizeObserver for tracking fixed bottom height
3237
3362
  */
3238
3363
  private fixedBottomObserver?;
3364
+ /**
3365
+ * Flag to prevent ResizeObserver from updating padding during keyboard animations
3366
+ */
3367
+ private isKeyboardAnimating;
3239
3368
  /**
3240
3369
  * Loading state - when true, shows loading indicator
3241
3370
  * @default false
@@ -3277,6 +3406,17 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3277
3406
  * Emitted when modal is closed
3278
3407
  */
3279
3408
  closed: _angular_core.OutputEmitterRef<void>;
3409
+ /**
3410
+ * Emitted when keyboard is about to show
3411
+ * Provides keyboard height in pixels
3412
+ * Child components can listen to this to react to keyboard appearance
3413
+ */
3414
+ keyboardWillShow: _angular_core.OutputEmitterRef<number>;
3415
+ /**
3416
+ * Emitted when keyboard is about to hide
3417
+ * Child components can listen to this to react to keyboard dismissal
3418
+ */
3419
+ keyboardWillHide: _angular_core.OutputEmitterRef<void>;
3280
3420
  ngOnInit(): void;
3281
3421
  ngOnDestroy(): void;
3282
3422
  /**
@@ -3286,7 +3426,8 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3286
3426
  close(): void;
3287
3427
  /**
3288
3428
  * Set up keyboard event listeners to adjust component position
3289
- * Uses --keyboard-height for fixed bottom composer and adds padding to scroll area
3429
+ * Uses --keyboard-height for fixed bottom composer and adds padding to scroll area.
3430
+ * Adjusts scroll position so content smoothly follows the keyboard up (like Messenger/Telegram).
3290
3431
  * @protected
3291
3432
  */
3292
3433
  protected setupKeyboardListeners(): void;
@@ -3302,7 +3443,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3302
3443
  */
3303
3444
  protected cleanupKeyboardListeners(): void;
3304
3445
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileModalBase, never>;
3305
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobileModalBase, never, never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerMeta": { "alias": "headerMeta"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "enableKeyboardHandling": { "alias": "enableKeyboardHandling"; "required": false; "isSignal": true; }; "hasFixedBottom": { "alias": "hasFixedBottom"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
3446
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobileModalBase, never, never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerMeta": { "alias": "headerMeta"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "enableKeyboardHandling": { "alias": "enableKeyboardHandling"; "required": false; "isSignal": true; }; "hasFixedBottom": { "alias": "hasFixedBottom"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "keyboardWillShow": "keyboardWillShow"; "keyboardWillHide": "keyboardWillHide"; }, never, never, true, never>;
3306
3447
  }
3307
3448
 
3308
3449
  /**
@@ -3372,7 +3513,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3372
3513
  * </ds-mobile-modal-base>
3373
3514
  * ```
3374
3515
  */
3375
- declare class DsMobileModalBaseComponent extends MobileModalBase implements AfterContentInit {
3516
+ declare class DsMobileModalBaseComponent extends MobileModalBase implements OnInit, AfterContentInit, OnDestroy {
3376
3517
  private cdr;
3377
3518
  /**
3378
3519
  * Reference to ion-content for keyboard handling
@@ -3407,7 +3548,9 @@ declare class DsMobileModalBaseComponent extends MobileModalBase implements Afte
3407
3548
  hasCustomLoadingState: boolean;
3408
3549
  hasCustomErrorState: boolean;
3409
3550
  constructor(cdr: ChangeDetectorRef);
3551
+ ngOnInit(): void;
3410
3552
  ngAfterContentInit(): void;
3553
+ ngOnDestroy(): void;
3411
3554
  /**
3412
3555
  * Determine if header should be shown based on showHeader input and content detection
3413
3556
  */
@@ -3578,18 +3721,6 @@ declare class DsMobilePostDetailModalComponent implements OnInit, AfterViewInit
3578
3721
  originalContent: string;
3579
3722
  timestamp: string;
3580
3723
  } | null>;
3581
- showMentionMenu: _angular_core.WritableSignal<boolean>;
3582
- mentionQuery: _angular_core.WritableSignal<string>;
3583
- availableUsers: _angular_core.Signal<{
3584
- name: string;
3585
- initials: string;
3586
- role: string;
3587
- }[]>;
3588
- filteredUsers: _angular_core.Signal<{
3589
- name: string;
3590
- initials: string;
3591
- role: string;
3592
- }[]>;
3593
3724
  constructor(lightbox: DsMobileLightboxService, bottomSheet: DsMobileBottomSheetService);
3594
3725
  ngOnInit(): void;
3595
3726
  ngAfterViewInit(): void;
@@ -3602,13 +3733,9 @@ declare class DsMobilePostDetailModalComponent implements OnInit, AfterViewInit
3602
3733
  */
3603
3734
  focusCommentInput(): void;
3604
3735
  /**
3605
- * Handle input changes and detect @ mentions
3736
+ * Handle input changes for auto-resize
3606
3737
  */
3607
3738
  handleInput(event: Event): void;
3608
- /**
3609
- * Select a user from mention menu - show as reply indicator instead of inline mention
3610
- */
3611
- selectMention(userName: string): void;
3612
3739
  /**
3613
3740
  * Handle reply to a comment
3614
3741
  */
@@ -3819,6 +3946,7 @@ interface ChatMessage {
3819
3946
  isOwnMessage: boolean;
3820
3947
  attachments?: ChatAttachment[];
3821
3948
  fileAttachments?: AttachmentData[];
3949
+ isNewMessage?: boolean;
3822
3950
  }
3823
3951
  /**
3824
3952
  * Message group interface for grouped timestamp display
@@ -3828,6 +3956,14 @@ interface MessageGroup {
3828
3956
  displayTimestamp: string;
3829
3957
  messages: ChatMessage[];
3830
3958
  }
3959
+ /**
3960
+ * Extended message interface with display metadata
3961
+ */
3962
+ interface MessageDisplay extends ChatMessage {
3963
+ showAvatar: boolean;
3964
+ clusterPosition: 'single' | 'first' | 'middle' | 'last';
3965
+ isNewMessage?: boolean;
3966
+ }
3831
3967
  /**
3832
3968
  * Chat participant interface
3833
3969
  */
@@ -3838,6 +3974,9 @@ interface ChatParticipant {
3838
3974
  avatarInitials?: string;
3839
3975
  avatarType?: 'initials' | 'photo' | 'icon';
3840
3976
  avatarSrc?: string;
3977
+ badge?: string;
3978
+ verified?: boolean;
3979
+ lastActive?: string;
3841
3980
  }
3842
3981
  /**
3843
3982
  * Chat modal data interface
@@ -3955,6 +4094,10 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
3955
4094
  * Error state - when set, shows error message
3956
4095
  */
3957
4096
  error?: string;
4097
+ /**
4098
+ * Back button click event
4099
+ */
4100
+ back: EventEmitter<void>;
3958
4101
  participant: _angular_core.WritableSignal<ChatParticipant>;
3959
4102
  messages: _angular_core.WritableSignal<ChatMessage[]>;
3960
4103
  currentUserInitials: _angular_core.WritableSignal<string>;
@@ -3965,6 +4108,10 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
3965
4108
  * Selected message ID for showing timestamp
3966
4109
  */
3967
4110
  selectedMessageId: _angular_core.WritableSignal<string | null>;
4111
+ /**
4112
+ * Track if keyboard is currently visible
4113
+ */
4114
+ private isKeyboardVisible;
3968
4115
  /**
3969
4116
  * Timeout for auto-hiding timestamp
3970
4117
  */
@@ -3973,9 +4120,30 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
3973
4120
  * Computed signal for grouped messages with timestamp headers
3974
4121
  */
3975
4122
  messageGroups: _angular_core.Signal<MessageGroup[]>;
4123
+ /**
4124
+ * Computed signal for messages with display metadata (avatar visibility)
4125
+ */
4126
+ messagesWithDisplay: _angular_core.Signal<(MessageGroup & {
4127
+ messages: MessageDisplay[];
4128
+ })[]>;
3976
4129
  constructor(lightboxService: DsMobileLightboxService);
3977
4130
  ngOnInit(): void;
3978
4131
  ngAfterViewInit(): void;
4132
+ /**
4133
+ * Handle back button click
4134
+ */
4135
+ handleBack(): void;
4136
+ /**
4137
+ * Handle keyboard show event from base modal
4138
+ * Only scrolls to bottom if user is already near the bottom, otherwise lets
4139
+ * the natural padding expansion push content up (like Messenger/Signal/Telegram)
4140
+ */
4141
+ handleKeyboardShow(keyboardHeight: number): void;
4142
+ /**
4143
+ * Check if scroll position is near the bottom
4144
+ * Used to determine if we should auto-scroll when keyboard appears
4145
+ */
4146
+ private isNearBottom;
3979
4147
  /**
3980
4148
  * Scroll to bottom of messages
3981
4149
  */
@@ -3998,6 +4166,16 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
3998
4166
  * Handle composer attachment button click
3999
4167
  */
4000
4168
  handleComposerAttachmentClick(): void;
4169
+ /**
4170
+ * Handle attachments changed (added or removed)
4171
+ * ResizeObserver automatically updates padding, which naturally pushes content up.
4172
+ * Only scroll to bottom if user is already viewing the latest messages.
4173
+ */
4174
+ handleAttachmentsChanged(): void;
4175
+ /**
4176
+ * Handle content area click - dismiss keyboard when tapping messages
4177
+ */
4178
+ handleContentClick(): void;
4001
4179
  /**
4002
4180
  * Get file variant for card-inline-file component
4003
4181
  */
@@ -4016,12 +4194,18 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
4016
4194
  handleMessageLongPress(message: ChatMessage): void;
4017
4195
  /**
4018
4196
  * Handle message click to show/hide timestamp
4197
+ * Only shows timestamp if keyboard is already hidden
4019
4198
  */
4020
4199
  handleMessageClick(messageId: string): void;
4021
4200
  /**
4022
4201
  * Format message timestamp for display (EU 24-hour format, Danish)
4023
4202
  */
4024
4203
  formatMessageTimestamp(date: Date): string;
4204
+ /**
4205
+ * Get initial timestamp for empty chat state
4206
+ * Returns current time formatted with smart date display
4207
+ */
4208
+ getInitialTimestamp(): string;
4025
4209
  /**
4026
4210
  * Group messages by time threshold
4027
4211
  * Messages within the threshold and on the same day are grouped together
@@ -4036,8 +4220,14 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
4036
4220
  * Uses 24-hour EU time format with Danish locale
4037
4221
  */
4038
4222
  private formatGroupTimestamp;
4223
+ /**
4224
+ * Add display metadata to message groups
4225
+ * Determines which messages should show avatars (only last in cluster)
4226
+ * and calculates cluster positions for border radius styling
4227
+ */
4228
+ private addDisplayMetadata;
4039
4229
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileChatModalComponent, never>;
4040
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileChatModalComponent, "ds-mobile-chat-modal", never, { "chatData": { "alias": "chatData"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "error": { "alias": "error"; "required": false; }; }, {}, never, never, true, never>;
4230
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileChatModalComponent, "ds-mobile-chat-modal", never, { "chatData": { "alias": "chatData"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "error": { "alias": "error"; "required": false; }; }, { "back": "back"; }, never, never, true, never>;
4041
4231
  }
4042
4232
 
4043
4233
  /**
@@ -4699,7 +4889,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
4699
4889
  hasError: _angular_core.InputSignal<boolean>;
4700
4890
  errorMessage: _angular_core.InputSignal<string>;
4701
4891
  autocomplete: _angular_core.InputSignal<string>;
4702
- inputmode: _angular_core.InputSignal<"search" | "text" | "url" | "numeric" | "email" | "tel" | undefined>;
4892
+ inputmode: _angular_core.InputSignal<"search" | "text" | "numeric" | "url" | "email" | "tel" | undefined>;
4703
4893
  autoClearError: _angular_core.InputSignal<boolean>;
4704
4894
  validator: _angular_core.InputSignal<((value: string) => boolean) | null>;
4705
4895
  valueChange: _angular_core.OutputEmitterRef<string>;
@@ -4735,6 +4925,8 @@ declare class DsTextInputComponent implements ControlValueAccessor {
4735
4925
  * Features:
4736
4926
  * - Configurable positioning (bottom-right, bottom-left, bottom-center)
4737
4927
  * - Uses design system theming variables
4928
+ * - Dynamically calculates position above tab bar (including safe areas)
4929
+ * - Maintains consistent 20px gap from tab bar
4738
4930
  * - Handles iOS safe areas
4739
4931
  * - Accessible with ARIA labels
4740
4932
  * - Smooth entrance animation
@@ -4749,7 +4941,10 @@ declare class DsTextInputComponent implements ControlValueAccessor {
4749
4941
  * </ds-mobile-fab>
4750
4942
  * ```
4751
4943
  */
4752
- declare class DsMobileFabComponent {
4944
+ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
4945
+ private elementRef;
4946
+ private platform;
4947
+ private resizeObserver?;
4753
4948
  /**
4754
4949
  * Icon name from the design system icon library
4755
4950
  * @default 'remixAddLine'
@@ -4780,10 +4975,21 @@ declare class DsMobileFabComponent {
4780
4975
  * Emitted when the FAB is clicked
4781
4976
  */
4782
4977
  fabClick: _angular_core.OutputEmitterRef<void>;
4978
+ ngAfterViewInit(): void;
4979
+ /**
4980
+ * Calculate the FAB position dynamically based on actual tab bar height
4981
+ */
4982
+ private calculatePosition;
4983
+ /**
4984
+ * Setup ResizeObserver to recalculate position when tab bar size changes
4985
+ * (e.g., when device rotates or safe area changes)
4986
+ */
4987
+ private setupResizeObserver;
4783
4988
  /**
4784
4989
  * Handle button click
4785
4990
  */
4786
4991
  handleClick(): void;
4992
+ ngOnDestroy(): void;
4787
4993
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileFabComponent, never>;
4788
4994
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileFabComponent, "ds-mobile-fab", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "fabClick": "fabClick"; }, never, never, true, never>;
4789
4995
  }
@@ -4873,6 +5079,28 @@ declare class WhitelabelService {
4873
5079
  * Convert hex color to RGB values
4874
5080
  */
4875
5081
  private hexToRgb;
5082
+ /**
5083
+ * Generate a hover state color by applying a black overlay
5084
+ * This simulates the effect of overlaying #000000 with 10% opacity
5085
+ *
5086
+ * @param baseColor - Hex color to overlay on (e.g., '#6B5FF5')
5087
+ * @param overlayColor - Overlay color (default: '#000000' for darkening)
5088
+ * @param overlayAlpha - Opacity of overlay (0-1, default: 0.1 = 10%)
5089
+ * @returns Hex color with overlay applied
5090
+ *
5091
+ * @example
5092
+ * generateHoverColor('#6B5FF5') // Returns darker purple for hover state
5093
+ * generateHoverColor('#FF0000', '#FFFFFF', 0.2) // Lighten red by 20%
5094
+ */
5095
+ private generateHoverColor;
5096
+ /**
5097
+ * Generate an active/pressed state color (darker than hover)
5098
+ * Uses 20% black overlay for a more pronounced pressed effect
5099
+ *
5100
+ * @param baseColor - Hex color to overlay on
5101
+ * @returns Hex color for active/pressed state
5102
+ */
5103
+ private generateActiveColor;
4876
5104
  /**
4877
5105
  * Apply colors to CSS custom properties and native StatusBar
4878
5106
  * This updates the actual CSS variables used throughout the app
@@ -4922,6 +5150,56 @@ declare class DsAvatarWithBadgeComponent {
4922
5150
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsAvatarWithBadgeComponent, "ds-avatar-with-badge", never, { "type": { "alias": "type"; "required": false; }; "size": { "alias": "size"; "required": false; }; "initials": { "alias": "initials"; "required": false; }; "src": { "alias": "src"; "required": false; }; "iconName": { "alias": "iconName"; "required": false; }; "showBadge": { "alias": "showBadge"; "required": false; }; "badgePosition": { "alias": "badgePosition"; "required": false; }; }, {}, never, never, true, never>;
4923
5151
  }
4924
5152
 
5153
+ /**
5154
+ * DsMobileEmptyStateComponent
5155
+ *
5156
+ * Reusable empty state component for displaying when there's no content.
5157
+ * Used in chat modals, comment sections, and other list-based views.
5158
+ *
5159
+ * Features:
5160
+ * - Optional image display
5161
+ * - Customizable title and description
5162
+ * - Consistent styling across the app
5163
+ * - Flexible image sizing
5164
+ *
5165
+ * @example
5166
+ * ```html
5167
+ * <!-- With image -->
5168
+ * <ds-mobile-empty-state
5169
+ * [imageSrc]="'/Assets/Empty state-chat.png'"
5170
+ * [imageAlt]="'No messages'"
5171
+ * [title]="'Ingen beskeder endnu'"
5172
+ * [description]="'Start samtalen ved at sende en besked'">
5173
+ * </ds-mobile-empty-state>
5174
+ *
5175
+ * <!-- Without image -->
5176
+ * <ds-mobile-empty-state
5177
+ * [title]="'Ingen resultater'"
5178
+ * [description]="'Prøv at justere dine søgekriterier'">
5179
+ * </ds-mobile-empty-state>
5180
+ * ```
5181
+ */
5182
+ declare class DsMobileEmptyStateComponent {
5183
+ /**
5184
+ * Source URL for the empty state image (optional)
5185
+ */
5186
+ imageSrc: _angular_core.InputSignal<string>;
5187
+ /**
5188
+ * Alt text for the image
5189
+ */
5190
+ imageAlt: _angular_core.InputSignal<string>;
5191
+ /**
5192
+ * Title text for the empty state
5193
+ */
5194
+ title: _angular_core.InputSignal<string>;
5195
+ /**
5196
+ * Description text for the empty state (optional)
5197
+ */
5198
+ description: _angular_core.InputSignal<string>;
5199
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileEmptyStateComponent, never>;
5200
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileEmptyStateComponent, "ds-mobile-empty-state", never, { "imageSrc": { "alias": "imageSrc"; "required": false; "isSignal": true; }; "imageAlt": { "alias": "imageAlt"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5201
+ }
5202
+
4925
5203
  /**
4926
5204
  * User service for managing current user data globally
4927
5205
  */
@@ -4955,6 +5233,7 @@ declare class UserService {
4955
5233
  * Unified data structures for community posts
4956
5234
  */
4957
5235
  interface Comment {
5236
+ id?: string;
4958
5237
  authorName: string;
4959
5238
  authorRole: string;
4960
5239
  timestamp: string;
@@ -5104,7 +5383,9 @@ declare class MobileHomePageComponent {
5104
5383
  userService: UserService;
5105
5384
  constructor(navCtrl: NavController, userService: UserService);
5106
5385
  handleRefresh(event: any): void;
5107
- navigateToDetail(): void;
5386
+ handlePostClick(): void;
5387
+ handleContactClick(contactType: string): void;
5388
+ handleFileClick(fileType: string): void;
5108
5389
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHomePageComponent, never>;
5109
5390
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHomePageComponent, "app-home-page", never, {}, {}, never, never, true, never>;
5110
5391
  }
@@ -5122,7 +5403,7 @@ declare class MobileInquiriesPageComponent {
5122
5403
  private navCtrl;
5123
5404
  private newInquiryModal;
5124
5405
  constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
5125
- filterStatus: _angular_core.WritableSignal<"open" | "closed" | "all">;
5406
+ filterStatus: _angular_core.WritableSignal<"all" | "open" | "closed">;
5126
5407
  tabItems: InlineTabItem[];
5127
5408
  inquiries: _angular_core.WritableSignal<Inquiry[]>;
5128
5409
  filteredInquiries: _angular_core.Signal<Inquiry[]>;
@@ -5132,6 +5413,7 @@ declare class MobileInquiriesPageComponent {
5132
5413
  getInquiryIcon(category: string): string;
5133
5414
  openInquiryDetail(inquiryId: string): void;
5134
5415
  showInquiryActions(inquiryId: string): void;
5416
+ handleRefresh(event: any): void;
5135
5417
  createNewInquiry(): Promise<void>;
5136
5418
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileInquiriesPageComponent, never>;
5137
5419
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileInquiriesPageComponent, "app-mobile-inquiries-page", never, {}, {}, never, never, true, never>;
@@ -5197,7 +5479,7 @@ declare class MobileTabsExampleComponent implements OnInit {
5197
5479
  * so it will be used by both ds-mobile-tab-bar and ds-mobile-page-main components
5198
5480
  * throughout the entire application.
5199
5481
  */
5200
- profileMenuItems: ActionGroup[];
5482
+ get profileMenuItems(): ActionGroup[];
5201
5483
  /**
5202
5484
  * Handle profile menu action selection.
5203
5485
  * The tab bar component handles the UI (opening/closing menu),
@@ -5319,5 +5601,5 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
5319
5601
  */
5320
5602
  declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
5321
5603
 
5322
- export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAvatarWithBadgeComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileContentSectionComponent, DsMobileFabComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLongPressDirective, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobileTabBarComponent, DsMobileTabsComponent, DsTextInputComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, SectionHeaderComponent, SignInPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, UserService, WhitelabelDemoPage, WhitelabelService, customBackTransition, customPageTransition };
5323
- export type { ActionGroup, ActionItem, ActionResult, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, ModalOptions, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, TabConfig, WhitelabelConfig };
5604
+ export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAvatarWithBadgeComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileContentSectionComponent, DsMobileDropdownComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLongPressDirective, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobileProfileActionsSheetComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsTextInputComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, SectionHeaderComponent, SignInPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, UserService, WhitelabelDemoPage, WhitelabelService, customBackTransition, customPageTransition };
5605
+ export type { ActionGroup, ActionItem, ActionResult, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, DropdownAlign, DropdownPosition, DsMobileDropdownItem, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, ModalOptions, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, TabConfig, WhitelabelConfig };