@propbinder/mobile-design 0.1.22 → 0.2.0

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
@@ -338,6 +338,7 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
338
338
  private modalController;
339
339
  private router;
340
340
  private userService;
341
+ private whitelabelDemoModal;
341
342
  isNativePlatform: _angular_core.Signal<boolean>;
342
343
  title: _angular_core.InputSignal<string>;
343
344
  headerTitle: _angular_core.InputSignal<string>;
@@ -813,6 +814,320 @@ declare class DsMobilePostComposerComponent {
813
814
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePostComposerComponent, "ds-mobile-post-composer", never, { "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "buttonText": { "alias": "buttonText"; "required": false; "isSignal": true; }; }, { "composerClick": "composerClick"; }, never, never, true, never>;
814
815
  }
815
816
 
817
+ /**
818
+ * DsMobileMessageComposerComponent
819
+ *
820
+ * Reusable message composer component extracted from post-detail-modal.
821
+ * Can be used for both comments and chat messages.
822
+ *
823
+ * Features:
824
+ * - Text input with auto-resize
825
+ * - Avatar display
826
+ * - Send button (appears when text is entered)
827
+ * - Optional mention menu support
828
+ * - Optional edit/reply indicators
829
+ * - Keyboard handling for mobile
830
+ * - Safe area support
831
+ *
832
+ * @example
833
+ * ```html
834
+ * <ds-mobile-message-composer
835
+ * [avatarInitials]="'JD'"
836
+ * [placeholder]="'Write a message...'"
837
+ * (messageSent)="handleMessage($event)">
838
+ * </ds-mobile-message-composer>
839
+ * ```
840
+ */
841
+ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestroy {
842
+ /**
843
+ * Avatar initials
844
+ */
845
+ avatarInitials: _angular_core.InputSignal<string>;
846
+ /**
847
+ * Avatar type
848
+ */
849
+ avatarType: _angular_core.InputSignal<"initials" | "photo" | "icon">;
850
+ /**
851
+ * Avatar photo source (for photo type)
852
+ */
853
+ avatarSrc: _angular_core.InputSignal<string>;
854
+ /**
855
+ * Placeholder text for the input
856
+ */
857
+ placeholder: _angular_core.InputSignal<string>;
858
+ /**
859
+ * Send button aria label
860
+ */
861
+ sendButtonLabel: _angular_core.InputSignal<string>;
862
+ /**
863
+ * Edit indicator text (when editing)
864
+ */
865
+ editIndicatorText: _angular_core.InputSignal<string>;
866
+ /**
867
+ * Reply indicator text prefix
868
+ */
869
+ replyIndicatorText: _angular_core.InputSignal<string>;
870
+ /**
871
+ * Whether to enable mention support
872
+ */
873
+ enableMentions: _angular_core.InputSignal<boolean>;
874
+ /**
875
+ * Available users for mentions (if mentions enabled)
876
+ */
877
+ mentionUsers: _angular_core.InputSignal<{
878
+ name: string;
879
+ initials: string;
880
+ role: string;
881
+ }[]>;
882
+ /**
883
+ * Auto-focus input on mount
884
+ */
885
+ autoFocus: _angular_core.InputSignal<boolean>;
886
+ /**
887
+ * ViewChild for message input
888
+ */
889
+ messageInput?: ElementRef<HTMLTextAreaElement>;
890
+ /**
891
+ * Message text signal
892
+ */
893
+ messageText: _angular_core.WritableSignal<string>;
894
+ /**
895
+ * Editing message state (optional)
896
+ */
897
+ editingMessage: _angular_core.WritableSignal<{
898
+ authorName: string;
899
+ originalContent: string;
900
+ timestamp: string;
901
+ } | null>;
902
+ /**
903
+ * Replying to state (optional)
904
+ */
905
+ replyingTo: _angular_core.WritableSignal<{
906
+ authorName: string;
907
+ content: string;
908
+ } | null>;
909
+ /**
910
+ * Mention menu state
911
+ */
912
+ showMentionMenu: _angular_core.WritableSignal<boolean>;
913
+ /**
914
+ * Mention query for filtering
915
+ */
916
+ mentionQuery: _angular_core.WritableSignal<string>;
917
+ /**
918
+ * Filtered users based on mention query
919
+ */
920
+ filteredUsers: _angular_core.Signal<{
921
+ name: string;
922
+ initials: string;
923
+ role: string;
924
+ }[]>;
925
+ /**
926
+ * Emits when a message is sent
927
+ */
928
+ messageSent: _angular_core.OutputEmitterRef<{
929
+ content: string;
930
+ isReply?: boolean;
931
+ replyTo?: string;
932
+ isEdit?: boolean;
933
+ }>;
934
+ /**
935
+ * Emits when edit is cancelled
936
+ */
937
+ editCancelled: _angular_core.OutputEmitterRef<void>;
938
+ /**
939
+ * Emits when reply is cancelled
940
+ */
941
+ replyCancelled: _angular_core.OutputEmitterRef<void>;
942
+ /**
943
+ * Emits when mention is selected
944
+ */
945
+ mentionSelected: _angular_core.OutputEmitterRef<{
946
+ userName: string;
947
+ }>;
948
+ ngAfterViewInit(): void;
949
+ ngOnDestroy(): void;
950
+ /**
951
+ * Set up keyboard event listeners
952
+ */
953
+ private setupKeyboardListeners;
954
+ /**
955
+ * Clean up keyboard event listeners
956
+ */
957
+ private cleanupKeyboardListeners;
958
+ /**
959
+ * Show the keyboard when user interacts with input
960
+ */
961
+ showKeyboard(): void;
962
+ /**
963
+ * Handle input changes and detect @ mentions
964
+ */
965
+ handleInput(event: Event): void;
966
+ /**
967
+ * Select a user from mention menu
968
+ */
969
+ selectMention(userName: string): void;
970
+ /**
971
+ * Cancel edit
972
+ */
973
+ cancelEdit(): void;
974
+ /**
975
+ * Cancel reply
976
+ */
977
+ cancelReply(): void;
978
+ /**
979
+ * Set reply state (for external use)
980
+ */
981
+ setReply(authorName: string, content: string): void;
982
+ /**
983
+ * Set edit state (for external use)
984
+ */
985
+ setEdit(authorName: string, originalContent: string, timestamp: string): void;
986
+ /**
987
+ * Clear composer state
988
+ */
989
+ clear(): void;
990
+ /**
991
+ * Focus the input
992
+ */
993
+ focus(): void;
994
+ /**
995
+ * Send message
996
+ */
997
+ sendMessage(): void;
998
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileMessageComposerComponent, never>;
999
+ 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; }; "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"; }, never, never, true, never>;
1000
+ }
1001
+
1002
+ /**
1003
+ * Chat attachment interface
1004
+ */
1005
+ interface ChatAttachment {
1006
+ id: string;
1007
+ type: 'image' | 'pdf' | 'file';
1008
+ url: string;
1009
+ name: string;
1010
+ size?: number;
1011
+ thumbnail?: string;
1012
+ }
1013
+ /**
1014
+ * DsMobileMessageBubbleComponent
1015
+ *
1016
+ * Individual message bubble component for chat conversations.
1017
+ * Supports left-aligned (sender) and right-aligned (user) messages with different styling.
1018
+ *
1019
+ * Features:
1020
+ * - Left/right alignment based on sender
1021
+ * - Avatar display (left for sender, right for user)
1022
+ * - Message content with text wrapping
1023
+ * - Timestamp display
1024
+ * - Read receipt indicator (for user's messages)
1025
+ * - Attachment support
1026
+ * - Long press support for actions
1027
+ *
1028
+ * @example
1029
+ * ```html
1030
+ * <!-- Sender's message (left-aligned) -->
1031
+ * <ds-mobile-message-bubble
1032
+ * [isOwnMessage]="false"
1033
+ * [senderName]="'Ricki Meihlen'"
1034
+ * [content]="'We have received your case...'"
1035
+ * [timestamp]="'12:34'"
1036
+ * [avatarInitials]="'RM'">
1037
+ * </ds-mobile-message-bubble>
1038
+ *
1039
+ * <!-- User's message (right-aligned) -->
1040
+ * <ds-mobile-message-bubble
1041
+ * [isOwnMessage]="true"
1042
+ * [senderName]="'You'"
1043
+ * [content]="'Thank you!'"
1044
+ * [timestamp]="'12:35'"
1045
+ * [readStatus]="true"
1046
+ * [avatarInitials]="'JD'">
1047
+ * </ds-mobile-message-bubble>
1048
+ * ```
1049
+ */
1050
+ declare class DsMobileMessageBubbleComponent {
1051
+ /**
1052
+ * Message content text
1053
+ */
1054
+ content: _angular_core.InputSignal<string>;
1055
+ /**
1056
+ * Whether this is the current user's message (right-aligned)
1057
+ */
1058
+ isOwnMessage: _angular_core.InputSignal<boolean>;
1059
+ /**
1060
+ * Sender's name (for display purposes)
1061
+ */
1062
+ senderName: _angular_core.InputSignal<string>;
1063
+ /**
1064
+ * Timestamp text (e.g., "12:34", "08-12-2025 13:18")
1065
+ */
1066
+ timestamp: _angular_core.InputSignal<string>;
1067
+ /**
1068
+ * Avatar initials
1069
+ */
1070
+ avatarInitials: _angular_core.InputSignal<string>;
1071
+ /**
1072
+ * Avatar type
1073
+ */
1074
+ avatarType: _angular_core.InputSignal<"initials" | "photo" | "icon">;
1075
+ /**
1076
+ * Avatar photo source (for photo type)
1077
+ */
1078
+ avatarSrc: _angular_core.InputSignal<string>;
1079
+ /**
1080
+ * Whether to show read receipt (only for user's messages)
1081
+ */
1082
+ /**
1083
+ * Message attachments
1084
+ */
1085
+ attachments: _angular_core.InputSignal<ChatAttachment[] | undefined>;
1086
+ /**
1087
+ * Whether the message is clickable
1088
+ */
1089
+ clickable: _angular_core.InputSignal<boolean>;
1090
+ /**
1091
+ * Emits when attachment is clicked
1092
+ */
1093
+ attachmentClick: _angular_core.OutputEmitterRef<ChatAttachment>;
1094
+ /**
1095
+ * Emits when the message is long-pressed
1096
+ */
1097
+ longPress: _angular_core.OutputEmitterRef<void>;
1098
+ /**
1099
+ * Long press tracking
1100
+ */
1101
+ private longPressTimer;
1102
+ private longPressTriggered;
1103
+ private touchStartX;
1104
+ private touchStartY;
1105
+ private readonly LONG_PRESS_DURATION;
1106
+ private readonly MOVE_THRESHOLD;
1107
+ /**
1108
+ * Handle attachment click
1109
+ */
1110
+ handleAttachmentClick(attachment: ChatAttachment): void;
1111
+ /**
1112
+ * Handle touch start for long press detection
1113
+ */
1114
+ handleTouchStart(event: TouchEvent): void;
1115
+ /**
1116
+ * Handle touch end to clear long press timer
1117
+ */
1118
+ handleTouchEnd(event: TouchEvent): void;
1119
+ /**
1120
+ * Handle touch move to cancel long press if moved too much
1121
+ */
1122
+ handleTouchMove(event: TouchEvent): void;
1123
+ /**
1124
+ * Handle context menu (right-click on desktop) to trigger long press action
1125
+ */
1126
+ handleContextMenu(event: Event): void;
1127
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileMessageBubbleComponent, never>;
1128
+ 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; }; "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"; }, never, never, true, never>;
1129
+ }
1130
+
816
1131
  /**
817
1132
  * DsMobileLongPressDirective
818
1133
  *
@@ -986,11 +1301,17 @@ declare class DsMobileListItemComponent {
986
1301
  leadingSize: _angular_core.InputSignal<string>;
987
1302
  /**
988
1303
  * Display variant
989
- * - 'feed' - Standard feed display (default)
990
- * - 'detail' - Full detail view
1304
+ * - undefined (default) - Standard display
991
1305
  * - 'compact' - Compact display for nested/related items
992
1306
  */
993
- variant: _angular_core.InputSignal<"feed" | "detail" | "compact">;
1307
+ variant: _angular_core.InputSignal<"compact" | undefined>;
1308
+ /**
1309
+ * Vertical alignment of leading and main content slots
1310
+ * - 'top' - Align to top (default)
1311
+ * - 'center' - Align to center
1312
+ * - 'bottom' - Align to bottom
1313
+ */
1314
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
994
1315
  /**
995
1316
  * Whether the list item is interactive (clickable and long-pressable)
996
1317
  * When true, adds interactive background, cursor pointer, and touch handlers
@@ -1089,7 +1410,7 @@ declare class DsMobileListItemComponent {
1089
1410
  */
1090
1411
  handleMoreButtonClick(event: Event): void;
1091
1412
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileListItemComponent, never>;
1092
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileListItemComponent, "ds-mobile-list-item", never, { "leadingSize": { "alias": "leadingSize"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "enableLongPress": { "alias": "enableLongPress"; "required": false; "isSignal": true; }; "showDesktopMoreButton": { "alias": "showDesktopMoreButton"; "required": false; "isSignal": true; }; "interactiveOffset": { "alias": "interactiveOffset"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "showDivider": { "alias": "showDivider"; "required": false; "isSignal": true; }; "dividerSpacing": { "alias": "dividerSpacing"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "moreButtonClick": "moreButtonClick"; }, never, ["[content-leading]", "[content-main]", "*", "[content-trailing]"], true, [{ directive: typeof DsMobileLongPressDirective; inputs: {}; outputs: { "longPress": "longPress"; }; }]>;
1413
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileListItemComponent, "ds-mobile-list-item", never, { "leadingSize": { "alias": "leadingSize"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "enableLongPress": { "alias": "enableLongPress"; "required": false; "isSignal": true; }; "showDesktopMoreButton": { "alias": "showDesktopMoreButton"; "required": false; "isSignal": true; }; "interactiveOffset": { "alias": "interactiveOffset"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "showDivider": { "alias": "showDivider"; "required": false; "isSignal": true; }; "dividerSpacing": { "alias": "dividerSpacing"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "moreButtonClick": "moreButtonClick"; }, never, ["[content-leading]", "[content-main]", "*", "[content-trailing]"], true, [{ directive: typeof DsMobileLongPressDirective; inputs: {}; outputs: { "longPress": "longPress"; }; }]>;
1093
1414
  }
1094
1415
 
1095
1416
  /**
@@ -1207,11 +1528,10 @@ declare class DsMobileInteractiveListItemPostComponent {
1207
1528
  showBadge: _angular_core.InputSignal<boolean>;
1208
1529
  /**
1209
1530
  * Display variant
1210
- * - 'feed' - Standard feed display (default)
1211
- * - 'detail' - Full detail view
1531
+ * - undefined (default) - Standard display
1212
1532
  * - 'compact' - Compact display for nested/related posts
1213
1533
  */
1214
- variant: _angular_core.InputSignal<"feed" | "detail" | "compact">;
1534
+ variant: _angular_core.InputSignal<"compact" | undefined>;
1215
1535
  /**
1216
1536
  * Whether the post card is clickable
1217
1537
  */
@@ -1416,11 +1736,10 @@ declare class DsMobileInteractiveListItemInquiryComponent {
1416
1736
  iconColor: _angular_core.InputSignal<string>;
1417
1737
  /**
1418
1738
  * Display variant
1419
- * - 'feed' - Standard feed display (default)
1420
- * - 'detail' - Full detail view
1739
+ * - undefined (default) - Standard display
1421
1740
  * - 'compact' - Compact display
1422
1741
  */
1423
- variant: _angular_core.InputSignal<"feed" | "detail" | "compact">;
1742
+ variant: _angular_core.InputSignal<"compact" | undefined>;
1424
1743
  /**
1425
1744
  * Whether the inquiry item is clickable
1426
1745
  */
@@ -1478,6 +1797,10 @@ declare class DsMobileInteractiveListItemMessageComponent {
1478
1797
  * Sender's role (e.g., "Tenant", "Property Manager")
1479
1798
  */
1480
1799
  senderRole: _angular_core.InputSignal<string>;
1800
+ /**
1801
+ * Timestamp for the message (e.g., "2h ago", "2t siden")
1802
+ */
1803
+ timestamp: _angular_core.InputSignal<string>;
1481
1804
  /**
1482
1805
  * Message preview text
1483
1806
  */
@@ -1513,7 +1836,7 @@ declare class DsMobileInteractiveListItemMessageComponent {
1513
1836
  handleMessageClick(): void;
1514
1837
  handleLongPress(): void;
1515
1838
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemMessageComponent, never>;
1516
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemMessageComponent, "ds-mobile-interactive-list-item-message", never, { "senderName": { "alias": "senderName"; "required": true; "isSignal": true; }; "senderRole": { "alias": "senderRole"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "unread": { "alias": "unread"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "messageClick": "messageClick"; "longPress": "longPress"; }, never, never, true, never>;
1839
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemMessageComponent, "ds-mobile-interactive-list-item-message", never, { "senderName": { "alias": "senderName"; "required": true; "isSignal": true; }; "senderRole": { "alias": "senderRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "unread": { "alias": "unread"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "messageClick": "messageClick"; "longPress": "longPress"; }, never, never, true, never>;
1517
1840
  }
1518
1841
 
1519
1842
  /**
@@ -1855,6 +2178,8 @@ interface LightboxImageOptions {
1855
2178
  enableSwipe?: boolean;
1856
2179
  /** Show image info (title, description) */
1857
2180
  showInfo?: boolean;
2181
+ /** Show like & comment action buttons */
2182
+ showActions?: boolean;
1858
2183
  /** Animation type for opening */
1859
2184
  animation?: 'fade' | 'zoom' | 'slide';
1860
2185
  }
@@ -1995,6 +2320,7 @@ declare class DsMobileLightboxImageComponent implements OnInit, AfterViewInit, O
1995
2320
  showControls: boolean;
1996
2321
  enableSwipe: boolean;
1997
2322
  showInfo: boolean;
2323
+ showActions: boolean;
1998
2324
  animation: 'fade' | 'zoom' | 'slide';
1999
2325
  onCloseRequested?: () => void;
2000
2326
  swiperContainer: ElementRef<HTMLDivElement>;
@@ -2168,8 +2494,12 @@ declare class DsMobileLightboxHeaderComponent {
2168
2494
  * Emitted when close button is clicked
2169
2495
  */
2170
2496
  closeClick: _angular_core.OutputEmitterRef<void>;
2497
+ /**
2498
+ * Emitted when share button is clicked
2499
+ */
2500
+ shareClick: _angular_core.OutputEmitterRef<void>;
2171
2501
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileLightboxHeaderComponent, never>;
2172
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileLightboxHeaderComponent, "ds-mobile-lightbox-header", never, { "author": { "alias": "author"; "required": false; "isSignal": true; }; }, { "closeClick": "closeClick"; }, never, never, true, never>;
2502
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileLightboxHeaderComponent, "ds-mobile-lightbox-header", never, { "author": { "alias": "author"; "required": false; "isSignal": true; }; }, { "closeClick": "closeClick"; "shareClick": "shareClick"; }, never, never, true, never>;
2173
2503
  }
2174
2504
 
2175
2505
  /**
@@ -2191,6 +2521,11 @@ declare class DsMobileLightboxFooterComponent {
2191
2521
  * Total number of images
2192
2522
  */
2193
2523
  totalImages: _angular_core.InputSignal<number>;
2524
+ /**
2525
+ * Whether to show like & comment action buttons
2526
+ * @default false
2527
+ */
2528
+ showActions: _angular_core.InputSignal<boolean>;
2194
2529
  /**
2195
2530
  * Whether the content is liked
2196
2531
  */
@@ -2219,12 +2554,8 @@ declare class DsMobileLightboxFooterComponent {
2219
2554
  * Emitted when comment button is clicked
2220
2555
  */
2221
2556
  commentClick: _angular_core.OutputEmitterRef<void>;
2222
- /**
2223
- * Emitted when share button is clicked
2224
- */
2225
- shareClick: _angular_core.OutputEmitterRef<void>;
2226
2557
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileLightboxFooterComponent, never>;
2227
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileLightboxFooterComponent, "ds-mobile-lightbox-footer", never, { "showNavigation": { "alias": "showNavigation"; "required": false; "isSignal": true; }; "currentIndex": { "alias": "currentIndex"; "required": false; "isSignal": true; }; "totalImages": { "alias": "totalImages"; "required": false; "isSignal": true; }; "isLiked": { "alias": "isLiked"; "required": false; "isSignal": true; }; "likeCount": { "alias": "likeCount"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; }, { "prevClick": "prevClick"; "nextClick": "nextClick"; "likeClick": "likeClick"; "commentClick": "commentClick"; "shareClick": "shareClick"; }, never, never, true, never>;
2558
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileLightboxFooterComponent, "ds-mobile-lightbox-footer", never, { "showNavigation": { "alias": "showNavigation"; "required": false; "isSignal": true; }; "currentIndex": { "alias": "currentIndex"; "required": false; "isSignal": true; }; "totalImages": { "alias": "totalImages"; "required": false; "isSignal": true; }; "showActions": { "alias": "showActions"; "required": false; "isSignal": true; }; "isLiked": { "alias": "isLiked"; "required": false; "isSignal": true; }; "likeCount": { "alias": "likeCount"; "required": false; "isSignal": true; }; "commentCount": { "alias": "commentCount"; "required": false; "isSignal": true; }; }, { "prevClick": "prevClick"; "nextClick": "nextClick"; "likeClick": "likeClick"; "commentClick": "commentClick"; }, never, never, true, never>;
2228
2559
  }
2229
2560
 
2230
2561
  /**
@@ -2821,6 +3152,243 @@ declare class DsMobilePostDetailModalService {
2821
3152
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsMobilePostDetailModalService>;
2822
3153
  }
2823
3154
 
3155
+ /**
3156
+ * Chat message data interface
3157
+ */
3158
+ interface ChatMessage {
3159
+ id: string;
3160
+ content: string;
3161
+ senderId: string;
3162
+ senderName: string;
3163
+ senderRole?: string;
3164
+ timestamp: string;
3165
+ avatarInitials?: string;
3166
+ avatarType?: 'initials' | 'photo' | 'icon';
3167
+ avatarSrc?: string;
3168
+ isOwnMessage: boolean;
3169
+ attachments?: ChatAttachment[];
3170
+ }
3171
+ /**
3172
+ * Chat participant interface
3173
+ */
3174
+ interface ChatParticipant {
3175
+ id: string;
3176
+ name: string;
3177
+ role?: string;
3178
+ avatarInitials?: string;
3179
+ avatarType?: 'initials' | 'photo' | 'icon';
3180
+ avatarSrc?: string;
3181
+ }
3182
+ /**
3183
+ * Chat modal data interface
3184
+ *
3185
+ * Represents the data needed to display a chat conversation.
3186
+ *
3187
+ * @example
3188
+ * ```typescript
3189
+ * const chatData: ChatModalData = {
3190
+ * participant: {
3191
+ * id: '123',
3192
+ * name: 'Ricki Meihlen',
3193
+ * role: 'Inquiry assignee',
3194
+ * avatarInitials: 'RM'
3195
+ * },
3196
+ * messages: [
3197
+ * {
3198
+ * id: '1',
3199
+ * content: 'We have received your case...',
3200
+ * senderId: '123',
3201
+ * senderName: 'Ricki Meihlen',
3202
+ * timestamp: '12:34',
3203
+ * isOwnMessage: false,
3204
+ * avatarInitials: 'RM'
3205
+ * }
3206
+ * ],
3207
+ * currentUserId: '456'
3208
+ * };
3209
+ * ```
3210
+ */
3211
+ interface ChatModalData {
3212
+ /** The other participant in the conversation */
3213
+ participant: ChatParticipant;
3214
+ /** Array of messages in the conversation */
3215
+ messages: ChatMessage[];
3216
+ /** Current user's ID */
3217
+ currentUserId: string;
3218
+ /** Current user's avatar initials */
3219
+ currentUserInitials?: string;
3220
+ /** Current user's avatar type */
3221
+ currentUserAvatarType?: 'initials' | 'photo' | 'icon';
3222
+ /** Current user's avatar source */
3223
+ currentUserAvatarSrc?: string;
3224
+ /** Auto-focus input when modal opens */
3225
+ autoFocus?: boolean;
3226
+ }
3227
+ /**
3228
+ * DsMobileChatModalComponent
3229
+ *
3230
+ * Modal component for displaying and managing chat conversations.
3231
+ * Follows the same pattern as post-detail-modal for consistent behavior.
3232
+ *
3233
+ * Features:
3234
+ * - Header with participant info and close button
3235
+ * - Scrollable message thread
3236
+ * - Fixed message composer at bottom
3237
+ * - Keyboard handling
3238
+ * - Safe area support
3239
+ *
3240
+ * This component is typically not used directly - use DsMobileChatModalService instead.
3241
+ *
3242
+ * @example
3243
+ * ```typescript
3244
+ * // Don't instantiate directly - use the service:
3245
+ * constructor(private chatModal: DsMobileChatModalService) {}
3246
+ *
3247
+ * openChat() {
3248
+ * this.chatModal.open({
3249
+ * participant: { id: '123', name: 'Ricki Meihlen' },
3250
+ * messages: [...],
3251
+ * currentUserId: '456'
3252
+ * });
3253
+ * }
3254
+ * ```
3255
+ */
3256
+ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit, OnDestroy {
3257
+ private modalController;
3258
+ chatData: ChatModalData;
3259
+ /**
3260
+ * Loading state - when true, shows loading indicator
3261
+ */
3262
+ loading: boolean;
3263
+ /**
3264
+ * Error state - when set, shows error message
3265
+ */
3266
+ error?: string;
3267
+ participant: _angular_core.WritableSignal<ChatParticipant>;
3268
+ messages: _angular_core.WritableSignal<ChatMessage[]>;
3269
+ currentUserInitials: _angular_core.WritableSignal<string>;
3270
+ currentUserAvatarType: _angular_core.WritableSignal<"initials" | "photo" | "icon">;
3271
+ currentUserAvatarSrc: _angular_core.WritableSignal<string>;
3272
+ autoFocus: _angular_core.WritableSignal<boolean>;
3273
+ constructor(modalController: ModalController);
3274
+ ngOnInit(): void;
3275
+ ngAfterViewInit(): void;
3276
+ ngOnDestroy(): void;
3277
+ /**
3278
+ * Scroll to bottom of messages
3279
+ */
3280
+ private scrollToBottom;
3281
+ /**
3282
+ * Close the modal
3283
+ */
3284
+ close(): void;
3285
+ /**
3286
+ * Handle message sent from composer
3287
+ */
3288
+ handleMessageSent(event: {
3289
+ content: string;
3290
+ isReply?: boolean;
3291
+ replyTo?: string;
3292
+ isEdit?: boolean;
3293
+ }): void;
3294
+ /**
3295
+ * Handle attachment click
3296
+ */
3297
+ handleAttachmentClick(attachment: ChatAttachment): void;
3298
+ /**
3299
+ * Handle message long press
3300
+ */
3301
+ handleMessageLongPress(message: ChatMessage): void;
3302
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileChatModalComponent, never>;
3303
+ 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>;
3304
+ }
3305
+
3306
+ /**
3307
+ * DsMobileChatModalService
3308
+ *
3309
+ * Service for displaying chat conversations in a full-screen modal.
3310
+ * Built on Ionic's modal system with native gestures and animations.
3311
+ * Follows the same pattern as DsMobilePostDetailModalService for consistent behavior.
3312
+ *
3313
+ * Features:
3314
+ * - Full conversation display
3315
+ * - Message thread with bubbles
3316
+ * - Message composer
3317
+ * - Native modal animations
3318
+ * - Safe area support
3319
+ * - Keyboard handling
3320
+ *
3321
+ * @example
3322
+ * ```typescript
3323
+ * constructor(private chatModal: DsMobileChatModalService) {}
3324
+ *
3325
+ * async openChat() {
3326
+ * await this.chatModal.open({
3327
+ * participant: {
3328
+ * id: '123',
3329
+ * name: 'Ricki Meihlen',
3330
+ * role: 'Inquiry assignee',
3331
+ * avatarInitials: 'RM'
3332
+ * },
3333
+ * messages: [
3334
+ * {
3335
+ * id: '1',
3336
+ * content: 'We have received your case...',
3337
+ * senderId: '123',
3338
+ * senderName: 'Ricki Meihlen',
3339
+ * timestamp: '12:34',
3340
+ * isOwnMessage: false,
3341
+ * avatarInitials: 'RM'
3342
+ * },
3343
+ * {
3344
+ * id: '2',
3345
+ * content: 'Thank you!',
3346
+ * senderId: '456',
3347
+ * senderName: 'You',
3348
+ * timestamp: '12:35',
3349
+ * isOwnMessage: true,
3350
+ * avatarInitials: 'JD',
3351
+ * readStatus: true
3352
+ * }
3353
+ * ],
3354
+ * currentUserId: '456',
3355
+ * currentUserInitials: 'JD',
3356
+ * autoFocus: true
3357
+ * });
3358
+ * }
3359
+ * ```
3360
+ */
3361
+ declare class DsMobileChatModalService {
3362
+ private modalController;
3363
+ constructor(modalController: ModalController);
3364
+ /**
3365
+ * Open the chat modal
3366
+ *
3367
+ * @param chatData Chat data to display
3368
+ * @param options Optional loading and error states
3369
+ * @returns Promise that resolves when the modal is presented
3370
+ */
3371
+ open(chatData: ChatModalData, options?: {
3372
+ loading?: boolean;
3373
+ error?: string;
3374
+ }): Promise<void>;
3375
+ /**
3376
+ * Close the currently open chat modal
3377
+ *
3378
+ * @param data Optional data to pass back when dismissing
3379
+ * @returns Promise that resolves when the modal is dismissed
3380
+ */
3381
+ close(data?: any): Promise<boolean>;
3382
+ /**
3383
+ * Get the top-most modal if one exists
3384
+ *
3385
+ * @returns Promise that resolves to the modal element or undefined
3386
+ */
3387
+ getTop(): Promise<HTMLIonModalElement | undefined>;
3388
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileChatModalService, never>;
3389
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsMobileChatModalService>;
3390
+ }
3391
+
2824
3392
  /**
2825
3393
  * Handbook detail data interface
2826
3394
  *
@@ -3238,7 +3806,7 @@ declare class DsMobileHandbookFolderMiniComponent {
3238
3806
  * ```
3239
3807
  */
3240
3808
  declare class DsTextInputComponent implements ControlValueAccessor {
3241
- type: _angular_core.InputSignal<"search" | "text" | "email" | "tel" | "password" | "url">;
3809
+ type: _angular_core.InputSignal<"search" | "text" | "url" | "email" | "tel" | "password">;
3242
3810
  placeholder: _angular_core.InputSignal<string>;
3243
3811
  disabled: _angular_core.InputSignal<boolean>;
3244
3812
  readonly: _angular_core.InputSignal<boolean>;
@@ -3246,7 +3814,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
3246
3814
  hasError: _angular_core.InputSignal<boolean>;
3247
3815
  errorMessage: _angular_core.InputSignal<string>;
3248
3816
  autocomplete: _angular_core.InputSignal<string>;
3249
- inputmode: _angular_core.InputSignal<"search" | "text" | "email" | "tel" | "url" | "numeric" | undefined>;
3817
+ inputmode: _angular_core.InputSignal<"search" | "text" | "numeric" | "url" | "email" | "tel" | undefined>;
3250
3818
  autoClearError: _angular_core.InputSignal<boolean>;
3251
3819
  validator: _angular_core.InputSignal<((value: string) => boolean) | null>;
3252
3820
  valueChange: _angular_core.OutputEmitterRef<string>;
@@ -3414,6 +3982,8 @@ declare class MobileInquiryDetailPageComponent extends MobilePageBase implements
3414
3982
  userService: UserService;
3415
3983
  private navCtrl;
3416
3984
  private elementRef;
3985
+ private lightbox;
3986
+ private chatModal;
3417
3987
  ionContent?: IonContent;
3418
3988
  private platform;
3419
3989
  isNativePlatform: _angular_core.Signal<boolean>;
@@ -3423,13 +3993,15 @@ declare class MobileInquiryDetailPageComponent extends MobilePageBase implements
3423
3993
  activities: ActivityItem[];
3424
3994
  messageThreads: MessageThread[];
3425
3995
  unreadMessagesCount: _angular_core.Signal<number>;
3426
- constructor(userService: UserService, navCtrl: NavController, elementRef: ElementRef);
3996
+ photos: LightboxImage[];
3997
+ constructor(userService: UserService, navCtrl: NavController, elementRef: ElementRef, lightbox: DsMobileLightboxService, chatModal: DsMobileChatModalService);
3427
3998
  ngAfterViewInit(): void;
3428
3999
  setActiveTab(tabId: string): void;
3429
4000
  goBack(): void;
3430
4001
  handleScroll(event: any): void;
3431
4002
  handleRefresh(event: any): void;
3432
- openMessage(messageId: string): void;
4003
+ openMessage(messageId: string): Promise<void>;
4004
+ openPhotoLightbox(index: number): Promise<void>;
3433
4005
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileInquiryDetailPageComponent, never>;
3434
4006
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileInquiryDetailPageComponent, "app-mobile-inquiry-detail-page", never, {}, {}, never, never, true, never>;
3435
4007
  }
@@ -3633,6 +4205,7 @@ declare class WhitelabelDemoPage implements OnInit {
3633
4205
  applyCejTheme(): void;
3634
4206
  applyPkaTheme(): void;
3635
4207
  applyClaveTheme(): void;
4208
+ applyFreedomTheme(): void;
3636
4209
  applyCustomColors(): void;
3637
4210
  private updateCustomColorInputs;
3638
4211
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelDemoPage, never>;
@@ -3658,5 +4231,5 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
3658
4231
  */
3659
4232
  declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
3660
4233
 
3661
- export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsMobileActionsBottomSheetComponent, DsMobileBottomSheetService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileContentSectionComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLongPressDirective, DsMobileModalService, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobileTabBarComponent, DsMobileTabsComponent, DsTextInputComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, SectionHeaderComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, UserService, WhitelabelDemoPage, WhitelabelService, customBackTransition, customPageTransition };
3662
- export type { ActionGroup, ActionItem, ActionResult, AttachmentItem, BottomSheetOptions, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, HandbookDetailData, HandbookItem, InlineTabItem, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, ModalOptions, ActionResult as PostActionResult, PostDetailData, TabConfig, WhitelabelConfig };
4234
+ export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsMobileActionsBottomSheetComponent, DsMobileBottomSheetService, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileContentSectionComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLongPressDirective, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalService, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobileTabBarComponent, DsMobileTabsComponent, DsTextInputComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, SectionHeaderComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, UserService, WhitelabelDemoPage, WhitelabelService, customBackTransition, customPageTransition };
4235
+ export type { ActionGroup, ActionItem, ActionResult, AttachmentItem, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, HandbookDetailData, HandbookItem, InlineTabItem, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, ModalOptions, ActionResult as PostActionResult, PostDetailData, TabConfig, WhitelabelConfig };