@propbinder/mobile-design 0.2.5 → 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/fesm2022/propbinder-mobile-design.mjs +2430 -648
- package/fesm2022/propbinder-mobile-design.mjs.map +1 -1
- package/index.d.ts +570 -38
- package/package.json +1 -1
- package/styles/ionic.css +41 -4
- package/styles/mobile-page-base.css +4 -1
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.
|
|
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.
|
|
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; }; }, { "
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
1496
|
+
*/
|
|
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
|
|
1149
1507
|
*/
|
|
1150
|
-
|
|
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
|
/**
|
|
@@ -2986,6 +3361,10 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
2986
3361
|
* ResizeObserver for tracking fixed bottom height
|
|
2987
3362
|
*/
|
|
2988
3363
|
private fixedBottomObserver?;
|
|
3364
|
+
/**
|
|
3365
|
+
* Flag to prevent ResizeObserver from updating padding during keyboard animations
|
|
3366
|
+
*/
|
|
3367
|
+
private isKeyboardAnimating;
|
|
2989
3368
|
/**
|
|
2990
3369
|
* Loading state - when true, shows loading indicator
|
|
2991
3370
|
* @default false
|
|
@@ -3027,6 +3406,17 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
3027
3406
|
* Emitted when modal is closed
|
|
3028
3407
|
*/
|
|
3029
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>;
|
|
3030
3420
|
ngOnInit(): void;
|
|
3031
3421
|
ngOnDestroy(): void;
|
|
3032
3422
|
/**
|
|
@@ -3036,7 +3426,8 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
3036
3426
|
close(): void;
|
|
3037
3427
|
/**
|
|
3038
3428
|
* Set up keyboard event listeners to adjust component position
|
|
3039
|
-
* 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).
|
|
3040
3431
|
* @protected
|
|
3041
3432
|
*/
|
|
3042
3433
|
protected setupKeyboardListeners(): void;
|
|
@@ -3052,7 +3443,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
3052
3443
|
*/
|
|
3053
3444
|
protected cleanupKeyboardListeners(): void;
|
|
3054
3445
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileModalBase, never>;
|
|
3055
|
-
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>;
|
|
3056
3447
|
}
|
|
3057
3448
|
|
|
3058
3449
|
/**
|
|
@@ -3122,7 +3513,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
3122
3513
|
* </ds-mobile-modal-base>
|
|
3123
3514
|
* ```
|
|
3124
3515
|
*/
|
|
3125
|
-
declare class DsMobileModalBaseComponent extends MobileModalBase implements AfterContentInit {
|
|
3516
|
+
declare class DsMobileModalBaseComponent extends MobileModalBase implements OnInit, AfterContentInit, OnDestroy {
|
|
3126
3517
|
private cdr;
|
|
3127
3518
|
/**
|
|
3128
3519
|
* Reference to ion-content for keyboard handling
|
|
@@ -3157,7 +3548,9 @@ declare class DsMobileModalBaseComponent extends MobileModalBase implements Afte
|
|
|
3157
3548
|
hasCustomLoadingState: boolean;
|
|
3158
3549
|
hasCustomErrorState: boolean;
|
|
3159
3550
|
constructor(cdr: ChangeDetectorRef);
|
|
3551
|
+
ngOnInit(): void;
|
|
3160
3552
|
ngAfterContentInit(): void;
|
|
3553
|
+
ngOnDestroy(): void;
|
|
3161
3554
|
/**
|
|
3162
3555
|
* Determine if header should be shown based on showHeader input and content detection
|
|
3163
3556
|
*/
|
|
@@ -3328,18 +3721,6 @@ declare class DsMobilePostDetailModalComponent implements OnInit, AfterViewInit
|
|
|
3328
3721
|
originalContent: string;
|
|
3329
3722
|
timestamp: string;
|
|
3330
3723
|
} | null>;
|
|
3331
|
-
showMentionMenu: _angular_core.WritableSignal<boolean>;
|
|
3332
|
-
mentionQuery: _angular_core.WritableSignal<string>;
|
|
3333
|
-
availableUsers: _angular_core.Signal<{
|
|
3334
|
-
name: string;
|
|
3335
|
-
initials: string;
|
|
3336
|
-
role: string;
|
|
3337
|
-
}[]>;
|
|
3338
|
-
filteredUsers: _angular_core.Signal<{
|
|
3339
|
-
name: string;
|
|
3340
|
-
initials: string;
|
|
3341
|
-
role: string;
|
|
3342
|
-
}[]>;
|
|
3343
3724
|
constructor(lightbox: DsMobileLightboxService, bottomSheet: DsMobileBottomSheetService);
|
|
3344
3725
|
ngOnInit(): void;
|
|
3345
3726
|
ngAfterViewInit(): void;
|
|
@@ -3352,13 +3733,9 @@ declare class DsMobilePostDetailModalComponent implements OnInit, AfterViewInit
|
|
|
3352
3733
|
*/
|
|
3353
3734
|
focusCommentInput(): void;
|
|
3354
3735
|
/**
|
|
3355
|
-
* Handle input changes
|
|
3736
|
+
* Handle input changes for auto-resize
|
|
3356
3737
|
*/
|
|
3357
3738
|
handleInput(event: Event): void;
|
|
3358
|
-
/**
|
|
3359
|
-
* Select a user from mention menu - show as reply indicator instead of inline mention
|
|
3360
|
-
*/
|
|
3361
|
-
selectMention(userName: string): void;
|
|
3362
3739
|
/**
|
|
3363
3740
|
* Handle reply to a comment
|
|
3364
3741
|
*/
|
|
@@ -3569,6 +3946,7 @@ interface ChatMessage {
|
|
|
3569
3946
|
isOwnMessage: boolean;
|
|
3570
3947
|
attachments?: ChatAttachment[];
|
|
3571
3948
|
fileAttachments?: AttachmentData[];
|
|
3949
|
+
isNewMessage?: boolean;
|
|
3572
3950
|
}
|
|
3573
3951
|
/**
|
|
3574
3952
|
* Message group interface for grouped timestamp display
|
|
@@ -3578,6 +3956,14 @@ interface MessageGroup {
|
|
|
3578
3956
|
displayTimestamp: string;
|
|
3579
3957
|
messages: ChatMessage[];
|
|
3580
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
|
+
}
|
|
3581
3967
|
/**
|
|
3582
3968
|
* Chat participant interface
|
|
3583
3969
|
*/
|
|
@@ -3588,6 +3974,9 @@ interface ChatParticipant {
|
|
|
3588
3974
|
avatarInitials?: string;
|
|
3589
3975
|
avatarType?: 'initials' | 'photo' | 'icon';
|
|
3590
3976
|
avatarSrc?: string;
|
|
3977
|
+
badge?: string;
|
|
3978
|
+
verified?: boolean;
|
|
3979
|
+
lastActive?: string;
|
|
3591
3980
|
}
|
|
3592
3981
|
/**
|
|
3593
3982
|
* Chat modal data interface
|
|
@@ -3705,6 +4094,10 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
3705
4094
|
* Error state - when set, shows error message
|
|
3706
4095
|
*/
|
|
3707
4096
|
error?: string;
|
|
4097
|
+
/**
|
|
4098
|
+
* Back button click event
|
|
4099
|
+
*/
|
|
4100
|
+
back: EventEmitter<void>;
|
|
3708
4101
|
participant: _angular_core.WritableSignal<ChatParticipant>;
|
|
3709
4102
|
messages: _angular_core.WritableSignal<ChatMessage[]>;
|
|
3710
4103
|
currentUserInitials: _angular_core.WritableSignal<string>;
|
|
@@ -3715,6 +4108,10 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
3715
4108
|
* Selected message ID for showing timestamp
|
|
3716
4109
|
*/
|
|
3717
4110
|
selectedMessageId: _angular_core.WritableSignal<string | null>;
|
|
4111
|
+
/**
|
|
4112
|
+
* Track if keyboard is currently visible
|
|
4113
|
+
*/
|
|
4114
|
+
private isKeyboardVisible;
|
|
3718
4115
|
/**
|
|
3719
4116
|
* Timeout for auto-hiding timestamp
|
|
3720
4117
|
*/
|
|
@@ -3723,9 +4120,30 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
3723
4120
|
* Computed signal for grouped messages with timestamp headers
|
|
3724
4121
|
*/
|
|
3725
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
|
+
})[]>;
|
|
3726
4129
|
constructor(lightboxService: DsMobileLightboxService);
|
|
3727
4130
|
ngOnInit(): void;
|
|
3728
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;
|
|
3729
4147
|
/**
|
|
3730
4148
|
* Scroll to bottom of messages
|
|
3731
4149
|
*/
|
|
@@ -3748,6 +4166,16 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
3748
4166
|
* Handle composer attachment button click
|
|
3749
4167
|
*/
|
|
3750
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;
|
|
3751
4179
|
/**
|
|
3752
4180
|
* Get file variant for card-inline-file component
|
|
3753
4181
|
*/
|
|
@@ -3766,12 +4194,18 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
3766
4194
|
handleMessageLongPress(message: ChatMessage): void;
|
|
3767
4195
|
/**
|
|
3768
4196
|
* Handle message click to show/hide timestamp
|
|
4197
|
+
* Only shows timestamp if keyboard is already hidden
|
|
3769
4198
|
*/
|
|
3770
4199
|
handleMessageClick(messageId: string): void;
|
|
3771
4200
|
/**
|
|
3772
4201
|
* Format message timestamp for display (EU 24-hour format, Danish)
|
|
3773
4202
|
*/
|
|
3774
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;
|
|
3775
4209
|
/**
|
|
3776
4210
|
* Group messages by time threshold
|
|
3777
4211
|
* Messages within the threshold and on the same day are grouped together
|
|
@@ -3786,8 +4220,14 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
3786
4220
|
* Uses 24-hour EU time format with Danish locale
|
|
3787
4221
|
*/
|
|
3788
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;
|
|
3789
4229
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileChatModalComponent, never>;
|
|
3790
|
-
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>;
|
|
3791
4231
|
}
|
|
3792
4232
|
|
|
3793
4233
|
/**
|
|
@@ -4449,7 +4889,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
|
|
|
4449
4889
|
hasError: _angular_core.InputSignal<boolean>;
|
|
4450
4890
|
errorMessage: _angular_core.InputSignal<string>;
|
|
4451
4891
|
autocomplete: _angular_core.InputSignal<string>;
|
|
4452
|
-
inputmode: _angular_core.InputSignal<"search" | "text" | "
|
|
4892
|
+
inputmode: _angular_core.InputSignal<"search" | "text" | "numeric" | "url" | "email" | "tel" | undefined>;
|
|
4453
4893
|
autoClearError: _angular_core.InputSignal<boolean>;
|
|
4454
4894
|
validator: _angular_core.InputSignal<((value: string) => boolean) | null>;
|
|
4455
4895
|
valueChange: _angular_core.OutputEmitterRef<string>;
|
|
@@ -4485,6 +4925,8 @@ declare class DsTextInputComponent implements ControlValueAccessor {
|
|
|
4485
4925
|
* Features:
|
|
4486
4926
|
* - Configurable positioning (bottom-right, bottom-left, bottom-center)
|
|
4487
4927
|
* - Uses design system theming variables
|
|
4928
|
+
* - Dynamically calculates position above tab bar (including safe areas)
|
|
4929
|
+
* - Maintains consistent 20px gap from tab bar
|
|
4488
4930
|
* - Handles iOS safe areas
|
|
4489
4931
|
* - Accessible with ARIA labels
|
|
4490
4932
|
* - Smooth entrance animation
|
|
@@ -4499,7 +4941,10 @@ declare class DsTextInputComponent implements ControlValueAccessor {
|
|
|
4499
4941
|
* </ds-mobile-fab>
|
|
4500
4942
|
* ```
|
|
4501
4943
|
*/
|
|
4502
|
-
declare class DsMobileFabComponent {
|
|
4944
|
+
declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
|
|
4945
|
+
private elementRef;
|
|
4946
|
+
private platform;
|
|
4947
|
+
private resizeObserver?;
|
|
4503
4948
|
/**
|
|
4504
4949
|
* Icon name from the design system icon library
|
|
4505
4950
|
* @default 'remixAddLine'
|
|
@@ -4530,10 +4975,21 @@ declare class DsMobileFabComponent {
|
|
|
4530
4975
|
* Emitted when the FAB is clicked
|
|
4531
4976
|
*/
|
|
4532
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;
|
|
4533
4988
|
/**
|
|
4534
4989
|
* Handle button click
|
|
4535
4990
|
*/
|
|
4536
4991
|
handleClick(): void;
|
|
4992
|
+
ngOnDestroy(): void;
|
|
4537
4993
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileFabComponent, never>;
|
|
4538
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>;
|
|
4539
4995
|
}
|
|
@@ -4623,6 +5079,28 @@ declare class WhitelabelService {
|
|
|
4623
5079
|
* Convert hex color to RGB values
|
|
4624
5080
|
*/
|
|
4625
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;
|
|
4626
5104
|
/**
|
|
4627
5105
|
* Apply colors to CSS custom properties and native StatusBar
|
|
4628
5106
|
* This updates the actual CSS variables used throughout the app
|
|
@@ -4672,6 +5150,56 @@ declare class DsAvatarWithBadgeComponent {
|
|
|
4672
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>;
|
|
4673
5151
|
}
|
|
4674
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
|
+
|
|
4675
5203
|
/**
|
|
4676
5204
|
* User service for managing current user data globally
|
|
4677
5205
|
*/
|
|
@@ -4705,6 +5233,7 @@ declare class UserService {
|
|
|
4705
5233
|
* Unified data structures for community posts
|
|
4706
5234
|
*/
|
|
4707
5235
|
interface Comment {
|
|
5236
|
+
id?: string;
|
|
4708
5237
|
authorName: string;
|
|
4709
5238
|
authorRole: string;
|
|
4710
5239
|
timestamp: string;
|
|
@@ -4854,7 +5383,9 @@ declare class MobileHomePageComponent {
|
|
|
4854
5383
|
userService: UserService;
|
|
4855
5384
|
constructor(navCtrl: NavController, userService: UserService);
|
|
4856
5385
|
handleRefresh(event: any): void;
|
|
4857
|
-
|
|
5386
|
+
handlePostClick(): void;
|
|
5387
|
+
handleContactClick(contactType: string): void;
|
|
5388
|
+
handleFileClick(fileType: string): void;
|
|
4858
5389
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHomePageComponent, never>;
|
|
4859
5390
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHomePageComponent, "app-home-page", never, {}, {}, never, never, true, never>;
|
|
4860
5391
|
}
|
|
@@ -4872,7 +5403,7 @@ declare class MobileInquiriesPageComponent {
|
|
|
4872
5403
|
private navCtrl;
|
|
4873
5404
|
private newInquiryModal;
|
|
4874
5405
|
constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
|
|
4875
|
-
filterStatus: _angular_core.WritableSignal<"
|
|
5406
|
+
filterStatus: _angular_core.WritableSignal<"all" | "open" | "closed">;
|
|
4876
5407
|
tabItems: InlineTabItem[];
|
|
4877
5408
|
inquiries: _angular_core.WritableSignal<Inquiry[]>;
|
|
4878
5409
|
filteredInquiries: _angular_core.Signal<Inquiry[]>;
|
|
@@ -4882,6 +5413,7 @@ declare class MobileInquiriesPageComponent {
|
|
|
4882
5413
|
getInquiryIcon(category: string): string;
|
|
4883
5414
|
openInquiryDetail(inquiryId: string): void;
|
|
4884
5415
|
showInquiryActions(inquiryId: string): void;
|
|
5416
|
+
handleRefresh(event: any): void;
|
|
4885
5417
|
createNewInquiry(): Promise<void>;
|
|
4886
5418
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileInquiriesPageComponent, never>;
|
|
4887
5419
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileInquiriesPageComponent, "app-mobile-inquiries-page", never, {}, {}, never, never, true, never>;
|
|
@@ -4947,7 +5479,7 @@ declare class MobileTabsExampleComponent implements OnInit {
|
|
|
4947
5479
|
* so it will be used by both ds-mobile-tab-bar and ds-mobile-page-main components
|
|
4948
5480
|
* throughout the entire application.
|
|
4949
5481
|
*/
|
|
4950
|
-
profileMenuItems: ActionGroup[];
|
|
5482
|
+
get profileMenuItems(): ActionGroup[];
|
|
4951
5483
|
/**
|
|
4952
5484
|
* Handle profile menu action selection.
|
|
4953
5485
|
* The tab bar component handles the UI (opening/closing menu),
|
|
@@ -5069,5 +5601,5 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
|
|
|
5069
5601
|
*/
|
|
5070
5602
|
declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
|
|
5071
5603
|
|
|
5072
|
-
export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAvatarWithBadgeComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, 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 };
|
|
5073
|
-
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 };
|