@propbinder/mobile-design 0.2.17 → 0.2.22
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/fesm2022/propbinder-mobile-design.mjs +5386 -2925
- package/fesm2022/propbinder-mobile-design.mjs.map +1 -1
- package/index.d.ts +934 -212
- package/package.json +1 -1
- package/styles/ionic.css +91 -64
- package/styles/mobile-common.css +1 -1
- package/styles/mobile-page-base.css +20 -14
package/index.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { AfterViewInit, OnInit, ElementRef, Injector, TemplateRef,
|
|
2
|
+
import { OnDestroy, AfterViewInit, OnInit, ElementRef, Injector, TemplateRef, 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';
|
|
4
5
|
import { ImpactStyle } from '@capacitor/haptics';
|
|
5
6
|
import { DsTextareaComponent } from '@propbinder/design-system';
|
|
6
7
|
import { ControlValueAccessor } from '@angular/forms';
|
|
8
|
+
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
|
7
9
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
10
|
+
import * as rxjs from 'rxjs';
|
|
11
|
+
import * as _propbinder_mobile_design from '@propbinder/mobile-design';
|
|
8
12
|
import { Animation } from '@ionic/angular';
|
|
9
13
|
|
|
10
14
|
/**
|
|
@@ -15,20 +19,29 @@ import { Animation } from '@ionic/angular';
|
|
|
15
19
|
* - 'full' - 100% width (no max)
|
|
16
20
|
*/
|
|
17
21
|
type ContentWidth = 'narrow' | 'standard' | 'wide' | 'full';
|
|
22
|
+
/**
|
|
23
|
+
* Network status type
|
|
24
|
+
*/
|
|
25
|
+
type NetworkStatus = 'online' | 'offline' | 'unknown';
|
|
18
26
|
/**
|
|
19
27
|
* MobilePageBase
|
|
20
28
|
*
|
|
21
29
|
* Shared base class for mobile page components (ds-mobile-page-main, ds-mobile-page-details).
|
|
22
|
-
* Provides consistent content width control across all page types.
|
|
30
|
+
* Provides consistent content width control and network status monitoring across all page types.
|
|
23
31
|
*
|
|
24
32
|
* **Padding Strategy:**
|
|
25
33
|
* - All pages use 20px horizontal padding globally
|
|
26
34
|
* - For tappable lists, use negative margins (e.g., margin: 0 -8px) to create full-width sections
|
|
27
35
|
* - This approach simplifies padding management and provides consistency
|
|
28
36
|
*
|
|
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
|
+
*
|
|
29
42
|
* @internal This is a base class and should not be used directly.
|
|
30
43
|
*/
|
|
31
|
-
declare abstract class MobilePageBase {
|
|
44
|
+
declare abstract class MobilePageBase implements OnDestroy {
|
|
32
45
|
/**
|
|
33
46
|
* Maximum content width (desktop only)
|
|
34
47
|
*
|
|
@@ -59,6 +72,68 @@ declare abstract class MobilePageBase {
|
|
|
59
72
|
* @internal
|
|
60
73
|
*/
|
|
61
74
|
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;
|
|
62
137
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobilePageBase, never>;
|
|
63
138
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobilePageBase, never, never, { "contentWidth": { "alias": "contentWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
64
139
|
}
|
|
@@ -271,6 +346,7 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
|
|
|
271
346
|
private elementRef;
|
|
272
347
|
textareaInput?: ElementRef<HTMLTextAreaElement>;
|
|
273
348
|
fileInput?: ElementRef<HTMLInputElement>;
|
|
349
|
+
private whitelabelService;
|
|
274
350
|
autoFocus: boolean;
|
|
275
351
|
isReadonly: boolean;
|
|
276
352
|
isEditMode: boolean;
|
|
@@ -306,11 +382,6 @@ declare class DsMobilePostCreateBottomSheetComponent implements AfterViewInit, O
|
|
|
306
382
|
handleCancel(): Promise<void>;
|
|
307
383
|
handlePost(): Promise<void>;
|
|
308
384
|
handleAddImage(): Promise<void>;
|
|
309
|
-
/**
|
|
310
|
-
* Restore StatusBar configuration (background task)
|
|
311
|
-
* Safe area padding is now handled preventively via applySafeAreaToToolbar()
|
|
312
|
-
*/
|
|
313
|
-
private restoreStatusBar;
|
|
314
385
|
handleRemoveImage(index: number): void;
|
|
315
386
|
handleAddAttachment(): void;
|
|
316
387
|
handleFileSelect(event: Event): void;
|
|
@@ -497,6 +568,28 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
|
|
|
497
568
|
showCondensedHeader: _angular_core.InputSignal<boolean>;
|
|
498
569
|
scrollThreshold: _angular_core.InputSignal<number>;
|
|
499
570
|
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>;
|
|
500
593
|
/**
|
|
501
594
|
* Profile menu action groups to display when avatar is clicked.
|
|
502
595
|
* If not provided, a default menu will be used (without Whitelabel Demo).
|
|
@@ -546,7 +639,7 @@ declare class DsMobilePageMainComponent extends MobilePageBase implements AfterV
|
|
|
546
639
|
*/
|
|
547
640
|
handleRefresh(event: any): Promise<void>;
|
|
548
641
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePageMainComponent, 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>;
|
|
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>;
|
|
550
643
|
}
|
|
551
644
|
|
|
552
645
|
interface InlineTabItem {
|
|
@@ -591,6 +684,176 @@ declare class DsMobileInlineTabsComponent {
|
|
|
591
684
|
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>;
|
|
592
685
|
}
|
|
593
686
|
|
|
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
|
+
|
|
594
857
|
/**
|
|
595
858
|
* DsMobilePageDetailsComponent
|
|
596
859
|
*
|
|
@@ -631,9 +894,19 @@ declare class DsMobilePageDetailsComponent extends MobilePageBase implements Aft
|
|
|
631
894
|
private elementRef;
|
|
632
895
|
ionContent?: IonContent;
|
|
633
896
|
private platform;
|
|
897
|
+
whitelabelService: WhitelabelService;
|
|
634
898
|
isNativePlatform: _angular_core.Signal<boolean>;
|
|
635
899
|
title: _angular_core.InputSignal<string>;
|
|
636
900
|
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>;
|
|
637
910
|
tabs: _angular_core.InputSignal<InlineTabItem[] | undefined>;
|
|
638
911
|
activeTab: _angular_core.InputSignal<string>;
|
|
639
912
|
showRefresh: _angular_core.InputSignal<boolean>;
|
|
@@ -669,7 +942,7 @@ declare class DsMobilePageDetailsComponent extends MobilePageBase implements Aft
|
|
|
669
942
|
*/
|
|
670
943
|
handleRefresh(event: any): Promise<void>;
|
|
671
944
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobilePageDetailsComponent, 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>;
|
|
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>;
|
|
673
946
|
}
|
|
674
947
|
|
|
675
948
|
/**
|
|
@@ -678,18 +951,21 @@ declare class DsMobilePageDetailsComponent extends MobilePageBase implements Aft
|
|
|
678
951
|
* Main content container for mobile pages with flexible layout options.
|
|
679
952
|
* Provides consistent spacing and layout patterns.
|
|
680
953
|
*
|
|
954
|
+
* **Note:** For production use, prefer `ds-mobile-section` for individual sections.
|
|
955
|
+
* This component is maintained for grid layouts and prototyping.
|
|
956
|
+
*
|
|
681
957
|
* @example
|
|
682
958
|
* ```html
|
|
683
959
|
* <!-- Default: stacked layout -->
|
|
684
960
|
* <ds-mobile-content>
|
|
685
|
-
* <ds-mobile-
|
|
686
|
-
* <ds-mobile-
|
|
961
|
+
* <ds-mobile-section>...</ds-mobile-section>
|
|
962
|
+
* <ds-mobile-section>...</ds-mobile-section>
|
|
687
963
|
* </ds-mobile-content>
|
|
688
964
|
*
|
|
689
965
|
* <!-- Grid layout -->
|
|
690
966
|
* <ds-mobile-content layout="grid-2">
|
|
691
|
-
* <
|
|
692
|
-
* <
|
|
967
|
+
* <div>Grid item 1</div>
|
|
968
|
+
* <div>Grid item 2</div>
|
|
693
969
|
* </ds-mobile-content>
|
|
694
970
|
* ```
|
|
695
971
|
*/
|
|
@@ -704,25 +980,6 @@ declare class DsMobileContentComponent {
|
|
|
704
980
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileContentComponent, never>;
|
|
705
981
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileContentComponent, "ds-mobile-content", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
706
982
|
}
|
|
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
|
-
}
|
|
726
983
|
/**
|
|
727
984
|
* SectionHeaderComponent
|
|
728
985
|
*
|
|
@@ -745,6 +1002,128 @@ declare class ContentRowComponent {
|
|
|
745
1002
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentRowComponent, "content-row", never, {}, {}, never, ["*"], true, never>;
|
|
746
1003
|
}
|
|
747
1004
|
|
|
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
|
+
|
|
748
1127
|
/**
|
|
749
1128
|
* DsMobileHeaderContentComponent
|
|
750
1129
|
*
|
|
@@ -813,157 +1192,34 @@ declare class TileIconComponent {
|
|
|
813
1192
|
*
|
|
814
1193
|
* Semantic slot for tile content containing label and value.
|
|
815
1194
|
* Use within `ds-mobile-header-content-tile`.
|
|
816
|
-
*
|
|
817
|
-
* Contains:
|
|
818
|
-
* - `<tile-label>` - Small label text
|
|
819
|
-
* - `<tile-value>` - Large value text
|
|
820
|
-
*/
|
|
821
|
-
declare class TileContentComponent {
|
|
822
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileContentComponent, never>;
|
|
823
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileContentComponent, "tile-content", never, {}, {}, never, ["tile-label", "tile-value"], true, never>;
|
|
824
|
-
}
|
|
825
|
-
/**
|
|
826
|
-
* TileLabelComponent
|
|
827
|
-
*
|
|
828
|
-
* Label text for tile content.
|
|
829
|
-
* Use within `tile-content` inside `ds-mobile-header-content-tile`.
|
|
830
|
-
*/
|
|
831
|
-
declare class TileLabelComponent {
|
|
832
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileLabelComponent, never>;
|
|
833
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileLabelComponent, "tile-label", never, {}, {}, never, ["*"], true, never>;
|
|
834
|
-
}
|
|
835
|
-
/**
|
|
836
|
-
* TileValueComponent
|
|
837
|
-
*
|
|
838
|
-
* Value text for tile content.
|
|
839
|
-
* Use within `tile-content` inside `ds-mobile-header-content-tile`.
|
|
840
|
-
*/
|
|
841
|
-
declare class TileValueComponent {
|
|
842
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileValueComponent, never>;
|
|
843
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileValueComponent, "tile-value", never, {}, {}, never, ["*"], true, never>;
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
interface WhitelabelConfig {
|
|
847
|
-
logoUrl: string;
|
|
848
|
-
logoMarkUrl: string;
|
|
849
|
-
logoAlt: string;
|
|
850
|
-
logoWidth?: number;
|
|
851
|
-
logoHeight?: number;
|
|
852
|
-
logoMarkWidth?: number;
|
|
853
|
-
logoMarkHeight?: number;
|
|
854
|
-
primarySurface: string;
|
|
855
|
-
primaryContent: string;
|
|
856
|
-
secondarySurface: string;
|
|
857
|
-
secondaryContent: string;
|
|
858
|
-
organizationName: string;
|
|
859
|
-
organizationId: string;
|
|
860
|
-
}
|
|
861
|
-
/**
|
|
862
|
-
* WhitelabelService
|
|
863
|
-
*
|
|
864
|
-
* Manages whitelabel configuration including logos and brand colors.
|
|
865
|
-
* Automatically updates CSS custom properties when colors change.
|
|
866
|
-
*
|
|
867
|
-
* @example
|
|
868
|
-
* Initialize with custom config:
|
|
869
|
-
* ```typescript
|
|
870
|
-
* whitelabelService.initialize({
|
|
871
|
-
* logoUrl: '/Assets/logos/acme-logo.svg',
|
|
872
|
-
* logoMarkUrl: '/Assets/logos/acme-mark.svg',
|
|
873
|
-
* primaryColor: '#2563eb',
|
|
874
|
-
* secondaryColor: '#3b82f6',
|
|
875
|
-
* organizationName: 'Acme Corp'
|
|
876
|
-
* });
|
|
877
|
-
* ```
|
|
878
|
-
*
|
|
879
|
-
* Load from API:
|
|
880
|
-
* ```typescript
|
|
881
|
-
* await whitelabelService.loadFromApi('acme-corp');
|
|
882
|
-
* ```
|
|
883
|
-
*/
|
|
884
|
-
declare class WhitelabelService {
|
|
885
|
-
private _config;
|
|
886
|
-
readonly logoUrl: _angular_core.Signal<string>;
|
|
887
|
-
readonly logoMarkUrl: _angular_core.Signal<string>;
|
|
888
|
-
readonly logoAlt: _angular_core.Signal<string>;
|
|
889
|
-
readonly logoHeight: _angular_core.Signal<number>;
|
|
890
|
-
readonly primarySurface: _angular_core.Signal<string>;
|
|
891
|
-
readonly primaryContent: _angular_core.Signal<string>;
|
|
892
|
-
readonly secondarySurface: _angular_core.Signal<string>;
|
|
893
|
-
readonly secondaryContent: _angular_core.Signal<string>;
|
|
894
|
-
readonly organizationName: _angular_core.Signal<string>;
|
|
895
|
-
readonly organizationId: _angular_core.Signal<string>;
|
|
896
|
-
readonly config: _angular_core.Signal<WhitelabelConfig>;
|
|
897
|
-
constructor();
|
|
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>;
|
|
1195
|
+
*
|
|
1196
|
+
* Contains:
|
|
1197
|
+
* - `<tile-label>` - Small label text
|
|
1198
|
+
* - `<tile-value>` - Large value text
|
|
1199
|
+
*/
|
|
1200
|
+
declare class TileContentComponent {
|
|
1201
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileContentComponent, never>;
|
|
1202
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileContentComponent, "tile-content", never, {}, {}, never, ["tile-label", "tile-value"], true, never>;
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* TileLabelComponent
|
|
1206
|
+
*
|
|
1207
|
+
* Label text for tile content.
|
|
1208
|
+
* Use within `tile-content` inside `ds-mobile-header-content-tile`.
|
|
1209
|
+
*/
|
|
1210
|
+
declare class TileLabelComponent {
|
|
1211
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileLabelComponent, never>;
|
|
1212
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileLabelComponent, "tile-label", never, {}, {}, never, ["*"], true, never>;
|
|
1213
|
+
}
|
|
1214
|
+
/**
|
|
1215
|
+
* TileValueComponent
|
|
1216
|
+
*
|
|
1217
|
+
* Value text for tile content.
|
|
1218
|
+
* Use within `tile-content` inside `ds-mobile-header-content-tile`.
|
|
1219
|
+
*/
|
|
1220
|
+
declare class TileValueComponent {
|
|
1221
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TileValueComponent, never>;
|
|
1222
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TileValueComponent, "tile-value", never, {}, {}, never, ["*"], true, never>;
|
|
967
1223
|
}
|
|
968
1224
|
|
|
969
1225
|
type LogoVariant = 'full' | 'mark';
|
|
@@ -2342,6 +2598,7 @@ declare class DsMobileActionListItemComponent {
|
|
|
2342
2598
|
* [timestamp]="'2h ago'"
|
|
2343
2599
|
* [avatarInitials]="'JD'"
|
|
2344
2600
|
* [clickable]="true"
|
|
2601
|
+
* [enableLongPress]="true"
|
|
2345
2602
|
* (postClick)="openPost()">
|
|
2346
2603
|
*
|
|
2347
2604
|
* <post-content>
|
|
@@ -2398,6 +2655,13 @@ declare class DsMobileInteractiveListItemPostComponent {
|
|
|
2398
2655
|
* Whether the post card is clickable
|
|
2399
2656
|
*/
|
|
2400
2657
|
clickable: _angular_core.InputSignal<boolean>;
|
|
2658
|
+
/**
|
|
2659
|
+
* Enable long-press interaction when clickable is true
|
|
2660
|
+
* Set to false to disable long-press but keep click
|
|
2661
|
+
* Also controls visibility of desktop "more" button
|
|
2662
|
+
* @default true
|
|
2663
|
+
*/
|
|
2664
|
+
enableLongPress: _angular_core.InputSignal<boolean>;
|
|
2401
2665
|
/**
|
|
2402
2666
|
* Emits when the post card is clicked (if clickable)
|
|
2403
2667
|
*/
|
|
@@ -2415,7 +2679,7 @@ declare class DsMobileInteractiveListItemPostComponent {
|
|
|
2415
2679
|
handleLongPress(): void;
|
|
2416
2680
|
handleMoreButtonClick(event: Event): void;
|
|
2417
2681
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemPostComponent, 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>;
|
|
2682
|
+
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>;
|
|
2419
2683
|
}
|
|
2420
2684
|
/**
|
|
2421
2685
|
* PostContentComponent
|
|
@@ -2563,6 +2827,7 @@ declare class PostPdfAttachmentComponent {
|
|
|
2563
2827
|
* [timestamp]="'12 days ago'"
|
|
2564
2828
|
* [iconName]="'remixCalendarLine'"
|
|
2565
2829
|
* [clickable]="true"
|
|
2830
|
+
* [enableLongPress]="true"
|
|
2566
2831
|
* (inquiryClick)="openInquiry()">
|
|
2567
2832
|
* </ds-mobile-interactive-list-item-inquiry>
|
|
2568
2833
|
* ```
|
|
@@ -2610,6 +2875,13 @@ declare class DsMobileInteractiveListItemInquiryComponent {
|
|
|
2610
2875
|
* Whether to show chevron icon
|
|
2611
2876
|
*/
|
|
2612
2877
|
showChevron: _angular_core.InputSignal<boolean>;
|
|
2878
|
+
/**
|
|
2879
|
+
* Enable long-press interaction when clickable is true
|
|
2880
|
+
* Set to false to disable long-press but keep click
|
|
2881
|
+
* Also controls visibility of desktop "more" button
|
|
2882
|
+
* @default true
|
|
2883
|
+
*/
|
|
2884
|
+
enableLongPress: _angular_core.InputSignal<boolean>;
|
|
2613
2885
|
/**
|
|
2614
2886
|
* Emits when the inquiry item is clicked (if clickable)
|
|
2615
2887
|
*/
|
|
@@ -2626,7 +2898,7 @@ declare class DsMobileInteractiveListItemInquiryComponent {
|
|
|
2626
2898
|
handleLongPress(): void;
|
|
2627
2899
|
handleMoreButtonClick(event: Event): void;
|
|
2628
2900
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemInquiryComponent, 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>;
|
|
2901
|
+
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>;
|
|
2630
2902
|
}
|
|
2631
2903
|
|
|
2632
2904
|
/**
|
|
@@ -2815,7 +3087,7 @@ interface TabConfig {
|
|
|
2815
3087
|
* ```css
|
|
2816
3088
|
* ion-tabs {
|
|
2817
3089
|
* height: 100%;
|
|
2818
|
-
* background: var(--color-
|
|
3090
|
+
* background: var(--color-header-surface);
|
|
2819
3091
|
* }
|
|
2820
3092
|
* ```
|
|
2821
3093
|
*/
|
|
@@ -2942,6 +3214,7 @@ declare class DsMobileTabsComponent implements OnInit {
|
|
|
2942
3214
|
* ```
|
|
2943
3215
|
*/
|
|
2944
3216
|
declare class DsMobileSwiperComponent implements AfterViewInit, OnDestroy {
|
|
3217
|
+
private elementRef;
|
|
2945
3218
|
/**
|
|
2946
3219
|
* Width of each slide (e.g., '75vw', '300px', '80%')
|
|
2947
3220
|
*/
|
|
@@ -2950,13 +3223,48 @@ declare class DsMobileSwiperComponent implements AfterViewInit, OnDestroy {
|
|
|
2950
3223
|
* Gap between slides in pixels
|
|
2951
3224
|
*/
|
|
2952
3225
|
gap: _angular_core.InputSignal<number>;
|
|
3226
|
+
/**
|
|
3227
|
+
* Enable pagination dots
|
|
3228
|
+
*/
|
|
3229
|
+
pagination: _angular_core.InputSignal<boolean>;
|
|
3230
|
+
/**
|
|
3231
|
+
* Enable auto height - container adapts to active slide's height
|
|
3232
|
+
*/
|
|
3233
|
+
autoHeight: _angular_core.InputSignal<boolean>;
|
|
3234
|
+
/**
|
|
3235
|
+
* Enable progressive opacity based on slide position
|
|
3236
|
+
* Slides fade in/out smoothly as they move toward/away from center
|
|
3237
|
+
*/
|
|
3238
|
+
progressiveOpacity: _angular_core.InputSignal<boolean>;
|
|
3239
|
+
/**
|
|
3240
|
+
* Enable progressive scale based on slide position
|
|
3241
|
+
* Slides scale down smoothly as they move away from center
|
|
3242
|
+
*/
|
|
3243
|
+
progressiveScale: _angular_core.InputSignal<boolean>;
|
|
2953
3244
|
swiperContainer: ElementRef;
|
|
2954
3245
|
private swiperInstance;
|
|
3246
|
+
constructor(elementRef: ElementRef);
|
|
2955
3247
|
ngAfterViewInit(): void;
|
|
2956
3248
|
private initializeSwiper;
|
|
3249
|
+
/**
|
|
3250
|
+
* Navigate to previous slide
|
|
3251
|
+
*/
|
|
3252
|
+
slidePrev(): void;
|
|
3253
|
+
/**
|
|
3254
|
+
* Navigate to next slide
|
|
3255
|
+
*/
|
|
3256
|
+
slideNext(): void;
|
|
3257
|
+
/**
|
|
3258
|
+
* Check if at the beginning
|
|
3259
|
+
*/
|
|
3260
|
+
isBeginning(): boolean;
|
|
3261
|
+
/**
|
|
3262
|
+
* Check if at the end
|
|
3263
|
+
*/
|
|
3264
|
+
isEnd(): boolean;
|
|
2957
3265
|
ngOnDestroy(): void;
|
|
2958
3266
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileSwiperComponent, never>;
|
|
2959
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileSwiperComponent, "ds-mobile-swiper", never, { "slideWidth": { "alias": "slideWidth"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
3267
|
+
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>;
|
|
2960
3268
|
}
|
|
2961
3269
|
|
|
2962
3270
|
/**
|
|
@@ -3437,12 +3745,21 @@ declare class DsMobileLightboxFooterComponent {
|
|
|
3437
3745
|
* />
|
|
3438
3746
|
* ```
|
|
3439
3747
|
*/
|
|
3440
|
-
declare class DsMobileInlinePhotoComponent {
|
|
3748
|
+
declare class DsMobileInlinePhotoComponent implements OnInit {
|
|
3441
3749
|
private lightboxService;
|
|
3442
3750
|
/**
|
|
3443
3751
|
* Array of image URLs to display
|
|
3444
3752
|
*/
|
|
3445
3753
|
images: string[];
|
|
3754
|
+
/**
|
|
3755
|
+
* Optional array of loading states for each image (by index)
|
|
3756
|
+
* If provided, shows loader overlay for images that are still loading
|
|
3757
|
+
*/
|
|
3758
|
+
loadingStates?: boolean[];
|
|
3759
|
+
/**
|
|
3760
|
+
* Internal signal to track image loading states
|
|
3761
|
+
*/
|
|
3762
|
+
private internalLoadingStates;
|
|
3446
3763
|
/**
|
|
3447
3764
|
* Author information (passed to lightbox)
|
|
3448
3765
|
*/
|
|
@@ -3459,6 +3776,11 @@ declare class DsMobileInlinePhotoComponent {
|
|
|
3459
3776
|
* Remaining images shown in lightbox only
|
|
3460
3777
|
*/
|
|
3461
3778
|
maxVisible: number;
|
|
3779
|
+
/**
|
|
3780
|
+
* Whether to use grid layout (true) or flex-wrap layout (false)
|
|
3781
|
+
* @default true
|
|
3782
|
+
*/
|
|
3783
|
+
useGrid: boolean;
|
|
3462
3784
|
/**
|
|
3463
3785
|
* Event emitted when lightbox is opened
|
|
3464
3786
|
*/
|
|
@@ -3467,10 +3789,26 @@ declare class DsMobileInlinePhotoComponent {
|
|
|
3467
3789
|
totalImages: number;
|
|
3468
3790
|
}>;
|
|
3469
3791
|
constructor(lightboxService: DsMobileLightboxService);
|
|
3792
|
+
/**
|
|
3793
|
+
* Initialize loading states for all visible images
|
|
3794
|
+
*/
|
|
3795
|
+
ngOnInit(): void;
|
|
3796
|
+
/**
|
|
3797
|
+
* Handle image load event
|
|
3798
|
+
*/
|
|
3799
|
+
onImageLoad(index: number): void;
|
|
3800
|
+
/**
|
|
3801
|
+
* Handle image error event
|
|
3802
|
+
*/
|
|
3803
|
+
onImageError(index: number): void;
|
|
3470
3804
|
/**
|
|
3471
3805
|
* Get the first N images to display inline
|
|
3472
3806
|
*/
|
|
3473
3807
|
get visibleImages(): string[];
|
|
3808
|
+
/**
|
|
3809
|
+
* Check if a specific image is loading
|
|
3810
|
+
*/
|
|
3811
|
+
isImageLoading(index: number): boolean;
|
|
3474
3812
|
/**
|
|
3475
3813
|
* Calculate how many images are hidden
|
|
3476
3814
|
*/
|
|
@@ -3480,7 +3818,63 @@ declare class DsMobileInlinePhotoComponent {
|
|
|
3480
3818
|
*/
|
|
3481
3819
|
openLightbox(index: number, event?: Event): void;
|
|
3482
3820
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInlinePhotoComponent, never>;
|
|
3483
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInlinePhotoComponent, "ds-mobile-inline-photo", never, { "images": { "alias": "images"; "required": false; }; "author": { "alias": "author"; "required": false; }; "maxVisible": { "alias": "maxVisible"; "required": false; }; }, { "photoClick": "photoClick"; }, never, never, true, never>;
|
|
3821
|
+
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>;
|
|
3822
|
+
}
|
|
3823
|
+
|
|
3824
|
+
/**
|
|
3825
|
+
* DsMobileLoaderOverlayComponent
|
|
3826
|
+
*
|
|
3827
|
+
* Reusable loader overlay component that displays a spinner centered over its container.
|
|
3828
|
+
* Designed to overlay images or other content during loading states.
|
|
3829
|
+
*
|
|
3830
|
+
* Features:
|
|
3831
|
+
* - Semi-transparent white background overlay
|
|
3832
|
+
* - Centered animated spinner
|
|
3833
|
+
* - Customizable spinner size
|
|
3834
|
+
* - Absolute positioning to cover parent
|
|
3835
|
+
* - Accessible with proper z-index stacking
|
|
3836
|
+
*
|
|
3837
|
+
* @example
|
|
3838
|
+
* ```html
|
|
3839
|
+
* <!-- Basic usage -->
|
|
3840
|
+
* <div style="position: relative;">
|
|
3841
|
+
* <img src="image.jpg" alt="Content" />
|
|
3842
|
+
* @if (isLoading) {
|
|
3843
|
+
* <ds-mobile-loader-overlay />
|
|
3844
|
+
* }
|
|
3845
|
+
* </div>
|
|
3846
|
+
*
|
|
3847
|
+
* <!-- With custom spinner size -->
|
|
3848
|
+
* <div style="position: relative;">
|
|
3849
|
+
* <div class="content">Loading content...</div>
|
|
3850
|
+
* <ds-mobile-loader-overlay [spinnerSize]="32" />
|
|
3851
|
+
* </div>
|
|
3852
|
+
*
|
|
3853
|
+
* <!-- Over an image with rounded corners -->
|
|
3854
|
+
* <div style="position: relative; border-radius: 12px; overflow: hidden;">
|
|
3855
|
+
* <img src="photo.jpg" />
|
|
3856
|
+
* <ds-mobile-loader-overlay [borderRadius]="12" />
|
|
3857
|
+
* </div>
|
|
3858
|
+
* ```
|
|
3859
|
+
*
|
|
3860
|
+
* @notes
|
|
3861
|
+
* - Parent container must have position: relative for the overlay to work correctly
|
|
3862
|
+
* - The overlay covers the entire parent element using inset: 0
|
|
3863
|
+
* - Spinner animation runs continuously at 0.6s per rotation
|
|
3864
|
+
*/
|
|
3865
|
+
declare class DsMobileLoaderOverlayComponent {
|
|
3866
|
+
/**
|
|
3867
|
+
* Size of the spinner in pixels
|
|
3868
|
+
* @default 24
|
|
3869
|
+
*/
|
|
3870
|
+
spinnerSize: _angular_core.InputSignal<number>;
|
|
3871
|
+
/**
|
|
3872
|
+
* Border radius of the overlay in pixels (should match parent's border radius)
|
|
3873
|
+
* @default 0
|
|
3874
|
+
*/
|
|
3875
|
+
borderRadius: _angular_core.InputSignal<number>;
|
|
3876
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileLoaderOverlayComponent, never>;
|
|
3877
|
+
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>;
|
|
3484
3878
|
}
|
|
3485
3879
|
|
|
3486
3880
|
/**
|
|
@@ -3742,6 +4136,29 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
3742
4136
|
* @default false
|
|
3743
4137
|
*/
|
|
3744
4138
|
hasFixedBottom: _angular_core.InputSignal<boolean>;
|
|
4139
|
+
/**
|
|
4140
|
+
* Content padding for modal content
|
|
4141
|
+
* Controls padding inside .modal-main-content
|
|
4142
|
+
* - '0' (default) - No padding, use ds-mobile-section for content organization
|
|
4143
|
+
* - '20px' - Legacy padding for content without sections
|
|
4144
|
+
* - Any custom CSS padding value
|
|
4145
|
+
*
|
|
4146
|
+
* @default '0'
|
|
4147
|
+
*
|
|
4148
|
+
* @example
|
|
4149
|
+
* ```html
|
|
4150
|
+
* <!-- Default: sections handle padding -->
|
|
4151
|
+
* <ds-mobile-modal-base headerTitle="Details">
|
|
4152
|
+
* <ds-mobile-section headline="Info">...</ds-mobile-section>
|
|
4153
|
+
* </ds-mobile-modal-base>
|
|
4154
|
+
*
|
|
4155
|
+
* <!-- Legacy: content without sections -->
|
|
4156
|
+
* <ds-mobile-modal-base headerTitle="Details" contentPadding="20px">
|
|
4157
|
+
* <div>Padded content</div>
|
|
4158
|
+
* </ds-mobile-modal-base>
|
|
4159
|
+
* ```
|
|
4160
|
+
*/
|
|
4161
|
+
contentPadding: _angular_core.InputSignal<string>;
|
|
3745
4162
|
/**
|
|
3746
4163
|
* Emitted when modal is closed
|
|
3747
4164
|
*/
|
|
@@ -3783,7 +4200,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
3783
4200
|
*/
|
|
3784
4201
|
protected cleanupKeyboardListeners(): void;
|
|
3785
4202
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileModalBase, 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>;
|
|
4203
|
+
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>;
|
|
3787
4204
|
}
|
|
3788
4205
|
|
|
3789
4206
|
/**
|
|
@@ -4578,7 +4995,7 @@ interface ChatParticipant {
|
|
|
4578
4995
|
*
|
|
4579
4996
|
* Represents the data needed to display a chat conversation.
|
|
4580
4997
|
*
|
|
4581
|
-
* @example
|
|
4998
|
+
* @example
|
|
4582
4999
|
* ```typescript
|
|
4583
5000
|
* const chatData: ChatModalData = {
|
|
4584
5001
|
* participant: {
|
|
@@ -4774,7 +5191,7 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
|
|
|
4774
5191
|
/**
|
|
4775
5192
|
* Get file variant for card-inline-file component
|
|
4776
5193
|
*/
|
|
4777
|
-
getFileVariant(type: string):
|
|
5194
|
+
getFileVariant(type: string): 'pdf' | 'doc';
|
|
4778
5195
|
/**
|
|
4779
5196
|
* Handle file attachment click
|
|
4780
5197
|
*/
|
|
@@ -5203,6 +5620,7 @@ interface ContactItem {
|
|
|
5203
5620
|
* This component is typically not used directly - use DsMobileHandbookDetailModalService instead.
|
|
5204
5621
|
*/
|
|
5205
5622
|
declare class DsMobileHandbookDetailModalComponent implements OnInit {
|
|
5623
|
+
private modalController;
|
|
5206
5624
|
handbookData: HandbookDetailData;
|
|
5207
5625
|
/**
|
|
5208
5626
|
* Loading state - when true, shows loading indicator
|
|
@@ -5213,6 +5631,7 @@ declare class DsMobileHandbookDetailModalComponent implements OnInit {
|
|
|
5213
5631
|
*/
|
|
5214
5632
|
error?: string;
|
|
5215
5633
|
handbook: _angular_core.WritableSignal<HandbookDetailData>;
|
|
5634
|
+
constructor(modalController: ModalController);
|
|
5216
5635
|
ngOnInit(): void;
|
|
5217
5636
|
/**
|
|
5218
5637
|
* Split handbook items to enforce content structure rules:
|
|
@@ -5228,9 +5647,17 @@ declare class DsMobileHandbookDetailModalComponent implements OnInit {
|
|
|
5228
5647
|
*/
|
|
5229
5648
|
getDisplayItems(): HandbookItem[];
|
|
5230
5649
|
/**
|
|
5231
|
-
* Handle contact click
|
|
5650
|
+
* Handle contact click - shows bottom sheet with call and copy actions
|
|
5651
|
+
*/
|
|
5652
|
+
handleContactClick(contact: ContactItem): Promise<void>;
|
|
5653
|
+
/**
|
|
5654
|
+
* Handle the selected contact action
|
|
5655
|
+
*/
|
|
5656
|
+
private handleContactAction;
|
|
5657
|
+
/**
|
|
5658
|
+
* Fallback method for copying text to clipboard (for older browsers/webviews)
|
|
5232
5659
|
*/
|
|
5233
|
-
|
|
5660
|
+
private fallbackCopyToClipboard;
|
|
5234
5661
|
/**
|
|
5235
5662
|
* Handle attachment click
|
|
5236
5663
|
*/
|
|
@@ -5589,6 +6016,45 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
|
|
|
5589
6016
|
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>;
|
|
5590
6017
|
}
|
|
5591
6018
|
|
|
6019
|
+
type AppIconSize = 'sm' | 'md' | 'lg' | 'xl';
|
|
6020
|
+
/**
|
|
6021
|
+
* DsAppIconComponent
|
|
6022
|
+
*
|
|
6023
|
+
* Displays the organization's logomark styled as an app icon with rounded corners
|
|
6024
|
+
* and shadow. The logomark fill color adapts to the background.
|
|
6025
|
+
* Perfect for sign-in pages, splash screens, etc.
|
|
6026
|
+
*
|
|
6027
|
+
* Uses percentage-based padding and border-radius for perfect proportional scaling.
|
|
6028
|
+
*
|
|
6029
|
+
* @example
|
|
6030
|
+
* Sign-in page (large):
|
|
6031
|
+
* ```html
|
|
6032
|
+
* <ds-app-icon size="xl" />
|
|
6033
|
+
* ```
|
|
6034
|
+
*
|
|
6035
|
+
* Settings preview (small):
|
|
6036
|
+
* ```html
|
|
6037
|
+
* <ds-app-icon size="sm" />
|
|
6038
|
+
* ```
|
|
6039
|
+
*/
|
|
6040
|
+
declare class DsAppIconComponent {
|
|
6041
|
+
whitelabelService: WhitelabelService;
|
|
6042
|
+
/**
|
|
6043
|
+
* Size of the app icon
|
|
6044
|
+
* - sm: 16x16px (padding: 2.4px, radius: 3.2px)
|
|
6045
|
+
* - md: 32x32px (padding: 4.8px, radius: 6.4px)
|
|
6046
|
+
* - lg: 48x48px (padding: 7.2px, radius: 9.6px)
|
|
6047
|
+
* - xl: 64x64px (padding: 9.6px, radius: 12.8px)
|
|
6048
|
+
*/
|
|
6049
|
+
size: AppIconSize;
|
|
6050
|
+
/**
|
|
6051
|
+
* Computed CSS class for size variant
|
|
6052
|
+
*/
|
|
6053
|
+
sizeClass: _angular_core.Signal<string>;
|
|
6054
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAppIconComponent, never>;
|
|
6055
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsAppIconComponent, "ds-app-icon", never, { "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
|
|
6056
|
+
}
|
|
6057
|
+
|
|
5592
6058
|
type AvatarType = 'initials' | 'photo' | 'icon';
|
|
5593
6059
|
type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
5594
6060
|
type BadgePosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
@@ -5618,6 +6084,11 @@ declare class DsAvatarWithBadgeComponent {
|
|
|
5618
6084
|
showBadge: boolean;
|
|
5619
6085
|
badgePosition: BadgePosition;
|
|
5620
6086
|
badgeClasses: _angular_core.Signal<string>;
|
|
6087
|
+
/**
|
|
6088
|
+
* Computed badge icon size that scales with avatar size
|
|
6089
|
+
* Maps avatar sizes to appropriate app icon sizes
|
|
6090
|
+
*/
|
|
6091
|
+
badgeIconSize: _angular_core.Signal<AppIconSize>;
|
|
5621
6092
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsAvatarWithBadgeComponent, never>;
|
|
5622
6093
|
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>;
|
|
5623
6094
|
}
|
|
@@ -5638,7 +6109,7 @@ declare class DsAvatarWithBadgeComponent {
|
|
|
5638
6109
|
* ```html
|
|
5639
6110
|
* <!-- With image -->
|
|
5640
6111
|
* <ds-mobile-empty-state
|
|
5641
|
-
* [imageSrc]="'/Assets/
|
|
6112
|
+
* [imageSrc]="'/Assets/empty-state-inquiry.svg'"
|
|
5642
6113
|
* [imageAlt]="'No messages'"
|
|
5643
6114
|
* [title]="'Ingen beskeder endnu'"
|
|
5644
6115
|
* [description]="'Start samtalen ved at sende en besked'">
|
|
@@ -5672,6 +6143,126 @@ declare class DsMobileEmptyStateComponent {
|
|
|
5672
6143
|
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>;
|
|
5673
6144
|
}
|
|
5674
6145
|
|
|
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
|
+
|
|
5675
6266
|
/**
|
|
5676
6267
|
* User service for managing current user data globally
|
|
5677
6268
|
*/
|
|
@@ -5684,6 +6275,8 @@ declare class UserService {
|
|
|
5684
6275
|
readonly avatarType: _angular_core.Signal<"initials" | "photo" | "icon">;
|
|
5685
6276
|
readonly avatarSrc: _angular_core.Signal<string>;
|
|
5686
6277
|
readonly profileMenuItems: _angular_core.Signal<ActionGroup[] | undefined>;
|
|
6278
|
+
private profileActionSelectedSubject;
|
|
6279
|
+
readonly profileActionSelected$: rxjs.Observable<ActionResult>;
|
|
5687
6280
|
/**
|
|
5688
6281
|
* Update avatar configuration
|
|
5689
6282
|
*/
|
|
@@ -5696,6 +6289,10 @@ declare class UserService {
|
|
|
5696
6289
|
* if they don't receive profileMenuItems as an input.
|
|
5697
6290
|
*/
|
|
5698
6291
|
setProfileMenuItems(items: ActionGroup[]): void;
|
|
6292
|
+
/**
|
|
6293
|
+
* Notify subscribers that a profile action was selected
|
|
6294
|
+
*/
|
|
6295
|
+
notifyProfileAction(result: ActionResult): void;
|
|
5699
6296
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserService, never>;
|
|
5700
6297
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserService>;
|
|
5701
6298
|
}
|
|
@@ -5808,7 +6405,10 @@ declare class MobileCommunityPageComponent {
|
|
|
5808
6405
|
private postModal;
|
|
5809
6406
|
userService: UserService;
|
|
5810
6407
|
private postsService;
|
|
6408
|
+
pageComponent: DsMobilePageMainComponent;
|
|
6409
|
+
pinnedSwiper?: DsMobileSwiperComponent;
|
|
5811
6410
|
allPosts: _angular_core.Signal<Post[]>;
|
|
6411
|
+
pinnedPosts: _angular_core.Signal<Post[]>;
|
|
5812
6412
|
hasAnyPosts: _angular_core.Signal<boolean>;
|
|
5813
6413
|
hasMorePosts: _angular_core.Signal<boolean>;
|
|
5814
6414
|
constructor(router: Router, route: ActivatedRoute, bottomSheet: DsMobileBottomSheetService, lightbox: DsMobileLightboxService, postModal: DsMobilePostDetailModalService, userService: UserService, postsService: PostsService);
|
|
@@ -5834,12 +6434,29 @@ declare class MobileCommunityPageComponent {
|
|
|
5834
6434
|
* Handle long press on a post to show action sheet
|
|
5835
6435
|
*/
|
|
5836
6436
|
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;
|
|
5837
6453
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileCommunityPageComponent, never>;
|
|
5838
6454
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileCommunityPageComponent, "app-mobile-community-page", never, {}, {}, never, never, true, never>;
|
|
5839
6455
|
}
|
|
5840
6456
|
|
|
5841
6457
|
declare class MobileHandbookPageComponent {
|
|
5842
6458
|
userService: UserService;
|
|
6459
|
+
pageComponent: DsMobilePageMainComponent;
|
|
5843
6460
|
utilitiesItems: HandbookItem[];
|
|
5844
6461
|
sikkerhedsudstyrItems: HandbookItem[];
|
|
5845
6462
|
serviceContractsItems: HandbookItem[];
|
|
@@ -5851,13 +6468,26 @@ declare class MobileHandbookPageComponent {
|
|
|
5851
6468
|
}
|
|
5852
6469
|
|
|
5853
6470
|
declare class MobileHomePageComponent {
|
|
5854
|
-
private
|
|
6471
|
+
private router;
|
|
5855
6472
|
userService: UserService;
|
|
5856
|
-
|
|
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);
|
|
5857
6486
|
handleRefresh(event: any): void;
|
|
5858
|
-
|
|
5859
|
-
|
|
5860
|
-
|
|
6487
|
+
openPost(postId: string, focusComment?: boolean): Promise<void>;
|
|
6488
|
+
openInquiryDetail(inquiryId: string): void;
|
|
6489
|
+
navigateToCommunity(): void;
|
|
6490
|
+
navigateToInquiries(): void;
|
|
5861
6491
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHomePageComponent, never>;
|
|
5862
6492
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHomePageComponent, "app-home-page", never, {}, {}, never, never, true, never>;
|
|
5863
6493
|
}
|
|
@@ -5874,6 +6504,7 @@ declare class MobileInquiriesPageComponent {
|
|
|
5874
6504
|
userService: UserService;
|
|
5875
6505
|
private navCtrl;
|
|
5876
6506
|
private newInquiryModal;
|
|
6507
|
+
pageComponent: DsMobilePageMainComponent;
|
|
5877
6508
|
constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
|
|
5878
6509
|
filterStatus: _angular_core.WritableSignal<"open" | "closed" | "all">;
|
|
5879
6510
|
tabItems: InlineTabItem[];
|
|
@@ -5911,6 +6542,7 @@ declare class MobileInquiryDetailPageComponent {
|
|
|
5911
6542
|
messageThreads: MessageThread[];
|
|
5912
6543
|
unreadMessagesCount: _angular_core.Signal<number>;
|
|
5913
6544
|
photos: LightboxImage[];
|
|
6545
|
+
get photoUrls(): string[];
|
|
5914
6546
|
constructor(userService: UserService, lightbox: DsMobileLightboxService, chatModal: DsMobileChatModalService);
|
|
5915
6547
|
setActiveTab(tabId: string): void;
|
|
5916
6548
|
goBack(): void;
|
|
@@ -5956,6 +6588,9 @@ declare class MobileTabsExampleComponent implements OnInit {
|
|
|
5956
6588
|
* Handle profile menu action selection.
|
|
5957
6589
|
* The tab bar component handles the UI (opening/closing menu),
|
|
5958
6590
|
* 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.
|
|
5959
6594
|
*/
|
|
5960
6595
|
handleProfileAction(result: ActionResult): void;
|
|
5961
6596
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileTabsExampleComponent, never>;
|
|
@@ -6015,40 +6650,127 @@ declare class MobilePostDetailPageComponent {
|
|
|
6015
6650
|
*
|
|
6016
6651
|
* Sign-in page with email authentication.
|
|
6017
6652
|
* Features logomark, decorative city background, and form validation.
|
|
6653
|
+
* Auto-focuses email input on iOS to trigger keyboard.
|
|
6018
6654
|
*/
|
|
6019
|
-
declare class SignInPageComponent {
|
|
6655
|
+
declare class SignInPageComponent implements AfterViewInit, OnDestroy {
|
|
6656
|
+
emailInputRef?: ElementRef;
|
|
6657
|
+
whitelabelService: WhitelabelService;
|
|
6020
6658
|
email: string;
|
|
6021
6659
|
emailError: _angular_core.WritableSignal<boolean>;
|
|
6022
6660
|
isSubmitting: _angular_core.WritableSignal<boolean>;
|
|
6023
6661
|
emailSent: _angular_core.WritableSignal<boolean>;
|
|
6662
|
+
ngAfterViewInit(): void;
|
|
6663
|
+
/**
|
|
6664
|
+
* Show the keyboard on mobile platforms
|
|
6665
|
+
*/
|
|
6666
|
+
private showKeyboard;
|
|
6024
6667
|
handleSubmit(): void;
|
|
6025
6668
|
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;
|
|
6026
6682
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignInPageComponent, never>;
|
|
6027
6683
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignInPageComponent, "app-sign-in", never, {}, {}, never, never, true, never>;
|
|
6028
6684
|
}
|
|
6029
6685
|
|
|
6030
6686
|
/**
|
|
6031
|
-
* Whitelabel Demo
|
|
6687
|
+
* Whitelabel Demo Modal Component
|
|
6032
6688
|
*
|
|
6033
6689
|
* Demonstrates the whitelabeling system with theme selection, brand colors, and logo previews.
|
|
6690
|
+
* Opens as a full-screen modal similar to post details.
|
|
6034
6691
|
*/
|
|
6035
|
-
declare class
|
|
6692
|
+
declare class WhitelabelDemoModalComponent implements OnInit {
|
|
6036
6693
|
whitelabelService: WhitelabelService;
|
|
6694
|
+
private modalController;
|
|
6037
6695
|
currentTheme: string;
|
|
6038
|
-
|
|
6039
|
-
|
|
6040
|
-
|
|
6041
|
-
|
|
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;
|
|
6042
6708
|
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;
|
|
6043
6717
|
applyDefaultTheme(): void;
|
|
6044
6718
|
applyCejTheme(): void;
|
|
6045
6719
|
applyPkaTheme(): void;
|
|
6046
6720
|
applyClaveTheme(): void;
|
|
6047
6721
|
applyFreedomTheme(): void;
|
|
6048
6722
|
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;
|
|
6049
6730
|
private updateCustomColorInputs;
|
|
6050
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<
|
|
6051
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<
|
|
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>;
|
|
6052
6774
|
}
|
|
6053
6775
|
|
|
6054
6776
|
/**
|
|
@@ -6073,5 +6795,5 @@ declare const customPageTransition: (_: HTMLElement, opts: any) => Animation;
|
|
|
6073
6795
|
*/
|
|
6074
6796
|
declare const customBackTransition: (_: HTMLElement, opts: any) => Animation;
|
|
6075
6797
|
|
|
6076
|
-
export { ActionCommentComponent, ActionLikeComponent, ContentRowComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAttachmentPreviewComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileContactListItemComponent, DsMobileContentComponent,
|
|
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 };
|
|
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 };
|