@propbinder/mobile-design 0.2.16 → 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
  *
@@ -1002,128 +745,6 @@ declare class ContentRowComponent {
1002
745
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentRowComponent, "content-row", never, {}, {}, never, ["*"], true, never>;
1003
746
  }
1004
747
 
1005
- /**
1006
- * DsMobileSectionComponent
1007
- *
1008
- * Universal section component for mobile pages, modals, and content containers.
1009
- * Provides consistent layout with optional headlines, action links, flexible padding, and borders.
1010
- *
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
1017
- *
1018
- * **Usage Patterns:**
1019
- *
1020
- * @example
1021
- * ```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>
1067
- * ```
1068
- */
1069
- declare class DsMobileSectionComponent {
1070
- /**
1071
- * Section headline text
1072
- * @default ''
1073
- */
1074
- headline: _angular_core.InputSignal<string>;
1075
- /**
1076
- * Optional icon to display before headline
1077
- * @default ''
1078
- */
1079
- icon: _angular_core.InputSignal<string>;
1080
- /**
1081
- * Link text (e.g., "See all", "View more")
1082
- * When provided, displays a clickable link in the section header
1083
- * @default ''
1084
- */
1085
- linkText: _angular_core.InputSignal<string>;
1086
- /**
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 ''
1091
- */
1092
- padding: _angular_core.InputSignal<string>;
1093
- /**
1094
- * Gap between section header and content
1095
- * Accepts any valid CSS gap value
1096
- * @default '12px'
1097
- */
1098
- gap: _angular_core.InputSignal<string>;
1099
- /**
1100
- * Gap between child elements within section-content
1101
- * Accepts any valid CSS gap value
1102
- * @default '12px'
1103
- */
1104
- contentGap: _angular_core.InputSignal<string>;
1105
- /**
1106
- * Whether to show bottom border
1107
- * @default true
1108
- */
1109
- showBorder: _angular_core.InputSignal<boolean>;
1110
- /**
1111
- * CSS overflow property for the section
1112
- * @default 'visible'
1113
- */
1114
- overflow: _angular_core.InputSignal<string>;
1115
- /**
1116
- * Emitted when section link is clicked
1117
- */
1118
- linkClick: _angular_core.OutputEmitterRef<void>;
1119
- /**
1120
- * Handle link click event
1121
- */
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
748
  /**
1128
749
  * DsMobileHeaderContentComponent
1129
750
  *
@@ -1222,30 +843,289 @@ declare class TileValueComponent {
1222
843
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileValueComponent, "tile-value", never, {}, {}, never, ["*"], true, never>;
1223
844
  }
1224
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
+ }
1225
861
  /**
1226
- * DsMobileCommentComponent
862
+ * WhitelabelService
1227
863
  *
1228
- * Individual comment component for post discussions.
1229
- * Displays user comments with avatar, content, and like action.
864
+ * Manages whitelabel configuration including logos and brand colors.
865
+ * Automatically updates CSS custom properties when colors change.
1230
866
  *
1231
867
  * @example
1232
- * ```html
1233
- * <ds-mobile-comment
1234
- * [authorName]="'John Doe'"
1235
- * [authorRole]="'Tenant'"
1236
- * [timestamp]="'1h ago'"
1237
- * [avatarInitials]="'JD'"
1238
- * [content]="'Great post!'">
1239
- * </ds-mobile-comment>
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');
1240
882
  * ```
1241
883
  */
1242
- declare class DsMobileCommentComponent {
1243
- private platformId;
1244
- /**
1245
- * Detect if viewport is desktop size
1246
- * Use viewport width for breakpoint detection (show button on tablet and above)
1247
- */
1248
- isDesktop: _angular_core.WritableSignal<boolean>;
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();
898
+ /**
899
+ * Initialize whitelabel configuration
900
+ * Call this early in app initialization (app.config.ts or app.component.ts)
901
+ */
902
+ initialize(config: Partial<WhitelabelConfig>): void;
903
+ /**
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.)
908
+ */
909
+ loadFromApi(organizationId?: string): Promise<void>;
910
+ /**
911
+ * Update config dynamically (e.g., when user switches organizations)
912
+ */
913
+ updateConfig(updates: Partial<WhitelabelConfig>): void;
914
+ /**
915
+ * Update only the brand colors
916
+ */
917
+ updateColors(colors: {
918
+ primarySurface?: string;
919
+ primaryContent?: string;
920
+ secondarySurface?: string;
921
+ secondaryContent?: string;
922
+ }): void;
923
+ /**
924
+ * Reset to default configuration
925
+ */
926
+ resetToDefault(): void;
927
+ /**
928
+ * Convert hex color to RGB values
929
+ */
930
+ private hexToRgb;
931
+ /**
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%
943
+ */
944
+ private generateHoverColor;
945
+ /**
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
951
+ */
952
+ private generateActiveColor;
953
+ /**
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
957
+ */
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>;
967
+ }
968
+
969
+ type LogoVariant = 'full' | 'mark';
970
+ type LogoSize = 'sm' | 'md' | 'lg' | 'xl';
971
+ /**
972
+ * DsLogoComponent
973
+ *
974
+ * Displays the whitelabeled logo or logomark based on current configuration.
975
+ * Automatically pulls logo assets from WhitelabelService.
976
+ *
977
+ * @example
978
+ * Full logo in header:
979
+ * ```html
980
+ * <ds-logo variant="full" size="md" />
981
+ * ```
982
+ *
983
+ * Logomark for compact spaces:
984
+ * ```html
985
+ * <ds-logo variant="mark" size="sm" />
986
+ * ```
987
+ */
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>;
1002
+ }
1003
+
1004
+ /**
1005
+ * DsMobileSystemMessageBannerComponent
1006
+ *
1007
+ * Full-width centered banner component for displaying system messages in chat conversations.
1008
+ * Uses the same text styling as message bubbles for consistency.
1009
+ *
1010
+ * Features:
1011
+ * - Full-width centered layout
1012
+ * - Subtle background with theming support
1013
+ * - Same typography as message bubbles
1014
+ * - Optional icon support
1015
+ *
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
+ * ```
1035
+ */
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>;
1053
+ }
1054
+
1055
+ /**
1056
+ * DsMobileFileAttachmentComponent
1057
+ *
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
+ * ```
1072
+ */
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>;
1103
+ }
1104
+
1105
+ /**
1106
+ * DsMobileCommentComponent
1107
+ *
1108
+ * Individual comment component for post discussions.
1109
+ * Displays user comments with avatar, content, and like action.
1110
+ *
1111
+ * @example
1112
+ * ```html
1113
+ * <ds-mobile-comment
1114
+ * [authorName]="'John Doe'"
1115
+ * [authorRole]="'Tenant'"
1116
+ * [timestamp]="'1h ago'"
1117
+ * [avatarInitials]="'JD'"
1118
+ * [content]="'Great post!'">
1119
+ * </ds-mobile-comment>
1120
+ * ```
1121
+ */
1122
+ declare class DsMobileCommentComponent {
1123
+ private platformId;
1124
+ /**
1125
+ * Detect if viewport is desktop size
1126
+ * Use viewport width for breakpoint detection (show button on tablet and above)
1127
+ */
1128
+ isDesktop: _angular_core.WritableSignal<boolean>;
1249
1129
  constructor();
1250
1130
  /**
1251
1131
  * Author's display name
@@ -2405,27 +2285,68 @@ declare class DsMobileListItemStaticComponent {
2405
2285
  }
2406
2286
 
2407
2287
  /**
2408
- * DsMobileInteractiveListItemPostComponent
2288
+ * DsMobileActionListItemComponent
2409
2289
  *
2410
- * Specialized interactive list item for displaying social media posts.
2411
- * Built on top of ds-mobile-interactive-list-item base component.
2412
- * Displays user posts with avatar, content, media, and action buttons.
2413
- * Follows Threads-inspired design with clean layout and interactions.
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)
2414
2295
  *
2415
2296
  * @example
2416
2297
  * ```html
2417
- * <ds-mobile-interactive-list-item-post
2418
- * [authorName]="'John Doe'"
2419
- * [authorRole]="'Tenant'"
2420
- * [timestamp]="'2h ago'"
2421
- * [avatarInitials]="'JD'"
2422
- * [clickable]="true"
2423
- * [enableLongPress]="true"
2424
- * (postClick)="openPost()">
2425
- *
2426
- * <post-content>
2427
- * <post-text>This is a sample post...</post-text>
2428
- * </post-content>
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
+
2329
+ /**
2330
+ * DsMobileInteractiveListItemPostComponent
2331
+ *
2332
+ * Specialized interactive list item for displaying social media posts.
2333
+ * Built on top of ds-mobile-interactive-list-item base component.
2334
+ * Displays user posts with avatar, content, media, and action buttons.
2335
+ * Follows Threads-inspired design with clean layout and interactions.
2336
+ *
2337
+ * @example
2338
+ * ```html
2339
+ * <ds-mobile-interactive-list-item-post
2340
+ * [authorName]="'John Doe'"
2341
+ * [authorRole]="'Tenant'"
2342
+ * [timestamp]="'2h ago'"
2343
+ * [avatarInitials]="'JD'"
2344
+ * [clickable]="true"
2345
+ * (postClick)="openPost()">
2346
+ *
2347
+ * <post-content>
2348
+ * <post-text>This is a sample post...</post-text>
2349
+ * </post-content>
2429
2350
  *
2430
2351
  * <post-actions>
2431
2352
  * <action-like [active]="true" count="42" />
@@ -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
  */
@@ -3036,7 +2942,6 @@ declare class DsMobileTabsComponent implements OnInit {
3036
2942
  * ```
3037
2943
  */
3038
2944
  declare class DsMobileSwiperComponent implements AfterViewInit, OnDestroy {
3039
- private elementRef;
3040
2945
  /**
3041
2946
  * Width of each slide (e.g., '75vw', '300px', '80%')
3042
2947
  */
@@ -3045,99 +2950,13 @@ declare class DsMobileSwiperComponent implements AfterViewInit, OnDestroy {
3045
2950
  * Gap between slides in pixels
3046
2951
  */
3047
2952
  gap: _angular_core.InputSignal<number>;
3048
- /**
3049
- * Enable pagination dots
3050
- */
3051
- pagination: _angular_core.InputSignal<boolean>;
3052
- /**
3053
- * Enable auto height - container adapts to active slide's height
3054
- */
3055
- autoHeight: _angular_core.InputSignal<boolean>;
3056
- /**
3057
- * Enable progressive opacity based on slide position
3058
- * Slides fade in/out smoothly as they move toward/away from center
3059
- */
3060
- progressiveOpacity: _angular_core.InputSignal<boolean>;
3061
- /**
3062
- * Enable progressive scale based on slide position
3063
- * Slides scale down smoothly as they move away from center
3064
- */
3065
- progressiveScale: _angular_core.InputSignal<boolean>;
3066
2953
  swiperContainer: ElementRef;
3067
2954
  private swiperInstance;
3068
- constructor(elementRef: ElementRef);
3069
2955
  ngAfterViewInit(): void;
3070
2956
  private initializeSwiper;
3071
- /**
3072
- * Navigate to previous slide
3073
- */
3074
- slidePrev(): void;
3075
- /**
3076
- * Navigate to next slide
3077
- */
3078
- slideNext(): void;
3079
- /**
3080
- * Check if at the beginning
3081
- */
3082
- isBeginning(): boolean;
3083
- /**
3084
- * Check if at the end
3085
- */
3086
- isEnd(): boolean;
3087
2957
  ngOnDestroy(): void;
3088
2958
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSwiperComponent, never>;
3089
- 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>;
3090
- }
3091
-
3092
- /**
3093
- * DsMobileSystemMessageBannerComponent
3094
- *
3095
- * Full-width centered banner component for displaying system messages in chat conversations.
3096
- * Uses the same text styling as message bubbles for consistency.
3097
- *
3098
- * Features:
3099
- * - Full-width centered layout
3100
- * - Subtle background with theming support
3101
- * - Same typography as message bubbles
3102
- * - Optional icon support
3103
- *
3104
- * Common use cases:
3105
- * - Inquiry status updates ("Your inquiry has been assigned to...")
3106
- * - System notifications ("This inquiry is marked as resolved")
3107
- * - Auto-replies ("We aim to respond within 24 hours...")
3108
- * - Time/date separators
3109
- *
3110
- * @example
3111
- * ```html
3112
- * <!-- Simple system message -->
3113
- * <ds-mobile-system-message-banner
3114
- * [message]="'Ricki Meihlen har overtaget din henvendelse og vil kontakte dig snart.'">
3115
- * </ds-mobile-system-message-banner>
3116
- *
3117
- * <!-- With icon -->
3118
- * <ds-mobile-system-message-banner
3119
- * [message]="'Vi bestræber os på at svare inden for 24 timer på hverdage.'"
3120
- * [iconName]="'remixInformationLine'">
3121
- * </ds-mobile-system-message-banner>
3122
- * ```
3123
- */
3124
- declare class DsMobileSystemMessageBannerComponent {
3125
- /**
3126
- * System message text to display
3127
- */
3128
- message: _angular_core.InputSignal<string>;
3129
- /**
3130
- * Optional icon name (currently using inline SVG for info icon)
3131
- * Can be extended to support full icon library integration
3132
- */
3133
- iconName: _angular_core.InputSignal<string>;
3134
- /**
3135
- * Whether this system message appears directly after a timestamp
3136
- * When true, removes top padding to reduce spacing
3137
- */
3138
- afterTimestamp: _angular_core.InputSignal<boolean>;
3139
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSystemMessageBannerComponent, never>;
3140
- 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>;
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>;
3141
2960
  }
3142
2961
 
3143
2962
  /**
@@ -3618,21 +3437,12 @@ declare class DsMobileLightboxFooterComponent {
3618
3437
  * />
3619
3438
  * ```
3620
3439
  */
3621
- declare class DsMobileInlinePhotoComponent implements OnInit {
3440
+ declare class DsMobileInlinePhotoComponent {
3622
3441
  private lightboxService;
3623
3442
  /**
3624
3443
  * Array of image URLs to display
3625
3444
  */
3626
3445
  images: string[];
3627
- /**
3628
- * Optional array of loading states for each image (by index)
3629
- * If provided, shows loader overlay for images that are still loading
3630
- */
3631
- loadingStates?: boolean[];
3632
- /**
3633
- * Internal signal to track image loading states
3634
- */
3635
- private internalLoadingStates;
3636
3446
  /**
3637
3447
  * Author information (passed to lightbox)
3638
3448
  */
@@ -3649,11 +3459,6 @@ declare class DsMobileInlinePhotoComponent implements OnInit {
3649
3459
  * Remaining images shown in lightbox only
3650
3460
  */
3651
3461
  maxVisible: number;
3652
- /**
3653
- * Whether to use grid layout (true) or flex-wrap layout (false)
3654
- * @default true
3655
- */
3656
- useGrid: boolean;
3657
3462
  /**
3658
3463
  * Event emitted when lightbox is opened
3659
3464
  */
@@ -3662,26 +3467,10 @@ declare class DsMobileInlinePhotoComponent implements OnInit {
3662
3467
  totalImages: number;
3663
3468
  }>;
3664
3469
  constructor(lightboxService: DsMobileLightboxService);
3665
- /**
3666
- * Initialize loading states for all visible images
3667
- */
3668
- ngOnInit(): void;
3669
- /**
3670
- * Handle image load event
3671
- */
3672
- onImageLoad(index: number): void;
3673
- /**
3674
- * Handle image error event
3675
- */
3676
- onImageError(index: number): void;
3677
3470
  /**
3678
3471
  * Get the first N images to display inline
3679
3472
  */
3680
3473
  get visibleImages(): string[];
3681
- /**
3682
- * Check if a specific image is loading
3683
- */
3684
- isImageLoading(index: number): boolean;
3685
3474
  /**
3686
3475
  * Calculate how many images are hidden
3687
3476
  */
@@ -3691,63 +3480,7 @@ declare class DsMobileInlinePhotoComponent implements OnInit {
3691
3480
  */
3692
3481
  openLightbox(index: number, event?: Event): void;
3693
3482
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInlinePhotoComponent, never>;
3694
- 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>;
3695
- }
3696
-
3697
- /**
3698
- * DsMobileLoaderOverlayComponent
3699
- *
3700
- * Reusable loader overlay component that displays a spinner centered over its container.
3701
- * Designed to overlay images or other content during loading states.
3702
- *
3703
- * Features:
3704
- * - Semi-transparent white background overlay
3705
- * - Centered animated spinner
3706
- * - Customizable spinner size
3707
- * - Absolute positioning to cover parent
3708
- * - Accessible with proper z-index stacking
3709
- *
3710
- * @example
3711
- * ```html
3712
- * <!-- Basic usage -->
3713
- * <div style="position: relative;">
3714
- * <img src="image.jpg" alt="Content" />
3715
- * @if (isLoading) {
3716
- * <ds-mobile-loader-overlay />
3717
- * }
3718
- * </div>
3719
- *
3720
- * <!-- With custom spinner size -->
3721
- * <div style="position: relative;">
3722
- * <div class="content">Loading content...</div>
3723
- * <ds-mobile-loader-overlay [spinnerSize]="32" />
3724
- * </div>
3725
- *
3726
- * <!-- Over an image with rounded corners -->
3727
- * <div style="position: relative; border-radius: 12px; overflow: hidden;">
3728
- * <img src="photo.jpg" />
3729
- * <ds-mobile-loader-overlay [borderRadius]="12" />
3730
- * </div>
3731
- * ```
3732
- *
3733
- * @notes
3734
- * - Parent container must have position: relative for the overlay to work correctly
3735
- * - The overlay covers the entire parent element using inset: 0
3736
- * - Spinner animation runs continuously at 0.6s per rotation
3737
- */
3738
- declare class DsMobileLoaderOverlayComponent {
3739
- /**
3740
- * Size of the spinner in pixels
3741
- * @default 24
3742
- */
3743
- spinnerSize: _angular_core.InputSignal<number>;
3744
- /**
3745
- * Border radius of the overlay in pixels (should match parent's border radius)
3746
- * @default 0
3747
- */
3748
- borderRadius: _angular_core.InputSignal<number>;
3749
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileLoaderOverlayComponent, never>;
3750
- 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>;
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>;
3751
3484
  }
3752
3485
 
3753
3486
  /**
@@ -4009,29 +3742,6 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
4009
3742
  * @default false
4010
3743
  */
4011
3744
  hasFixedBottom: _angular_core.InputSignal<boolean>;
4012
- /**
4013
- * Content padding for modal content
4014
- * Controls padding inside .modal-main-content
4015
- * - '0' (default) - No padding, use ds-mobile-section for content organization
4016
- * - '20px' - Legacy padding for content without sections
4017
- * - Any custom CSS padding value
4018
- *
4019
- * @default '0'
4020
- *
4021
- * @example
4022
- * ```html
4023
- * <!-- Default: sections handle padding -->
4024
- * <ds-mobile-modal-base headerTitle="Details">
4025
- * <ds-mobile-section headline="Info">...</ds-mobile-section>
4026
- * </ds-mobile-modal-base>
4027
- *
4028
- * <!-- Legacy: content without sections -->
4029
- * <ds-mobile-modal-base headerTitle="Details" contentPadding="20px">
4030
- * <div>Padded content</div>
4031
- * </ds-mobile-modal-base>
4032
- * ```
4033
- */
4034
- contentPadding: _angular_core.InputSignal<string>;
4035
3745
  /**
4036
3746
  * Emitted when modal is closed
4037
3747
  */
@@ -4073,7 +3783,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
4073
3783
  */
4074
3784
  protected cleanupKeyboardListeners(): void;
4075
3785
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileModalBase, never>;
4076
- 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>;
4077
3787
  }
4078
3788
 
4079
3789
  /**
@@ -4868,7 +4578,7 @@ interface ChatParticipant {
4868
4578
  *
4869
4579
  * Represents the data needed to display a chat conversation.
4870
4580
  *
4871
- * @example
4581
+ * @example
4872
4582
  * ```typescript
4873
4583
  * const chatData: ChatModalData = {
4874
4584
  * participant: {
@@ -5064,7 +4774,7 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
5064
4774
  /**
5065
4775
  * Get file variant for card-inline-file component
5066
4776
  */
5067
- getFileVariant(type: string): 'pdf' | 'doc';
4777
+ getFileVariant(type: string): "pdf" | "doc";
5068
4778
  /**
5069
4779
  * Handle file attachment click
5070
4780
  */
@@ -5493,7 +5203,6 @@ interface ContactItem {
5493
5203
  * This component is typically not used directly - use DsMobileHandbookDetailModalService instead.
5494
5204
  */
5495
5205
  declare class DsMobileHandbookDetailModalComponent implements OnInit {
5496
- private modalController;
5497
5206
  handbookData: HandbookDetailData;
5498
5207
  /**
5499
5208
  * Loading state - when true, shows loading indicator
@@ -5504,7 +5213,6 @@ declare class DsMobileHandbookDetailModalComponent implements OnInit {
5504
5213
  */
5505
5214
  error?: string;
5506
5215
  handbook: _angular_core.WritableSignal<HandbookDetailData>;
5507
- constructor(modalController: ModalController);
5508
5216
  ngOnInit(): void;
5509
5217
  /**
5510
5218
  * Split handbook items to enforce content structure rules:
@@ -5520,17 +5228,9 @@ declare class DsMobileHandbookDetailModalComponent implements OnInit {
5520
5228
  */
5521
5229
  getDisplayItems(): HandbookItem[];
5522
5230
  /**
5523
- * Handle contact click - shows bottom sheet with call and copy actions
5524
- */
5525
- handleContactClick(contact: ContactItem): Promise<void>;
5526
- /**
5527
- * Handle the selected contact action
5528
- */
5529
- private handleContactAction;
5530
- /**
5531
- * Fallback method for copying text to clipboard (for older browsers/webviews)
5231
+ * Handle contact click
5532
5232
  */
5533
- private fallbackCopyToClipboard;
5233
+ handleContactClick(contact: ContactItem): void;
5534
5234
  /**
5535
5235
  * Handle attachment click
5536
5236
  */
@@ -5811,56 +5511,6 @@ declare class DsTextInputComponent implements ControlValueAccessor {
5811
5511
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsTextInputComponent, "ds-text-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "inputmode": { "alias": "inputmode"; "required": false; "isSignal": true; }; "autoClearError": { "alias": "autoClearError"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; "focus": "focus"; "errorCleared": "errorCleared"; }, never, never, true, never>;
5812
5512
  }
5813
5513
 
5814
- /**
5815
- * DsMobileFileAttachmentComponent
5816
- *
5817
- * File attachment display for various document types.
5818
- * Shows file info card with icon, filename, and file size.
5819
- * Supports PDF and generic document formats.
5820
- * Emits click event to open file in viewer.
5821
- *
5822
- * @example
5823
- * ```html
5824
- * <ds-mobile-file-attachment
5825
- * [fileName]="'Document.pdf'"
5826
- * [fileSize]="'1.2 MB'"
5827
- * [variant]="'pdf'"
5828
- * (fileClick)="openFile()">
5829
- * </ds-mobile-file-attachment>
5830
- * ```
5831
- */
5832
- declare class DsMobileFileAttachmentComponent {
5833
- /**
5834
- * File name
5835
- */
5836
- fileName: _angular_core.InputSignal<string>;
5837
- /**
5838
- * File size display (e.g., "1.2 MB")
5839
- */
5840
- fileSize: _angular_core.InputSignal<string>;
5841
- /**
5842
- * File type variant
5843
- * - 'pdf' - PDF document (red icon)
5844
- * - 'doc' - Generic document (blue icon)
5845
- */
5846
- variant: _angular_core.InputSignal<"pdf" | "doc">;
5847
- /**
5848
- * Emits when the file attachment is clicked
5849
- */
5850
- fileClick: _angular_core.OutputEmitterRef<void>;
5851
- /**
5852
- * Get the appropriate icon name based on variant
5853
- */
5854
- getIconName(): string;
5855
- /**
5856
- * Get the file type label based on variant
5857
- */
5858
- getFileTypeLabel(): string;
5859
- handleClick(event: Event): void;
5860
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileFileAttachmentComponent, never>;
5861
- 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>;
5862
- }
5863
-
5864
5514
  /**
5865
5515
  * DsMobileFabComponent
5866
5516
  *
@@ -5939,45 +5589,6 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
5939
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>;
5940
5590
  }
5941
5591
 
5942
- type AppIconSize = 'sm' | 'md' | 'lg' | 'xl';
5943
- /**
5944
- * DsAppIconComponent
5945
- *
5946
- * Displays the organization's logomark styled as an app icon with rounded corners
5947
- * and shadow. The logomark fill color adapts to the background.
5948
- * Perfect for sign-in pages, splash screens, etc.
5949
- *
5950
- * Uses percentage-based padding and border-radius for perfect proportional scaling.
5951
- *
5952
- * @example
5953
- * Sign-in page (large):
5954
- * ```html
5955
- * <ds-app-icon size="xl" />
5956
- * ```
5957
- *
5958
- * Settings preview (small):
5959
- * ```html
5960
- * <ds-app-icon size="sm" />
5961
- * ```
5962
- */
5963
- declare class DsAppIconComponent {
5964
- whitelabelService: WhitelabelService;
5965
- /**
5966
- * Size of the app icon
5967
- * - sm: 16x16px (padding: 2.4px, radius: 3.2px)
5968
- * - md: 32x32px (padding: 4.8px, radius: 6.4px)
5969
- * - lg: 48x48px (padding: 7.2px, radius: 9.6px)
5970
- * - xl: 64x64px (padding: 9.6px, radius: 12.8px)
5971
- */
5972
- size: AppIconSize;
5973
- /**
5974
- * Computed CSS class for size variant
5975
- */
5976
- sizeClass: _angular_core.Signal<string>;
5977
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAppIconComponent, never>;
5978
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsAppIconComponent, "ds-app-icon", never, { "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
5979
- }
5980
-
5981
5592
  type AvatarType = 'initials' | 'photo' | 'icon';
5982
5593
  type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
5983
5594
  type BadgePosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
@@ -6007,92 +5618,10 @@ declare class DsAvatarWithBadgeComponent {
6007
5618
  showBadge: boolean;
6008
5619
  badgePosition: BadgePosition;
6009
5620
  badgeClasses: _angular_core.Signal<string>;
6010
- /**
6011
- * Computed badge icon size that scales with avatar size
6012
- * Maps avatar sizes to appropriate app icon sizes
6013
- */
6014
- badgeIconSize: _angular_core.Signal<AppIconSize>;
6015
5621
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAvatarWithBadgeComponent, never>;
6016
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>;
6017
5623
  }
6018
5624
 
6019
- /**
6020
- * DsMobileActionListItemComponent
6021
- *
6022
- * Specialized list item for action sheets and menus.
6023
- * Wraps ds-mobile-list-item with action-specific styling:
6024
- * - Vertically centered content
6025
- * - Interactive by default
6026
- * - No dividers (controlled per-item)
6027
- *
6028
- * @example
6029
- * ```html
6030
- * <ds-mobile-action-list-item
6031
- * title="Edit"
6032
- * [showDivider]="true"
6033
- * (itemClick)="handleEdit()">
6034
- * <ds-icon content-leading name="remixEditLine" size="20px" />
6035
- * </ds-mobile-action-list-item>
6036
- * ```
6037
- */
6038
- declare class DsMobileActionListItemComponent {
6039
- /**
6040
- * Action title text
6041
- */
6042
- title: _angular_core.InputSignal<string>;
6043
- /**
6044
- * Whether to show divider below item
6045
- * @default false
6046
- */
6047
- showDivider: _angular_core.InputSignal<boolean>;
6048
- /**
6049
- * Whether the action is disabled
6050
- * @default false
6051
- */
6052
- disabled: _angular_core.InputSignal<boolean>;
6053
- /**
6054
- * Emits when the action item is clicked
6055
- */
6056
- itemClick: _angular_core.OutputEmitterRef<void>;
6057
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileActionListItemComponent, never>;
6058
- 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>;
6059
- }
6060
-
6061
- type LogoVariant = 'full' | 'mark';
6062
- type LogoSize = 'sm' | 'md' | 'lg' | 'xl';
6063
- /**
6064
- * DsLogoComponent
6065
- *
6066
- * Displays the whitelabeled logo or logomark based on current configuration.
6067
- * Automatically pulls logo assets from WhitelabelService.
6068
- *
6069
- * @example
6070
- * Full logo in header:
6071
- * ```html
6072
- * <ds-logo variant="full" size="md" />
6073
- * ```
6074
- *
6075
- * Logomark for compact spaces:
6076
- * ```html
6077
- * <ds-logo variant="mark" size="sm" />
6078
- * ```
6079
- */
6080
- declare class DsLogoComponent {
6081
- whitelabelService: WhitelabelService;
6082
- variant: LogoVariant;
6083
- size: LogoSize;
6084
- customHeight?: number;
6085
- customWidth?: number;
6086
- get logoSrc(): string;
6087
- get logoAlt(): string;
6088
- /**
6089
- * Priority: customHeight input > whitelabel config logoHeight > default 32px
6090
- */
6091
- get effectiveHeight(): number;
6092
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsLogoComponent, never>;
6093
- 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>;
6094
- }
6095
-
6096
5625
  /**
6097
5626
  * DsMobileEmptyStateComponent
6098
5627
  *
@@ -6109,7 +5638,7 @@ declare class DsLogoComponent {
6109
5638
  * ```html
6110
5639
  * <!-- With image -->
6111
5640
  * <ds-mobile-empty-state
6112
- * [imageSrc]="'/Assets/empty-state-inquiry.svg'"
5641
+ * [imageSrc]="'/Assets/Empty state-chat.png'"
6113
5642
  * [imageAlt]="'No messages'"
6114
5643
  * [title]="'Ingen beskeder endnu'"
6115
5644
  * [description]="'Start samtalen ved at sende en besked'">
@@ -6143,126 +5672,6 @@ declare class DsMobileEmptyStateComponent {
6143
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>;
6144
5673
  }
6145
5674
 
6146
- /**
6147
- * DsMobileOfflineBannerComponent
6148
- *
6149
- * A compact banner component to indicate offline status.
6150
- * Designed to be used in the [offline-indicator] slot of page components.
6151
- *
6152
- * Features:
6153
- * - Amber/yellow warning styling
6154
- * - WiFi off icon
6155
- * - Customizable message
6156
- * - Compact, non-intrusive design
6157
- * - Smooth slide-in animation
6158
- *
6159
- * @example
6160
- * ```html
6161
- * <ds-mobile-page-main title="Community">
6162
- * <ds-mobile-offline-banner
6163
- * offline-indicator
6164
- * *ngIf="pageComponent.isOffline()">
6165
- * </ds-mobile-offline-banner>
6166
- *
6167
- * <!-- Page content -->
6168
- * </ds-mobile-page-main>
6169
- * ```
6170
- */
6171
- declare class DsMobileOfflineBannerComponent {
6172
- /**
6173
- * Icon to display (default: WiFi off icon)
6174
- */
6175
- icon: _angular_core.InputSignal<string>;
6176
- /**
6177
- * Title text for the banner
6178
- */
6179
- title: _angular_core.InputSignal<string>;
6180
- /**
6181
- * Optional secondary message
6182
- */
6183
- message: _angular_core.InputSignal<string>;
6184
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileOfflineBannerComponent, never>;
6185
- 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>;
6186
- }
6187
-
6188
- /**
6189
- * DsMobileIllustrationComponent
6190
- *
6191
- * A component that displays illustrations with dynamic whitelabel color adaptation.
6192
- * Inlines SVG and uses CSS variables to adapt colors to your theme.
6193
- *
6194
- * **Features:**
6195
- * - Predefined variants (post, inquiry) for common empty states
6196
- * - Automatic color adaptation using CSS variables
6197
- * - Preserves all SVG details (textures, filters, gradients, shadows)
6198
- * - White radial gradient overlay for depth effect
6199
- * - Configurable size
6200
- *
6201
- * **Color Adaptation:**
6202
- * The SVGs use the `--color-accent` CSS variable for the main page colors.
6203
- * All texture details, shadows, and effects are preserved.
6204
- *
6205
- * @example
6206
- * ```html
6207
- * <!-- Using predefined variant -->
6208
- * <ds-mobile-illustration variant="post" />
6209
- *
6210
- * <!-- Using predefined variant with custom size -->
6211
- * <ds-mobile-illustration variant="inquiry" size="150px" />
6212
- * ```
6213
- */
6214
- declare class DsMobileIllustrationComponent {
6215
- private sanitizer;
6216
- /**
6217
- * Predefined illustration variant
6218
- * Available variants: 'post', 'inquiry'
6219
- */
6220
- variant: _angular_core.InputSignal<"post" | "inquiry">;
6221
- /**
6222
- * Illustration size (width and height)
6223
- * @default '120px'
6224
- */
6225
- size: _angular_core.InputSignal<string>;
6226
- constructor(sanitizer: DomSanitizer);
6227
- /**
6228
- * Inline SVG content for each variant
6229
- */
6230
- private svgMap;
6231
- /**
6232
- * Computed SVG content - sanitized for security
6233
- */
6234
- svgContent: _angular_core.Signal<SafeHtml>;
6235
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileIllustrationComponent, never>;
6236
- 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>;
6237
- }
6238
-
6239
- /**
6240
- * DsMobilePropertyBannerComponent
6241
- *
6242
- * Compact banner displaying property photo and address.
6243
- * Designed for use in page headers to show current property context.
6244
- *
6245
- * @example
6246
- * ```html
6247
- * <ds-mobile-property-banner
6248
- * address="Toftegårds Allé 5A, 2. tv."
6249
- * photoUrl="/Assets/building.jpg">
6250
- * </ds-mobile-property-banner>
6251
- * ```
6252
- */
6253
- declare class DsMobilePropertyBannerComponent {
6254
- /**
6255
- * Property address text
6256
- */
6257
- address: _angular_core.InputSignal<string>;
6258
- /**
6259
- * URL to property photo
6260
- */
6261
- photoUrl: _angular_core.InputSignal<string>;
6262
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePropertyBannerComponent, never>;
6263
- 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>;
6264
- }
6265
-
6266
5675
  /**
6267
5676
  * User service for managing current user data globally
6268
5677
  */
@@ -6275,8 +5684,6 @@ declare class UserService {
6275
5684
  readonly avatarType: _angular_core.Signal<"initials" | "photo" | "icon">;
6276
5685
  readonly avatarSrc: _angular_core.Signal<string>;
6277
5686
  readonly profileMenuItems: _angular_core.Signal<ActionGroup[] | undefined>;
6278
- private profileActionSelectedSubject;
6279
- readonly profileActionSelected$: rxjs.Observable<ActionResult>;
6280
5687
  /**
6281
5688
  * Update avatar configuration
6282
5689
  */
@@ -6289,10 +5696,6 @@ declare class UserService {
6289
5696
  * if they don't receive profileMenuItems as an input.
6290
5697
  */
6291
5698
  setProfileMenuItems(items: ActionGroup[]): void;
6292
- /**
6293
- * Notify subscribers that a profile action was selected
6294
- */
6295
- notifyProfileAction(result: ActionResult): void;
6296
5699
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserService, never>;
6297
5700
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserService>;
6298
5701
  }
@@ -6405,10 +5808,7 @@ declare class MobileCommunityPageComponent {
6405
5808
  private postModal;
6406
5809
  userService: UserService;
6407
5810
  private postsService;
6408
- pageComponent: DsMobilePageMainComponent;
6409
- pinnedSwiper?: DsMobileSwiperComponent;
6410
5811
  allPosts: _angular_core.Signal<Post[]>;
6411
- pinnedPosts: _angular_core.Signal<Post[]>;
6412
5812
  hasAnyPosts: _angular_core.Signal<boolean>;
6413
5813
  hasMorePosts: _angular_core.Signal<boolean>;
6414
5814
  constructor(router: Router, route: ActivatedRoute, bottomSheet: DsMobileBottomSheetService, lightbox: DsMobileLightboxService, postModal: DsMobilePostDetailModalService, userService: UserService, postsService: PostsService);
@@ -6434,29 +5834,12 @@ declare class MobileCommunityPageComponent {
6434
5834
  * Handle long press on a post to show action sheet
6435
5835
  */
6436
5836
  handlePostLongPress(postId: string, isOwnPost: boolean): Promise<void>;
6437
- /**
6438
- * Navigate to previous slide in pinned posts
6439
- */
6440
- slidePrev(): void;
6441
- /**
6442
- * Navigate to next slide in pinned posts
6443
- */
6444
- slideNext(): void;
6445
- /**
6446
- * Check if currently on first slide
6447
- */
6448
- isFirstSlide(): boolean;
6449
- /**
6450
- * Check if currently on last slide
6451
- */
6452
- isLastSlide(): boolean;
6453
5837
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileCommunityPageComponent, never>;
6454
5838
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileCommunityPageComponent, "app-mobile-community-page", never, {}, {}, never, never, true, never>;
6455
5839
  }
6456
5840
 
6457
5841
  declare class MobileHandbookPageComponent {
6458
5842
  userService: UserService;
6459
- pageComponent: DsMobilePageMainComponent;
6460
5843
  utilitiesItems: HandbookItem[];
6461
5844
  sikkerhedsudstyrItems: HandbookItem[];
6462
5845
  serviceContractsItems: HandbookItem[];
@@ -6468,26 +5851,13 @@ declare class MobileHandbookPageComponent {
6468
5851
  }
6469
5852
 
6470
5853
  declare class MobileHomePageComponent {
6471
- private router;
5854
+ private navCtrl;
6472
5855
  userService: UserService;
6473
- private postsService;
6474
- private postModal;
6475
- pageComponent: DsMobilePageMainComponent;
6476
- recentPosts: _angular_core.Signal<_propbinder_mobile_design.Post[]>;
6477
- private allInquiries;
6478
- openInquiries: _angular_core.Signal<{
6479
- id: string;
6480
- title: string;
6481
- description: string;
6482
- status: "open";
6483
- timestamp: string;
6484
- }[]>;
6485
- constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService);
5856
+ constructor(navCtrl: NavController, userService: UserService);
6486
5857
  handleRefresh(event: any): void;
6487
- openPost(postId: string, focusComment?: boolean): Promise<void>;
6488
- openInquiryDetail(inquiryId: string): void;
6489
- navigateToCommunity(): void;
6490
- navigateToInquiries(): void;
5858
+ handlePostClick(): void;
5859
+ handleContactClick(contactType: string): void;
5860
+ handleFileClick(fileType: string): void;
6491
5861
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHomePageComponent, never>;
6492
5862
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHomePageComponent, "app-home-page", never, {}, {}, never, never, true, never>;
6493
5863
  }
@@ -6504,7 +5874,6 @@ declare class MobileInquiriesPageComponent {
6504
5874
  userService: UserService;
6505
5875
  private navCtrl;
6506
5876
  private newInquiryModal;
6507
- pageComponent: DsMobilePageMainComponent;
6508
5877
  constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
6509
5878
  filterStatus: _angular_core.WritableSignal<"open" | "closed" | "all">;
6510
5879
  tabItems: InlineTabItem[];
@@ -6542,7 +5911,6 @@ declare class MobileInquiryDetailPageComponent {
6542
5911
  messageThreads: MessageThread[];
6543
5912
  unreadMessagesCount: _angular_core.Signal<number>;
6544
5913
  photos: LightboxImage[];
6545
- get photoUrls(): string[];
6546
5914
  constructor(userService: UserService, lightbox: DsMobileLightboxService, chatModal: DsMobileChatModalService);
6547
5915
  setActiveTab(tabId: string): void;
6548
5916
  goBack(): void;
@@ -6588,9 +5956,6 @@ declare class MobileTabsExampleComponent implements OnInit {
6588
5956
  * Handle profile menu action selection.
6589
5957
  * The tab bar component handles the UI (opening/closing menu),
6590
5958
  * this method handles the business logic.
6591
- *
6592
- * NOTE: Desktop only - called directly from tab bar.
6593
- * Mobile actions are handled globally in AppComponent via UserService.
6594
5959
  */
6595
5960
  handleProfileAction(result: ActionResult): void;
6596
5961
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileTabsExampleComponent, never>;
@@ -6650,127 +6015,40 @@ declare class MobilePostDetailPageComponent {
6650
6015
  *
6651
6016
  * Sign-in page with email authentication.
6652
6017
  * Features logomark, decorative city background, and form validation.
6653
- * Auto-focuses email input on iOS to trigger keyboard.
6654
6018
  */
6655
- declare class SignInPageComponent implements AfterViewInit, OnDestroy {
6656
- emailInputRef?: ElementRef;
6657
- whitelabelService: WhitelabelService;
6019
+ declare class SignInPageComponent {
6658
6020
  email: string;
6659
6021
  emailError: _angular_core.WritableSignal<boolean>;
6660
6022
  isSubmitting: _angular_core.WritableSignal<boolean>;
6661
6023
  emailSent: _angular_core.WritableSignal<boolean>;
6662
- ngAfterViewInit(): void;
6663
- /**
6664
- * Show the keyboard on mobile platforms
6665
- */
6666
- private showKeyboard;
6667
6024
  handleSubmit(): void;
6668
6025
  handleBackToLogin(): void;
6669
- /**
6670
- * Update status bar for sign-in page background
6671
- * Uses the sign-in background color to determine appropriate status bar style
6672
- */
6673
- private updateSignInStatusBar;
6674
- /**
6675
- * Restore status bar to header color when leaving sign-in page
6676
- */
6677
- ngOnDestroy(): void;
6678
- /**
6679
- * Restore status bar to use header surface color
6680
- */
6681
- private restoreHeaderStatusBar;
6682
6026
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignInPageComponent, never>;
6683
6027
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInPageComponent, "app-sign-in", never, {}, {}, never, never, true, never>;
6684
6028
  }
6685
6029
 
6686
6030
  /**
6687
- * Whitelabel Demo Modal Component
6031
+ * Whitelabel Demo Page
6688
6032
  *
6689
6033
  * Demonstrates the whitelabeling system with theme selection, brand colors, and logo previews.
6690
- * Opens as a full-screen modal similar to post details.
6691
6034
  */
6692
- declare class WhitelabelDemoModalComponent implements OnInit {
6035
+ declare class WhitelabelDemoPage implements OnInit {
6693
6036
  whitelabelService: WhitelabelService;
6694
- private modalController;
6695
6037
  currentTheme: string;
6696
- customAppIconSurface: string;
6697
- customAppIconContent: string;
6698
- customAccent: string;
6699
- customOnAccent: string;
6700
- customHeaderSurface: string;
6701
- customHeaderContent: string;
6702
- customHeaderAccent: string;
6703
- customOnHeaderAccent: string;
6704
- customSignInBgSolid: string;
6705
- customSignInBgGradientStart: string;
6706
- customSignInBgGradientEnd: string;
6707
- customSignInContentColor: string;
6038
+ customPrimarySurface: string;
6039
+ customPrimaryContent: string;
6040
+ customSecondarySurface: string;
6041
+ customSecondaryContent: string;
6708
6042
  ngOnInit(): void;
6709
- /**
6710
- * Detect the current active theme based on colors
6711
- */
6712
- private detectCurrentTheme;
6713
- /**
6714
- * Close the modal
6715
- */
6716
- close(): void;
6717
6043
  applyDefaultTheme(): void;
6718
6044
  applyCejTheme(): void;
6719
6045
  applyPkaTheme(): void;
6720
6046
  applyClaveTheme(): void;
6721
6047
  applyFreedomTheme(): void;
6722
6048
  applyCustomColors(): void;
6723
- toggleCityIllustration(): void;
6724
- updateSignInBgType(type: 'solid' | 'gradient'): void;
6725
- updateLogoSize(size: 'sm' | 'md' | 'lg' | 'xl'): void;
6726
- applySignInBackground(): void;
6727
- applySignInContentColor(): void;
6728
- private updateSignInBgInputs;
6729
- private updateSignInContentColorInput;
6730
6049
  private updateCustomColorInputs;
6731
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelDemoModalComponent, never>;
6732
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WhitelabelDemoModalComponent, "ds-whitelabel-demo-modal", never, {}, {}, never, never, true, never>;
6733
- }
6734
-
6735
- /**
6736
- * WhitelabelDemoModalService
6737
- *
6738
- * Service for displaying the whitelabel demo in a full-screen modal.
6739
- * Built on Ionic's modal system with native gestures and animations.
6740
- *
6741
- * @example
6742
- * ```typescript
6743
- * constructor(private whitelabelModal: WhitelabelDemoModalService) {}
6744
- *
6745
- * async openDemo() {
6746
- * await this.whitelabelModal.open();
6747
- * }
6748
- * ```
6749
- */
6750
- declare class WhitelabelDemoModalService {
6751
- private modalController;
6752
- constructor(modalController: ModalController);
6753
- /**
6754
- * Open the whitelabel demo modal
6755
- *
6756
- * @returns Promise that resolves when the modal is presented
6757
- */
6758
- open(): Promise<void>;
6759
- /**
6760
- * Close the currently open whitelabel demo modal
6761
- *
6762
- * @param data Optional data to pass back when dismissing
6763
- * @returns Promise that resolves when the modal is dismissed
6764
- */
6765
- close(data?: any): Promise<boolean>;
6766
- /**
6767
- * Get the top-most modal if one exists
6768
- *
6769
- * @returns Promise that resolves to the modal element or undefined
6770
- */
6771
- getTop(): Promise<HTMLIonModalElement | undefined>;
6772
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<WhitelabelDemoModalService, never>;
6773
- 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>;
6774
6052
  }
6775
6053
 
6776
6054
  /**
@@ -6795,5 +6073,5 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
6795
6073
  */
6796
6074
  declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
6797
6075
 
6798
- export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileDropdownComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFileAttachmentComponent, 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, 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, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition };
6799
- 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 };