@propbinder/mobile-design 0.2.56 → 0.2.60

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
@@ -403,6 +403,11 @@ declare class DsMobileBottomSheetHeaderComponent {
403
403
  * @default false
404
404
  */
405
405
  rightButtonDisabled: boolean;
406
+ /**
407
+ * Show loading spinner on right button
408
+ * @default false
409
+ */
410
+ rightButtonLoading: boolean;
406
411
  /**
407
412
  * Emitted when left button is clicked
408
413
  */
@@ -412,7 +417,7 @@ declare class DsMobileBottomSheetHeaderComponent {
412
417
  */
413
418
  rightButtonClick: EventEmitter<void>;
414
419
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileBottomSheetHeaderComponent, never>;
415
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileBottomSheetHeaderComponent, "ds-mobile-bottom-sheet-header", never, { "title": { "alias": "title"; "required": false; }; "leftButtonLabel": { "alias": "leftButtonLabel"; "required": false; }; "rightButtonLabel": { "alias": "rightButtonLabel"; "required": false; }; "rightButtonDisabled": { "alias": "rightButtonDisabled"; "required": false; }; }, { "leftButtonClick": "leftButtonClick"; "rightButtonClick": "rightButtonClick"; }, never, never, true, never>;
420
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileBottomSheetHeaderComponent, "ds-mobile-bottom-sheet-header", never, { "title": { "alias": "title"; "required": false; }; "leftButtonLabel": { "alias": "leftButtonLabel"; "required": false; }; "rightButtonLabel": { "alias": "rightButtonLabel"; "required": false; }; "rightButtonDisabled": { "alias": "rightButtonDisabled"; "required": false; }; "rightButtonLoading": { "alias": "rightButtonLoading"; "required": false; }; }, { "leftButtonClick": "leftButtonClick"; "rightButtonClick": "rightButtonClick"; }, never, never, true, never>;
416
421
  }
417
422
 
418
423
  /**
@@ -474,6 +479,21 @@ declare class DsMobileConfirmationSheetComponent {
474
479
  * @default 'Luk'
475
480
  */
476
481
  buttonText: string;
482
+ /**
483
+ * Whether the action is destructive (renders button in error/red color)
484
+ * @default false
485
+ */
486
+ destructive: boolean;
487
+ /**
488
+ * Whether to show a cancel button below the action button
489
+ * @default false
490
+ */
491
+ showCancelButton: boolean;
492
+ /**
493
+ * Cancel button text
494
+ * @default 'Annuller'
495
+ */
496
+ cancelButtonText: string;
477
497
  /**
478
498
  * Whether to show the illustration
479
499
  * @default true
@@ -498,8 +518,9 @@ declare class DsMobileConfirmationSheetComponent {
498
518
  * Handle button click - dismisses the sheet
499
519
  */
500
520
  handleButtonClick(): Promise<void>;
521
+ handleCancel(): Promise<void>;
501
522
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileConfirmationSheetComponent, never>;
502
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileConfirmationSheetComponent, "ds-mobile-confirmation-sheet", never, { "title": { "alias": "title"; "required": true; }; "message": { "alias": "message"; "required": true; }; "buttonText": { "alias": "buttonText"; "required": false; }; "showIllustration": { "alias": "showIllustration"; "required": false; }; "illustrationVariant": { "alias": "illustrationVariant"; "required": false; }; "illustrationSize": { "alias": "illustrationSize"; "required": false; }; }, {}, ["summaryTemplate"], never, true, never>;
523
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileConfirmationSheetComponent, "ds-mobile-confirmation-sheet", never, { "title": { "alias": "title"; "required": true; }; "message": { "alias": "message"; "required": true; }; "buttonText": { "alias": "buttonText"; "required": false; }; "destructive": { "alias": "destructive"; "required": false; }; "showCancelButton": { "alias": "showCancelButton"; "required": false; }; "cancelButtonText": { "alias": "cancelButtonText"; "required": false; }; "showIllustration": { "alias": "showIllustration"; "required": false; }; "illustrationVariant": { "alias": "illustrationVariant"; "required": false; }; "illustrationSize": { "alias": "illustrationSize"; "required": false; }; }, {}, ["summaryTemplate"], never, true, never>;
503
524
  }
504
525
 
505
526
  /**
@@ -519,6 +540,8 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
519
540
  textareaInput?: ElementRef<HTMLTextAreaElement>;
520
541
  fileInput?: ElementRef<HTMLInputElement>;
521
542
  private whitelabelService;
543
+ private mediaPicker;
544
+ readonly isNative: boolean;
522
545
  autoFocus: boolean;
523
546
  isReadonly: boolean;
524
547
  isEditMode: boolean;
@@ -554,6 +577,7 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
554
577
  handleCancel(): Promise<void>;
555
578
  handlePost(): Promise<void>;
556
579
  handleAddImage(): Promise<void>;
580
+ handleTakePhoto(): Promise<void>;
557
581
  handleRemoveImage(index: number): void;
558
582
  handleAddAttachment(): void;
559
583
  handleFileSelect(event: Event): void;
@@ -738,6 +762,8 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
738
762
  title: _angular_core.InputSignal<string>;
739
763
  headerTitle: _angular_core.InputSignal<string>;
740
764
  headerSubtitle: _angular_core.InputSignal<string>;
765
+ /** When true, the header logo plays a slide-in-from-top animation on first reveal */
766
+ firstEntry: _angular_core.InputSignal<boolean>;
741
767
  avatarType: _angular_core.InputSignal<"initials" | "photo" | "icon">;
742
768
  avatarInitials: _angular_core.InputSignal<string>;
743
769
  avatarSrc: _angular_core.InputSignal<string>;
@@ -817,7 +843,7 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
817
843
  */
818
844
  handleRefresh(event: any): Promise<void>;
819
845
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePageMainComponent, never>;
820
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePageMainComponent, "ds-mobile-page-main", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerSubtitle": { "alias": "headerSubtitle"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "showCondensedHeader": { "alias": "showCondensedHeader"; "required": false; "isSignal": true; }; "scrollThreshold": { "alias": "scrollThreshold"; "required": false; "isSignal": true; }; "headerFadeDistance": { "alias": "headerFadeDistance"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; "profileMenuItems": { "alias": "profileMenuItems"; "required": false; "isSignal": true; }; }, { "avatarClick": "avatarClick"; "profileActionSelected": "profileActionSelected"; "refresh": "refresh"; "scroll": "scroll"; }, never, ["[header-content]", "[offline-indicator]", "*"], true, never>;
846
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePageMainComponent, "ds-mobile-page-main", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerSubtitle": { "alias": "headerSubtitle"; "required": false; "isSignal": true; }; "firstEntry": { "alias": "firstEntry"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "showCondensedHeader": { "alias": "showCondensedHeader"; "required": false; "isSignal": true; }; "scrollThreshold": { "alias": "scrollThreshold"; "required": false; "isSignal": true; }; "headerFadeDistance": { "alias": "headerFadeDistance"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; "profileMenuItems": { "alias": "profileMenuItems"; "required": false; "isSignal": true; }; }, { "avatarClick": "avatarClick"; "profileActionSelected": "profileActionSelected"; "refresh": "refresh"; "scroll": "scroll"; }, never, ["[header-content]", "[offline-indicator]", "*"], true, never>;
821
847
  }
822
848
 
823
849
  interface InlineTabItem {
@@ -918,7 +944,7 @@ declare class WhitelabelService {
918
944
  readonly logoUrl: _angular_core.Signal<string>;
919
945
  readonly logoMarkUrl: _angular_core.Signal<string>;
920
946
  readonly logoAlt: _angular_core.Signal<string>;
921
- readonly logoSize: _angular_core.Signal<"md" | "sm" | "lg" | "xl">;
947
+ readonly logoSize: _angular_core.Signal<"sm" | "md" | "lg" | "xl">;
922
948
  readonly logoHeight: _angular_core.Signal<number>;
923
949
  readonly appIconSurface: _angular_core.Signal<string>;
924
950
  readonly appIconContent: _angular_core.Signal<string>;
@@ -2004,6 +2030,7 @@ declare class DsMobileDropdownComponent {
2004
2030
  declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestroy {
2005
2031
  private cdr;
2006
2032
  constructor(cdr: ChangeDetectorRef);
2033
+ private mediaPicker;
2007
2034
  /**
2008
2035
  * Avatar initials
2009
2036
  */
@@ -2072,10 +2099,35 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
2072
2099
  * Attachments signal
2073
2100
  */
2074
2101
  attachments: _angular_core.WritableSignal<AttachmentData[]>;
2102
+ /**
2103
+ * Snapshot of attachments kept alive during the section's exit animation so
2104
+ * the items remain visible while the container collapses.
2105
+ */
2106
+ private attachmentSnapshot;
2107
+ isAttachmentSectionExiting: _angular_core.WritableSignal<boolean>;
2108
+ /** IDs of items currently playing their exit animation */
2109
+ exitingAttachmentIds: _angular_core.WritableSignal<Set<string>>;
2110
+ /** Items to render — real list normally, snapshot during exit animation */
2111
+ attachmentsForDisplay: _angular_core.Signal<AttachmentData[]>;
2112
+ /** Section stays in DOM while there are items OR while the exit is playing */
2113
+ showAttachmentSection: _angular_core.Signal<boolean>;
2114
+ /** Section is in expanded (visible) state only when real items still exist AND we're not collapsing */
2115
+ attachmentSectionExpanded: _angular_core.Signal<boolean>;
2075
2116
  /**
2076
2117
  * Attachment menu open state
2077
2118
  */
2078
2119
  isAttachmentMenuOpen: _angular_core.WritableSignal<boolean>;
2120
+ /**
2121
+ * Tracks whether the viewport is in the mobile breakpoint (< 768px).
2122
+ * Updated via matchMedia so it reacts to window resize without polling.
2123
+ */
2124
+ private readonly mql;
2125
+ private readonly isMobileViewport;
2126
+ private readonly mqListener;
2127
+ /** Only open the slide-up panel on mobile viewports */
2128
+ isPanelOpen: _angular_core.Signal<boolean>;
2129
+ /** Only open the dropdown on desktop viewports */
2130
+ isDropdownOpen: _angular_core.Signal<boolean>;
2079
2131
  /**
2080
2132
  * Editing message state (optional)
2081
2133
  */
@@ -2222,15 +2274,19 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
2222
2274
  closeAttachmentMenu(event?: MouseEvent): void;
2223
2275
  /**
2224
2276
  * Handle add photo button click from menu
2225
- * Uses Capawesome File Picker API to open photo library directly
2226
- * Allows multiple photo selection
2277
+ * Uses MediaPickerService to open photo library
2227
2278
  */
2228
2279
  handleAddPhoto(event?: MouseEvent): Promise<void>;
2280
+ /**
2281
+ * Handle camera button click from menu
2282
+ * Uses MediaPickerService to open device camera
2283
+ */
2284
+ handleTakePhoto(event?: MouseEvent): Promise<void>;
2229
2285
  /**
2230
2286
  * Handle add file button click from menu
2231
- * Opens file picker
2287
+ * On native: uses MediaPickerService. On web: triggers hidden file input.
2232
2288
  */
2233
- handleAddFile(event?: MouseEvent): void;
2289
+ handleAddFile(event?: MouseEvent): Promise<void>;
2234
2290
  /**
2235
2291
  * Detect file type from file name or mime type
2236
2292
  */
@@ -2256,6 +2312,25 @@ declare class DsMobileMessageComposerComponent implements AfterViewInit, OnDestr
2256
2312
  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>;
2257
2313
  }
2258
2314
 
2315
+ /**
2316
+ * DsMobileMediaActionsPanelComponent
2317
+ *
2318
+ * Expandable media action panel rendered inline in the message composer footer.
2319
+ * Displays Photo / Camera / File actions as large tap-target tiles with a
2320
+ * smooth slide-up animation.
2321
+ *
2322
+ * Intentionally hidden via CSS on viewports >= 768 px (desktop), where the
2323
+ * existing dropdown is shown instead.
2324
+ */
2325
+ declare class DsMobileMediaActionsPanelComponent {
2326
+ items: _angular_core.InputSignal<DsMobileDropdownItem[]>;
2327
+ isOpen: _angular_core.InputSignal<boolean>;
2328
+ itemSelected: _angular_core.OutputEmitterRef<DsMobileDropdownItem>;
2329
+ handleClick(item: DsMobileDropdownItem): void;
2330
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileMediaActionsPanelComponent, never>;
2331
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileMediaActionsPanelComponent, "ds-mobile-media-actions-panel", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
2332
+ }
2333
+
2259
2334
  /**
2260
2335
  * Chat attachment interface
2261
2336
  */
@@ -4309,6 +4384,23 @@ declare class DsMobileLoaderOverlayComponent {
4309
4384
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileLoaderOverlayComponent, "ds-mobile-loader-overlay", never, { "spinnerSize": { "alias": "spinnerSize"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4310
4385
  }
4311
4386
 
4387
+ /**
4388
+ * DsMobileAppLoadingComponent — dev app mirror.
4389
+ * See projects/mobile-design-lib/src/components/app-loading for the authoritative source.
4390
+ *
4391
+ * Phases:
4392
+ * - Default (isExiting=false): Shows a centered ring spinner with the logomark at 1.2x scale.
4393
+ * - isExiting=true: Plays exit animation — logo + ring fly upward, backdrop fades.
4394
+ * Emits exitComplete when the backdrop fade animation ends.
4395
+ */
4396
+ declare class DsMobileAppLoadingComponent {
4397
+ isExiting: _angular_core.InputSignal<boolean>;
4398
+ exitComplete: _angular_core.OutputEmitterRef<void>;
4399
+ onAnimEnd(event: AnimationEvent): void;
4400
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileAppLoadingComponent, never>;
4401
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileAppLoadingComponent, "ds-mobile-app-loading", never, { "isExiting": { "alias": "isExiting"; "required": false; "isSignal": true; }; }, { "exitComplete": "exitComplete"; }, never, never, true, never>;
4402
+ }
4403
+
4312
4404
  /**
4313
4405
  * Configuration options for modal presentation
4314
4406
  */
@@ -5313,9 +5405,13 @@ declare class DsMobileCardInlineContactComponent {
5313
5405
  */
5314
5406
  name: _angular_core.InputSignal<string>;
5315
5407
  /**
5316
- * Avatar initials (usually 1-2 letters)
5408
+ * Avatar initials (usually 1-2 letters). Not needed when imageUrl is provided.
5317
5409
  */
5318
5410
  initials: _angular_core.InputSignal<string>;
5411
+ /**
5412
+ * Image URL for the leading slot. When provided, renders an image instead of initials avatar.
5413
+ */
5414
+ imageUrl: _angular_core.InputSignal<string>;
5319
5415
  /**
5320
5416
  * Contact person name (optional)
5321
5417
  */
@@ -5338,13 +5434,21 @@ declare class DsMobileCardInlineContactComponent {
5338
5434
  * Whether to show chevron icon
5339
5435
  */
5340
5436
  showChevron: _angular_core.InputSignal<boolean>;
5437
+ /**
5438
+ * Whether to show an edit button in the trailing slot
5439
+ */
5440
+ showEditButton: _angular_core.InputSignal<boolean>;
5341
5441
  /**
5342
5442
  * Emits when the contact item is clicked (if clickable)
5343
5443
  */
5344
5444
  contactClick: _angular_core.OutputEmitterRef<void>;
5445
+ /**
5446
+ * Emits when the edit button is clicked
5447
+ */
5448
+ editClick: _angular_core.OutputEmitterRef<void>;
5345
5449
  handleContactClick(): void;
5346
5450
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileCardInlineContactComponent, never>;
5347
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCardInlineContactComponent, "ds-mobile-card-inline-contact", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "initials": { "alias": "initials"; "required": true; "isSignal": true; }; "contactPerson": { "alias": "contactPerson"; "required": false; "isSignal": true; }; "phoneNumber": { "alias": "phoneNumber"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; }, { "contactClick": "contactClick"; }, never, never, true, never>;
5451
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileCardInlineContactComponent, "ds-mobile-card-inline-contact", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "contactPerson": { "alias": "contactPerson"; "required": false; "isSignal": true; }; "phoneNumber": { "alias": "phoneNumber"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; "showEditButton": { "alias": "showEditButton"; "required": false; "isSignal": true; }; }, { "contactClick": "contactClick"; "editClick": "editClick"; }, never, never, true, never>;
5348
5452
  }
5349
5453
 
5350
5454
  /**
@@ -5847,6 +5951,8 @@ interface NewInquiryData {
5847
5951
  */
5848
5952
  declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit {
5849
5953
  private modalController;
5954
+ private mediaPicker;
5955
+ readonly isNative: boolean;
5850
5956
  titleInputRef?: ElementRef<HTMLElement>;
5851
5957
  descriptionInputRef?: ElementRef<HTMLElement>;
5852
5958
  titleInput?: DsTextareaComponent;
@@ -5887,6 +5993,12 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
5887
5993
  * Attachments array (replaces photos)
5888
5994
  */
5889
5995
  attachments: _angular_core.WritableSignal<AttachmentData[]>;
5996
+ private attachmentSnapshot;
5997
+ isAttachmentSectionExiting: _angular_core.WritableSignal<boolean>;
5998
+ exitingAttachmentIds: _angular_core.WritableSignal<Set<string>>;
5999
+ attachmentsForDisplay: _angular_core.Signal<AttachmentData[]>;
6000
+ showAttachmentSection: _angular_core.Signal<boolean>;
6001
+ attachmentSectionExpanded: _angular_core.Signal<boolean>;
5890
6002
  /**
5891
6003
  * Form validation state
5892
6004
  */
@@ -5918,25 +6030,27 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
5918
6030
  */
5919
6031
  validateForm(): void;
5920
6032
  /**
5921
- * Add a new photo from camera/library
6033
+ * Add a new photo from library
5922
6034
  */
5923
6035
  addPhoto(): Promise<void>;
6036
+ /**
6037
+ * Take a photo using the device camera
6038
+ */
6039
+ takePhoto(): Promise<void>;
5924
6040
  /**
5925
6041
  * Remove an attachment
5926
6042
  */
5927
6043
  removeAttachment(attachmentId: string): void;
5928
6044
  /**
5929
6045
  * Handle attachment button click
6046
+ * On native: uses MediaPickerService. On web: triggers hidden file input.
5930
6047
  */
5931
- handleAddAttachment(): void;
6048
+ handleAddAttachment(): Promise<void>;
5932
6049
  /**
5933
6050
  * Detect file type from file name or mime type
6051
+ * @deprecated Use mediaPicker.detectFileType() for new code
5934
6052
  */
5935
6053
  private detectFileType;
5936
- /**
5937
- * Format file size for display
5938
- */
5939
- private formatFileSize;
5940
6054
  /**
5941
6055
  * Handle file selection from file input
5942
6056
  */
@@ -6281,6 +6395,8 @@ interface NewFacilityData {
6281
6395
  declare class DsMobileFacilityCreationModalComponent implements OnInit, AfterViewInit {
6282
6396
  private modalController;
6283
6397
  private bottomSheetService;
6398
+ private mediaPicker;
6399
+ readonly isNative: boolean;
6284
6400
  titleInputRef?: ElementRef<HTMLElement>;
6285
6401
  descriptionInputRef?: ElementRef<HTMLElement>;
6286
6402
  titleInput?: DsTextareaComponent;
@@ -6321,6 +6437,12 @@ declare class DsMobileFacilityCreationModalComponent implements OnInit, AfterVie
6321
6437
  * Attachments array
6322
6438
  */
6323
6439
  attachments: _angular_core.WritableSignal<AttachmentData[]>;
6440
+ private attachmentSnapshot;
6441
+ isAttachmentSectionExiting: _angular_core.WritableSignal<boolean>;
6442
+ exitingAttachmentIds: _angular_core.WritableSignal<Set<string>>;
6443
+ attachmentsForDisplay: _angular_core.Signal<AttachmentData[]>;
6444
+ showAttachmentSection: _angular_core.Signal<boolean>;
6445
+ attachmentSectionExpanded: _angular_core.Signal<boolean>;
6324
6446
  /**
6325
6447
  * Who can book signal
6326
6448
  */
@@ -6384,25 +6506,27 @@ declare class DsMobileFacilityCreationModalComponent implements OnInit, AfterVie
6384
6506
  */
6385
6507
  openAccessSheet(): Promise<void>;
6386
6508
  /**
6387
- * Add a new photo from camera/library
6509
+ * Add a new photo from library
6388
6510
  */
6389
6511
  addPhoto(): Promise<void>;
6512
+ /**
6513
+ * Take a photo using the device camera
6514
+ */
6515
+ takePhoto(): Promise<void>;
6390
6516
  /**
6391
6517
  * Remove an attachment
6392
6518
  */
6393
6519
  removeAttachment(attachmentId: string): void;
6394
6520
  /**
6395
6521
  * Handle attachment button click
6522
+ * On native: uses MediaPickerService. On web: triggers hidden file input.
6396
6523
  */
6397
- handleAddAttachment(): void;
6524
+ handleAddAttachment(): Promise<void>;
6398
6525
  /**
6399
6526
  * Detect file type from file name or mime type
6527
+ * @deprecated Use mediaPicker.detectFileType() for new code
6400
6528
  */
6401
6529
  private detectFileType;
6402
- /**
6403
- * Format file size for display
6404
- */
6405
- private formatFileSize;
6406
6530
  /**
6407
6531
  * Handle file selection from file input
6408
6532
  */
@@ -6705,6 +6829,8 @@ interface FacilityDetailData {
6705
6829
  availableTimeSlots?: Record<string, TimeSlot[]>;
6706
6830
  /** Fallback to mock data for testing */
6707
6831
  useMockData?: boolean;
6832
+ /** Callback executed when booking is confirmed */
6833
+ onSubmit?: (result: BookingResult) => Promise<void>;
6708
6834
  }
6709
6835
  /**
6710
6836
  * DsMobileFacilityDetailModalComponent
@@ -7227,6 +7353,7 @@ declare class DsMobileHandbookFolderMiniComponent {
7227
7353
  */
7228
7354
  declare class DsTextInputComponent implements ControlValueAccessor {
7229
7355
  type: _angular_core.InputSignal<"search" | "text" | "url" | "email" | "tel" | "password">;
7356
+ label: _angular_core.InputSignal<string>;
7230
7357
  placeholder: _angular_core.InputSignal<string>;
7231
7358
  disabled: _angular_core.InputSignal<boolean>;
7232
7359
  readonly: _angular_core.InputSignal<boolean>;
@@ -7241,6 +7368,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
7241
7368
  blur: _angular_core.OutputEmitterRef<FocusEvent>;
7242
7369
  focus: _angular_core.OutputEmitterRef<FocusEvent>;
7243
7370
  errorCleared: _angular_core.OutputEmitterRef<void>;
7371
+ private inputElRef;
7244
7372
  private _value;
7245
7373
  value: _angular_core.Signal<string>;
7246
7374
  inputId: string;
@@ -7257,8 +7385,9 @@ declare class DsTextInputComponent implements ControlValueAccessor {
7257
7385
  registerOnChange(fn: (value: string) => void): void;
7258
7386
  registerOnTouched(fn: () => void): void;
7259
7387
  setDisabledState(isDisabled: boolean): void;
7388
+ focusInput(): void;
7260
7389
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsTextInputComponent, never>;
7261
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsTextInputComponent, "ds-text-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputmode": { "alias": "inputmode"; "required": false; "isSignal": true; }; "autoClearError": { "alias": "autoClearError"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "errorCleared": "errorCleared"; }, never, never, true, never>;
7390
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsTextInputComponent, "ds-text-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputmode": { "alias": "inputmode"; "required": false; "isSignal": true; }; "autoClearError": { "alias": "autoClearError"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "errorCleared": "errorCleared"; }, never, never, true, never>;
7262
7391
  }
7263
7392
 
7264
7393
  /**
@@ -7305,7 +7434,7 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
7305
7434
  * Note: FAB is always 56px circular, but this affects the icon size
7306
7435
  * @default 'md'
7307
7436
  */
7308
- size: _angular_core.InputSignal<"md" | "sm" | "lg">;
7437
+ size: _angular_core.InputSignal<"sm" | "md" | "lg">;
7309
7438
  /**
7310
7439
  * ARIA label for accessibility
7311
7440
  * @required - Always provide a descriptive label
@@ -7515,7 +7644,7 @@ declare class DsMobileOfflineBannerComponent {
7515
7644
  * Inlines SVG and uses CSS variables to adapt colors to your theme.
7516
7645
  *
7517
7646
  * **Features:**
7518
- * - Predefined variants (post, inquiry) for common empty states
7647
+ * - Predefined variants (post, inquiry, family) for common empty states
7519
7648
  * - Automatic color adaptation using CSS variables
7520
7649
  * - Preserves all SVG details (textures, filters, gradients, shadows)
7521
7650
  * - White radial gradient overlay for depth effect
@@ -7538,9 +7667,9 @@ declare class DsMobileIllustrationComponent {
7538
7667
  private sanitizer;
7539
7668
  /**
7540
7669
  * Predefined illustration variant
7541
- * Available variants: 'post', 'inquiry', 'confirmation'
7670
+ * Available variants: 'post', 'inquiry', 'confirmation', 'family'
7542
7671
  */
7543
- variant: _angular_core.InputSignal<"post" | "inquiry" | "confirmation">;
7672
+ variant: _angular_core.InputSignal<"post" | "inquiry" | "confirmation" | "family">;
7544
7673
  /**
7545
7674
  * Illustration size (width and height)
7546
7675
  * @default '120px'
@@ -7794,6 +7923,42 @@ declare class MobileHandbookPageComponent {
7794
7923
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHandbookPageComponent, "app-mobile-handbook-page", never, {}, {}, never, never, true, never>;
7795
7924
  }
7796
7925
 
7926
+ type LoadingPhase = 'loading' | 'exiting' | 'idle';
7927
+ /**
7928
+ * PageLoadingService
7929
+ *
7930
+ * Coordinates the three-phase full-screen loading state between a page
7931
+ * component (which knows when its data is ready) and the layout component
7932
+ * (which owns the tab bar and overlay rendering).
7933
+ *
7934
+ * Phase flow:
7935
+ * loading → (setLoading(false)) → exiting → (animationend) → idle
7936
+ *
7937
+ * Pages call setLoading(true/false) — the animation sequence is transparent
7938
+ * to callers. The layout listens to isExiting() and calls onExitComplete()
7939
+ * after the overlay's exit animation fires animationend.
7940
+ */
7941
+ declare class PageLoadingService {
7942
+ readonly phase: _angular_core.WritableSignal<LoadingPhase>;
7943
+ readonly isLoading: _angular_core.Signal<boolean>;
7944
+ readonly isExiting: _angular_core.Signal<boolean>;
7945
+ /** True when any full-screen overlay should cover the tab bar */
7946
+ readonly isCoveringScreen: _angular_core.Signal<boolean>;
7947
+ readonly hasError: _angular_core.WritableSignal<boolean>;
7948
+ setLoading(value: boolean): void;
7949
+ /** Called by the layout when the overlay's exit animation completes */
7950
+ onExitComplete(): void;
7951
+ /**
7952
+ * True only during the window right after the loading overlay exits.
7953
+ * Used to gate homeReveal and logoSlideIn so they don't replay on
7954
+ * subsequent navigations back to the page.
7955
+ */
7956
+ readonly isRevealAnimation: _angular_core.WritableSignal<boolean>;
7957
+ setError(): void;
7958
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageLoadingService, never>;
7959
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageLoadingService>;
7960
+ }
7961
+
7797
7962
  declare class TrackingPermissionService {
7798
7963
  private readonly trackingPromptRequestedKey;
7799
7964
  private readonly platform;
@@ -7811,6 +7976,56 @@ declare class TrackingPermissionService {
7811
7976
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<TrackingPermissionService>;
7812
7977
  }
7813
7978
 
7979
+ type FamilyMemberStatus = 'active' | 'pending' | 'expired';
7980
+ type ContactType = 'email' | 'phone';
7981
+ interface FamilyMember {
7982
+ id: string;
7983
+ name: string;
7984
+ initials: string;
7985
+ email?: string;
7986
+ phone?: string;
7987
+ status: FamilyMemberStatus;
7988
+ expiresAt?: Date;
7989
+ invitedAt?: Date;
7990
+ }
7991
+ interface FamilyInvite {
7992
+ token: string;
7993
+ inviterName: string;
7994
+ inviterInitials: string;
7995
+ propertyAddress: string;
7996
+ propertyPhotoUrl: string;
7997
+ inviteeName: string;
7998
+ inviteeEmail: string;
7999
+ expiresAt: Date;
8000
+ status: 'pending' | 'accepted' | 'expired';
8001
+ }
8002
+
8003
+ declare class FamilyAccessService {
8004
+ readonly maxMembers = 2;
8005
+ readonly inviteExpiryHours = 72;
8006
+ private _members;
8007
+ private _isLoading;
8008
+ private _resendConfirmed;
8009
+ private _acceptedInviteContext;
8010
+ readonly members: _angular_core.Signal<FamilyMember[]>;
8011
+ readonly isLoading: _angular_core.Signal<boolean>;
8012
+ readonly resendConfirmed: _angular_core.Signal<string | null>;
8013
+ readonly isEmpty: _angular_core.Signal<boolean>;
8014
+ readonly hasReachedLimit: _angular_core.Signal<boolean>;
8015
+ readonly acceptedInviteContext: _angular_core.Signal<FamilyInvite | null>;
8016
+ loadMembers(): Promise<void>;
8017
+ inviteMember(name: string, contact: string, type: ContactType): Promise<void>;
8018
+ removeMember(memberId: string): Promise<void>;
8019
+ revokeInvite(memberId: string): Promise<void>;
8020
+ resendInvite(memberId: string): Promise<void>;
8021
+ loadInvite(token: string): Promise<FamilyInvite>;
8022
+ acceptInvite(token: string, invite: FamilyInvite): Promise<void>;
8023
+ clearAcceptedInviteContext(): void;
8024
+ requestNewInvite(token: string): Promise<void>;
8025
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FamilyAccessService, never>;
8026
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FamilyAccessService>;
8027
+ }
8028
+
7814
8029
  declare class MobileHomePageComponent implements OnInit {
7815
8030
  private router;
7816
8031
  userService: UserService;
@@ -7818,7 +8033,9 @@ declare class MobileHomePageComponent implements OnInit {
7818
8033
  private postModal;
7819
8034
  private trackingPermissionService;
7820
8035
  private bottomSheet;
8036
+ familyAccessService: FamilyAccessService;
7821
8037
  pageComponent: DsMobilePageMainComponent;
8038
+ protected pageLoading: PageLoadingService;
7822
8039
  recentPosts: _angular_core.Signal<_propbinder_mobile_design.Post[]>;
7823
8040
  private allInquiries;
7824
8041
  openInquiries: _angular_core.Signal<{
@@ -7828,8 +8045,9 @@ declare class MobileHomePageComponent implements OnInit {
7828
8045
  status: "open";
7829
8046
  timestamp: string;
7830
8047
  }[]>;
7831
- constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService, trackingPermissionService: TrackingPermissionService, bottomSheet: DsMobileBottomSheetService);
8048
+ constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService, trackingPermissionService: TrackingPermissionService, bottomSheet: DsMobileBottomSheetService, familyAccessService: FamilyAccessService);
7832
8049
  ngOnInit(): void;
8050
+ private simulateLoad;
7833
8051
  handleRefresh(event: any): void;
7834
8052
  openPost(postId: string, focusComment?: boolean): Promise<void>;
7835
8053
  openInquiryDetail(inquiryId: string): void;
@@ -7921,10 +8139,12 @@ declare class MobileInquiryDetailPageComponent {
7921
8139
  declare class MobileTabsExampleComponent implements OnInit {
7922
8140
  userService: UserService;
7923
8141
  private router;
8142
+ private navCtrl;
7924
8143
  private whitelabelDemoModal;
7925
8144
  private trackingPermissionService;
8145
+ readonly pageLoading: PageLoadingService;
7926
8146
  private trackedProfileMenuItems;
7927
- constructor(userService: UserService, router: Router);
8147
+ constructor(userService: UserService, router: Router, navCtrl: NavController);
7928
8148
  ngOnInit(): void;
7929
8149
  tabs: TabConfig[];
7930
8150
  /**
@@ -7943,6 +8163,8 @@ declare class MobileTabsExampleComponent implements OnInit {
7943
8163
  * Mobile actions are handled globally in AppComponent via UserService.
7944
8164
  */
7945
8165
  handleProfileAction(result: ActionResult): void;
8166
+ /** Called by the error overlay retry button — clears error and re-navigates to home */
8167
+ handleRetry(): void;
7946
8168
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileTabsExampleComponent, never>;
7947
8169
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileTabsExampleComponent, "app-mobile-tabs-example", never, {}, {}, never, never, true, never>;
7948
8170
  }
@@ -8087,6 +8309,59 @@ declare class SignInPageComponent implements AfterViewInit, OnDestroy {
8087
8309
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInPageComponent, "app-sign-in", never, {}, {}, never, never, true, never>;
8088
8310
  }
8089
8311
 
8312
+ declare class FamilyAccessPageComponent implements OnInit {
8313
+ readonly service: FamilyAccessService;
8314
+ private bottomSheet;
8315
+ toastMessage: _angular_core.WritableSignal<string | null>;
8316
+ ngOnInit(): void;
8317
+ showToast(message: string): void;
8318
+ statusLabel(member: FamilyMember): string;
8319
+ handleResend(member: FamilyMember): Promise<void>;
8320
+ confirmRevoke(member: FamilyMember): Promise<void>;
8321
+ openMemberActions(member: FamilyMember): Promise<void>;
8322
+ openInviteSheet(): Promise<void>;
8323
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FamilyAccessPageComponent, never>;
8324
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FamilyAccessPageComponent, "app-family-access-page", never, {}, {}, never, never, true, never>;
8325
+ }
8326
+
8327
+ declare class AcceptInvitePageComponent implements OnInit {
8328
+ private route;
8329
+ private router;
8330
+ private familyAccessService;
8331
+ isLoading: _angular_core.WritableSignal<boolean>;
8332
+ isAccepting: _angular_core.WritableSignal<boolean>;
8333
+ isRequesting: _angular_core.WritableSignal<boolean>;
8334
+ requestSent: _angular_core.WritableSignal<boolean>;
8335
+ invite: _angular_core.WritableSignal<FamilyInvite | null>;
8336
+ isExpired: _angular_core.Signal<boolean>;
8337
+ pageTitle: _angular_core.Signal<string>;
8338
+ ngOnInit(): Promise<void>;
8339
+ accept(): Promise<void>;
8340
+ requestResend(): Promise<void>;
8341
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcceptInvitePageComponent, never>;
8342
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcceptInvitePageComponent, "app-accept-invite-page", never, {}, {}, never, never, true, never>;
8343
+ }
8344
+
8345
+ declare class CreateAccountPageComponent {
8346
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreateAccountPageComponent, never>;
8347
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CreateAccountPageComponent, "app-create-account-page", never, {}, {}, never, never, true, never>;
8348
+ }
8349
+
8350
+ declare class AvatarUploadPageComponent {
8351
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarUploadPageComponent, never>;
8352
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarUploadPageComponent, "app-avatar-upload-page", never, {}, {}, never, never, true, never>;
8353
+ }
8354
+
8355
+ declare class InviteSuccessPageComponent {
8356
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InviteSuccessPageComponent, never>;
8357
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InviteSuccessPageComponent, "app-invite-success-page", never, {}, {}, never, never, true, never>;
8358
+ }
8359
+
8360
+ declare class SignInToAcceptPageComponent {
8361
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignInToAcceptPageComponent, never>;
8362
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInToAcceptPageComponent, "app-sign-in-to-accept-page", never, {}, {}, never, never, true, never>;
8363
+ }
8364
+
8090
8365
  /**
8091
8366
  * Whitelabel Demo Modal Component
8092
8367
  *
@@ -8200,5 +8475,40 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
8200
8475
  */
8201
8476
  declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
8202
8477
 
8203
- export { ActionCommentComponent, ActionLikeComponent, BaseModalService, ContentRowComponent, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingConfirmationWrapperComponent, DsMobileBookingModalComponent, DsMobileBookingModalService, DsMobileBookingSummaryComponent, DsMobileBottomSheetHeaderComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileConfirmationSheetComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileDropdownComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFacilityCreationConfirmationWrapperComponent, DsMobileFacilityCreationModalComponent, DsMobileFacilityCreationModalService, DsMobileFacilityDetailModalComponent, DsMobileFacilityDetailModalService, DsMobileFileAttachmentComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemBookingComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLoaderOverlayComponent, DsMobileLongPressDirective, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobileOfflineBannerComponent, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobilePriceSheetComponent, DsMobileProfileActionsSheetComponent, DsMobilePropertyBannerComponent, DsMobileSectionComponent, DsMobileSwiperComponent, DsMobileSwiperWithNavComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, SectionHeaderComponent, SignInPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition };
8204
- export type { ActionGroup, ActionItem, ActionResult, AppIconSize, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BookingModalOptions, BookingResult, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, DateOption, DropdownAlign, DropdownPosition, DsMobileDropdownItem, FacilityCreationModalOptions, FacilityDetailData, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, LogoSize, LogoVariant, ModalOptions, NetworkStatus, NewFacilityData, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, TabConfig, TimeSlot, WhitelabelConfig };
8478
+ interface MediaPickerResult {
8479
+ attachments: AttachmentData[];
8480
+ }
8481
+ declare class MediaPickerService {
8482
+ /**
8483
+ * Opens the native photo library picker (multi-select, up to `limit` items).
8484
+ * Uses @capawesome/capacitor-file-picker which maps to the Android Photo Picker
8485
+ * on API 33+ and UIImagePickerController/PHPickerViewController on iOS.
8486
+ * No runtime permission required on Android 13+.
8487
+ */
8488
+ pickFromLibrary(limit?: number): Promise<MediaPickerResult>;
8489
+ /**
8490
+ * Opens the device camera directly.
8491
+ *
8492
+ * iOS: triggers NSCameraUsageDescription permission dialog on first use
8493
+ * (privacy string already set in Info.plist).
8494
+ * Android: launches the stock Camera app as a separate Activity —
8495
+ * no CAMERA permission needed in AndroidManifest.xml.
8496
+ *
8497
+ * Returns a single image (camera is always single-shot).
8498
+ */
8499
+ takePhoto(): Promise<MediaPickerResult>;
8500
+ /**
8501
+ * Opens the system file picker for documents.
8502
+ * On native, uses FilePicker.pickFiles() with broad MIME types.
8503
+ * On web, returns empty — the caller is responsible for triggering
8504
+ * a hidden <input type="file"> in that case.
8505
+ */
8506
+ pickFiles(limit?: number): Promise<MediaPickerResult>;
8507
+ formatFileSize(bytes: number): string;
8508
+ detectFileType(fileName: string): AttachmentData['type'];
8509
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MediaPickerService, never>;
8510
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MediaPickerService>;
8511
+ }
8512
+
8513
+ export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingConfirmationWrapperComponent, DsMobileBookingModalComponent, DsMobileBookingModalService, DsMobileBookingSummaryComponent, DsMobileBottomSheetHeaderComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileConfirmationSheetComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileDropdownComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFacilityCreationConfirmationWrapperComponent, DsMobileFacilityCreationModalComponent, DsMobileFacilityCreationModalService, DsMobileFacilityDetailModalComponent, DsMobileFacilityDetailModalService, DsMobileFileAttachmentComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemBookingComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLoaderOverlayComponent, DsMobileLongPressDirective, DsMobileMediaActionsPanelComponent, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobileOfflineBannerComponent, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobilePriceSheetComponent, DsMobileProfileActionsSheetComponent, DsMobilePropertyBannerComponent, DsMobileSectionComponent, DsMobileSwiperComponent, DsMobileSwiperWithNavComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, FamilyAccessPageComponent, FamilyAccessService, InviteSuccessPageComponent, MediaPickerService, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PageLoadingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, SectionHeaderComponent, SignInPageComponent, SignInToAcceptPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition };
8514
+ export type { ActionGroup, ActionItem, ActionResult, AppIconSize, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BookingModalOptions, BookingResult, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContactType, ContentWidth, DateOption, DropdownAlign, DropdownPosition, DsMobileDropdownItem, FacilityCreationModalOptions, FacilityDetailData, FamilyInvite, FamilyMember, FamilyMemberStatus, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, LoadingPhase, LogoSize, LogoVariant, MediaPickerResult, ModalOptions, NetworkStatus, NewFacilityData, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, TabConfig, TimeSlot, WhitelabelConfig };