@propbinder/mobile-design 0.2.15 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -1,14 +1,10 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, AfterViewInit, OnInit, ElementRef, Injector, TemplateRef, EventEmitter, ApplicationRef, EnvironmentInjector, Type, AfterContentInit, ChangeDetectorRef } from '@angular/core';
2
+ import { AfterViewInit, OnInit, ElementRef, Injector, TemplateRef, OnDestroy, EventEmitter, ApplicationRef, EnvironmentInjector, Type, AfterContentInit, ChangeDetectorRef } from '@angular/core';
3
3
  import { ModalController, IonContent, NavController, GestureController, ModalOptions as ModalOptions$1 } from '@ionic/angular/standalone';
4
- import { Style } from '@capacitor/status-bar';
5
4
  import { ImpactStyle } from '@capacitor/haptics';
6
5
  import { DsTextareaComponent } from '@propbinder/design-system';
7
6
  import { ControlValueAccessor } from '@angular/forms';
8
- import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
9
7
  import { Router, ActivatedRoute } from '@angular/router';
10
- import * as rxjs from 'rxjs';
11
- import * as _propbinder_mobile_design from '@propbinder/mobile-design';
12
8
  import { Animation } from '@ionic/angular';
13
9
 
14
10
  /**
@@ -19,29 +15,20 @@ import { Animation } from '@ionic/angular';
19
15
  * - 'full' - 100% width (no max)
20
16
  */
21
17
  type ContentWidth = 'narrow' | 'standard' | 'wide' | 'full';
22
- /**
23
- * Network status type
24
- */
25
- type NetworkStatus = 'online' | 'offline' | 'unknown';
26
18
  /**
27
19
  * MobilePageBase
28
20
  *
29
21
  * Shared base class for mobile page components (ds-mobile-page-main, ds-mobile-page-details).
30
- * Provides consistent content width control and network status monitoring across all page types.
22
+ * Provides consistent content width control across all page types.
31
23
  *
32
24
  * **Padding Strategy:**
33
25
  * - All pages use 20px horizontal padding globally
34
26
  * - For tappable lists, use negative margins (e.g., margin: 0 -8px) to create full-width sections
35
27
  * - This approach simplifies padding management and provides consistency
36
28
  *
37
- * **Network Monitoring:**
38
- * - Tracks online/offline status via Capacitor Network plugin (native) or browser API (web)
39
- * - Exposes `isOffline()` computed signal for easy consumption by child components
40
- * - Pages can use this to conditionally disable features or show offline indicators
41
- *
42
29
  * @internal This is a base class and should not be used directly.
43
30
  */
44
- declare abstract class MobilePageBase implements OnDestroy {
31
+ declare abstract class MobilePageBase {
45
32
  /**
46
33
  * Maximum content width (desktop only)
47
34
  *
@@ -72,68 +59,6 @@ declare abstract class MobilePageBase implements OnDestroy {
72
59
  * @internal
73
60
  */
74
61
  protected maxWidthValue: _angular_core.Signal<string>;
75
- /**
76
- * Network status signal
77
- * Tracks current online/offline state
78
- *
79
- * @internal
80
- */
81
- protected networkStatus: _angular_core.WritableSignal<NetworkStatus>;
82
- /**
83
- * Is the device currently offline?
84
- * Public computed signal for consumption by child components and pages
85
- *
86
- * @example
87
- * ```typescript
88
- * // In a page component
89
- * @ViewChild(DsMobilePageMainComponent) pageComponent!: DsMobilePageMainComponent;
90
- *
91
- * get isOffline() {
92
- * return this.pageComponent?.isOffline();
93
- * }
94
- * ```
95
- */
96
- isOffline: _angular_core.Signal<boolean>;
97
- /**
98
- * Is the device currently online?
99
- * Public computed signal for consumption by child components and pages
100
- */
101
- isOnline: _angular_core.Signal<boolean>;
102
- /**
103
- * Network listener ID for Capacitor Network plugin
104
- * Used to clean up listener on destroy
105
- *
106
- * @internal
107
- */
108
- private networkListenerId?;
109
- /**
110
- * Browser API event handlers
111
- * Stored as class properties for proper cleanup
112
- *
113
- * @internal
114
- */
115
- private handleOnline;
116
- private handleOffline;
117
- /**
118
- * Initialize network status monitoring
119
- * Uses Capacitor Network plugin for native apps, browser API for web
120
- *
121
- * @param isNative - Whether running on native platform (iOS/Android)
122
- * @internal Called by child components in ngAfterViewInit
123
- */
124
- protected initNetworkMonitoring(isNative: boolean): Promise<void>;
125
- /**
126
- * Initialize browser-based network monitoring
127
- * Uses navigator.onLine and window events
128
- *
129
- * @internal
130
- */
131
- private initBrowserNetworkMonitoring;
132
- /**
133
- * Cleanup network monitoring listeners
134
- * Called automatically on component destroy
135
- */
136
- ngOnDestroy(): void;
137
62
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobilePageBase, never>;
138
63
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobilePageBase, never, never, { "contentWidth": { "alias": "contentWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
139
64
  }
@@ -346,7 +271,6 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
346
271
  private elementRef;
347
272
  textareaInput?: ElementRef<HTMLTextAreaElement>;
348
273
  fileInput?: ElementRef<HTMLInputElement>;
349
- private whitelabelService;
350
274
  autoFocus: boolean;
351
275
  isReadonly: boolean;
352
276
  isEditMode: boolean;
@@ -382,6 +306,11 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
382
306
  handleCancel(): Promise<void>;
383
307
  handlePost(): Promise<void>;
384
308
  handleAddImage(): Promise<void>;
309
+ /**
310
+ * Restore StatusBar configuration (background task)
311
+ * Safe area padding is now handled preventively via applySafeAreaToToolbar()
312
+ */
313
+ private restoreStatusBar;
385
314
  handleRemoveImage(index: number): void;
386
315
  handleAddAttachment(): void;
387
316
  handleFileSelect(event: Event): void;
@@ -568,28 +497,6 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
568
497
  showCondensedHeader: _angular_core.InputSignal<boolean>;
569
498
  scrollThreshold: _angular_core.InputSignal<number>;
570
499
  headerFadeDistance: _angular_core.InputSignal<number>;
571
- /**
572
- * Content wrapper padding
573
- * - '0' (default) - No padding, use ds-mobile-section for content organization
574
- * - '20px' - Legacy padding for content without sections
575
- * - Any custom CSS padding value
576
- *
577
- * Note: Bottom padding for safe area and tab bar is always preserved
578
- *
579
- * @example
580
- * ```html
581
- * <!-- Default: sections handle padding -->
582
- * <ds-mobile-page-main title="Home">
583
- * <ds-mobile-section>...</ds-mobile-section>
584
- * </ds-mobile-page-main>
585
- *
586
- * <!-- Legacy: content without sections -->
587
- * <ds-mobile-page-main title="Home" contentPadding="20px">
588
- * <div>Content without sections...</div>
589
- * </ds-mobile-page-main>
590
- * ```
591
- */
592
- contentPadding: _angular_core.InputSignal<string>;
593
500
  /**
594
501
  * Profile menu action groups to display when avatar is clicked.
595
502
  * If not provided, a default menu will be used (without Whitelabel Demo).
@@ -639,7 +546,7 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
639
546
  */
640
547
  handleRefresh(event: any): Promise<void>;
641
548
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePageMainComponent, never>;
642
- 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>;
549
+ 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; }; "profileMenuItems": { "alias": "profileMenuItems"; "required": false; "isSignal": true; }; }, { "avatarClick": "avatarClick"; "profileActionSelected": "profileActionSelected"; "refresh": "refresh"; "scroll": "scroll"; }, never, ["[header-content]", "*"], true, never>;
643
550
  }
644
551
 
645
552
  interface InlineTabItem {
@@ -684,176 +591,6 @@ declare class DsMobileInlineTabsComponent {
684
591
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInlineTabsComponent, "ds-mobile-inline-tabs", never, { "tabs": { "alias": "tabs"; "required": true; "isSignal": true; }; "activeTab": { "alias": "activeTab"; "required": true; "isSignal": true; }; }, { "tabChange": "tabChange"; }, never, never, true, never>;
685
592
  }
686
593
 
687
- interface WhitelabelConfig {
688
- logoUrl: string;
689
- logoMarkUrl: string;
690
- logoAlt: string;
691
- logoSize: 'sm' | 'md' | 'lg' | 'xl';
692
- logoWidth?: number;
693
- logoHeight?: number;
694
- logoMarkWidth?: number;
695
- logoMarkHeight?: number;
696
- appIconSurface: string;
697
- appIconContent: string;
698
- accent: string;
699
- onAccent: string;
700
- headerSurface: string;
701
- headerContent: string;
702
- headerAccent: string;
703
- onHeaderAccent: string;
704
- showCityIllustration: boolean;
705
- signInBgType: 'solid' | 'gradient';
706
- signInBgSolid: string;
707
- signInBgGradientStart: string;
708
- signInBgGradientEnd: string;
709
- signInContentColor: string;
710
- organizationName: string;
711
- organizationId: string;
712
- }
713
- /**
714
- * WhitelabelService
715
- *
716
- * Manages whitelabel configuration including logos and brand colors.
717
- * Automatically updates CSS custom properties when colors change.
718
- *
719
- * @example
720
- * Initialize with custom config:
721
- * ```typescript
722
- * whitelabelService.initialize({
723
- * logoUrl: '/Assets/logos/acme-logo.svg',
724
- * logoMarkUrl: '/Assets/logos/acme-mark.svg',
725
- * accent: '#2563eb',
726
- * onAccent: '#ffffff',
727
- * headerSurface: '#1e40af',
728
- * headerContent: '#ffffff',
729
- * organizationName: 'Acme Corp'
730
- * });
731
- * ```
732
- *
733
- * Load from API:
734
- * ```typescript
735
- * await whitelabelService.loadFromApi('acme-corp');
736
- * ```
737
- */
738
- declare class WhitelabelService {
739
- private _config;
740
- readonly logoUrl: _angular_core.Signal<string>;
741
- readonly logoMarkUrl: _angular_core.Signal<string>;
742
- readonly logoAlt: _angular_core.Signal<string>;
743
- readonly logoSize: _angular_core.Signal<"sm" | "md" | "lg" | "xl">;
744
- readonly logoHeight: _angular_core.Signal<number>;
745
- readonly appIconSurface: _angular_core.Signal<string>;
746
- readonly appIconContent: _angular_core.Signal<string>;
747
- readonly accent: _angular_core.Signal<string>;
748
- readonly onAccent: _angular_core.Signal<string>;
749
- readonly headerSurface: _angular_core.Signal<string>;
750
- readonly headerContent: _angular_core.Signal<string>;
751
- readonly headerAccent: _angular_core.Signal<string>;
752
- readonly onHeaderAccent: _angular_core.Signal<string>;
753
- readonly showCityIllustration: _angular_core.Signal<boolean>;
754
- readonly signInBgType: _angular_core.Signal<"solid" | "gradient">;
755
- readonly signInBgSolid: _angular_core.Signal<string>;
756
- readonly signInBgGradientStart: _angular_core.Signal<string>;
757
- readonly signInBgGradientEnd: _angular_core.Signal<string>;
758
- readonly signInContentColor: _angular_core.Signal<string>;
759
- readonly organizationName: _angular_core.Signal<string>;
760
- readonly organizationId: _angular_core.Signal<string>;
761
- readonly signInBgStyle: _angular_core.Signal<string>;
762
- readonly config: _angular_core.Signal<WhitelabelConfig>;
763
- constructor();
764
- /**
765
- * Setup global listener for modal dismiss events
766
- * Re-applies status bar after modals close to override Ionic's cached state restoration
767
- */
768
- private setupModalDismissListener;
769
- /**
770
- * Initialize whitelabel configuration
771
- * Call this early in app initialization (app.config.ts or app.component.ts)
772
- */
773
- initialize(config: Partial<WhitelabelConfig>): void;
774
- /**
775
- * Load whitelabel config from API
776
- * Typically called on app startup based on subdomain, user tenant, etc.
777
- *
778
- * @param organizationId - The organization identifier (subdomain, tenant ID, etc.)
779
- */
780
- loadFromApi(organizationId?: string): Promise<void>;
781
- /**
782
- * Update config dynamically (e.g., when user switches organizations)
783
- */
784
- updateConfig(updates: Partial<WhitelabelConfig>): void;
785
- /**
786
- * Update only the brand colors
787
- */
788
- updateColors(colors: {
789
- appIconSurface?: string;
790
- appIconContent?: string;
791
- accent?: string;
792
- onAccent?: string;
793
- headerSurface?: string;
794
- headerContent?: string;
795
- headerAccent?: string;
796
- onHeaderAccent?: string;
797
- }): void;
798
- /**
799
- * Reset to default configuration
800
- */
801
- resetToDefault(): void;
802
- /**
803
- * Convert hex color to RGB values
804
- */
805
- private hexToRgb;
806
- /**
807
- * Calculate relative luminance of a color (WCAG standard)
808
- * Returns a value between 0 (darkest) and 1 (lightest)
809
- */
810
- private getRelativeLuminance;
811
- /**
812
- * Determine if a color is light (needs dark status bar content)
813
- */
814
- private isColorLight;
815
- /**
816
- * Get the appropriate status bar style for a background color
817
- * Public method for use by sign-in page
818
- */
819
- getStatusBarStyleForColor(color: string): Style;
820
- /**
821
- * Generate a hover state color by applying a black overlay
822
- * This simulates the effect of overlaying #000000 with 10% opacity
823
- *
824
- * @param baseColor - Hex color to overlay on (e.g., '#6B5FF5')
825
- * @param overlayColor - Overlay color (default: '#000000' for darkening)
826
- * @param overlayAlpha - Opacity of overlay (0-1, default: 0.1 = 10%)
827
- * @returns Hex color with overlay applied
828
- *
829
- * @example
830
- * generateHoverColor('#6B5FF5') // Returns darker purple for hover state
831
- * generateHoverColor('#FF0000', '#FFFFFF', 0.2) // Lighten red by 20%
832
- */
833
- private generateHoverColor;
834
- /**
835
- * Generate an active/pressed state color (darker than hover)
836
- * Uses 20% black overlay for a more pronounced pressed effect
837
- *
838
- * @param baseColor - Hex color to overlay on
839
- * @returns Hex color for active/pressed state
840
- */
841
- private generateActiveColor;
842
- /**
843
- * Apply colors to CSS custom properties and native StatusBar
844
- * This updates the actual CSS variables used throughout the app
845
- * and the native status bar color on mobile devices
846
- */
847
- private applyColors;
848
- /**
849
- * Update the native status bar color AND style
850
- * Sets background color (Android) and content style (iOS/Android)
851
- */
852
- private updateNativeStatusBar;
853
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelService, never>;
854
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<WhitelabelService>;
855
- }
856
-
857
594
  /**
858
595
  * DsMobilePageDetailsComponent
859
596
  *
@@ -894,19 +631,9 @@ declare class DsMobilePageDetailsComponent extends MobilePageBase implements Aft
894
631
  private elementRef;
895
632
  ionContent?: IonContent;
896
633
  private platform;
897
- whitelabelService: WhitelabelService;
898
634
  isNativePlatform: _angular_core.Signal<boolean>;
899
635
  title: _angular_core.InputSignal<string>;
900
636
  backRoute: _angular_core.InputSignal<string>;
901
- /**
902
- * Content wrapper padding
903
- * - '0' (default) - No padding, use ds-mobile-section for content organization
904
- * - '20px' - Legacy padding for content without sections
905
- * - Any custom CSS padding value
906
- *
907
- * Note: Bottom padding for safe area and tab bar is always preserved
908
- */
909
- contentPadding: _angular_core.InputSignal<string>;
910
637
  tabs: _angular_core.InputSignal<InlineTabItem[] | undefined>;
911
638
  activeTab: _angular_core.InputSignal<string>;
912
639
  showRefresh: _angular_core.InputSignal<boolean>;
@@ -942,7 +669,7 @@ declare class DsMobilePageDetailsComponent extends MobilePageBase implements Aft
942
669
  */
943
670
  handleRefresh(event: any): Promise<void>;
944
671
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePageDetailsComponent, never>;
945
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePageDetailsComponent, "ds-mobile-page-details", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "backRoute": { "alias": "backRoute"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; "tabs": { "alias": "tabs"; "required": false; "isSignal": true; }; "activeTab": { "alias": "activeTab"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "scrollThreshold": { "alias": "scrollThreshold"; "required": false; "isSignal": true; }; "headerFadeDistance": { "alias": "headerFadeDistance"; "required": false; "isSignal": true; }; }, { "back": "back"; "tabChange": "tabChange"; "refresh": "refresh"; "scroll": "scroll"; }, never, ["[offline-indicator]", "*"], true, never>;
672
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePageDetailsComponent, "ds-mobile-page-details", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "backRoute": { "alias": "backRoute"; "required": false; "isSignal": true; }; "tabs": { "alias": "tabs"; "required": false; "isSignal": true; }; "activeTab": { "alias": "activeTab"; "required": false; "isSignal": true; }; "showRefresh": { "alias": "showRefresh"; "required": false; "isSignal": true; }; "scrollThreshold": { "alias": "scrollThreshold"; "required": false; "isSignal": true; }; "headerFadeDistance": { "alias": "headerFadeDistance"; "required": false; "isSignal": true; }; }, { "back": "back"; "tabChange": "tabChange"; "refresh": "refresh"; "scroll": "scroll"; }, never, ["*"], true, never>;
946
673
  }
947
674
 
948
675
  /**
@@ -951,21 +678,18 @@ declare class DsMobilePageDetailsComponent extends MobilePageBase implements Aft
951
678
  * Main content container for mobile pages with flexible layout options.
952
679
  * Provides consistent spacing and layout patterns.
953
680
  *
954
- * **Note:** For production use, prefer `ds-mobile-section` for individual sections.
955
- * This component is maintained for grid layouts and prototyping.
956
- *
957
681
  * @example
958
682
  * ```html
959
683
  * <!-- Default: stacked layout -->
960
684
  * <ds-mobile-content>
961
- * <ds-mobile-section>...</ds-mobile-section>
962
- * <ds-mobile-section>...</ds-mobile-section>
685
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
686
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
963
687
  * </ds-mobile-content>
964
688
  *
965
689
  * <!-- Grid layout -->
966
690
  * <ds-mobile-content layout="grid-2">
967
- * <div>Grid item 1</div>
968
- * <div>Grid item 2</div>
691
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
692
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
969
693
  * </ds-mobile-content>
970
694
  * ```
971
695
  */
@@ -980,6 +704,25 @@ declare class DsMobileContentComponent {
980
704
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileContentComponent, never>;
981
705
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileContentComponent, "ds-mobile-content", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
982
706
  }
707
+ /**
708
+ * DsMobileContentSectionComponent
709
+ *
710
+ * Section within mobile content with optional header.
711
+ *
712
+ * @example
713
+ * ```html
714
+ * <ds-mobile-content-section>
715
+ * <section-header width="half"></section-header>
716
+ * <content-row>
717
+ * <div class="grey-box"></div>
718
+ * </content-row>
719
+ * </ds-mobile-content-section>
720
+ * ```
721
+ */
722
+ declare class DsMobileContentSectionComponent {
723
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileContentSectionComponent, never>;
724
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileContentSectionComponent, "ds-mobile-content-section", never, {}, {}, never, ["section-header", "*"], true, never>;
725
+ }
983
726
  /**
984
727
  * SectionHeaderComponent
985
728
  *
@@ -1003,223 +746,360 @@ declare class ContentRowComponent {
1003
746
  }
1004
747
 
1005
748
  /**
1006
- * DsMobileSectionComponent
749
+ * DsMobileHeaderContentComponent
1007
750
  *
1008
- * Universal section component for mobile pages, modals, and content containers.
1009
- * Provides consistent layout with optional headlines, action links, flexible padding, and borders.
751
+ * Container for header content tiles - displays tiles in a responsive grid.
752
+ * Used within the expandable header section of mobile pages to show
753
+ * summary information like property details, statistics, etc.
1010
754
  *
1011
- * **Features:**
1012
- * - Optional section headline with icon support
1013
- * - Optional action link with click handler
1014
- * - Flexible padding control
1015
- * - Border management (bottom border by default)
1016
- * - Works in pages, modals, and any content container
755
+ * @example
756
+ * ```html
757
+ * <ds-mobile-header-content header-content>
758
+ * <ds-mobile-header-content-tile>
759
+ * <tile-icon>
760
+ * <ds-icon name="remixHome4Line" />
761
+ * </tile-icon>
762
+ * <tile-content>
763
+ * <tile-label>Area</tile-label>
764
+ * <tile-value>120 m²</tile-value>
765
+ * </tile-content>
766
+ * </ds-mobile-header-content-tile>
767
+ * </ds-mobile-header-content>
768
+ * ```
769
+ */
770
+ declare class DsMobileHeaderContentComponent {
771
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileHeaderContentComponent, never>;
772
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileHeaderContentComponent, "ds-mobile-header-content", never, {}, {}, never, ["ds-mobile-header-content-tile"], true, never>;
773
+ }
774
+ /**
775
+ * DsMobileHeaderContentTileComponent
776
+ *
777
+ * Individual tile for displaying summary information in the header.
778
+ * Styled with purple background to match the mobile header theme.
1017
779
  *
1018
- * **Usage Patterns:**
780
+ * Must contain:
781
+ * - `<tile-icon>` - Icon container (optional)
782
+ * - `<tile-content>` - Label and value container
1019
783
  *
1020
784
  * @example
1021
785
  * ```html
1022
- * <!-- Section with headline and link -->
1023
- * <ds-mobile-section
1024
- * headline="Recent Posts"
1025
- * linkText="See all"
1026
- * (linkClick)="navigate()">
1027
- * <div class="posts-list">...</div>
1028
- * </ds-mobile-section>
1029
- *
1030
- * <!-- Section with icon in headline -->
1031
- * <ds-mobile-section
1032
- * headline="Messages"
1033
- * icon="remixChat3Line"
1034
- * linkText="View all"
1035
- * (linkClick)="viewMessages()">
1036
- * <div class="messages">...</div>
1037
- * </ds-mobile-section>
1038
- *
1039
- * <!-- Empty state section (no headline) -->
1040
- * <ds-mobile-section>
1041
- * <div class="empty-state">
1042
- * <ds-avatar type="icon" iconName="remixInboxLine" />
1043
- * <h3>No messages yet</h3>
1044
- * </div>
1045
- * </ds-mobile-section>
1046
- *
1047
- * <!-- Last section without border -->
1048
- * <ds-mobile-section
1049
- * headline="Contact"
1050
- * [showBorder]="false">
1051
- * <div class="contact-form">...</div>
1052
- * </ds-mobile-section>
1053
- *
1054
- * <!-- Section with custom padding -->
1055
- * <ds-mobile-section
1056
- * headline="Photos"
1057
- * padding="20px 0">
1058
- * <div class="photo-grid">...</div>
1059
- * </ds-mobile-section>
1060
- *
1061
- * <!-- Full-width section in page (default behavior) -->
1062
- * <ds-mobile-page-main title="Home">
1063
- * <ds-mobile-section headline="Posts">
1064
- * <div class="posts">...</div>
1065
- * </ds-mobile-section>
1066
- * </ds-mobile-page-main>
786
+ * <ds-mobile-header-content-tile>
787
+ * <tile-icon>
788
+ * <ds-icon name="remixHome4Line" size="20px" color="#DFE4FF" />
789
+ * </tile-icon>
790
+ * <tile-content>
791
+ * <tile-label>Rooms</tile-label>
792
+ * <tile-value>3 rooms</tile-value>
793
+ * </tile-content>
794
+ * </ds-mobile-header-content-tile>
1067
795
  * ```
1068
796
  */
1069
- declare class DsMobileSectionComponent {
1070
- /**
1071
- * Section headline text
1072
- * @default ''
1073
- */
1074
- headline: _angular_core.InputSignal<string>;
797
+ declare class DsMobileHeaderContentTileComponent {
798
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileHeaderContentTileComponent, never>;
799
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileHeaderContentTileComponent, "ds-mobile-header-content-tile", never, {}, {}, never, ["tile-icon", "tile-content"], true, never>;
800
+ }
801
+ /**
802
+ * TileIconComponent
803
+ *
804
+ * Semantic slot for tile icon with dark purple background.
805
+ * Use within `ds-mobile-header-content-tile`.
806
+ */
807
+ declare class TileIconComponent {
808
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileIconComponent, never>;
809
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileIconComponent, "tile-icon", never, {}, {}, never, ["*"], true, never>;
810
+ }
811
+ /**
812
+ * TileContentComponent
813
+ *
814
+ * Semantic slot for tile content containing label and value.
815
+ * Use within `ds-mobile-header-content-tile`.
816
+ *
817
+ * Contains:
818
+ * - `<tile-label>` - Small label text
819
+ * - `<tile-value>` - Large value text
820
+ */
821
+ declare class TileContentComponent {
822
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileContentComponent, never>;
823
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileContentComponent, "tile-content", never, {}, {}, never, ["tile-label", "tile-value"], true, never>;
824
+ }
825
+ /**
826
+ * TileLabelComponent
827
+ *
828
+ * Label text for tile content.
829
+ * Use within `tile-content` inside `ds-mobile-header-content-tile`.
830
+ */
831
+ declare class TileLabelComponent {
832
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileLabelComponent, never>;
833
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileLabelComponent, "tile-label", never, {}, {}, never, ["*"], true, never>;
834
+ }
835
+ /**
836
+ * TileValueComponent
837
+ *
838
+ * Value text for tile content.
839
+ * Use within `tile-content` inside `ds-mobile-header-content-tile`.
840
+ */
841
+ declare class TileValueComponent {
842
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileValueComponent, never>;
843
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileValueComponent, "tile-value", never, {}, {}, never, ["*"], true, never>;
844
+ }
845
+
846
+ interface WhitelabelConfig {
847
+ logoUrl: string;
848
+ logoMarkUrl: string;
849
+ logoAlt: string;
850
+ logoWidth?: number;
851
+ logoHeight?: number;
852
+ logoMarkWidth?: number;
853
+ logoMarkHeight?: number;
854
+ primarySurface: string;
855
+ primaryContent: string;
856
+ secondarySurface: string;
857
+ secondaryContent: string;
858
+ organizationName: string;
859
+ organizationId: string;
860
+ }
861
+ /**
862
+ * WhitelabelService
863
+ *
864
+ * Manages whitelabel configuration including logos and brand colors.
865
+ * Automatically updates CSS custom properties when colors change.
866
+ *
867
+ * @example
868
+ * Initialize with custom config:
869
+ * ```typescript
870
+ * whitelabelService.initialize({
871
+ * logoUrl: '/Assets/logos/acme-logo.svg',
872
+ * logoMarkUrl: '/Assets/logos/acme-mark.svg',
873
+ * primaryColor: '#2563eb',
874
+ * secondaryColor: '#3b82f6',
875
+ * organizationName: 'Acme Corp'
876
+ * });
877
+ * ```
878
+ *
879
+ * Load from API:
880
+ * ```typescript
881
+ * await whitelabelService.loadFromApi('acme-corp');
882
+ * ```
883
+ */
884
+ declare class WhitelabelService {
885
+ private _config;
886
+ readonly logoUrl: _angular_core.Signal<string>;
887
+ readonly logoMarkUrl: _angular_core.Signal<string>;
888
+ readonly logoAlt: _angular_core.Signal<string>;
889
+ readonly logoHeight: _angular_core.Signal<number>;
890
+ readonly primarySurface: _angular_core.Signal<string>;
891
+ readonly primaryContent: _angular_core.Signal<string>;
892
+ readonly secondarySurface: _angular_core.Signal<string>;
893
+ readonly secondaryContent: _angular_core.Signal<string>;
894
+ readonly organizationName: _angular_core.Signal<string>;
895
+ readonly organizationId: _angular_core.Signal<string>;
896
+ readonly config: _angular_core.Signal<WhitelabelConfig>;
897
+ constructor();
1075
898
  /**
1076
- * Optional icon to display before headline
1077
- * @default ''
899
+ * Initialize whitelabel configuration
900
+ * Call this early in app initialization (app.config.ts or app.component.ts)
1078
901
  */
1079
- icon: _angular_core.InputSignal<string>;
902
+ initialize(config: Partial<WhitelabelConfig>): void;
1080
903
  /**
1081
- * Link text (e.g., "See all", "View more")
1082
- * When provided, displays a clickable link in the section header
1083
- * @default ''
904
+ * Load whitelabel config from API
905
+ * Typically called on app startup based on subdomain, user tenant, etc.
906
+ *
907
+ * @param organizationId - The organization identifier (subdomain, tenant ID, etc.)
1084
908
  */
1085
- linkText: _angular_core.InputSignal<string>;
909
+ loadFromApi(organizationId?: string): Promise<void>;
1086
910
  /**
1087
- * Section padding
1088
- * Accepts any valid CSS padding value
1089
- * When not set, defaults to 20px on mobile and 32px on desktop
1090
- * @default ''
911
+ * Update config dynamically (e.g., when user switches organizations)
1091
912
  */
1092
- padding: _angular_core.InputSignal<string>;
913
+ updateConfig(updates: Partial<WhitelabelConfig>): void;
1093
914
  /**
1094
- * Gap between section header and content
1095
- * Accepts any valid CSS gap value
1096
- * @default '12px'
915
+ * Update only the brand colors
1097
916
  */
1098
- gap: _angular_core.InputSignal<string>;
917
+ updateColors(colors: {
918
+ primarySurface?: string;
919
+ primaryContent?: string;
920
+ secondarySurface?: string;
921
+ secondaryContent?: string;
922
+ }): void;
1099
923
  /**
1100
- * Gap between child elements within section-content
1101
- * Accepts any valid CSS gap value
1102
- * @default '12px'
924
+ * Reset to default configuration
1103
925
  */
1104
- contentGap: _angular_core.InputSignal<string>;
926
+ resetToDefault(): void;
1105
927
  /**
1106
- * Whether to show bottom border
1107
- * @default true
928
+ * Convert hex color to RGB values
1108
929
  */
1109
- showBorder: _angular_core.InputSignal<boolean>;
930
+ private hexToRgb;
1110
931
  /**
1111
- * CSS overflow property for the section
1112
- * @default 'visible'
932
+ * Generate a hover state color by applying a black overlay
933
+ * This simulates the effect of overlaying #000000 with 10% opacity
934
+ *
935
+ * @param baseColor - Hex color to overlay on (e.g., '#6B5FF5')
936
+ * @param overlayColor - Overlay color (default: '#000000' for darkening)
937
+ * @param overlayAlpha - Opacity of overlay (0-1, default: 0.1 = 10%)
938
+ * @returns Hex color with overlay applied
939
+ *
940
+ * @example
941
+ * generateHoverColor('#6B5FF5') // Returns darker purple for hover state
942
+ * generateHoverColor('#FF0000', '#FFFFFF', 0.2) // Lighten red by 20%
1113
943
  */
1114
- overflow: _angular_core.InputSignal<string>;
944
+ private generateHoverColor;
1115
945
  /**
1116
- * Emitted when section link is clicked
946
+ * Generate an active/pressed state color (darker than hover)
947
+ * Uses 20% black overlay for a more pronounced pressed effect
948
+ *
949
+ * @param baseColor - Hex color to overlay on
950
+ * @returns Hex color for active/pressed state
1117
951
  */
1118
- linkClick: _angular_core.OutputEmitterRef<void>;
952
+ private generateActiveColor;
1119
953
  /**
1120
- * Handle link click event
954
+ * Apply colors to CSS custom properties and native StatusBar
955
+ * This updates the actual CSS variables used throughout the app
956
+ * and the native status bar color on mobile devices
1121
957
  */
1122
- handleLinkClick(): void;
1123
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSectionComponent, never>;
1124
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileSectionComponent, "ds-mobile-section", never, { "headline": { "alias": "headline"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "linkText": { "alias": "linkText"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "contentGap": { "alias": "contentGap"; "required": false; "isSignal": true; }; "showBorder": { "alias": "showBorder"; "required": false; "isSignal": true; }; "overflow": { "alias": "overflow"; "required": false; "isSignal": true; }; }, { "linkClick": "linkClick"; }, never, ["*"], true, never>;
1125
- }
1126
-
1127
- /**
1128
- * DsMobileHeaderContentComponent
1129
- *
1130
- * Container for header content tiles - displays tiles in a responsive grid.
1131
- * Used within the expandable header section of mobile pages to show
1132
- * summary information like property details, statistics, etc.
1133
- *
1134
- * @example
1135
- * ```html
1136
- * <ds-mobile-header-content header-content>
1137
- * <ds-mobile-header-content-tile>
1138
- * <tile-icon>
1139
- * <ds-icon name="remixHome4Line" />
1140
- * </tile-icon>
1141
- * <tile-content>
1142
- * <tile-label>Area</tile-label>
1143
- * <tile-value>120 m²</tile-value>
1144
- * </tile-content>
1145
- * </ds-mobile-header-content-tile>
1146
- * </ds-mobile-header-content>
1147
- * ```
1148
- */
1149
- declare class DsMobileHeaderContentComponent {
1150
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileHeaderContentComponent, never>;
1151
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileHeaderContentComponent, "ds-mobile-header-content", never, {}, {}, never, ["ds-mobile-header-content-tile"], true, never>;
958
+ private applyColors;
959
+ /**
960
+ * Update the native status bar color
961
+ * Note: This only works on Android. On iOS, the status bar is transparent
962
+ * and shows the web content behind it (controlled by CSS variables)
963
+ */
964
+ private updateNativeStatusBar;
965
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelService, never>;
966
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<WhitelabelService>;
1152
967
  }
968
+
969
+ type LogoVariant = 'full' | 'mark';
970
+ type LogoSize = 'sm' | 'md' | 'lg' | 'xl';
1153
971
  /**
1154
- * DsMobileHeaderContentTileComponent
1155
- *
1156
- * Individual tile for displaying summary information in the header.
1157
- * Styled with purple background to match the mobile header theme.
972
+ * DsLogoComponent
1158
973
  *
1159
- * Must contain:
1160
- * - `<tile-icon>` - Icon container (optional)
1161
- * - `<tile-content>` - Label and value container
974
+ * Displays the whitelabeled logo or logomark based on current configuration.
975
+ * Automatically pulls logo assets from WhitelabelService.
1162
976
  *
1163
977
  * @example
978
+ * Full logo in header:
1164
979
  * ```html
1165
- * <ds-mobile-header-content-tile>
1166
- * <tile-icon>
1167
- * <ds-icon name="remixHome4Line" size="20px" color="#DFE4FF" />
1168
- * </tile-icon>
1169
- * <tile-content>
1170
- * <tile-label>Rooms</tile-label>
1171
- * <tile-value>3 rooms</tile-value>
1172
- * </tile-content>
1173
- * </ds-mobile-header-content-tile>
980
+ * <ds-logo variant="full" size="md" />
1174
981
  * ```
1175
- */
1176
- declare class DsMobileHeaderContentTileComponent {
1177
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileHeaderContentTileComponent, never>;
1178
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileHeaderContentTileComponent, "ds-mobile-header-content-tile", never, {}, {}, never, ["tile-icon", "tile-content"], true, never>;
1179
- }
1180
- /**
1181
- * TileIconComponent
1182
982
  *
1183
- * Semantic slot for tile icon with dark purple background.
1184
- * Use within `ds-mobile-header-content-tile`.
983
+ * Logomark for compact spaces:
984
+ * ```html
985
+ * <ds-logo variant="mark" size="sm" />
986
+ * ```
1185
987
  */
1186
- declare class TileIconComponent {
1187
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileIconComponent, never>;
1188
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileIconComponent, "tile-icon", never, {}, {}, never, ["*"], true, never>;
988
+ declare class DsLogoComponent {
989
+ whitelabelService: WhitelabelService;
990
+ variant: LogoVariant;
991
+ size: LogoSize;
992
+ customHeight?: number;
993
+ customWidth?: number;
994
+ get logoSrc(): string;
995
+ get logoAlt(): string;
996
+ /**
997
+ * Priority: customHeight input > whitelabel config logoHeight > default 32px
998
+ */
999
+ get effectiveHeight(): number;
1000
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsLogoComponent, never>;
1001
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsLogoComponent, "ds-logo", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "customHeight": { "alias": "customHeight"; "required": false; }; "customWidth": { "alias": "customWidth"; "required": false; }; }, {}, never, never, true, never>;
1189
1002
  }
1003
+
1190
1004
  /**
1191
- * TileContentComponent
1005
+ * DsMobileSystemMessageBannerComponent
1192
1006
  *
1193
- * Semantic slot for tile content containing label and value.
1194
- * Use within `ds-mobile-header-content-tile`.
1007
+ * Full-width centered banner component for displaying system messages in chat conversations.
1008
+ * Uses the same text styling as message bubbles for consistency.
1195
1009
  *
1196
- * Contains:
1197
- * - `<tile-label>` - Small label text
1198
- * - `<tile-value>` - Large value text
1199
- */
1200
- declare class TileContentComponent {
1201
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileContentComponent, never>;
1202
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileContentComponent, "tile-content", never, {}, {}, never, ["tile-label", "tile-value"], true, never>;
1203
- }
1204
- /**
1205
- * TileLabelComponent
1010
+ * Features:
1011
+ * - Full-width centered layout
1012
+ * - Subtle background with theming support
1013
+ * - Same typography as message bubbles
1014
+ * - Optional icon support
1206
1015
  *
1207
- * Label text for tile content.
1208
- * Use within `tile-content` inside `ds-mobile-header-content-tile`.
1016
+ * Common use cases:
1017
+ * - Inquiry status updates ("Your inquiry has been assigned to...")
1018
+ * - System notifications ("This inquiry is marked as resolved")
1019
+ * - Auto-replies ("We aim to respond within 24 hours...")
1020
+ * - Time/date separators
1021
+ *
1022
+ * @example
1023
+ * ```html
1024
+ * <!-- Simple system message -->
1025
+ * <ds-mobile-system-message-banner
1026
+ * [message]="'Ricki Meihlen har overtaget din henvendelse og vil kontakte dig snart.'">
1027
+ * </ds-mobile-system-message-banner>
1028
+ *
1029
+ * <!-- With icon -->
1030
+ * <ds-mobile-system-message-banner
1031
+ * [message]="'Vi bestræber os på at svare inden for 24 timer på hverdage.'"
1032
+ * [iconName]="'remixInformationLine'">
1033
+ * </ds-mobile-system-message-banner>
1034
+ * ```
1209
1035
  */
1210
- declare class TileLabelComponent {
1211
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileLabelComponent, never>;
1212
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileLabelComponent, "tile-label", never, {}, {}, never, ["*"], true, never>;
1036
+ declare class DsMobileSystemMessageBannerComponent {
1037
+ /**
1038
+ * System message text to display
1039
+ */
1040
+ message: _angular_core.InputSignal<string>;
1041
+ /**
1042
+ * Optional icon name (currently using inline SVG for info icon)
1043
+ * Can be extended to support full icon library integration
1044
+ */
1045
+ iconName: _angular_core.InputSignal<string>;
1046
+ /**
1047
+ * Whether this system message appears directly after a timestamp
1048
+ * When true, removes top padding to reduce spacing
1049
+ */
1050
+ afterTimestamp: _angular_core.InputSignal<boolean>;
1051
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSystemMessageBannerComponent, never>;
1052
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileSystemMessageBannerComponent, "ds-mobile-system-message-banner", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "afterTimestamp": { "alias": "afterTimestamp"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1213
1053
  }
1054
+
1214
1055
  /**
1215
- * TileValueComponent
1056
+ * DsMobileFileAttachmentComponent
1216
1057
  *
1217
- * Value text for tile content.
1218
- * Use within `tile-content` inside `ds-mobile-header-content-tile`.
1058
+ * File attachment display for various document types.
1059
+ * Shows file info card with icon, filename, and file size.
1060
+ * Supports PDF and generic document formats.
1061
+ * Emits click event to open file in viewer.
1062
+ *
1063
+ * @example
1064
+ * ```html
1065
+ * <ds-mobile-file-attachment
1066
+ * [fileName]="'Document.pdf'"
1067
+ * [fileSize]="'1.2 MB'"
1068
+ * [variant]="'pdf'"
1069
+ * (fileClick)="openFile()">
1070
+ * </ds-mobile-file-attachment>
1071
+ * ```
1219
1072
  */
1220
- declare class TileValueComponent {
1221
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileValueComponent, never>;
1222
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileValueComponent, "tile-value", never, {}, {}, never, ["*"], true, never>;
1073
+ declare class DsMobileFileAttachmentComponent {
1074
+ /**
1075
+ * File name
1076
+ */
1077
+ fileName: _angular_core.InputSignal<string>;
1078
+ /**
1079
+ * File size display (e.g., "1.2 MB")
1080
+ */
1081
+ fileSize: _angular_core.InputSignal<string>;
1082
+ /**
1083
+ * File type variant
1084
+ * - 'pdf' - PDF document (red icon)
1085
+ * - 'doc' - Generic document (blue icon)
1086
+ */
1087
+ variant: _angular_core.InputSignal<"pdf" | "doc">;
1088
+ /**
1089
+ * Emits when the file attachment is clicked
1090
+ */
1091
+ fileClick: _angular_core.OutputEmitterRef<void>;
1092
+ /**
1093
+ * Get the appropriate icon name based on variant
1094
+ */
1095
+ getIconName(): string;
1096
+ /**
1097
+ * Get the file type label based on variant
1098
+ */
1099
+ getFileTypeLabel(): string;
1100
+ handleClick(event: Event): void;
1101
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileFileAttachmentComponent, never>;
1102
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileFileAttachmentComponent, "ds-mobile-file-attachment", never, { "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "fileSize": { "alias": "fileSize"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "fileClick": "fileClick"; }, never, never, true, never>;
1223
1103
  }
1224
1104
 
1225
1105
  /**
@@ -2404,6 +2284,48 @@ declare class DsMobileListItemStaticComponent {
2404
2284
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileListItemStaticComponent, "ds-mobile-list-item-static", never, { "leadingSize": { "alias": "leadingSize"; "required": false; "isSignal": true; }; }, {}, never, ["[content-leading]", "[content-main]", "*", "[content-trailing]"], true, never>;
2405
2285
  }
2406
2286
 
2287
+ /**
2288
+ * DsMobileActionListItemComponent
2289
+ *
2290
+ * Specialized list item for action sheets and menus.
2291
+ * Wraps ds-mobile-list-item with action-specific styling:
2292
+ * - Vertically centered content
2293
+ * - Interactive by default
2294
+ * - No dividers (controlled per-item)
2295
+ *
2296
+ * @example
2297
+ * ```html
2298
+ * <ds-mobile-action-list-item
2299
+ * title="Edit"
2300
+ * [showDivider]="true"
2301
+ * (itemClick)="handleEdit()">
2302
+ * <ds-icon content-leading name="remixEditLine" size="20px" />
2303
+ * </ds-mobile-action-list-item>
2304
+ * ```
2305
+ */
2306
+ declare class DsMobileActionListItemComponent {
2307
+ /**
2308
+ * Action title text
2309
+ */
2310
+ title: _angular_core.InputSignal<string>;
2311
+ /**
2312
+ * Whether to show divider below item
2313
+ * @default false
2314
+ */
2315
+ showDivider: _angular_core.InputSignal<boolean>;
2316
+ /**
2317
+ * Whether the action is disabled
2318
+ * @default false
2319
+ */
2320
+ disabled: _angular_core.InputSignal<boolean>;
2321
+ /**
2322
+ * Emits when the action item is clicked
2323
+ */
2324
+ itemClick: _angular_core.OutputEmitterRef<void>;
2325
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileActionListItemComponent, never>;
2326
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileActionListItemComponent, "ds-mobile-action-list-item", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "showDivider": { "alias": "showDivider"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, ["[action-icon]", "[content-trailing]"], true, never>;
2327
+ }
2328
+
2407
2329
  /**
2408
2330
  * DsMobileInteractiveListItemPostComponent
2409
2331
  *
@@ -2420,7 +2342,6 @@ declare class DsMobileListItemStaticComponent {
2420
2342
  * [timestamp]="'2h ago'"
2421
2343
  * [avatarInitials]="'JD'"
2422
2344
  * [clickable]="true"
2423
- * [enableLongPress]="true"
2424
2345
  * (postClick)="openPost()">
2425
2346
  *
2426
2347
  * <post-content>
@@ -2477,13 +2398,6 @@ declare class DsMobileInteractiveListItemPostComponent {
2477
2398
  * Whether the post card is clickable
2478
2399
  */
2479
2400
  clickable: _angular_core.InputSignal<boolean>;
2480
- /**
2481
- * Enable long-press interaction when clickable is true
2482
- * Set to false to disable long-press but keep click
2483
- * Also controls visibility of desktop "more" button
2484
- * @default true
2485
- */
2486
- enableLongPress: _angular_core.InputSignal<boolean>;
2487
2401
  /**
2488
2402
  * Emits when the post card is clicked (if clickable)
2489
2403
  */
@@ -2501,7 +2415,7 @@ declare class DsMobileInteractiveListItemPostComponent {
2501
2415
  handleLongPress(): void;
2502
2416
  handleMoreButtonClick(event: Event): void;
2503
2417
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemPostComponent, never>;
2504
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemPostComponent, "ds-mobile-interactive-list-item-post", never, { "authorName": { "alias": "authorName"; "required": true; "isSignal": true; }; "authorRole": { "alias": "authorRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "showBadge": { "alias": "showBadge"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "enableLongPress": { "alias": "enableLongPress"; "required": false; "isSignal": true; }; }, { "postClick": "postClick"; "commentClick": "commentClick"; "longPress": "longPress"; }, never, ["post-menu", "post-content", "post-actions"], true, never>;
2418
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemPostComponent, "ds-mobile-interactive-list-item-post", never, { "authorName": { "alias": "authorName"; "required": true; "isSignal": true; }; "authorRole": { "alias": "authorRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "showBadge": { "alias": "showBadge"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "postClick": "postClick"; "commentClick": "commentClick"; "longPress": "longPress"; }, never, ["post-menu", "post-content", "post-actions"], true, never>;
2505
2419
  }
2506
2420
  /**
2507
2421
  * PostContentComponent
@@ -2649,7 +2563,6 @@ declare class PostPdfAttachmentComponent {
2649
2563
  * [timestamp]="'12 days ago'"
2650
2564
  * [iconName]="'remixCalendarLine'"
2651
2565
  * [clickable]="true"
2652
- * [enableLongPress]="true"
2653
2566
  * (inquiryClick)="openInquiry()">
2654
2567
  * </ds-mobile-interactive-list-item-inquiry>
2655
2568
  * ```
@@ -2697,13 +2610,6 @@ declare class DsMobileInteractiveListItemInquiryComponent {
2697
2610
  * Whether to show chevron icon
2698
2611
  */
2699
2612
  showChevron: _angular_core.InputSignal<boolean>;
2700
- /**
2701
- * Enable long-press interaction when clickable is true
2702
- * Set to false to disable long-press but keep click
2703
- * Also controls visibility of desktop "more" button
2704
- * @default true
2705
- */
2706
- enableLongPress: _angular_core.InputSignal<boolean>;
2707
2613
  /**
2708
2614
  * Emits when the inquiry item is clicked (if clickable)
2709
2615
  */
@@ -2720,7 +2626,7 @@ declare class DsMobileInteractiveListItemInquiryComponent {
2720
2626
  handleLongPress(): void;
2721
2627
  handleMoreButtonClick(event: Event): void;
2722
2628
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemInquiryComponent, never>;
2723
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemInquiryComponent, "ds-mobile-interactive-list-item-inquiry", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "statusLabel": { "alias": "statusLabel"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; "enableLongPress": { "alias": "enableLongPress"; "required": false; "isSignal": true; }; }, { "inquiryClick": "inquiryClick"; "longPress": "longPress"; }, never, never, true, never>;
2629
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemInquiryComponent, "ds-mobile-interactive-list-item-inquiry", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "statusLabel": { "alias": "statusLabel"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; }, { "inquiryClick": "inquiryClick"; "longPress": "longPress"; }, never, never, true, never>;
2724
2630
  }
2725
2631
 
2726
2632
  /**
@@ -2909,7 +2815,7 @@ interface TabConfig {
2909
2815
  * ```css
2910
2816
  * ion-tabs {
2911
2817
  * height: 100%;
2912
- * background: var(--color-header-surface);
2818
+ * background: var(--color-brand-secondary);
2913
2819
  * }
2914
2820
  * ```
2915
2821
  */
@@ -3014,6 +2920,45 @@ declare class DsMobileTabsComponent implements OnInit {
3014
2920
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileTabsComponent, "ds-mobile-tabs", never, { "tabs": { "alias": "tabs"; "required": false; }; "avatarType": { "alias": "avatarType"; "required": false; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; }; }, { "avatarClick": "avatarClick"; }, never, never, true, never>;
3015
2921
  }
3016
2922
 
2923
+ /**
2924
+ * DsMobileSwiperComponent
2925
+ *
2926
+ * A reusable swiper/carousel component with configurable child width and spacing.
2927
+ *
2928
+ * Features:
2929
+ * - First slide is left-aligned
2930
+ * - Middle slides are centered when active
2931
+ * - Last slide is right-aligned
2932
+ * - Configurable slide width and gap
2933
+ * - Content projection via ng-content
2934
+ *
2935
+ * Usage:
2936
+ * ```html
2937
+ * <ds-mobile-swiper [slideWidth]="'75vw'" [gap]="16">
2938
+ * <div class="swiper-slide">Slide 1</div>
2939
+ * <div class="swiper-slide">Slide 2</div>
2940
+ * <div class="swiper-slide">Slide 3</div>
2941
+ * </ds-mobile-swiper>
2942
+ * ```
2943
+ */
2944
+ declare class DsMobileSwiperComponent implements AfterViewInit, OnDestroy {
2945
+ /**
2946
+ * Width of each slide (e.g., '75vw', '300px', '80%')
2947
+ */
2948
+ slideWidth: _angular_core.InputSignal<string>;
2949
+ /**
2950
+ * Gap between slides in pixels
2951
+ */
2952
+ gap: _angular_core.InputSignal<number>;
2953
+ swiperContainer: ElementRef;
2954
+ private swiperInstance;
2955
+ ngAfterViewInit(): void;
2956
+ private initializeSwiper;
2957
+ ngOnDestroy(): void;
2958
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSwiperComponent, never>;
2959
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileSwiperComponent, "ds-mobile-swiper", never, { "slideWidth": { "alias": "slideWidth"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2960
+ }
2961
+
3017
2962
  /**
3018
2963
  * Media file types supported by the lightbox
3019
2964
  */
@@ -3492,21 +3437,12 @@ declare class DsMobileLightboxFooterComponent {
3492
3437
  * />
3493
3438
  * ```
3494
3439
  */
3495
- declare class DsMobileInlinePhotoComponent implements OnInit {
3440
+ declare class DsMobileInlinePhotoComponent {
3496
3441
  private lightboxService;
3497
3442
  /**
3498
3443
  * Array of image URLs to display
3499
3444
  */
3500
3445
  images: string[];
3501
- /**
3502
- * Optional array of loading states for each image (by index)
3503
- * If provided, shows loader overlay for images that are still loading
3504
- */
3505
- loadingStates?: boolean[];
3506
- /**
3507
- * Internal signal to track image loading states
3508
- */
3509
- private internalLoadingStates;
3510
3446
  /**
3511
3447
  * Author information (passed to lightbox)
3512
3448
  */
@@ -3523,11 +3459,6 @@ declare class DsMobileInlinePhotoComponent implements OnInit {
3523
3459
  * Remaining images shown in lightbox only
3524
3460
  */
3525
3461
  maxVisible: number;
3526
- /**
3527
- * Whether to use grid layout (true) or flex-wrap layout (false)
3528
- * @default true
3529
- */
3530
- useGrid: boolean;
3531
3462
  /**
3532
3463
  * Event emitted when lightbox is opened
3533
3464
  */
@@ -3536,92 +3467,20 @@ declare class DsMobileInlinePhotoComponent implements OnInit {
3536
3467
  totalImages: number;
3537
3468
  }>;
3538
3469
  constructor(lightboxService: DsMobileLightboxService);
3539
- /**
3540
- * Initialize loading states for all visible images
3541
- */
3542
- ngOnInit(): void;
3543
- /**
3544
- * Handle image load event
3545
- */
3546
- onImageLoad(index: number): void;
3547
- /**
3548
- * Handle image error event
3549
- */
3550
- onImageError(index: number): void;
3551
3470
  /**
3552
3471
  * Get the first N images to display inline
3553
3472
  */
3554
- get visibleImages(): string[];
3555
- /**
3556
- * Check if a specific image is loading
3557
- */
3558
- isImageLoading(index: number): boolean;
3559
- /**
3560
- * Calculate how many images are hidden
3561
- */
3562
- get hiddenCount(): number;
3563
- /**
3564
- * Open lightbox with all images, starting at the clicked index
3565
- */
3566
- openLightbox(index: number, event?: Event): void;
3567
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInlinePhotoComponent, never>;
3568
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInlinePhotoComponent, "ds-mobile-inline-photo", never, { "images": { "alias": "images"; "required": false; }; "loadingStates": { "alias": "loadingStates"; "required": false; }; "author": { "alias": "author"; "required": false; }; "maxVisible": { "alias": "maxVisible"; "required": false; }; "useGrid": { "alias": "useGrid"; "required": false; }; }, { "photoClick": "photoClick"; }, never, never, true, never>;
3569
- }
3570
-
3571
- /**
3572
- * DsMobileLoaderOverlayComponent
3573
- *
3574
- * Reusable loader overlay component that displays a spinner centered over its container.
3575
- * Designed to overlay images or other content during loading states.
3576
- *
3577
- * Features:
3578
- * - Semi-transparent white background overlay
3579
- * - Centered animated spinner
3580
- * - Customizable spinner size
3581
- * - Absolute positioning to cover parent
3582
- * - Accessible with proper z-index stacking
3583
- *
3584
- * @example
3585
- * ```html
3586
- * <!-- Basic usage -->
3587
- * <div style="position: relative;">
3588
- * <img src="image.jpg" alt="Content" />
3589
- * @if (isLoading) {
3590
- * <ds-mobile-loader-overlay />
3591
- * }
3592
- * </div>
3593
- *
3594
- * <!-- With custom spinner size -->
3595
- * <div style="position: relative;">
3596
- * <div class="content">Loading content...</div>
3597
- * <ds-mobile-loader-overlay [spinnerSize]="32" />
3598
- * </div>
3599
- *
3600
- * <!-- Over an image with rounded corners -->
3601
- * <div style="position: relative; border-radius: 12px; overflow: hidden;">
3602
- * <img src="photo.jpg" />
3603
- * <ds-mobile-loader-overlay [borderRadius]="12" />
3604
- * </div>
3605
- * ```
3606
- *
3607
- * @notes
3608
- * - Parent container must have position: relative for the overlay to work correctly
3609
- * - The overlay covers the entire parent element using inset: 0
3610
- * - Spinner animation runs continuously at 0.6s per rotation
3611
- */
3612
- declare class DsMobileLoaderOverlayComponent {
3473
+ get visibleImages(): string[];
3613
3474
  /**
3614
- * Size of the spinner in pixels
3615
- * @default 24
3475
+ * Calculate how many images are hidden
3616
3476
  */
3617
- spinnerSize: _angular_core.InputSignal<number>;
3477
+ get hiddenCount(): number;
3618
3478
  /**
3619
- * Border radius of the overlay in pixels (should match parent's border radius)
3620
- * @default 0
3479
+ * Open lightbox with all images, starting at the clicked index
3621
3480
  */
3622
- borderRadius: _angular_core.InputSignal<number>;
3623
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileLoaderOverlayComponent, never>;
3624
- 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>;
3481
+ openLightbox(index: number, event?: Event): void;
3482
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInlinePhotoComponent, never>;
3483
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInlinePhotoComponent, "ds-mobile-inline-photo", never, { "images": { "alias": "images"; "required": false; }; "author": { "alias": "author"; "required": false; }; "maxVisible": { "alias": "maxVisible"; "required": false; }; }, { "photoClick": "photoClick"; }, never, never, true, never>;
3625
3484
  }
3626
3485
 
3627
3486
  /**
@@ -3883,29 +3742,6 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3883
3742
  * @default false
3884
3743
  */
3885
3744
  hasFixedBottom: _angular_core.InputSignal<boolean>;
3886
- /**
3887
- * Content padding for modal content
3888
- * Controls padding inside .modal-main-content
3889
- * - '0' (default) - No padding, use ds-mobile-section for content organization
3890
- * - '20px' - Legacy padding for content without sections
3891
- * - Any custom CSS padding value
3892
- *
3893
- * @default '0'
3894
- *
3895
- * @example
3896
- * ```html
3897
- * <!-- Default: sections handle padding -->
3898
- * <ds-mobile-modal-base headerTitle="Details">
3899
- * <ds-mobile-section headline="Info">...</ds-mobile-section>
3900
- * </ds-mobile-modal-base>
3901
- *
3902
- * <!-- Legacy: content without sections -->
3903
- * <ds-mobile-modal-base headerTitle="Details" contentPadding="20px">
3904
- * <div>Padded content</div>
3905
- * </ds-mobile-modal-base>
3906
- * ```
3907
- */
3908
- contentPadding: _angular_core.InputSignal<string>;
3909
3745
  /**
3910
3746
  * Emitted when modal is closed
3911
3747
  */
@@ -3947,7 +3783,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
3947
3783
  */
3948
3784
  protected cleanupKeyboardListeners(): void;
3949
3785
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileModalBase, never>;
3950
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobileModalBase, never, never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerMeta": { "alias": "headerMeta"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "enableKeyboardHandling": { "alias": "enableKeyboardHandling"; "required": false; "isSignal": true; }; "hasFixedBottom": { "alias": "hasFixedBottom"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "keyboardWillShow": "keyboardWillShow"; "keyboardWillHide": "keyboardWillHide"; }, never, never, true, never>;
3786
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobileModalBase, never, never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerMeta": { "alias": "headerMeta"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "enableKeyboardHandling": { "alias": "enableKeyboardHandling"; "required": false; "isSignal": true; }; "hasFixedBottom": { "alias": "hasFixedBottom"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "keyboardWillShow": "keyboardWillShow"; "keyboardWillHide": "keyboardWillHide"; }, never, never, true, never>;
3951
3787
  }
3952
3788
 
3953
3789
  /**
@@ -4742,7 +4578,7 @@ interface ChatParticipant {
4742
4578
  *
4743
4579
  * Represents the data needed to display a chat conversation.
4744
4580
  *
4745
- * @example
4581
+ * @example
4746
4582
  * ```typescript
4747
4583
  * const chatData: ChatModalData = {
4748
4584
  * participant: {
@@ -4938,7 +4774,7 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
4938
4774
  /**
4939
4775
  * Get file variant for card-inline-file component
4940
4776
  */
4941
- getFileVariant(type: string): 'pdf' | 'doc';
4777
+ getFileVariant(type: string): "pdf" | "doc";
4942
4778
  /**
4943
4779
  * Handle file attachment click
4944
4780
  */
@@ -5367,7 +5203,6 @@ interface ContactItem {
5367
5203
  * This component is typically not used directly - use DsMobileHandbookDetailModalService instead.
5368
5204
  */
5369
5205
  declare class DsMobileHandbookDetailModalComponent implements OnInit {
5370
- private modalController;
5371
5206
  handbookData: HandbookDetailData;
5372
5207
  /**
5373
5208
  * Loading state - when true, shows loading indicator
@@ -5378,7 +5213,6 @@ declare class DsMobileHandbookDetailModalComponent implements OnInit {
5378
5213
  */
5379
5214
  error?: string;
5380
5215
  handbook: _angular_core.WritableSignal<HandbookDetailData>;
5381
- constructor(modalController: ModalController);
5382
5216
  ngOnInit(): void;
5383
5217
  /**
5384
5218
  * Split handbook items to enforce content structure rules:
@@ -5394,17 +5228,9 @@ declare class DsMobileHandbookDetailModalComponent implements OnInit {
5394
5228
  */
5395
5229
  getDisplayItems(): HandbookItem[];
5396
5230
  /**
5397
- * Handle contact click - shows bottom sheet with call and copy actions
5398
- */
5399
- handleContactClick(contact: ContactItem): Promise<void>;
5400
- /**
5401
- * Handle the selected contact action
5402
- */
5403
- private handleContactAction;
5404
- /**
5405
- * Fallback method for copying text to clipboard (for older browsers/webviews)
5231
+ * Handle contact click
5406
5232
  */
5407
- private fallbackCopyToClipboard;
5233
+ handleContactClick(contact: ContactItem): void;
5408
5234
  /**
5409
5235
  * Handle attachment click
5410
5236
  */
@@ -5763,45 +5589,6 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
5763
5589
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileFabComponent, "ds-mobile-fab", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "fabClick": "fabClick"; }, never, never, true, never>;
5764
5590
  }
5765
5591
 
5766
- type AppIconSize = 'sm' | 'md' | 'lg' | 'xl';
5767
- /**
5768
- * DsAppIconComponent
5769
- *
5770
- * Displays the organization's logomark styled as an app icon with rounded corners
5771
- * and shadow. The logomark fill color adapts to the background.
5772
- * Perfect for sign-in pages, splash screens, etc.
5773
- *
5774
- * Uses percentage-based padding and border-radius for perfect proportional scaling.
5775
- *
5776
- * @example
5777
- * Sign-in page (large):
5778
- * ```html
5779
- * <ds-app-icon size="xl" />
5780
- * ```
5781
- *
5782
- * Settings preview (small):
5783
- * ```html
5784
- * <ds-app-icon size="sm" />
5785
- * ```
5786
- */
5787
- declare class DsAppIconComponent {
5788
- whitelabelService: WhitelabelService;
5789
- /**
5790
- * Size of the app icon
5791
- * - sm: 16x16px (padding: 2.4px, radius: 3.2px)
5792
- * - md: 32x32px (padding: 4.8px, radius: 6.4px)
5793
- * - lg: 48x48px (padding: 7.2px, radius: 9.6px)
5794
- * - xl: 64x64px (padding: 9.6px, radius: 12.8px)
5795
- */
5796
- size: AppIconSize;
5797
- /**
5798
- * Computed CSS class for size variant
5799
- */
5800
- sizeClass: _angular_core.Signal<string>;
5801
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAppIconComponent, never>;
5802
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsAppIconComponent, "ds-app-icon", never, { "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
5803
- }
5804
-
5805
5592
  type AvatarType = 'initials' | 'photo' | 'icon';
5806
5593
  type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
5807
5594
  type BadgePosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
@@ -5831,50 +5618,10 @@ declare class DsAvatarWithBadgeComponent {
5831
5618
  showBadge: boolean;
5832
5619
  badgePosition: BadgePosition;
5833
5620
  badgeClasses: _angular_core.Signal<string>;
5834
- /**
5835
- * Computed badge icon size that scales with avatar size
5836
- * Maps avatar sizes to appropriate app icon sizes
5837
- */
5838
- badgeIconSize: _angular_core.Signal<AppIconSize>;
5839
5621
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAvatarWithBadgeComponent, never>;
5840
5622
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsAvatarWithBadgeComponent, "ds-avatar-with-badge", never, { "type": { "alias": "type"; "required": false; }; "size": { "alias": "size"; "required": false; }; "initials": { "alias": "initials"; "required": false; }; "src": { "alias": "src"; "required": false; }; "iconName": { "alias": "iconName"; "required": false; }; "showBadge": { "alias": "showBadge"; "required": false; }; "badgePosition": { "alias": "badgePosition"; "required": false; }; }, {}, never, never, true, never>;
5841
5623
  }
5842
5624
 
5843
- type LogoVariant = 'full' | 'mark';
5844
- type LogoSize = 'sm' | 'md' | 'lg' | 'xl';
5845
- /**
5846
- * DsLogoComponent
5847
- *
5848
- * Displays the whitelabeled logo or logomark based on current configuration.
5849
- * Automatically pulls logo assets from WhitelabelService.
5850
- *
5851
- * @example
5852
- * Full logo in header:
5853
- * ```html
5854
- * <ds-logo variant="full" size="md" />
5855
- * ```
5856
- *
5857
- * Logomark for compact spaces:
5858
- * ```html
5859
- * <ds-logo variant="mark" size="sm" />
5860
- * ```
5861
- */
5862
- declare class DsLogoComponent {
5863
- whitelabelService: WhitelabelService;
5864
- variant: LogoVariant;
5865
- size: LogoSize;
5866
- customHeight?: number;
5867
- customWidth?: number;
5868
- get logoSrc(): string;
5869
- get logoAlt(): string;
5870
- /**
5871
- * Priority: customHeight input > whitelabel config logoHeight > default 32px
5872
- */
5873
- get effectiveHeight(): number;
5874
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsLogoComponent, never>;
5875
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsLogoComponent, "ds-logo", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "customHeight": { "alias": "customHeight"; "required": false; }; "customWidth": { "alias": "customWidth"; "required": false; }; }, {}, never, never, true, never>;
5876
- }
5877
-
5878
5625
  /**
5879
5626
  * DsMobileEmptyStateComponent
5880
5627
  *
@@ -5891,7 +5638,7 @@ declare class DsLogoComponent {
5891
5638
  * ```html
5892
5639
  * <!-- With image -->
5893
5640
  * <ds-mobile-empty-state
5894
- * [imageSrc]="'/Assets/empty-state-inquiry.svg'"
5641
+ * [imageSrc]="'/Assets/Empty state-chat.png'"
5895
5642
  * [imageAlt]="'No messages'"
5896
5643
  * [title]="'Ingen beskeder endnu'"
5897
5644
  * [description]="'Start samtalen ved at sende en besked'">
@@ -5925,201 +5672,6 @@ declare class DsMobileEmptyStateComponent {
5925
5672
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileEmptyStateComponent, "ds-mobile-empty-state", never, { "imageSrc": { "alias": "imageSrc"; "required": false; "isSignal": true; }; "imageAlt": { "alias": "imageAlt"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5926
5673
  }
5927
5674
 
5928
- /**
5929
- * DsMobileOfflineBannerComponent
5930
- *
5931
- * A compact banner component to indicate offline status.
5932
- * Designed to be used in the [offline-indicator] slot of page components.
5933
- *
5934
- * Features:
5935
- * - Amber/yellow warning styling
5936
- * - WiFi off icon
5937
- * - Customizable message
5938
- * - Compact, non-intrusive design
5939
- * - Smooth slide-in animation
5940
- *
5941
- * @example
5942
- * ```html
5943
- * <ds-mobile-page-main title="Community">
5944
- * <ds-mobile-offline-banner
5945
- * offline-indicator
5946
- * *ngIf="pageComponent.isOffline()">
5947
- * </ds-mobile-offline-banner>
5948
- *
5949
- * <!-- Page content -->
5950
- * </ds-mobile-page-main>
5951
- * ```
5952
- */
5953
- declare class DsMobileOfflineBannerComponent {
5954
- /**
5955
- * Icon to display (default: WiFi off icon)
5956
- */
5957
- icon: _angular_core.InputSignal<string>;
5958
- /**
5959
- * Title text for the banner
5960
- */
5961
- title: _angular_core.InputSignal<string>;
5962
- /**
5963
- * Optional secondary message
5964
- */
5965
- message: _angular_core.InputSignal<string>;
5966
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileOfflineBannerComponent, never>;
5967
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileOfflineBannerComponent, "ds-mobile-offline-banner", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5968
- }
5969
-
5970
- /**
5971
- * DsMobileIllustrationComponent
5972
- *
5973
- * A component that displays illustrations with dynamic whitelabel color adaptation.
5974
- * Inlines SVG and uses CSS variables to adapt colors to your theme.
5975
- *
5976
- * **Features:**
5977
- * - Predefined variants (post, inquiry) for common empty states
5978
- * - Automatic color adaptation using CSS variables
5979
- * - Preserves all SVG details (textures, filters, gradients, shadows)
5980
- * - White radial gradient overlay for depth effect
5981
- * - Configurable size
5982
- *
5983
- * **Color Adaptation:**
5984
- * The SVGs use the `--color-accent` CSS variable for the main page colors.
5985
- * All texture details, shadows, and effects are preserved.
5986
- *
5987
- * @example
5988
- * ```html
5989
- * <!-- Using predefined variant -->
5990
- * <ds-mobile-illustration variant="post" />
5991
- *
5992
- * <!-- Using predefined variant with custom size -->
5993
- * <ds-mobile-illustration variant="inquiry" size="150px" />
5994
- * ```
5995
- */
5996
- declare class DsMobileIllustrationComponent {
5997
- private sanitizer;
5998
- /**
5999
- * Predefined illustration variant
6000
- * Available variants: 'post', 'inquiry'
6001
- */
6002
- variant: _angular_core.InputSignal<"post" | "inquiry">;
6003
- /**
6004
- * Illustration size (width and height)
6005
- * @default '120px'
6006
- */
6007
- size: _angular_core.InputSignal<string>;
6008
- constructor(sanitizer: DomSanitizer);
6009
- /**
6010
- * Inline SVG content for each variant
6011
- */
6012
- private svgMap;
6013
- /**
6014
- * Computed SVG content - sanitized for security
6015
- */
6016
- svgContent: _angular_core.Signal<SafeHtml>;
6017
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileIllustrationComponent, never>;
6018
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileIllustrationComponent, "ds-mobile-illustration", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6019
- }
6020
-
6021
- /**
6022
- * DsMobilePropertyBannerComponent
6023
- *
6024
- * Compact banner displaying property photo and address.
6025
- * Designed for use in page headers to show current property context.
6026
- *
6027
- * @example
6028
- * ```html
6029
- * <ds-mobile-property-banner
6030
- * address="Toftegårds Allé 5A, 2. tv."
6031
- * photoUrl="/Assets/building.jpg">
6032
- * </ds-mobile-property-banner>
6033
- * ```
6034
- */
6035
- declare class DsMobilePropertyBannerComponent {
6036
- /**
6037
- * Property address text
6038
- */
6039
- address: _angular_core.InputSignal<string>;
6040
- /**
6041
- * URL to property photo
6042
- */
6043
- photoUrl: _angular_core.InputSignal<string>;
6044
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePropertyBannerComponent, never>;
6045
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobilePropertyBannerComponent, "ds-mobile-property-banner", never, { "address": { "alias": "address"; "required": true; "isSignal": true; }; "photoUrl": { "alias": "photoUrl"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
6046
- }
6047
-
6048
- /**
6049
- * DsMobileSwiperComponent
6050
- *
6051
- * A reusable swiper/carousel component with configurable child width and spacing.
6052
- *
6053
- * Features:
6054
- * - First slide is left-aligned
6055
- * - Middle slides are centered when active
6056
- * - Last slide is right-aligned
6057
- * - Configurable slide width and gap
6058
- * - Content projection via ng-content
6059
- *
6060
- * Usage:
6061
- * ```html
6062
- * <ds-mobile-swiper [slideWidth]="'75vw'" [gap]="16">
6063
- * <div class="swiper-slide">Slide 1</div>
6064
- * <div class="swiper-slide">Slide 2</div>
6065
- * <div class="swiper-slide">Slide 3</div>
6066
- * </ds-mobile-swiper>
6067
- * ```
6068
- */
6069
- declare class DsMobileSwiperComponent implements AfterViewInit, OnDestroy {
6070
- private elementRef;
6071
- /**
6072
- * Width of each slide (e.g., '75vw', '300px', '80%')
6073
- */
6074
- slideWidth: _angular_core.InputSignal<string>;
6075
- /**
6076
- * Gap between slides in pixels
6077
- */
6078
- gap: _angular_core.InputSignal<number>;
6079
- /**
6080
- * Enable pagination dots
6081
- */
6082
- pagination: _angular_core.InputSignal<boolean>;
6083
- /**
6084
- * Enable auto height - container adapts to active slide's height
6085
- */
6086
- autoHeight: _angular_core.InputSignal<boolean>;
6087
- /**
6088
- * Enable progressive opacity based on slide position
6089
- * Slides fade in/out smoothly as they move toward/away from center
6090
- */
6091
- progressiveOpacity: _angular_core.InputSignal<boolean>;
6092
- /**
6093
- * Enable progressive scale based on slide position
6094
- * Slides scale down smoothly as they move away from center
6095
- */
6096
- progressiveScale: _angular_core.InputSignal<boolean>;
6097
- swiperContainer: ElementRef;
6098
- private swiperInstance;
6099
- constructor(elementRef: ElementRef);
6100
- ngAfterViewInit(): void;
6101
- private initializeSwiper;
6102
- /**
6103
- * Navigate to previous slide
6104
- */
6105
- slidePrev(): void;
6106
- /**
6107
- * Navigate to next slide
6108
- */
6109
- slideNext(): void;
6110
- /**
6111
- * Check if at the beginning
6112
- */
6113
- isBeginning(): boolean;
6114
- /**
6115
- * Check if at the end
6116
- */
6117
- isEnd(): boolean;
6118
- ngOnDestroy(): void;
6119
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSwiperComponent, never>;
6120
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileSwiperComponent, "ds-mobile-swiper", never, { "slideWidth": { "alias": "slideWidth"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": false; "isSignal": true; }; "autoHeight": { "alias": "autoHeight"; "required": false; "isSignal": true; }; "progressiveOpacity": { "alias": "progressiveOpacity"; "required": false; "isSignal": true; }; "progressiveScale": { "alias": "progressiveScale"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
6121
- }
6122
-
6123
5675
  /**
6124
5676
  * User service for managing current user data globally
6125
5677
  */
@@ -6132,8 +5684,6 @@ declare class UserService {
6132
5684
  readonly avatarType: _angular_core.Signal<"initials" | "photo" | "icon">;
6133
5685
  readonly avatarSrc: _angular_core.Signal<string>;
6134
5686
  readonly profileMenuItems: _angular_core.Signal<ActionGroup[] | undefined>;
6135
- private profileActionSelectedSubject;
6136
- readonly profileActionSelected$: rxjs.Observable<ActionResult>;
6137
5687
  /**
6138
5688
  * Update avatar configuration
6139
5689
  */
@@ -6146,10 +5696,6 @@ declare class UserService {
6146
5696
  * if they don't receive profileMenuItems as an input.
6147
5697
  */
6148
5698
  setProfileMenuItems(items: ActionGroup[]): void;
6149
- /**
6150
- * Notify subscribers that a profile action was selected
6151
- */
6152
- notifyProfileAction(result: ActionResult): void;
6153
5699
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserService, never>;
6154
5700
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserService>;
6155
5701
  }
@@ -6262,10 +5808,7 @@ declare class MobileCommunityPageComponent {
6262
5808
  private postModal;
6263
5809
  userService: UserService;
6264
5810
  private postsService;
6265
- pageComponent: DsMobilePageMainComponent;
6266
- pinnedSwiper?: DsMobileSwiperComponent;
6267
5811
  allPosts: _angular_core.Signal<Post[]>;
6268
- pinnedPosts: _angular_core.Signal<Post[]>;
6269
5812
  hasAnyPosts: _angular_core.Signal<boolean>;
6270
5813
  hasMorePosts: _angular_core.Signal<boolean>;
6271
5814
  constructor(router: Router, route: ActivatedRoute, bottomSheet: DsMobileBottomSheetService, lightbox: DsMobileLightboxService, postModal: DsMobilePostDetailModalService, userService: UserService, postsService: PostsService);
@@ -6291,29 +5834,12 @@ declare class MobileCommunityPageComponent {
6291
5834
  * Handle long press on a post to show action sheet
6292
5835
  */
6293
5836
  handlePostLongPress(postId: string, isOwnPost: boolean): Promise<void>;
6294
- /**
6295
- * Navigate to previous slide in pinned posts
6296
- */
6297
- slidePrev(): void;
6298
- /**
6299
- * Navigate to next slide in pinned posts
6300
- */
6301
- slideNext(): void;
6302
- /**
6303
- * Check if currently on first slide
6304
- */
6305
- isFirstSlide(): boolean;
6306
- /**
6307
- * Check if currently on last slide
6308
- */
6309
- isLastSlide(): boolean;
6310
5837
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileCommunityPageComponent, never>;
6311
5838
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileCommunityPageComponent, "app-mobile-community-page", never, {}, {}, never, never, true, never>;
6312
5839
  }
6313
5840
 
6314
5841
  declare class MobileHandbookPageComponent {
6315
5842
  userService: UserService;
6316
- pageComponent: DsMobilePageMainComponent;
6317
5843
  utilitiesItems: HandbookItem[];
6318
5844
  sikkerhedsudstyrItems: HandbookItem[];
6319
5845
  serviceContractsItems: HandbookItem[];
@@ -6325,26 +5851,13 @@ declare class MobileHandbookPageComponent {
6325
5851
  }
6326
5852
 
6327
5853
  declare class MobileHomePageComponent {
6328
- private router;
5854
+ private navCtrl;
6329
5855
  userService: UserService;
6330
- private postsService;
6331
- private postModal;
6332
- pageComponent: DsMobilePageMainComponent;
6333
- recentPosts: _angular_core.Signal<_propbinder_mobile_design.Post[]>;
6334
- private allInquiries;
6335
- openInquiries: _angular_core.Signal<{
6336
- id: string;
6337
- title: string;
6338
- description: string;
6339
- status: "open";
6340
- timestamp: string;
6341
- }[]>;
6342
- constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService);
5856
+ constructor(navCtrl: NavController, userService: UserService);
6343
5857
  handleRefresh(event: any): void;
6344
- openPost(postId: string, focusComment?: boolean): Promise<void>;
6345
- openInquiryDetail(inquiryId: string): void;
6346
- navigateToCommunity(): void;
6347
- navigateToInquiries(): void;
5858
+ handlePostClick(): void;
5859
+ handleContactClick(contactType: string): void;
5860
+ handleFileClick(fileType: string): void;
6348
5861
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHomePageComponent, never>;
6349
5862
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHomePageComponent, "app-home-page", never, {}, {}, never, never, true, never>;
6350
5863
  }
@@ -6361,7 +5874,6 @@ declare class MobileInquiriesPageComponent {
6361
5874
  userService: UserService;
6362
5875
  private navCtrl;
6363
5876
  private newInquiryModal;
6364
- pageComponent: DsMobilePageMainComponent;
6365
5877
  constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
6366
5878
  filterStatus: _angular_core.WritableSignal<"open" | "closed" | "all">;
6367
5879
  tabItems: InlineTabItem[];
@@ -6399,7 +5911,6 @@ declare class MobileInquiryDetailPageComponent {
6399
5911
  messageThreads: MessageThread[];
6400
5912
  unreadMessagesCount: _angular_core.Signal<number>;
6401
5913
  photos: LightboxImage[];
6402
- get photoUrls(): string[];
6403
5914
  constructor(userService: UserService, lightbox: DsMobileLightboxService, chatModal: DsMobileChatModalService);
6404
5915
  setActiveTab(tabId: string): void;
6405
5916
  goBack(): void;
@@ -6445,9 +5956,6 @@ declare class MobileTabsExampleComponent implements OnInit {
6445
5956
  * Handle profile menu action selection.
6446
5957
  * The tab bar component handles the UI (opening/closing menu),
6447
5958
  * this method handles the business logic.
6448
- *
6449
- * NOTE: Desktop only - called directly from tab bar.
6450
- * Mobile actions are handled globally in AppComponent via UserService.
6451
5959
  */
6452
5960
  handleProfileAction(result: ActionResult): void;
6453
5961
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileTabsExampleComponent, never>;
@@ -6507,127 +6015,40 @@ declare class MobilePostDetailPageComponent {
6507
6015
  *
6508
6016
  * Sign-in page with email authentication.
6509
6017
  * Features logomark, decorative city background, and form validation.
6510
- * Auto-focuses email input on iOS to trigger keyboard.
6511
6018
  */
6512
- declare class SignInPageComponent implements AfterViewInit, OnDestroy {
6513
- emailInputRef?: ElementRef;
6514
- whitelabelService: WhitelabelService;
6019
+ declare class SignInPageComponent {
6515
6020
  email: string;
6516
6021
  emailError: _angular_core.WritableSignal<boolean>;
6517
6022
  isSubmitting: _angular_core.WritableSignal<boolean>;
6518
6023
  emailSent: _angular_core.WritableSignal<boolean>;
6519
- ngAfterViewInit(): void;
6520
- /**
6521
- * Show the keyboard on mobile platforms
6522
- */
6523
- private showKeyboard;
6524
6024
  handleSubmit(): void;
6525
6025
  handleBackToLogin(): void;
6526
- /**
6527
- * Update status bar for sign-in page background
6528
- * Uses the sign-in background color to determine appropriate status bar style
6529
- */
6530
- private updateSignInStatusBar;
6531
- /**
6532
- * Restore status bar to header color when leaving sign-in page
6533
- */
6534
- ngOnDestroy(): void;
6535
- /**
6536
- * Restore status bar to use header surface color
6537
- */
6538
- private restoreHeaderStatusBar;
6539
6026
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignInPageComponent, never>;
6540
6027
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInPageComponent, "app-sign-in", never, {}, {}, never, never, true, never>;
6541
6028
  }
6542
6029
 
6543
6030
  /**
6544
- * Whitelabel Demo Modal Component
6031
+ * Whitelabel Demo Page
6545
6032
  *
6546
6033
  * Demonstrates the whitelabeling system with theme selection, brand colors, and logo previews.
6547
- * Opens as a full-screen modal similar to post details.
6548
6034
  */
6549
- declare class WhitelabelDemoModalComponent implements OnInit {
6035
+ declare class WhitelabelDemoPage implements OnInit {
6550
6036
  whitelabelService: WhitelabelService;
6551
- private modalController;
6552
6037
  currentTheme: string;
6553
- customAppIconSurface: string;
6554
- customAppIconContent: string;
6555
- customAccent: string;
6556
- customOnAccent: string;
6557
- customHeaderSurface: string;
6558
- customHeaderContent: string;
6559
- customHeaderAccent: string;
6560
- customOnHeaderAccent: string;
6561
- customSignInBgSolid: string;
6562
- customSignInBgGradientStart: string;
6563
- customSignInBgGradientEnd: string;
6564
- customSignInContentColor: string;
6038
+ customPrimarySurface: string;
6039
+ customPrimaryContent: string;
6040
+ customSecondarySurface: string;
6041
+ customSecondaryContent: string;
6565
6042
  ngOnInit(): void;
6566
- /**
6567
- * Detect the current active theme based on colors
6568
- */
6569
- private detectCurrentTheme;
6570
- /**
6571
- * Close the modal
6572
- */
6573
- close(): void;
6574
6043
  applyDefaultTheme(): void;
6575
6044
  applyCejTheme(): void;
6576
6045
  applyPkaTheme(): void;
6577
6046
  applyClaveTheme(): void;
6578
6047
  applyFreedomTheme(): void;
6579
6048
  applyCustomColors(): void;
6580
- toggleCityIllustration(): void;
6581
- updateSignInBgType(type: 'solid' | 'gradient'): void;
6582
- updateLogoSize(size: 'sm' | 'md' | 'lg' | 'xl'): void;
6583
- applySignInBackground(): void;
6584
- applySignInContentColor(): void;
6585
- private updateSignInBgInputs;
6586
- private updateSignInContentColorInput;
6587
6049
  private updateCustomColorInputs;
6588
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelDemoModalComponent, never>;
6589
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WhitelabelDemoModalComponent, "ds-whitelabel-demo-modal", never, {}, {}, never, never, true, never>;
6590
- }
6591
-
6592
- /**
6593
- * WhitelabelDemoModalService
6594
- *
6595
- * Service for displaying the whitelabel demo in a full-screen modal.
6596
- * Built on Ionic's modal system with native gestures and animations.
6597
- *
6598
- * @example
6599
- * ```typescript
6600
- * constructor(private whitelabelModal: WhitelabelDemoModalService) {}
6601
- *
6602
- * async openDemo() {
6603
- * await this.whitelabelModal.open();
6604
- * }
6605
- * ```
6606
- */
6607
- declare class WhitelabelDemoModalService {
6608
- private modalController;
6609
- constructor(modalController: ModalController);
6610
- /**
6611
- * Open the whitelabel demo modal
6612
- *
6613
- * @returns Promise that resolves when the modal is presented
6614
- */
6615
- open(): Promise<void>;
6616
- /**
6617
- * Close the currently open whitelabel demo modal
6618
- *
6619
- * @param data Optional data to pass back when dismissing
6620
- * @returns Promise that resolves when the modal is dismissed
6621
- */
6622
- close(data?: any): Promise<boolean>;
6623
- /**
6624
- * Get the top-most modal if one exists
6625
- *
6626
- * @returns Promise that resolves to the modal element or undefined
6627
- */
6628
- getTop(): Promise<HTMLIonModalElement | undefined>;
6629
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelDemoModalService, never>;
6630
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<WhitelabelDemoModalService>;
6050
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelDemoPage, never>;
6051
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WhitelabelDemoPage, "app-whitelabel-demo", never, {}, {}, never, never, true, never>;
6631
6052
  }
6632
6053
 
6633
6054
  /**
@@ -6652,5 +6073,5 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
6652
6073
  */
6653
6074
  declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
6654
6075
 
6655
- export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileDropdownComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, 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, DsMobileProfileActionsSheetComponent, DsMobilePropertyBannerComponent, DsMobileSectionComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsTextInputComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, SectionHeaderComponent, SignInPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, UserService, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition };
6656
- export type { ActionGroup, ActionItem, ActionResult, AppIconSize, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, DropdownAlign, DropdownPosition, DsMobileDropdownItem, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, LogoSize, LogoVariant, ModalOptions, NetworkStatus, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, TabConfig, WhitelabelConfig };
6076
+ export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileContentSectionComponent, DsMobileDropdownComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFileAttachmentComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileLongPressDirective, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobileProfileActionsSheetComponent, DsMobileSwiperComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsTextInputComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, SectionHeaderComponent, SignInPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, UserService, WhitelabelDemoPage, WhitelabelService, customBackTransition, customPageTransition };
6077
+ export type { ActionGroup, ActionItem, ActionResult, AttachmentData, AttachmentFileType, AttachmentItem, AvatarSize, AvatarType, BadgePosition, BottomSheetOptions, ChatAttachment, ChatMessage, ChatModalData, ChatParticipant, Comment, ActionResult as CommentActionResult, CommentData, ContactItem, ContentWidth, DropdownAlign, DropdownPosition, DsMobileDropdownItem, HandbookDetailData, HandbookItem, InlineTabItem, InquiryPhoto, Language, LightboxAuthor, LightboxImage, LightboxImageOptions, LightboxMediaFile, LightboxMediaType, LightboxOptions, LightboxPdf, LightboxPdfOptions, LogoSize, LogoVariant, ModalOptions, NewInquiryData, NewInquiryModalOptions, Post, ActionResult as PostActionResult, PostDetailData, TabConfig, WhitelabelConfig };