@propbinder/mobile-design 0.2.57 → 0.2.62

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 {
@@ -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
  */
@@ -4519,6 +4611,7 @@ declare class DsMobileModalService {
4519
4611
  */
4520
4612
  declare abstract class MobileModalBase implements OnInit, OnDestroy {
4521
4613
  protected modalController: ModalController;
4614
+ private platform;
4522
4615
  /**
4523
4616
  * Reference to IonContent for accessing scroll element
4524
4617
  */
@@ -5313,9 +5406,13 @@ declare class DsMobileCardInlineContactComponent {
5313
5406
  */
5314
5407
  name: _angular_core.InputSignal<string>;
5315
5408
  /**
5316
- * Avatar initials (usually 1-2 letters)
5409
+ * Avatar initials (usually 1-2 letters). Not needed when imageUrl is provided.
5317
5410
  */
5318
5411
  initials: _angular_core.InputSignal<string>;
5412
+ /**
5413
+ * Image URL for the leading slot. When provided, renders an image instead of initials avatar.
5414
+ */
5415
+ imageUrl: _angular_core.InputSignal<string>;
5319
5416
  /**
5320
5417
  * Contact person name (optional)
5321
5418
  */
@@ -5338,13 +5435,21 @@ declare class DsMobileCardInlineContactComponent {
5338
5435
  * Whether to show chevron icon
5339
5436
  */
5340
5437
  showChevron: _angular_core.InputSignal<boolean>;
5438
+ /**
5439
+ * Whether to show an edit button in the trailing slot
5440
+ */
5441
+ showEditButton: _angular_core.InputSignal<boolean>;
5341
5442
  /**
5342
5443
  * Emits when the contact item is clicked (if clickable)
5343
5444
  */
5344
5445
  contactClick: _angular_core.OutputEmitterRef<void>;
5446
+ /**
5447
+ * Emits when the edit button is clicked
5448
+ */
5449
+ editClick: _angular_core.OutputEmitterRef<void>;
5345
5450
  handleContactClick(): void;
5346
5451
  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>;
5452
+ 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
5453
  }
5349
5454
 
5350
5455
  /**
@@ -5847,6 +5952,8 @@ interface NewInquiryData {
5847
5952
  */
5848
5953
  declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit {
5849
5954
  private modalController;
5955
+ private mediaPicker;
5956
+ readonly isNative: boolean;
5850
5957
  titleInputRef?: ElementRef<HTMLElement>;
5851
5958
  descriptionInputRef?: ElementRef<HTMLElement>;
5852
5959
  titleInput?: DsTextareaComponent;
@@ -5887,6 +5994,12 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
5887
5994
  * Attachments array (replaces photos)
5888
5995
  */
5889
5996
  attachments: _angular_core.WritableSignal<AttachmentData[]>;
5997
+ private attachmentSnapshot;
5998
+ isAttachmentSectionExiting: _angular_core.WritableSignal<boolean>;
5999
+ exitingAttachmentIds: _angular_core.WritableSignal<Set<string>>;
6000
+ attachmentsForDisplay: _angular_core.Signal<AttachmentData[]>;
6001
+ showAttachmentSection: _angular_core.Signal<boolean>;
6002
+ attachmentSectionExpanded: _angular_core.Signal<boolean>;
5890
6003
  /**
5891
6004
  * Form validation state
5892
6005
  */
@@ -5918,25 +6031,27 @@ declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit
5918
6031
  */
5919
6032
  validateForm(): void;
5920
6033
  /**
5921
- * Add a new photo from camera/library
6034
+ * Add a new photo from library
5922
6035
  */
5923
6036
  addPhoto(): Promise<void>;
6037
+ /**
6038
+ * Take a photo using the device camera
6039
+ */
6040
+ takePhoto(): Promise<void>;
5924
6041
  /**
5925
6042
  * Remove an attachment
5926
6043
  */
5927
6044
  removeAttachment(attachmentId: string): void;
5928
6045
  /**
5929
6046
  * Handle attachment button click
6047
+ * On native: uses MediaPickerService. On web: triggers hidden file input.
5930
6048
  */
5931
- handleAddAttachment(): void;
6049
+ handleAddAttachment(): Promise<void>;
5932
6050
  /**
5933
6051
  * Detect file type from file name or mime type
6052
+ * @deprecated Use mediaPicker.detectFileType() for new code
5934
6053
  */
5935
6054
  private detectFileType;
5936
- /**
5937
- * Format file size for display
5938
- */
5939
- private formatFileSize;
5940
6055
  /**
5941
6056
  * Handle file selection from file input
5942
6057
  */
@@ -6281,6 +6396,8 @@ interface NewFacilityData {
6281
6396
  declare class DsMobileFacilityCreationModalComponent implements OnInit, AfterViewInit {
6282
6397
  private modalController;
6283
6398
  private bottomSheetService;
6399
+ private mediaPicker;
6400
+ readonly isNative: boolean;
6284
6401
  titleInputRef?: ElementRef<HTMLElement>;
6285
6402
  descriptionInputRef?: ElementRef<HTMLElement>;
6286
6403
  titleInput?: DsTextareaComponent;
@@ -6321,6 +6438,12 @@ declare class DsMobileFacilityCreationModalComponent implements OnInit, AfterVie
6321
6438
  * Attachments array
6322
6439
  */
6323
6440
  attachments: _angular_core.WritableSignal<AttachmentData[]>;
6441
+ private attachmentSnapshot;
6442
+ isAttachmentSectionExiting: _angular_core.WritableSignal<boolean>;
6443
+ exitingAttachmentIds: _angular_core.WritableSignal<Set<string>>;
6444
+ attachmentsForDisplay: _angular_core.Signal<AttachmentData[]>;
6445
+ showAttachmentSection: _angular_core.Signal<boolean>;
6446
+ attachmentSectionExpanded: _angular_core.Signal<boolean>;
6324
6447
  /**
6325
6448
  * Who can book signal
6326
6449
  */
@@ -6384,25 +6507,27 @@ declare class DsMobileFacilityCreationModalComponent implements OnInit, AfterVie
6384
6507
  */
6385
6508
  openAccessSheet(): Promise<void>;
6386
6509
  /**
6387
- * Add a new photo from camera/library
6510
+ * Add a new photo from library
6388
6511
  */
6389
6512
  addPhoto(): Promise<void>;
6513
+ /**
6514
+ * Take a photo using the device camera
6515
+ */
6516
+ takePhoto(): Promise<void>;
6390
6517
  /**
6391
6518
  * Remove an attachment
6392
6519
  */
6393
6520
  removeAttachment(attachmentId: string): void;
6394
6521
  /**
6395
6522
  * Handle attachment button click
6523
+ * On native: uses MediaPickerService. On web: triggers hidden file input.
6396
6524
  */
6397
- handleAddAttachment(): void;
6525
+ handleAddAttachment(): Promise<void>;
6398
6526
  /**
6399
6527
  * Detect file type from file name or mime type
6528
+ * @deprecated Use mediaPicker.detectFileType() for new code
6400
6529
  */
6401
6530
  private detectFileType;
6402
- /**
6403
- * Format file size for display
6404
- */
6405
- private formatFileSize;
6406
6531
  /**
6407
6532
  * Handle file selection from file input
6408
6533
  */
@@ -7229,6 +7354,7 @@ declare class DsMobileHandbookFolderMiniComponent {
7229
7354
  */
7230
7355
  declare class DsTextInputComponent implements ControlValueAccessor {
7231
7356
  type: _angular_core.InputSignal<"search" | "text" | "url" | "email" | "tel" | "password">;
7357
+ label: _angular_core.InputSignal<string>;
7232
7358
  placeholder: _angular_core.InputSignal<string>;
7233
7359
  disabled: _angular_core.InputSignal<boolean>;
7234
7360
  readonly: _angular_core.InputSignal<boolean>;
@@ -7243,6 +7369,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
7243
7369
  blur: _angular_core.OutputEmitterRef<FocusEvent>;
7244
7370
  focus: _angular_core.OutputEmitterRef<FocusEvent>;
7245
7371
  errorCleared: _angular_core.OutputEmitterRef<void>;
7372
+ private inputElRef;
7246
7373
  private _value;
7247
7374
  value: _angular_core.Signal<string>;
7248
7375
  inputId: string;
@@ -7259,8 +7386,9 @@ declare class DsTextInputComponent implements ControlValueAccessor {
7259
7386
  registerOnChange(fn: (value: string) => void): void;
7260
7387
  registerOnTouched(fn: () => void): void;
7261
7388
  setDisabledState(isDisabled: boolean): void;
7389
+ focusInput(): void;
7262
7390
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsTextInputComponent, never>;
7263
- 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>;
7391
+ 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>;
7264
7392
  }
7265
7393
 
7266
7394
  /**
@@ -7517,7 +7645,7 @@ declare class DsMobileOfflineBannerComponent {
7517
7645
  * Inlines SVG and uses CSS variables to adapt colors to your theme.
7518
7646
  *
7519
7647
  * **Features:**
7520
- * - Predefined variants (post, inquiry) for common empty states
7648
+ * - Predefined variants (post, inquiry, family) for common empty states
7521
7649
  * - Automatic color adaptation using CSS variables
7522
7650
  * - Preserves all SVG details (textures, filters, gradients, shadows)
7523
7651
  * - White radial gradient overlay for depth effect
@@ -7540,9 +7668,9 @@ declare class DsMobileIllustrationComponent {
7540
7668
  private sanitizer;
7541
7669
  /**
7542
7670
  * Predefined illustration variant
7543
- * Available variants: 'post', 'inquiry', 'confirmation'
7671
+ * Available variants: 'post', 'inquiry', 'confirmation', 'family'
7544
7672
  */
7545
- variant: _angular_core.InputSignal<"post" | "inquiry" | "confirmation">;
7673
+ variant: _angular_core.InputSignal<"post" | "inquiry" | "confirmation" | "family">;
7546
7674
  /**
7547
7675
  * Illustration size (width and height)
7548
7676
  * @default '120px'
@@ -7796,6 +7924,42 @@ declare class MobileHandbookPageComponent {
7796
7924
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHandbookPageComponent, "app-mobile-handbook-page", never, {}, {}, never, never, true, never>;
7797
7925
  }
7798
7926
 
7927
+ type LoadingPhase = 'loading' | 'exiting' | 'idle';
7928
+ /**
7929
+ * PageLoadingService
7930
+ *
7931
+ * Coordinates the three-phase full-screen loading state between a page
7932
+ * component (which knows when its data is ready) and the layout component
7933
+ * (which owns the tab bar and overlay rendering).
7934
+ *
7935
+ * Phase flow:
7936
+ * loading → (setLoading(false)) → exiting → (animationend) → idle
7937
+ *
7938
+ * Pages call setLoading(true/false) — the animation sequence is transparent
7939
+ * to callers. The layout listens to isExiting() and calls onExitComplete()
7940
+ * after the overlay's exit animation fires animationend.
7941
+ */
7942
+ declare class PageLoadingService {
7943
+ readonly phase: _angular_core.WritableSignal<LoadingPhase>;
7944
+ readonly isLoading: _angular_core.Signal<boolean>;
7945
+ readonly isExiting: _angular_core.Signal<boolean>;
7946
+ /** True when any full-screen overlay should cover the tab bar */
7947
+ readonly isCoveringScreen: _angular_core.Signal<boolean>;
7948
+ readonly hasError: _angular_core.WritableSignal<boolean>;
7949
+ setLoading(value: boolean): void;
7950
+ /** Called by the layout when the overlay's exit animation completes */
7951
+ onExitComplete(): void;
7952
+ /**
7953
+ * True only during the window right after the loading overlay exits.
7954
+ * Used to gate homeReveal and logoSlideIn so they don't replay on
7955
+ * subsequent navigations back to the page.
7956
+ */
7957
+ readonly isRevealAnimation: _angular_core.WritableSignal<boolean>;
7958
+ setError(): void;
7959
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageLoadingService, never>;
7960
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageLoadingService>;
7961
+ }
7962
+
7799
7963
  declare class TrackingPermissionService {
7800
7964
  private readonly trackingPromptRequestedKey;
7801
7965
  private readonly platform;
@@ -7813,6 +7977,56 @@ declare class TrackingPermissionService {
7813
7977
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<TrackingPermissionService>;
7814
7978
  }
7815
7979
 
7980
+ type FamilyMemberStatus = 'active' | 'pending' | 'expired';
7981
+ type ContactType = 'email' | 'phone';
7982
+ interface FamilyMember {
7983
+ id: string;
7984
+ name: string;
7985
+ initials: string;
7986
+ email?: string;
7987
+ phone?: string;
7988
+ status: FamilyMemberStatus;
7989
+ expiresAt?: Date;
7990
+ invitedAt?: Date;
7991
+ }
7992
+ interface FamilyInvite {
7993
+ token: string;
7994
+ inviterName: string;
7995
+ inviterInitials: string;
7996
+ propertyAddress: string;
7997
+ propertyPhotoUrl: string;
7998
+ inviteeName: string;
7999
+ inviteeEmail: string;
8000
+ expiresAt: Date;
8001
+ status: 'pending' | 'accepted' | 'expired';
8002
+ }
8003
+
8004
+ declare class FamilyAccessService {
8005
+ readonly maxMembers = 2;
8006
+ readonly inviteExpiryHours = 72;
8007
+ private _members;
8008
+ private _isLoading;
8009
+ private _resendConfirmed;
8010
+ private _acceptedInviteContext;
8011
+ readonly members: _angular_core.Signal<FamilyMember[]>;
8012
+ readonly isLoading: _angular_core.Signal<boolean>;
8013
+ readonly resendConfirmed: _angular_core.Signal<string | null>;
8014
+ readonly isEmpty: _angular_core.Signal<boolean>;
8015
+ readonly hasReachedLimit: _angular_core.Signal<boolean>;
8016
+ readonly acceptedInviteContext: _angular_core.Signal<FamilyInvite | null>;
8017
+ loadMembers(): Promise<void>;
8018
+ inviteMember(name: string, contact: string, type: ContactType): Promise<void>;
8019
+ removeMember(memberId: string): Promise<void>;
8020
+ revokeInvite(memberId: string): Promise<void>;
8021
+ resendInvite(memberId: string): Promise<void>;
8022
+ loadInvite(token: string): Promise<FamilyInvite>;
8023
+ acceptInvite(token: string, invite: FamilyInvite): Promise<void>;
8024
+ clearAcceptedInviteContext(): void;
8025
+ requestNewInvite(token: string): Promise<void>;
8026
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FamilyAccessService, never>;
8027
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FamilyAccessService>;
8028
+ }
8029
+
7816
8030
  declare class MobileHomePageComponent implements OnInit {
7817
8031
  private router;
7818
8032
  userService: UserService;
@@ -7820,7 +8034,9 @@ declare class MobileHomePageComponent implements OnInit {
7820
8034
  private postModal;
7821
8035
  private trackingPermissionService;
7822
8036
  private bottomSheet;
8037
+ familyAccessService: FamilyAccessService;
7823
8038
  pageComponent: DsMobilePageMainComponent;
8039
+ protected pageLoading: PageLoadingService;
7824
8040
  recentPosts: _angular_core.Signal<_propbinder_mobile_design.Post[]>;
7825
8041
  private allInquiries;
7826
8042
  openInquiries: _angular_core.Signal<{
@@ -7830,8 +8046,9 @@ declare class MobileHomePageComponent implements OnInit {
7830
8046
  status: "open";
7831
8047
  timestamp: string;
7832
8048
  }[]>;
7833
- constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService, trackingPermissionService: TrackingPermissionService, bottomSheet: DsMobileBottomSheetService);
8049
+ constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService, trackingPermissionService: TrackingPermissionService, bottomSheet: DsMobileBottomSheetService, familyAccessService: FamilyAccessService);
7834
8050
  ngOnInit(): void;
8051
+ private simulateLoad;
7835
8052
  handleRefresh(event: any): void;
7836
8053
  openPost(postId: string, focusComment?: boolean): Promise<void>;
7837
8054
  openInquiryDetail(inquiryId: string): void;
@@ -7923,10 +8140,12 @@ declare class MobileInquiryDetailPageComponent {
7923
8140
  declare class MobileTabsExampleComponent implements OnInit {
7924
8141
  userService: UserService;
7925
8142
  private router;
8143
+ private navCtrl;
7926
8144
  private whitelabelDemoModal;
7927
8145
  private trackingPermissionService;
8146
+ readonly pageLoading: PageLoadingService;
7928
8147
  private trackedProfileMenuItems;
7929
- constructor(userService: UserService, router: Router);
8148
+ constructor(userService: UserService, router: Router, navCtrl: NavController);
7930
8149
  ngOnInit(): void;
7931
8150
  tabs: TabConfig[];
7932
8151
  /**
@@ -7945,6 +8164,8 @@ declare class MobileTabsExampleComponent implements OnInit {
7945
8164
  * Mobile actions are handled globally in AppComponent via UserService.
7946
8165
  */
7947
8166
  handleProfileAction(result: ActionResult): void;
8167
+ /** Called by the error overlay retry button — clears error and re-navigates to home */
8168
+ handleRetry(): void;
7948
8169
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileTabsExampleComponent, never>;
7949
8170
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileTabsExampleComponent, "app-mobile-tabs-example", never, {}, {}, never, never, true, never>;
7950
8171
  }
@@ -8089,6 +8310,59 @@ declare class SignInPageComponent implements AfterViewInit, OnDestroy {
8089
8310
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInPageComponent, "app-sign-in", never, {}, {}, never, never, true, never>;
8090
8311
  }
8091
8312
 
8313
+ declare class FamilyAccessPageComponent implements OnInit {
8314
+ readonly service: FamilyAccessService;
8315
+ private bottomSheet;
8316
+ toastMessage: _angular_core.WritableSignal<string | null>;
8317
+ ngOnInit(): void;
8318
+ showToast(message: string): void;
8319
+ statusLabel(member: FamilyMember): string;
8320
+ handleResend(member: FamilyMember): Promise<void>;
8321
+ confirmRevoke(member: FamilyMember): Promise<void>;
8322
+ openMemberActions(member: FamilyMember): Promise<void>;
8323
+ openInviteSheet(): Promise<void>;
8324
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FamilyAccessPageComponent, never>;
8325
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FamilyAccessPageComponent, "app-family-access-page", never, {}, {}, never, never, true, never>;
8326
+ }
8327
+
8328
+ declare class AcceptInvitePageComponent implements OnInit {
8329
+ private route;
8330
+ private router;
8331
+ private familyAccessService;
8332
+ isLoading: _angular_core.WritableSignal<boolean>;
8333
+ isAccepting: _angular_core.WritableSignal<boolean>;
8334
+ isRequesting: _angular_core.WritableSignal<boolean>;
8335
+ requestSent: _angular_core.WritableSignal<boolean>;
8336
+ invite: _angular_core.WritableSignal<FamilyInvite | null>;
8337
+ isExpired: _angular_core.Signal<boolean>;
8338
+ pageTitle: _angular_core.Signal<string>;
8339
+ ngOnInit(): Promise<void>;
8340
+ accept(): Promise<void>;
8341
+ requestResend(): Promise<void>;
8342
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcceptInvitePageComponent, never>;
8343
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcceptInvitePageComponent, "app-accept-invite-page", never, {}, {}, never, never, true, never>;
8344
+ }
8345
+
8346
+ declare class CreateAccountPageComponent {
8347
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreateAccountPageComponent, never>;
8348
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CreateAccountPageComponent, "app-create-account-page", never, {}, {}, never, never, true, never>;
8349
+ }
8350
+
8351
+ declare class AvatarUploadPageComponent {
8352
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarUploadPageComponent, never>;
8353
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarUploadPageComponent, "app-avatar-upload-page", never, {}, {}, never, never, true, never>;
8354
+ }
8355
+
8356
+ declare class InviteSuccessPageComponent {
8357
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InviteSuccessPageComponent, never>;
8358
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InviteSuccessPageComponent, "app-invite-success-page", never, {}, {}, never, never, true, never>;
8359
+ }
8360
+
8361
+ declare class SignInToAcceptPageComponent {
8362
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignInToAcceptPageComponent, never>;
8363
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInToAcceptPageComponent, "app-sign-in-to-accept-page", never, {}, {}, never, never, true, never>;
8364
+ }
8365
+
8092
8366
  /**
8093
8367
  * Whitelabel Demo Modal Component
8094
8368
  *
@@ -8202,5 +8476,40 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
8202
8476
  */
8203
8477
  declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
8204
8478
 
8205
- 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 };
8206
- 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 };
8479
+ interface MediaPickerResult {
8480
+ attachments: AttachmentData[];
8481
+ }
8482
+ declare class MediaPickerService {
8483
+ /**
8484
+ * Opens the native photo library picker (multi-select, up to `limit` items).
8485
+ * Uses @capawesome/capacitor-file-picker which maps to the Android Photo Picker
8486
+ * on API 33+ and UIImagePickerController/PHPickerViewController on iOS.
8487
+ * No runtime permission required on Android 13+.
8488
+ */
8489
+ pickFromLibrary(limit?: number): Promise<MediaPickerResult>;
8490
+ /**
8491
+ * Opens the device camera directly.
8492
+ *
8493
+ * iOS: triggers NSCameraUsageDescription permission dialog on first use
8494
+ * (privacy string already set in Info.plist).
8495
+ * Android: launches the stock Camera app as a separate Activity —
8496
+ * no CAMERA permission needed in AndroidManifest.xml.
8497
+ *
8498
+ * Returns a single image (camera is always single-shot).
8499
+ */
8500
+ takePhoto(): Promise<MediaPickerResult>;
8501
+ /**
8502
+ * Opens the system file picker for documents.
8503
+ * On native, uses FilePicker.pickFiles() with broad MIME types.
8504
+ * On web, returns empty — the caller is responsible for triggering
8505
+ * a hidden <input type="file"> in that case.
8506
+ */
8507
+ pickFiles(limit?: number): Promise<MediaPickerResult>;
8508
+ formatFileSize(bytes: number): string;
8509
+ detectFileType(fileName: string): AttachmentData['type'];
8510
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MediaPickerService, never>;
8511
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MediaPickerService>;
8512
+ }
8513
+
8514
+ 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 };
8515
+ 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 };