@propbinder/mobile-design 0.4.4 → 0.4.43

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.
@@ -83,6 +83,7 @@ class WhitelabelService {
83
83
  // Readonly computed signals for accessing config values
84
84
  logoUrl = computed(() => this._config().logoUrl, ...(ngDevMode ? [{ debugName: "logoUrl" }] : []));
85
85
  logoMarkUrl = computed(() => this._config().logoMarkUrl, ...(ngDevMode ? [{ debugName: "logoMarkUrl" }] : []));
86
+ headerLogoUrl = computed(() => this._config().headerLogoUrl ?? '', ...(ngDevMode ? [{ debugName: "headerLogoUrl" }] : []));
86
87
  logoAlt = computed(() => this._config().logoAlt, ...(ngDevMode ? [{ debugName: "logoAlt" }] : []));
87
88
  logoSize = computed(() => this._config().logoSize, ...(ngDevMode ? [{ debugName: "logoSize" }] : []));
88
89
  logoHeight = computed(() => {
@@ -601,6 +602,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
601
602
  * ```html
602
603
  * <ds-logo variant="mark" size="sm" />
603
604
  * ```
605
+ *
606
+ * Header logo (uses optional headerLogoUrl override, else falls back to the full logo):
607
+ * ```html
608
+ * <ds-logo variant="header" size="lg" />
609
+ * ```
604
610
  */
605
611
  class DsLogoComponent {
606
612
  whitelabelService = inject(WhitelabelService);
@@ -611,6 +617,11 @@ class DsLogoComponent {
611
617
  get logoSrc() {
612
618
  const logoUrl = this.whitelabelService.logoUrl();
613
619
  const logoMarkUrl = this.whitelabelService.logoMarkUrl();
620
+ if (this.variant === 'header') {
621
+ // Header override: prefer headerLogoUrl, fall back to the full logo, then logomark
622
+ const headerLogoUrl = this.whitelabelService.headerLogoUrl();
623
+ return headerLogoUrl || logoUrl || logoMarkUrl;
624
+ }
614
625
  if (this.variant === 'full') {
615
626
  // Use logo, fall back to logomark if logo doesn't exist
616
627
  return logoUrl || logoMarkUrl;
@@ -622,7 +633,8 @@ class DsLogoComponent {
622
633
  }
623
634
  get logoAlt() {
624
635
  const alt = this.whitelabelService.logoAlt();
625
- return this.variant === 'full' ? alt : `${alt} logo`;
636
+ // 'mark' is the compact logomark; 'full' and 'header' show the wordmark
637
+ return this.variant === 'mark' ? `${alt} logo` : alt;
626
638
  }
627
639
  /**
628
640
  * Priority: customHeight input > whitelabel config logoHeight > default 32px
@@ -632,7 +644,7 @@ class DsLogoComponent {
632
644
  }
633
645
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
634
646
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.23", type: DsLogoComponent, isStandalone: true, selector: "ds-logo", inputs: { variant: "variant", size: "size", customHeight: "customHeight", customWidth: "customWidth" }, ngImport: i0, template: `
635
- <img
647
+ <img
636
648
  [src]="logoSrc"
637
649
  [alt]="logoAlt"
638
650
  class="logo"
@@ -645,7 +657,7 @@ class DsLogoComponent {
645
657
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsLogoComponent, decorators: [{
646
658
  type: Component,
647
659
  args: [{ selector: 'ds-logo', standalone: true, imports: [CommonModule], template: `
648
- <img
660
+ <img
649
661
  [src]="logoSrc"
650
662
  [alt]="logoAlt"
651
663
  class="logo"
@@ -1923,23 +1935,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
1923
1935
  */
1924
1936
  class DsMobileActionsBottomSheetComponent {
1925
1937
  modalController;
1926
- /**
1927
- * Custom action groups to display (overrides isOwnContent)
1928
- */
1938
+ /** Custom action groups to display (overrides isOwnContent). Set via Ionic componentProps. */
1929
1939
  customActionGroups;
1930
- /**
1931
- * Whether this content belongs to the current user (for preset content actions)
1932
- */
1940
+ /** Whether this content belongs to the current user (for preset content actions). */
1933
1941
  isOwnContent = false;
1934
- /**
1935
- * Computed action groups - uses custom groups if provided, otherwise falls back to preset content actions
1936
- */
1937
- actionGroups = computed(() => {
1938
- // Use custom action groups if provided
1939
- if (this.customActionGroups) {
1942
+ get actionGroups() {
1943
+ if (this.customActionGroups?.length) {
1940
1944
  return this.customActionGroups;
1941
1945
  }
1942
- // Otherwise fall back to preset content actions
1943
1946
  if (this.isOwnContent) {
1944
1947
  // Own content: Group 1 (Edit, Delete) + Group 2 (Like, Reply)
1945
1948
  return [
@@ -1998,7 +2001,7 @@ class DsMobileActionsBottomSheetComponent {
1998
2001
  },
1999
2002
  ];
2000
2003
  }
2001
- }, ...(ngDevMode ? [{ debugName: "actionGroups" }] : []));
2004
+ }
2002
2005
  constructor(modalController) {
2003
2006
  this.modalController = modalController;
2004
2007
  }
@@ -2013,7 +2016,7 @@ class DsMobileActionsBottomSheetComponent {
2013
2016
  <ds-mobile-bottom-sheet-wrapper>
2014
2017
  <!-- Actions List -->
2015
2018
  <div class="actions-list">
2016
- @for (group of actionGroups(); track $index; let isLast = $last) {
2019
+ @for (group of actionGroups; track $index; let isLast = $last) {
2017
2020
  <!-- Action Group -->
2018
2021
  <div class="action-group">
2019
2022
  @for (actionItem of group.actions; track actionItem.action; let isLastInGroup = $last) {
@@ -2042,7 +2045,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
2042
2045
  <ds-mobile-bottom-sheet-wrapper>
2043
2046
  <!-- Actions List -->
2044
2047
  <div class="actions-list">
2045
- @for (group of actionGroups(); track $index; let isLast = $last) {
2048
+ @for (group of actionGroups; track $index; let isLast = $last) {
2046
2049
  <!-- Action Group -->
2047
2050
  <div class="action-group">
2048
2051
  @for (actionItem of group.actions; track actionItem.action; let isLastInGroup = $last) {
@@ -2110,6 +2113,11 @@ function disableModalShadowPointerEvents(modal) {
2110
2113
  }, { once: true });
2111
2114
  }
2112
2115
 
2116
+ var modalShadowFix = /*#__PURE__*/Object.freeze({
2117
+ __proto__: null,
2118
+ disableModalShadowPointerEvents: disableModalShadowPointerEvents
2119
+ });
2120
+
2113
2121
  /**
2114
2122
  * DsMobileBottomSheetService
2115
2123
  *
@@ -4602,6 +4610,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
4602
4610
  class UserService {
4603
4611
  // User identity
4604
4612
  _displayName = signal('', ...(ngDevMode ? [{ debugName: "_displayName" }] : []));
4613
+ _email = signal('lars.m@email.dk', ...(ngDevMode ? [{ debugName: "_email" }] : []));
4614
+ _phone = signal('+45 28 91 44 02', ...(ngDevMode ? [{ debugName: "_phone" }] : []));
4605
4615
  _address = signal('', ...(ngDevMode ? [{ debugName: "_address" }] : []));
4606
4616
  // User avatar configuration
4607
4617
  _avatarInitials = signal('LM', ...(ngDevMode ? [{ debugName: "_avatarInitials" }] : []));
@@ -4611,6 +4621,8 @@ class UserService {
4611
4621
  _profileMenuItems = signal(undefined, ...(ngDevMode ? [{ debugName: "_profileMenuItems" }] : []));
4612
4622
  // Readonly computed values
4613
4623
  displayName = this._displayName.asReadonly();
4624
+ email = this._email.asReadonly();
4625
+ phone = this._phone.asReadonly();
4614
4626
  address = this._address.asReadonly();
4615
4627
  avatarInitials = this._avatarInitials.asReadonly();
4616
4628
  avatarType = this._avatarType.asReadonly();
@@ -4622,6 +4634,12 @@ class UserService {
4622
4634
  setDisplayName(name) {
4623
4635
  this._displayName.set(name);
4624
4636
  }
4637
+ setEmail(email) {
4638
+ this._email.set(email);
4639
+ }
4640
+ setPhone(phone) {
4641
+ this._phone.set(phone);
4642
+ }
4625
4643
  setAddress(address) {
4626
4644
  this._address.set(address);
4627
4645
  }
@@ -6251,8 +6269,8 @@ class DsMobilePageMainComponent extends MobilePageBase {
6251
6269
  <ion-header>
6252
6270
  <ion-toolbar>
6253
6271
  <div class="header-main">
6254
- <!-- Whitelabel logo (full in header, logomark used for app icon/avatars) -->
6255
- <ds-logo variant="full" size="lg" [class.logo--first-entry]="firstEntry()" />
6272
+ <!-- Whitelabel logo (header variant: headerLogoUrl override, else full logo) -->
6273
+ <ds-logo variant="header" size="lg" [class.logo--first-entry]="firstEntry()" />
6256
6274
 
6257
6275
  <!-- Title - fades in on scroll -->
6258
6276
  <ion-title class="header-main__title">{{ title() }}</ion-title>
@@ -6340,8 +6358,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
6340
6358
  <ion-header>
6341
6359
  <ion-toolbar>
6342
6360
  <div class="header-main">
6343
- <!-- Whitelabel logo (full in header, logomark used for app icon/avatars) -->
6344
- <ds-logo variant="full" size="lg" [class.logo--first-entry]="firstEntry()" />
6361
+ <!-- Whitelabel logo (header variant: headerLogoUrl override, else full logo) -->
6362
+ <ds-logo variant="header" size="lg" [class.logo--first-entry]="firstEntry()" />
6345
6363
 
6346
6364
  <!-- Title - fades in on scroll -->
6347
6365
  <ion-title class="header-main__title">{{ title() }}</ion-title>
@@ -11628,6 +11646,11 @@ class MobileModalBase {
11628
11646
  * @default 'follow'
11629
11647
  */
11630
11648
  keyboardContentBehavior = input('follow', ...(ngDevMode ? [{ debugName: "keyboardContentBehavior" }] : []));
11649
+ /**
11650
+ * Show border below the header
11651
+ * @default true
11652
+ */
11653
+ showHeaderBorder = input(true, ...(ngDevMode ? [{ debugName: "showHeaderBorder" }] : []));
11631
11654
  /**
11632
11655
  * Optional interceptor called instead of the default dismiss when the close button is tapped.
11633
11656
  * Return a function to take over close behavior (e.g. navigate back within the modal).
@@ -11930,14 +11953,14 @@ class MobileModalBase {
11930
11953
  return fixedBottomHeight + keyboardHeight;
11931
11954
  }
11932
11955
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileModalBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
11933
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.23", type: MobileModalBase, isStandalone: true, inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerMeta: { classPropertyName: "headerMeta", publicName: "headerMeta", isSignal: true, isRequired: false, transformFunction: null }, closeButtonLabel: { classPropertyName: "closeButtonLabel", publicName: "closeButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, enableKeyboardHandling: { classPropertyName: "enableKeyboardHandling", publicName: "enableKeyboardHandling", isSignal: true, isRequired: false, transformFunction: null }, hasFixedBottom: { classPropertyName: "hasFixedBottom", publicName: "hasFixedBottom", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null }, isAutoHeight: { classPropertyName: "isAutoHeight", publicName: "isAutoHeight", isSignal: true, isRequired: false, transformFunction: null }, keyboardContentBehavior: { classPropertyName: "keyboardContentBehavior", publicName: "keyboardContentBehavior", isSignal: true, isRequired: false, transformFunction: null }, onCloseRequest: { classPropertyName: "onCloseRequest", publicName: "onCloseRequest", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", keyboardWillShow: "keyboardWillShow", keyboardWillHide: "keyboardWillHide" }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], ngImport: i0 });
11956
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.23", type: MobileModalBase, isStandalone: true, inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerMeta: { classPropertyName: "headerMeta", publicName: "headerMeta", isSignal: true, isRequired: false, transformFunction: null }, closeButtonLabel: { classPropertyName: "closeButtonLabel", publicName: "closeButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, enableKeyboardHandling: { classPropertyName: "enableKeyboardHandling", publicName: "enableKeyboardHandling", isSignal: true, isRequired: false, transformFunction: null }, hasFixedBottom: { classPropertyName: "hasFixedBottom", publicName: "hasFixedBottom", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null }, isAutoHeight: { classPropertyName: "isAutoHeight", publicName: "isAutoHeight", isSignal: true, isRequired: false, transformFunction: null }, keyboardContentBehavior: { classPropertyName: "keyboardContentBehavior", publicName: "keyboardContentBehavior", isSignal: true, isRequired: false, transformFunction: null }, showHeaderBorder: { classPropertyName: "showHeaderBorder", publicName: "showHeaderBorder", isSignal: true, isRequired: false, transformFunction: null }, onCloseRequest: { classPropertyName: "onCloseRequest", publicName: "onCloseRequest", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", keyboardWillShow: "keyboardWillShow", keyboardWillHide: "keyboardWillHide" }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], ngImport: i0 });
11934
11957
  }
11935
11958
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileModalBase, decorators: [{
11936
11959
  type: Directive
11937
11960
  }], propDecorators: { ionContent: [{
11938
11961
  type: ViewChild,
11939
11962
  args: [IonContent, { read: IonContent }]
11940
- }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerMeta: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerMeta", required: false }] }], closeButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButtonLabel", required: false }] }], enableKeyboardHandling: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableKeyboardHandling", required: false }] }], hasFixedBottom: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasFixedBottom", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], isAutoHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAutoHeight", required: false }] }], keyboardContentBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardContentBehavior", required: false }] }], onCloseRequest: [{ type: i0.Input, args: [{ isSignal: true, alias: "onCloseRequest", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], keyboardWillShow: [{ type: i0.Output, args: ["keyboardWillShow"] }], keyboardWillHide: [{ type: i0.Output, args: ["keyboardWillHide"] }] } });
11963
+ }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerMeta: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerMeta", required: false }] }], closeButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButtonLabel", required: false }] }], enableKeyboardHandling: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableKeyboardHandling", required: false }] }], hasFixedBottom: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasFixedBottom", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], isAutoHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAutoHeight", required: false }] }], keyboardContentBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardContentBehavior", required: false }] }], showHeaderBorder: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeaderBorder", required: false }] }], onCloseRequest: [{ type: i0.Input, args: [{ isSignal: true, alias: "onCloseRequest", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], keyboardWillShow: [{ type: i0.Output, args: ["keyboardWillShow"] }], keyboardWillHide: [{ type: i0.Output, args: ["keyboardWillHide"] }] } });
11941
11964
 
11942
11965
  /**
11943
11966
  * DsMobileModalBaseComponent
@@ -12113,7 +12136,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12113
12136
  <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12114
12137
  <!-- Header (conditional) -->
12115
12138
  @if (shouldShowHeader()) {
12116
- <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()">
12139
+ <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()" [class.no-border]="!showHeaderBorder()">
12117
12140
  <div class="header-content">
12118
12141
  <!-- Leading slot (avatar, icon) - always rendered, CSS handles empty state -->
12119
12142
  <div class="header-leading">
@@ -12200,7 +12223,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12200
12223
  <ng-content select="[fixed-bottom]"></ng-content>
12201
12224
  <ng-content select="[footer]"></ng-content>
12202
12225
  </div>
12203
- `, isInline: true, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.modal-header.no-leading-content{padding-left:20px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-trailing{flex-shrink:0;display:flex;align-items:center;gap:4px}.header-trailing:empty{display:none}.modal-header.no-leading-content .header-content,.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}button.modal-title--interactive{display:block;width:100%;font:inherit;font-weight:600;letter-spacing:inherit;line-height:20px;text-align:left;background:none;border:none;padding:0;margin:0;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}button.modal-title--interactive:focus-visible{outline:2px solid var(--color-accent, #6b5ff5);outline-offset:2px;border-radius:4px}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.header-below:empty{display:none}.header-below{margin-top:12px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:max(8px,calc(var(--app-safe-bottom, 0px) - 24px))}:host-context(.plt-android) .modal-fixed-bottom{padding-bottom:max(8px,var(--app-safe-bottom, 0px));transform:none;transition:none}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff);padding-bottom:var(--keyboard-height, 0px);transition:padding-bottom .3s cubic-bezier(.215,.61,.355,1)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }] });
12226
+ `, isInline: true, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.modal-header.no-border{border-bottom:none}.modal-header.no-leading-content{padding-left:20px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-trailing{flex-shrink:0;display:flex;align-items:center;gap:4px}.header-trailing:empty{display:none}.modal-header.no-leading-content .header-content,.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}button.modal-title--interactive{display:block;width:100%;font:inherit;font-weight:600;letter-spacing:inherit;line-height:20px;text-align:left;background:none;border:none;padding:0;margin:0;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}button.modal-title--interactive:focus-visible{outline:2px solid var(--color-accent, #6b5ff5);outline-offset:2px;border-radius:4px}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.header-below:empty{display:none}.header-below{margin-top:12px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:max(8px,calc(var(--app-safe-bottom, 0px) - 24px))}:host-context(.plt-android) .modal-fixed-bottom{padding-bottom:max(8px,var(--app-safe-bottom, 0px));transform:none;transition:none}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff);padding-bottom:var(--keyboard-height, 0px);transition:padding-bottom .3s cubic-bezier(.215,.61,.355,1)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }] });
12204
12227
  }
12205
12228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsMobileModalBaseComponent, decorators: [{
12206
12229
  type: Component,
@@ -12218,7 +12241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
12218
12241
  <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12219
12242
  <!-- Header (conditional) -->
12220
12243
  @if (shouldShowHeader()) {
12221
- <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()">
12244
+ <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()" [class.no-border]="!showHeaderBorder()">
12222
12245
  <div class="header-content">
12223
12246
  <!-- Leading slot (avatar, icon) - always rendered, CSS handles empty state -->
12224
12247
  <div class="header-leading">
@@ -12305,7 +12328,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
12305
12328
  <ng-content select="[fixed-bottom]"></ng-content>
12306
12329
  <ng-content select="[footer]"></ng-content>
12307
12330
  </div>
12308
- `, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.modal-header.no-leading-content{padding-left:20px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-trailing{flex-shrink:0;display:flex;align-items:center;gap:4px}.header-trailing:empty{display:none}.modal-header.no-leading-content .header-content,.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}button.modal-title--interactive{display:block;width:100%;font:inherit;font-weight:600;letter-spacing:inherit;line-height:20px;text-align:left;background:none;border:none;padding:0;margin:0;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}button.modal-title--interactive:focus-visible{outline:2px solid var(--color-accent, #6b5ff5);outline-offset:2px;border-radius:4px}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.header-below:empty{display:none}.header-below{margin-top:12px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:max(8px,calc(var(--app-safe-bottom, 0px) - 24px))}:host-context(.plt-android) .modal-fixed-bottom{padding-bottom:max(8px,var(--app-safe-bottom, 0px));transform:none;transition:none}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff);padding-bottom:var(--keyboard-height, 0px);transition:padding-bottom .3s cubic-bezier(.215,.61,.355,1)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"] }]
12331
+ `, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.modal-header.no-border{border-bottom:none}.modal-header.no-leading-content{padding-left:20px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-trailing{flex-shrink:0;display:flex;align-items:center;gap:4px}.header-trailing:empty{display:none}.modal-header.no-leading-content .header-content,.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}button.modal-title--interactive{display:block;width:100%;font:inherit;font-weight:600;letter-spacing:inherit;line-height:20px;text-align:left;background:none;border:none;padding:0;margin:0;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}button.modal-title--interactive:focus-visible{outline:2px solid var(--color-accent, #6b5ff5);outline-offset:2px;border-radius:4px}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.header-below:empty{display:none}.header-below{margin-top:12px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:max(8px,calc(var(--app-safe-bottom, 0px) - 24px))}:host-context(.plt-android) .modal-fixed-bottom{padding-bottom:max(8px,var(--app-safe-bottom, 0px));transform:none;transition:none}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff);padding-bottom:var(--keyboard-height, 0px);transition:padding-bottom .3s cubic-bezier(.215,.61,.355,1)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"] }]
12309
12332
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { headerTitleInteractive: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitleInteractive", required: false }] }], textLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "textLoading", required: false }] }], textErrorTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "textErrorTitle", required: false }] }], titleClick: [{ type: i0.Output, args: ["titleClick"] }], ionContent: [{
12310
12333
  type: ViewChild,
12311
12334
  args: [IonContent, { read: IonContent }]
@@ -13541,7 +13564,6 @@ const DEFAULT_PANEL_LABELS = {
13541
13564
  groupNamePlaceholder: 'Gruppenavn',
13542
13565
  takePhoto: 'Tag et billede',
13543
13566
  chooseFromLibrary: 'Vælg fra bibliotek',
13544
- deletePhoto: 'Slet billede',
13545
13567
  };
13546
13568
  class DsMobileChatGroupPanelsComponent {
13547
13569
  modalCtrl = inject(ModalController);
@@ -13944,7 +13966,7 @@ class DsMobileChatGroupPanelsComponent {
13944
13966
  </ds-mobile-action-list-item>
13945
13967
  @if (editAvatarUrl()) {
13946
13968
  <ds-mobile-action-list-item
13947
- [title]="lbl().deletePhoto"
13969
+ [title]="'Slet billede'"
13948
13970
  [showDivider]="false"
13949
13971
  (itemClick)="deleteImage()">
13950
13972
  <ds-icon action-icon name="remixDeleteBinLine" size="24px" />
@@ -14167,7 +14189,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
14167
14189
  </ds-mobile-action-list-item>
14168
14190
  @if (editAvatarUrl()) {
14169
14191
  <ds-mobile-action-list-item
14170
- [title]="lbl().deletePhoto"
14192
+ [title]="'Slet billede'"
14171
14193
  [showDivider]="false"
14172
14194
  (itemClick)="deleteImage()">
14173
14195
  <ds-icon action-icon name="remixDeleteBinLine" size="24px" />
@@ -17152,6 +17174,7 @@ class DsMobileChatModalComponent {
17152
17174
  [loading]="loading"
17153
17175
  [error]="localError() || error"
17154
17176
  [showHeader]="true"
17177
+ [showHeaderBorder]="groupPanelView() === 'chat' || groupPanelView() === 'add-members'"
17155
17178
  [headerTitle]="groupHeaderTitle()"
17156
17179
  [headerMeta]="groupHeaderMeta()"
17157
17180
  [headerTitleInteractive]="groupHeaderTitleInteractive()"
@@ -17408,7 +17431,7 @@ class DsMobileChatModalComponent {
17408
17431
  </ds-mobile-message-composer>
17409
17432
  </div>
17410
17433
  </ds-mobile-modal-base>
17411
- `, isInline: true, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important;padding:0!important}:host ::ng-deep ds-textarea.ghost-input-clean .textarea-container{padding:0!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ":host ::ng-deep .modal-content-container{padding-top:0}:host-context(.chat-modal--settings) ::ng-deep .modal-header{border-bottom:none}:host-context(.chat-modal--add-members) ::ng-deep .modal-header{border-bottom:1px solid var(--border-color-default)}.chat-messages-container{display:flex;flex-direction:column;width:100%}.chat-system-line{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.35;color:var(--text-color-default-tertiary, #737373);text-align:center;margin:8px 24px}.chat-avatar-section{display:flex;flex-direction:column;align-items:center;gap:12px;padding:48px 0 0;background:var(--color-background-neutral-primary, #ffffff)}.chat-avatar-info{display:flex;flex-direction:column;align-items:center;gap:4px}.chat-avatar-name{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a)}.chat-avatar-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-secondary, #666666)}.chat-avatar-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:4px}.messages-list{display:flex;flex-direction:column;width:100%;padding:16px 0 0;align-items:stretch}.messages-list ds-mobile-message-bubble{width:100%;display:flex}.timestamp-header{display:flex;justify-content:center;margin:16px 0 8px}.timestamp-text{font-family:Brockmann,sans-serif;font-size:12px;font-weight:400;color:var(--color-text-secondary);padding:4px 12px}.message-file-attachments{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;padding:0 20px 0 60px;max-width:100%}.message-file-attachments.own-message{padding:0 0 0 96px;align-items:flex-end}.message-file-attachments ds-mobile-card-inline-file{max-width:280px;width:100%}.message-image-attachment{width:96px;height:96px;cursor:pointer;border-radius:12px;overflow:hidden;position:relative;transition:transform .2s ease;border:1px solid var(--border-color-default, #e5e5e5)}.message-image-attachment:active{transform:scale(.98)}.message-image-attachment .inline-image{width:100%;height:100%;display:block;-o-object-fit:cover;object-fit:cover}.group-settings-back-btn{flex-shrink:0;border-radius:50%}.group-settings-back-btn::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsAvatarWithBadgeComponent, selector: "ds-avatar-with-badge", inputs: ["type", "size", "initials", "src", "iconName", "showBadge", "badgePosition"] }, { kind: "component", type: DsMobileVendorAvatarComponent, selector: "ds-mobile-vendor-avatar", inputs: ["name", "logo", "size"] }, { kind: "component", type: DsMobileMessageComposerComponent, selector: "ds-mobile-message-composer", inputs: ["avatarInitials", "avatarType", "avatarSrc", "placeholder", "sendButtonLabel", "attachmentButtonLabel", "showAttachmentButton", "showAiButton", "editIndicatorText", "replyIndicatorText", "enableMentions", "mentionUsers", "showInternalToggle", "internalToggleLabel", "replyLabel", "internalMessageDescription", "autoFocus"], outputs: ["messageSent", "editCancelled", "replyCancelled", "mentionSelected", "attachmentClicked", "attachmentsChanged", "aiClick"] }, { kind: "component", type: DsMobileMessageBubbleComponent, selector: "ds-mobile-message-bubble", inputs: ["content", "isOwnMessage", "senderName", "isInternal", "internalMessageBadgeText", "timestamp", "showTimestamp", "avatarInitials", "avatarType", "avatarSrc", "showAvatar", "clusterPosition", "attachments", "clickable", "isNewMessage", "isDeleted", "showEditedHint", "editedHintText"], outputs: ["attachmentClick", "longPress", "messageClick"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["headerTitleInteractive", "textLoading", "textErrorTitle", "showHeader"], outputs: ["titleClick"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { kind: "component", type: DsMobileSystemMessageBannerComponent, selector: "ds-mobile-system-message-banner", inputs: ["message", "iconName", "afterTimestamp"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileGroupAvatarStackComponent, selector: "ds-mobile-group-avatar-stack", inputs: ["members", "customAvatarUrl", "size", "layout", "currentUserId"] }, { kind: "component", type: DsMobileListSearchComponent, selector: "ds-mobile-list-search", inputs: ["placeholder", "ariaLabel", "value", "showDivider"], outputs: ["valueChange"] }, { kind: "component", type: DsMobileChatGroupPanelsComponent, selector: "ds-mobile-chat-group-panels", inputs: ["panelView", "group", "membersForStack", "participantName", "currentUserId", "isAdmin", "canEditGroupDetails", "canAddGroupMembers", "canLeaveGroup", "canRemoveMember", "canMessageMember", "allTenantsForPicker", "searchQuery", "labels"], outputs: ["navigateTo", "renameGroup", "setGroupAvatarUrl", "addMembers", "removeMember", "messageMember", "leaveGroup"] }] });
17434
+ `, isInline: true, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important;padding:0!important}:host ::ng-deep ds-textarea.ghost-input-clean .textarea-container{padding:0!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ":host ::ng-deep .modal-content-container{padding-top:0}.chat-messages-container{display:flex;flex-direction:column;width:100%}.chat-system-line{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.35;color:var(--text-color-default-tertiary, #737373);text-align:center;margin:8px 24px}.chat-avatar-section{display:flex;flex-direction:column;align-items:center;gap:12px;padding:48px 0 0;background:var(--color-background-neutral-primary, #ffffff)}.chat-avatar-info{display:flex;flex-direction:column;align-items:center;gap:4px}.chat-avatar-name{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a)}.chat-avatar-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-secondary, #666666)}.chat-avatar-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:4px}.messages-list{display:flex;flex-direction:column;width:100%;padding:16px 0 0;align-items:stretch}.messages-list ds-mobile-message-bubble{width:100%;display:flex}.timestamp-header{display:flex;justify-content:center;margin:16px 0 8px}.timestamp-text{font-family:Brockmann,sans-serif;font-size:12px;font-weight:400;color:var(--color-text-secondary);padding:4px 12px}.message-file-attachments{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;padding:0 20px 0 60px;max-width:100%}.message-file-attachments.own-message{padding:0 0 0 96px;align-items:flex-end}.message-file-attachments ds-mobile-card-inline-file{max-width:280px;width:100%}.message-image-attachment{width:96px;height:96px;cursor:pointer;border-radius:12px;overflow:hidden;position:relative;transition:transform .2s ease;border:1px solid var(--border-color-default, #e5e5e5)}.message-image-attachment:active{transform:scale(.98)}.message-image-attachment .inline-image{width:100%;height:100%;display:block;-o-object-fit:cover;object-fit:cover}.group-settings-back-btn{flex-shrink:0;border-radius:50%}.group-settings-back-btn::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsAvatarWithBadgeComponent, selector: "ds-avatar-with-badge", inputs: ["type", "size", "initials", "src", "iconName", "showBadge", "badgePosition"] }, { kind: "component", type: DsMobileVendorAvatarComponent, selector: "ds-mobile-vendor-avatar", inputs: ["name", "logo", "size"] }, { kind: "component", type: DsMobileMessageComposerComponent, selector: "ds-mobile-message-composer", inputs: ["avatarInitials", "avatarType", "avatarSrc", "placeholder", "sendButtonLabel", "attachmentButtonLabel", "showAttachmentButton", "showAiButton", "editIndicatorText", "replyIndicatorText", "enableMentions", "mentionUsers", "showInternalToggle", "internalToggleLabel", "replyLabel", "internalMessageDescription", "autoFocus"], outputs: ["messageSent", "editCancelled", "replyCancelled", "mentionSelected", "attachmentClicked", "attachmentsChanged", "aiClick"] }, { kind: "component", type: DsMobileMessageBubbleComponent, selector: "ds-mobile-message-bubble", inputs: ["content", "isOwnMessage", "senderName", "isInternal", "internalMessageBadgeText", "timestamp", "showTimestamp", "avatarInitials", "avatarType", "avatarSrc", "showAvatar", "clusterPosition", "attachments", "clickable", "isNewMessage", "isDeleted", "showEditedHint", "editedHintText"], outputs: ["attachmentClick", "longPress", "messageClick"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["headerTitleInteractive", "textLoading", "textErrorTitle", "showHeader"], outputs: ["titleClick"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { kind: "component", type: DsMobileSystemMessageBannerComponent, selector: "ds-mobile-system-message-banner", inputs: ["message", "iconName", "afterTimestamp"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileGroupAvatarStackComponent, selector: "ds-mobile-group-avatar-stack", inputs: ["members", "customAvatarUrl", "size", "layout", "currentUserId"] }, { kind: "component", type: DsMobileListSearchComponent, selector: "ds-mobile-list-search", inputs: ["placeholder", "ariaLabel", "value", "showDivider"], outputs: ["valueChange"] }, { kind: "component", type: DsMobileChatGroupPanelsComponent, selector: "ds-mobile-chat-group-panels", inputs: ["panelView", "group", "membersForStack", "participantName", "currentUserId", "isAdmin", "canEditGroupDetails", "canAddGroupMembers", "canLeaveGroup", "canRemoveMember", "canMessageMember", "allTenantsForPicker", "searchQuery", "labels"], outputs: ["navigateTo", "renameGroup", "setGroupAvatarUrl", "addMembers", "removeMember", "messageMember", "leaveGroup"] }] });
17412
17435
  }
17413
17436
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsMobileChatModalComponent, decorators: [{
17414
17437
  type: Component,
@@ -17435,6 +17458,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
17435
17458
  [loading]="loading"
17436
17459
  [error]="localError() || error"
17437
17460
  [showHeader]="true"
17461
+ [showHeaderBorder]="groupPanelView() === 'chat' || groupPanelView() === 'add-members'"
17438
17462
  [headerTitle]="groupHeaderTitle()"
17439
17463
  [headerMeta]="groupHeaderMeta()"
17440
17464
  [headerTitleInteractive]="groupHeaderTitleInteractive()"
@@ -17691,7 +17715,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
17691
17715
  </ds-mobile-message-composer>
17692
17716
  </div>
17693
17717
  </ds-mobile-modal-base>
17694
- `, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important;padding:0!important}:host ::ng-deep ds-textarea.ghost-input-clean .textarea-container{padding:0!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ":host ::ng-deep .modal-content-container{padding-top:0}:host-context(.chat-modal--settings) ::ng-deep .modal-header{border-bottom:none}:host-context(.chat-modal--add-members) ::ng-deep .modal-header{border-bottom:1px solid var(--border-color-default)}.chat-messages-container{display:flex;flex-direction:column;width:100%}.chat-system-line{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.35;color:var(--text-color-default-tertiary, #737373);text-align:center;margin:8px 24px}.chat-avatar-section{display:flex;flex-direction:column;align-items:center;gap:12px;padding:48px 0 0;background:var(--color-background-neutral-primary, #ffffff)}.chat-avatar-info{display:flex;flex-direction:column;align-items:center;gap:4px}.chat-avatar-name{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a)}.chat-avatar-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-secondary, #666666)}.chat-avatar-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:4px}.messages-list{display:flex;flex-direction:column;width:100%;padding:16px 0 0;align-items:stretch}.messages-list ds-mobile-message-bubble{width:100%;display:flex}.timestamp-header{display:flex;justify-content:center;margin:16px 0 8px}.timestamp-text{font-family:Brockmann,sans-serif;font-size:12px;font-weight:400;color:var(--color-text-secondary);padding:4px 12px}.message-file-attachments{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;padding:0 20px 0 60px;max-width:100%}.message-file-attachments.own-message{padding:0 0 0 96px;align-items:flex-end}.message-file-attachments ds-mobile-card-inline-file{max-width:280px;width:100%}.message-image-attachment{width:96px;height:96px;cursor:pointer;border-radius:12px;overflow:hidden;position:relative;transition:transform .2s ease;border:1px solid var(--border-color-default, #e5e5e5)}.message-image-attachment:active{transform:scale(.98)}.message-image-attachment .inline-image{width:100%;height:100%;display:block;-o-object-fit:cover;object-fit:cover}.group-settings-back-btn{flex-shrink:0;border-radius:50%}.group-settings-back-btn::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}\n"] }]
17718
+ `, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important;padding:0!important}:host ::ng-deep ds-textarea.ghost-input-clean .textarea-container{padding:0!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ":host ::ng-deep .modal-content-container{padding-top:0}.chat-messages-container{display:flex;flex-direction:column;width:100%}.chat-system-line{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.35;color:var(--text-color-default-tertiary, #737373);text-align:center;margin:8px 24px}.chat-avatar-section{display:flex;flex-direction:column;align-items:center;gap:12px;padding:48px 0 0;background:var(--color-background-neutral-primary, #ffffff)}.chat-avatar-info{display:flex;flex-direction:column;align-items:center;gap:4px}.chat-avatar-name{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a)}.chat-avatar-role{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-secondary, #666666)}.chat-avatar-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:4px}.messages-list{display:flex;flex-direction:column;width:100%;padding:16px 0 0;align-items:stretch}.messages-list ds-mobile-message-bubble{width:100%;display:flex}.timestamp-header{display:flex;justify-content:center;margin:16px 0 8px}.timestamp-text{font-family:Brockmann,sans-serif;font-size:12px;font-weight:400;color:var(--color-text-secondary);padding:4px 12px}.message-file-attachments{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;padding:0 20px 0 60px;max-width:100%}.message-file-attachments.own-message{padding:0 0 0 96px;align-items:flex-end}.message-file-attachments ds-mobile-card-inline-file{max-width:280px;width:100%}.message-image-attachment{width:96px;height:96px;cursor:pointer;border-radius:12px;overflow:hidden;position:relative;transition:transform .2s ease;border:1px solid var(--border-color-default, #e5e5e5)}.message-image-attachment:active{transform:scale(.98)}.message-image-attachment .inline-image{width:100%;height:100%;display:block;-o-object-fit:cover;object-fit:cover}.group-settings-back-btn{flex-shrink:0;border-radius:50%}.group-settings-back-btn::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}\n"] }]
17695
17719
  }], ctorParameters: () => [{ type: DsMobileLightboxService }], propDecorators: { chatData: [{
17696
17720
  type: Input
17697
17721
  }], loading: [{
@@ -31329,6 +31353,465 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
31329
31353
  `, styles: [".settings-content{padding:20px}\n"] }]
31330
31354
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], prefs: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefs", required: false }] }] } });
31331
31355
 
31356
+ class ProfileModalComponent {
31357
+ userService = inject(UserService);
31358
+ modalController = inject(ModalController);
31359
+ closeInterceptor = () => this.close();
31360
+ editingName = signal(false, ...(ngDevMode ? [{ debugName: "editingName" }] : []));
31361
+ editingEmail = signal(false, ...(ngDevMode ? [{ debugName: "editingEmail" }] : []));
31362
+ editingPhone = signal(false, ...(ngDevMode ? [{ debugName: "editingPhone" }] : []));
31363
+ keyboardOffset = signal(false, ...(ngDevMode ? [{ debugName: "keyboardOffset" }] : []));
31364
+ hasChanges = signal(false, ...(ngDevMode ? [{ debugName: "hasChanges" }] : []));
31365
+ originalName = '';
31366
+ originalEmail = '';
31367
+ originalPhone = '';
31368
+ originalAvatarSrc = '';
31369
+ originalAvatarType = 'initials';
31370
+ originalAvatarInitials = '';
31371
+ nameInputRef;
31372
+ emailInputRef;
31373
+ phoneInputRef;
31374
+ photoFileInputRef;
31375
+ constructor() {
31376
+ this.originalName = this.userService.displayName();
31377
+ this.originalEmail = this.userService.email();
31378
+ this.originalPhone = this.userService.phone();
31379
+ this.originalAvatarSrc = this.userService.avatarSrc();
31380
+ this.originalAvatarType = this.userService.avatarType();
31381
+ this.originalAvatarInitials = this.userService.avatarInitials();
31382
+ }
31383
+ checkForChanges() {
31384
+ this.hasChanges.set(this.userService.displayName() !== this.originalName ||
31385
+ this.userService.email() !== this.originalEmail ||
31386
+ this.userService.phone() !== this.originalPhone ||
31387
+ this.userService.avatarSrc() !== this.originalAvatarSrc ||
31388
+ this.userService.avatarType() !== this.originalAvatarType);
31389
+ }
31390
+ async close() {
31391
+ if (!this.hasChanges()) {
31392
+ await this.modalController.dismiss();
31393
+ return;
31394
+ }
31395
+ const action = await this.showUnsavedChangesSheet();
31396
+ if (!action)
31397
+ return;
31398
+ if (action === 'discard') {
31399
+ this.userService.setDisplayName(this.originalName);
31400
+ this.userService.setEmail(this.originalEmail);
31401
+ this.userService.setPhone(this.originalPhone);
31402
+ this.userService.setAvatarSrc(this.originalAvatarSrc);
31403
+ this.userService.setAvatarType(this.originalAvatarType);
31404
+ this.userService.setAvatarInitials(this.originalAvatarInitials);
31405
+ }
31406
+ await this.modalController.dismiss();
31407
+ }
31408
+ async showUnsavedChangesSheet() {
31409
+ const { DsMobileConfirmationSheetComponent } = await Promise.resolve().then(function () { return dsMobileConfirmationSheet; });
31410
+ const { disableModalShadowPointerEvents } = await Promise.resolve().then(function () { return modalShadowFix; });
31411
+ const sheet = await this.modalController.create({
31412
+ component: DsMobileConfirmationSheetComponent,
31413
+ componentProps: {
31414
+ title: 'Du har ændringer der ikke er gemt',
31415
+ message: 'Vil du gemme eller kassere dine ændringer?',
31416
+ buttonText: 'Gem ændringer',
31417
+ showIllustration: false,
31418
+ secondaryButtonText: 'Kassér ændringer',
31419
+ secondaryButtonVariant: 'secondary',
31420
+ },
31421
+ breakpoints: [0, 1],
31422
+ initialBreakpoint: 1,
31423
+ handle: true,
31424
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
31425
+ backdropDismiss: false,
31426
+ showBackdrop: true,
31427
+ });
31428
+ await sheet.present();
31429
+ disableModalShadowPointerEvents(sheet);
31430
+ const result = await sheet.onDidDismiss();
31431
+ if (result.role === 'confirm')
31432
+ return 'save';
31433
+ if (result.role === 'backdrop')
31434
+ return 'discard';
31435
+ return null;
31436
+ }
31437
+ startEdit(field) {
31438
+ if (field === 'name') {
31439
+ this.editingName.set(true);
31440
+ this.keyboardOffset.set(false);
31441
+ setTimeout(() => this.nameInputRef?.nativeElement.focus());
31442
+ }
31443
+ else if (field === 'email') {
31444
+ this.editingEmail.set(true);
31445
+ this.keyboardOffset.set(false);
31446
+ setTimeout(() => this.emailInputRef?.nativeElement.focus());
31447
+ }
31448
+ else {
31449
+ this.editingPhone.set(true);
31450
+ this.keyboardOffset.set(true);
31451
+ setTimeout(() => this.phoneInputRef?.nativeElement.focus());
31452
+ }
31453
+ }
31454
+ saveName(event) {
31455
+ const val = event.target.value.trim();
31456
+ if (val) {
31457
+ this.userService.setDisplayName(val);
31458
+ const parts = val.split(' ');
31459
+ const initials = parts.length >= 2
31460
+ ? (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()
31461
+ : val.substring(0, 2).toUpperCase();
31462
+ this.userService.setAvatarInitials(initials);
31463
+ }
31464
+ this.keyboardOffset.set(false);
31465
+ this.editingName.set(false);
31466
+ this.checkForChanges();
31467
+ }
31468
+ saveEmail(event) {
31469
+ const val = event.target.value.trim();
31470
+ if (val)
31471
+ this.userService.setEmail(val);
31472
+ this.keyboardOffset.set(false);
31473
+ this.editingEmail.set(false);
31474
+ this.checkForChanges();
31475
+ }
31476
+ savePhone(event) {
31477
+ const val = event.target.value.trim();
31478
+ if (val)
31479
+ this.userService.setPhone(val);
31480
+ this.keyboardOffset.set(false);
31481
+ this.editingPhone.set(false);
31482
+ this.checkForChanges();
31483
+ }
31484
+ async openPhotoActions() {
31485
+ const photoActions = [
31486
+ {
31487
+ actions: [
31488
+ { action: 'take-photo', title: 'Take a picture', icon: 'remixCamera3Line' },
31489
+ { action: 'choose-library', title: 'Choose from library', icon: 'remixImageLine' },
31490
+ ],
31491
+ },
31492
+ ];
31493
+ if (this.userService.avatarSrc()) {
31494
+ photoActions[0].actions.push({
31495
+ action: 'delete-photo',
31496
+ title: 'Delete photo',
31497
+ icon: 'remixDeleteBinLine',
31498
+ destructive: true,
31499
+ });
31500
+ }
31501
+ const sheet = await this.modalController.create({
31502
+ component: DsMobileActionsBottomSheetComponent,
31503
+ componentProps: { customActionGroups: photoActions },
31504
+ breakpoints: [0, 1],
31505
+ initialBreakpoint: 1,
31506
+ handle: true,
31507
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
31508
+ backdropDismiss: true,
31509
+ });
31510
+ await sheet.present();
31511
+ disableModalShadowPointerEvents(sheet);
31512
+ const result = await sheet.onWillDismiss();
31513
+ if (!result.data?.action)
31514
+ return;
31515
+ const input = this.photoFileInputRef?.nativeElement;
31516
+ if (!input)
31517
+ return;
31518
+ switch (result.data.action) {
31519
+ case 'take-photo':
31520
+ input.setAttribute('capture', 'environment');
31521
+ input.click();
31522
+ break;
31523
+ case 'choose-library':
31524
+ input.removeAttribute('capture');
31525
+ input.click();
31526
+ break;
31527
+ case 'delete-photo':
31528
+ this.userService.setAvatarSrc('');
31529
+ this.userService.setAvatarType('initials');
31530
+ this.checkForChanges();
31531
+ break;
31532
+ }
31533
+ }
31534
+ onPhotoSelected(event) {
31535
+ const file = event.target.files?.[0];
31536
+ if (!file)
31537
+ return;
31538
+ const url = URL.createObjectURL(file);
31539
+ this.userService.setAvatarSrc(url);
31540
+ this.userService.setAvatarType('photo');
31541
+ event.target.value = '';
31542
+ this.checkForChanges();
31543
+ }
31544
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31545
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.23", type: ProfileModalComponent, isStandalone: true, selector: "app-profile-modal", viewQueries: [{ propertyName: "nameInputRef", first: true, predicate: ["nameInput"], descendants: true }, { propertyName: "emailInputRef", first: true, predicate: ["emailInput"], descendants: true }, { propertyName: "phoneInputRef", first: true, predicate: ["phoneInput"], descendants: true }, { propertyName: "photoFileInputRef", first: true, predicate: ["photoFileInput"], descendants: true }], ngImport: i0, template: `
31546
+ <ds-mobile-modal-base headerTitle="My profile" [showHeader]="true" [showHeaderBorder]="false" [enableKeyboardHandling]="true" [onCloseRequest]="closeInterceptor">
31547
+ <div header-leading>
31548
+ <ds-icon-button
31549
+ class="back-btn"
31550
+ icon="remixArrowLeftSLine"
31551
+ variant="secondary"
31552
+ size="lg"
31553
+ (clicked)="close()"
31554
+ aria-label="Tilbage"
31555
+ />
31556
+ </div>
31557
+
31558
+ <div class="profile-content" [class.keyboard-offset]="keyboardOffset()">
31559
+
31560
+ <!-- Hero -->
31561
+ <div class="profile-hero">
31562
+ <button
31563
+ type="button"
31564
+ class="profile-hero-avatar"
31565
+ (click)="openPhotoActions()"
31566
+ aria-label="Edit profile photo"
31567
+ >
31568
+ <ds-avatar-with-badge
31569
+ [type]="userService.avatarType()"
31570
+ [initials]="userService.avatarInitials()"
31571
+ [src]="userService.avatarSrc()"
31572
+ size="xl"
31573
+ [showBadge]="false"
31574
+ />
31575
+ <span class="profile-hero-avatar-edit" aria-hidden="true">
31576
+ <ds-icon name="remixEditLine" size="14px" />
31577
+ </span>
31578
+ </button>
31579
+ <div class="profile-hero-text">
31580
+ <h2 class="profile-hero-name">{{ userService.displayName() }}</h2>
31581
+ <p class="profile-hero-email">{{ userService.email() }}</p>
31582
+ </div>
31583
+ </div>
31584
+
31585
+ <!-- Fields -->
31586
+ <div class="field-group">
31587
+
31588
+ <!-- Full name -->
31589
+ <div class="field">
31590
+ <p class="field-label">Full name</p>
31591
+ <div class="field-pill" [class.editing]="editingName()" (click)="!editingName() && startEdit('name')">
31592
+ @if (!editingName()) {
31593
+ <p class="field-pill-value">{{ userService.displayName() }}</p>
31594
+ } @else {
31595
+ <input
31596
+ #nameInput
31597
+ type="text"
31598
+ class="field-pill-input"
31599
+ [value]="userService.displayName()"
31600
+ (blur)="saveName($event)"
31601
+ (keydown.enter)="nameInputRef?.nativeElement?.blur()"
31602
+ />
31603
+ }
31604
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingName()" />
31605
+ </div>
31606
+ </div>
31607
+
31608
+ <!-- Email address -->
31609
+ <div class="field">
31610
+ <p class="field-label">Email address</p>
31611
+ <div class="field-pill" [class.editing]="editingEmail()" (click)="!editingEmail() && startEdit('email')">
31612
+ @if (!editingEmail()) {
31613
+ <p class="field-pill-value">{{ userService.email() }}</p>
31614
+ } @else {
31615
+ <input
31616
+ #emailInput
31617
+ type="email"
31618
+ class="field-pill-input"
31619
+ [value]="userService.email()"
31620
+ (blur)="saveEmail($event)"
31621
+ (keydown.enter)="emailInputRef?.nativeElement?.blur()"
31622
+ />
31623
+ }
31624
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingEmail()" />
31625
+ </div>
31626
+ </div>
31627
+
31628
+ <!-- Phone -->
31629
+ <div class="field">
31630
+ <p class="field-label">Phone</p>
31631
+ <div class="field-pill" [class.editing]="editingPhone()" (click)="!editingPhone() && startEdit('phone')">
31632
+ @if (!editingPhone()) {
31633
+ <p class="field-pill-value">{{ userService.phone() }}</p>
31634
+ } @else {
31635
+ <input
31636
+ #phoneInput
31637
+ type="tel"
31638
+ class="field-pill-input"
31639
+ [value]="userService.phone()"
31640
+ (blur)="savePhone($event)"
31641
+ (keydown.enter)="phoneInputRef?.nativeElement?.blur()"
31642
+ />
31643
+ }
31644
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingPhone()" />
31645
+ </div>
31646
+ </div>
31647
+
31648
+ <!-- Address (read-only) -->
31649
+ <div class="field">
31650
+ <p class="field-label">Adress</p>
31651
+ <div class="field-pill field-pill--readonly">
31652
+ <p class="field-pill-value">{{ userService.address() }}</p>
31653
+ </div>
31654
+ </div>
31655
+
31656
+ </div>
31657
+ </div>
31658
+
31659
+ <input
31660
+ #photoFileInput
31661
+ type="file"
31662
+ accept="image/*"
31663
+ class="visually-hidden"
31664
+ (change)="onPhotoSelected($event)"
31665
+ />
31666
+
31667
+ </ds-mobile-modal-base>
31668
+ `, isInline: true, styles: [":host ::ng-deep .modal-header{border-bottom:none}:host ::ng-deep .header-main{text-align:center}.back-btn{flex-shrink:0;border-radius:50%}.back-btn::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.profile-content{padding:0 20px;padding-bottom:calc(24px + env(safe-area-inset-bottom,0px));transition:transform .3s ease}.profile-content.keyboard-offset{transform:translateY(-24px)}.profile-hero{display:flex;flex-direction:column;align-items:center;text-align:center;padding:16px 24px;gap:12px}.profile-hero-avatar{position:relative;display:inline-block;padding:0;border:none;background:none;cursor:pointer;-webkit-tap-highlight-color:transparent}.profile-hero-avatar-edit{position:absolute;bottom:-4px;right:-4px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--color-background-neutral-secondary, #f6f7f8);box-shadow:0 0 0 2px var(--color-background-primary, #ffffff);color:var(--color-text-secondary, #6C6F7A);pointer-events:none}.profile-hero-text{display:flex;flex-direction:column;align-items:center;gap:4px}.profile-hero-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-lg, 20px);font-weight:600;line-height:24px;letter-spacing:-.8px;color:var(--color-text-primary, #202227);margin:0;max-width:164px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-hero-email{font-family:Brockmann,sans-serif;font-size:14px;font-weight:400;line-height:18px;letter-spacing:-.56px;color:#737373;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field-group{display:flex;flex-direction:column;gap:16px;padding:16px 0}.field{display:flex;flex-direction:column;gap:4px}.field-label{font-family:Brockmann,sans-serif;font-size:14px;font-weight:500;line-height:18px;letter-spacing:-.56px;color:var(--base-600, #545b66);margin:0}.field-pill{display:flex;align-items:center;gap:4px;background:#f6f7f8;border-radius:100px;padding:16px;cursor:pointer;-webkit-tap-highlight-color:transparent}.field-pill--readonly{cursor:default}.field-pill-value{flex:1;min-width:0;font-family:Brockmann,sans-serif;font-size:14px;font-weight:400;line-height:18px;letter-spacing:-.56px;color:var(--color-text-primary, #202227);margin:0}.field-pill--readonly .field-pill-value{color:var(--content-default-disabled-grey, #7c8694)}.field-pill-chevron{flex-shrink:0;color:var(--color-text-secondary, #6C6F7A);transition:opacity .2s ease,transform .2s ease}.field-pill-chevron.hidden{opacity:0;transform:scale(.5);pointer-events:none}.field-pill-input{flex:1;min-width:0;background:none;border:none;font-family:Brockmann,sans-serif;font-size:14px;font-weight:400;line-height:18px;letter-spacing:-.56px;color:var(--color-text-primary, #202227);outline:none;padding:0;margin:0}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["headerTitleInteractive", "textLoading", "textErrorTitle", "showHeader"], outputs: ["titleClick"] }, { kind: "component", type: DsAvatarWithBadgeComponent, selector: "ds-avatar-with-badge", inputs: ["type", "size", "initials", "src", "iconName", "showBadge", "badgePosition"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }] });
31669
+ }
31670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalComponent, decorators: [{
31671
+ type: Component,
31672
+ args: [{ selector: 'app-profile-modal', standalone: true, imports: [
31673
+ DsMobileModalBaseComponent,
31674
+ DsAvatarWithBadgeComponent,
31675
+ DsIconComponent,
31676
+ DsIconButtonComponent,
31677
+ ], template: `
31678
+ <ds-mobile-modal-base headerTitle="My profile" [showHeader]="true" [showHeaderBorder]="false" [enableKeyboardHandling]="true" [onCloseRequest]="closeInterceptor">
31679
+ <div header-leading>
31680
+ <ds-icon-button
31681
+ class="back-btn"
31682
+ icon="remixArrowLeftSLine"
31683
+ variant="secondary"
31684
+ size="lg"
31685
+ (clicked)="close()"
31686
+ aria-label="Tilbage"
31687
+ />
31688
+ </div>
31689
+
31690
+ <div class="profile-content" [class.keyboard-offset]="keyboardOffset()">
31691
+
31692
+ <!-- Hero -->
31693
+ <div class="profile-hero">
31694
+ <button
31695
+ type="button"
31696
+ class="profile-hero-avatar"
31697
+ (click)="openPhotoActions()"
31698
+ aria-label="Edit profile photo"
31699
+ >
31700
+ <ds-avatar-with-badge
31701
+ [type]="userService.avatarType()"
31702
+ [initials]="userService.avatarInitials()"
31703
+ [src]="userService.avatarSrc()"
31704
+ size="xl"
31705
+ [showBadge]="false"
31706
+ />
31707
+ <span class="profile-hero-avatar-edit" aria-hidden="true">
31708
+ <ds-icon name="remixEditLine" size="14px" />
31709
+ </span>
31710
+ </button>
31711
+ <div class="profile-hero-text">
31712
+ <h2 class="profile-hero-name">{{ userService.displayName() }}</h2>
31713
+ <p class="profile-hero-email">{{ userService.email() }}</p>
31714
+ </div>
31715
+ </div>
31716
+
31717
+ <!-- Fields -->
31718
+ <div class="field-group">
31719
+
31720
+ <!-- Full name -->
31721
+ <div class="field">
31722
+ <p class="field-label">Full name</p>
31723
+ <div class="field-pill" [class.editing]="editingName()" (click)="!editingName() && startEdit('name')">
31724
+ @if (!editingName()) {
31725
+ <p class="field-pill-value">{{ userService.displayName() }}</p>
31726
+ } @else {
31727
+ <input
31728
+ #nameInput
31729
+ type="text"
31730
+ class="field-pill-input"
31731
+ [value]="userService.displayName()"
31732
+ (blur)="saveName($event)"
31733
+ (keydown.enter)="nameInputRef?.nativeElement?.blur()"
31734
+ />
31735
+ }
31736
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingName()" />
31737
+ </div>
31738
+ </div>
31739
+
31740
+ <!-- Email address -->
31741
+ <div class="field">
31742
+ <p class="field-label">Email address</p>
31743
+ <div class="field-pill" [class.editing]="editingEmail()" (click)="!editingEmail() && startEdit('email')">
31744
+ @if (!editingEmail()) {
31745
+ <p class="field-pill-value">{{ userService.email() }}</p>
31746
+ } @else {
31747
+ <input
31748
+ #emailInput
31749
+ type="email"
31750
+ class="field-pill-input"
31751
+ [value]="userService.email()"
31752
+ (blur)="saveEmail($event)"
31753
+ (keydown.enter)="emailInputRef?.nativeElement?.blur()"
31754
+ />
31755
+ }
31756
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingEmail()" />
31757
+ </div>
31758
+ </div>
31759
+
31760
+ <!-- Phone -->
31761
+ <div class="field">
31762
+ <p class="field-label">Phone</p>
31763
+ <div class="field-pill" [class.editing]="editingPhone()" (click)="!editingPhone() && startEdit('phone')">
31764
+ @if (!editingPhone()) {
31765
+ <p class="field-pill-value">{{ userService.phone() }}</p>
31766
+ } @else {
31767
+ <input
31768
+ #phoneInput
31769
+ type="tel"
31770
+ class="field-pill-input"
31771
+ [value]="userService.phone()"
31772
+ (blur)="savePhone($event)"
31773
+ (keydown.enter)="phoneInputRef?.nativeElement?.blur()"
31774
+ />
31775
+ }
31776
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingPhone()" />
31777
+ </div>
31778
+ </div>
31779
+
31780
+ <!-- Address (read-only) -->
31781
+ <div class="field">
31782
+ <p class="field-label">Adress</p>
31783
+ <div class="field-pill field-pill--readonly">
31784
+ <p class="field-pill-value">{{ userService.address() }}</p>
31785
+ </div>
31786
+ </div>
31787
+
31788
+ </div>
31789
+ </div>
31790
+
31791
+ <input
31792
+ #photoFileInput
31793
+ type="file"
31794
+ accept="image/*"
31795
+ class="visually-hidden"
31796
+ (change)="onPhotoSelected($event)"
31797
+ />
31798
+
31799
+ </ds-mobile-modal-base>
31800
+ `, styles: [":host ::ng-deep .modal-header{border-bottom:none}:host ::ng-deep .header-main{text-align:center}.back-btn{flex-shrink:0;border-radius:50%}.back-btn::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.profile-content{padding:0 20px;padding-bottom:calc(24px + env(safe-area-inset-bottom,0px));transition:transform .3s ease}.profile-content.keyboard-offset{transform:translateY(-24px)}.profile-hero{display:flex;flex-direction:column;align-items:center;text-align:center;padding:16px 24px;gap:12px}.profile-hero-avatar{position:relative;display:inline-block;padding:0;border:none;background:none;cursor:pointer;-webkit-tap-highlight-color:transparent}.profile-hero-avatar-edit{position:absolute;bottom:-4px;right:-4px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--color-background-neutral-secondary, #f6f7f8);box-shadow:0 0 0 2px var(--color-background-primary, #ffffff);color:var(--color-text-secondary, #6C6F7A);pointer-events:none}.profile-hero-text{display:flex;flex-direction:column;align-items:center;gap:4px}.profile-hero-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-lg, 20px);font-weight:600;line-height:24px;letter-spacing:-.8px;color:var(--color-text-primary, #202227);margin:0;max-width:164px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-hero-email{font-family:Brockmann,sans-serif;font-size:14px;font-weight:400;line-height:18px;letter-spacing:-.56px;color:#737373;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field-group{display:flex;flex-direction:column;gap:16px;padding:16px 0}.field{display:flex;flex-direction:column;gap:4px}.field-label{font-family:Brockmann,sans-serif;font-size:14px;font-weight:500;line-height:18px;letter-spacing:-.56px;color:var(--base-600, #545b66);margin:0}.field-pill{display:flex;align-items:center;gap:4px;background:#f6f7f8;border-radius:100px;padding:16px;cursor:pointer;-webkit-tap-highlight-color:transparent}.field-pill--readonly{cursor:default}.field-pill-value{flex:1;min-width:0;font-family:Brockmann,sans-serif;font-size:14px;font-weight:400;line-height:18px;letter-spacing:-.56px;color:var(--color-text-primary, #202227);margin:0}.field-pill--readonly .field-pill-value{color:var(--content-default-disabled-grey, #7c8694)}.field-pill-chevron{flex-shrink:0;color:var(--color-text-secondary, #6C6F7A);transition:opacity .2s ease,transform .2s ease}.field-pill-chevron.hidden{opacity:0;transform:scale(.5);pointer-events:none}.field-pill-input{flex:1;min-width:0;background:none;border:none;font-family:Brockmann,sans-serif;font-size:14px;font-weight:400;line-height:18px;letter-spacing:-.56px;color:var(--color-text-primary, #202227);outline:none;padding:0;margin:0}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
31801
+ }], ctorParameters: () => [], propDecorators: { nameInputRef: [{
31802
+ type: ViewChild,
31803
+ args: ['nameInput']
31804
+ }], emailInputRef: [{
31805
+ type: ViewChild,
31806
+ args: ['emailInput']
31807
+ }], phoneInputRef: [{
31808
+ type: ViewChild,
31809
+ args: ['phoneInput']
31810
+ }], photoFileInputRef: [{
31811
+ type: ViewChild,
31812
+ args: ['photoFileInput']
31813
+ }] } });
31814
+
31332
31815
  // Mobile Page Components
31333
31816
 
31334
31817
  class MobileCommunityPageComponent {
@@ -31640,6 +32123,7 @@ class MobileCommunityPageComponent {
31640
32123
  [notificationCount]="notificationService.unreadCount()"
31641
32124
  [avatarInitials]="userService.avatarInitials()"
31642
32125
  [avatarType]="userService.avatarType()"
32126
+ [avatarSrc]="userService.avatarSrc()"
31643
32127
  [contentLoading]="isLoading()"
31644
32128
  [contentLoadingVariant]="'card'"
31645
32129
  (notificationClick)="handleNotificationClick()"
@@ -31900,6 +32384,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
31900
32384
  [notificationCount]="notificationService.unreadCount()"
31901
32385
  [avatarInitials]="userService.avatarInitials()"
31902
32386
  [avatarType]="userService.avatarType()"
32387
+ [avatarSrc]="userService.avatarSrc()"
31903
32388
  [contentLoading]="isLoading()"
31904
32389
  [contentLoadingVariant]="'card'"
31905
32390
  (notificationClick)="handleNotificationClick()"
@@ -32411,7 +32896,7 @@ class MobileHandbookPageComponent {
32411
32896
  }
32412
32897
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileHandbookPageComponent, deps: [{ token: UserService }], target: i0.ɵɵFactoryTarget.Component });
32413
32898
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.23", type: MobileHandbookPageComponent, isStandalone: true, selector: "app-mobile-handbook-page", viewQueries: [{ propertyName: "pageComponent", first: true, predicate: ["pageComponent"], descendants: true }], ngImport: i0, template: `
32414
- <ds-mobile-page-main #pageComponent title="Håndbog" [notificationCount]="notificationService.unreadCount()" [avatarInitials]="userService.avatarInitials()" [avatarType]="userService.avatarType()" [contentLoading]="isLoading()" [contentLoadingVariant]="'handbook'" (notificationClick)="handleNotificationClick()" (refresh)="handleRefresh($event)">
32899
+ <ds-mobile-page-main #pageComponent title="Håndbog" [notificationCount]="notificationService.unreadCount()" [avatarInitials]="userService.avatarInitials()" [avatarType]="userService.avatarType()" [avatarSrc]="userService.avatarSrc()" [contentLoading]="isLoading()" [contentLoadingVariant]="'handbook'" (notificationClick)="handleNotificationClick()" (refresh)="handleRefresh($event)">
32415
32900
  <!-- Offline indicator -->
32416
32901
  @if (pageComponent.isOffline()) {
32417
32902
  <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
@@ -32437,7 +32922,7 @@ class MobileHandbookPageComponent {
32437
32922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileHandbookPageComponent, decorators: [{
32438
32923
  type: Component,
32439
32924
  args: [{ selector: 'app-mobile-handbook-page', standalone: true, imports: [DsMobilePageMainComponent, DsMobileSectionComponent, DsMobileHandbookFolderComponent, DsMobileOfflineBannerComponent], template: `
32440
- <ds-mobile-page-main #pageComponent title="Håndbog" [notificationCount]="notificationService.unreadCount()" [avatarInitials]="userService.avatarInitials()" [avatarType]="userService.avatarType()" [contentLoading]="isLoading()" [contentLoadingVariant]="'handbook'" (notificationClick)="handleNotificationClick()" (refresh)="handleRefresh($event)">
32925
+ <ds-mobile-page-main #pageComponent title="Håndbog" [notificationCount]="notificationService.unreadCount()" [avatarInitials]="userService.avatarInitials()" [avatarType]="userService.avatarType()" [avatarSrc]="userService.avatarSrc()" [contentLoading]="isLoading()" [contentLoadingVariant]="'handbook'" (notificationClick)="handleNotificationClick()" (refresh)="handleRefresh($event)">
32441
32926
  <!-- Offline indicator -->
32442
32927
  @if (pageComponent.isOffline()) {
32443
32928
  <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
@@ -33239,6 +33724,7 @@ class MobileHomePageComponent {
33239
33724
  [notificationCount]="notificationService.unreadCount()"
33240
33725
  [avatarInitials]="userService.avatarInitials()"
33241
33726
  [avatarType]="userService.avatarType()"
33727
+ [avatarSrc]="userService.avatarSrc()"
33242
33728
  (notificationClick)="handleNotificationClick()"
33243
33729
  (refresh)="handleRefresh($event)"
33244
33730
  >
@@ -33451,6 +33937,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
33451
33937
  [notificationCount]="notificationService.unreadCount()"
33452
33938
  [avatarInitials]="userService.avatarInitials()"
33453
33939
  [avatarType]="userService.avatarType()"
33940
+ [avatarSrc]="userService.avatarSrc()"
33454
33941
  (notificationClick)="handleNotificationClick()"
33455
33942
  (refresh)="handleRefresh($event)"
33456
33943
  >
@@ -33726,6 +34213,7 @@ class MobileInquiriesPageComponent {
33726
34213
  [notificationCount]="notificationService.unreadCount()"
33727
34214
  [avatarInitials]="userService.avatarInitials()"
33728
34215
  [avatarType]="userService.avatarType()"
34216
+ [avatarSrc]="userService.avatarSrc()"
33729
34217
  [contentLoading]="isLoading()"
33730
34218
  [contentLoadingVariant]="'list'"
33731
34219
  (notificationClick)="handleNotificationClick()"
@@ -33801,6 +34289,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
33801
34289
  [notificationCount]="notificationService.unreadCount()"
33802
34290
  [avatarInitials]="userService.avatarInitials()"
33803
34291
  [avatarType]="userService.avatarType()"
34292
+ [avatarSrc]="userService.avatarSrc()"
33804
34293
  [contentLoading]="isLoading()"
33805
34294
  [contentLoadingVariant]="'list'"
33806
34295
  (notificationClick)="handleNotificationClick()"
@@ -36112,33 +36601,10 @@ class MobileTabsExampleComponent {
36112
36601
  * NOTE: Desktop only - called directly from tab bar.
36113
36602
  * Mobile actions are handled globally in AppComponent via UserService.
36114
36603
  */
36115
- handleProfileAction(result) {
36116
- console.log('Profile action selected (desktop tab bar):', result.action);
36117
- if (result.action === 'family-access') {
36118
- this.navCtrl.navigateForward(['/family-access'], {
36119
- animation: customPageTransition
36120
- });
36121
- }
36122
- if (result.action === 'manage-admins') {
36123
- this.navCtrl.navigateForward(['/community-admins'], {
36124
- animation: customPageTransition
36125
- });
36126
- }
36127
- // Handle appearance action here (opens modal)
36128
- if (result.action === 'appearance') {
36129
- console.log('Opening whitelabel demo...');
36130
- // Small delay to ensure bottom sheet is fully dismissed
36131
- setTimeout(async () => {
36132
- try {
36133
- await this.whitelabelDemoModal.open();
36134
- }
36135
- catch (error) {
36136
- console.error('Failed to open whitelabel demo modal:', error);
36137
- }
36138
- }, 100);
36139
- }
36140
- // Notify globally so AppComponent can handle navigation
36141
- this.userService.notifyProfileAction(result);
36604
+ handleProfileAction(_result) {
36605
+ // All profile actions are handled globally in AppComponent via UserService.
36606
+ // ds-mobile-page-main already calls notifyProfileAction() internally,
36607
+ // so no forwarding is needed here.
36142
36608
  }
36143
36609
  handleMoreMenuAction(item) {
36144
36610
  if (item.route) {
@@ -36208,6 +36674,7 @@ class MobileTabsExampleComponent {
36208
36674
  [notificationCount]="notificationService.unreadCount()"
36209
36675
  [avatarInitials]="userService.avatarInitials()"
36210
36676
  [avatarType]="userService.avatarType()"
36677
+ [avatarSrc]="userService.avatarSrc()"
36211
36678
  [profileMenuItems]="profileMenuItems"
36212
36679
  (notificationClick)="handleNotificationClick()"
36213
36680
  (profileActionSelected)="handleProfileAction($event)"
@@ -36252,6 +36719,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
36252
36719
  [notificationCount]="notificationService.unreadCount()"
36253
36720
  [avatarInitials]="userService.avatarInitials()"
36254
36721
  [avatarType]="userService.avatarType()"
36722
+ [avatarSrc]="userService.avatarSrc()"
36255
36723
  [profileMenuItems]="profileMenuItems"
36256
36724
  (notificationClick)="handleNotificationClick()"
36257
36725
  (profileActionSelected)="handleProfileAction($event)"
@@ -36799,6 +37267,7 @@ class MobileBookingPageComponent {
36799
37267
  [notificationCount]="notificationService.unreadCount()"
36800
37268
  [avatarInitials]="userService.avatarInitials()"
36801
37269
  [avatarType]="userService.avatarType()"
37270
+ [avatarSrc]="userService.avatarSrc()"
36802
37271
  (notificationClick)="handleNotificationClick()"
36803
37272
  (refresh)="handleRefresh($event)">
36804
37273
 
@@ -36924,6 +37393,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
36924
37393
  [notificationCount]="notificationService.unreadCount()"
36925
37394
  [avatarInitials]="userService.avatarInitials()"
36926
37395
  [avatarType]="userService.avatarType()"
37396
+ [avatarSrc]="userService.avatarSrc()"
36927
37397
  (notificationClick)="handleNotificationClick()"
36928
37398
  (refresh)="handleRefresh($event)">
36929
37399
 
@@ -37947,6 +38417,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
37947
38417
 
37948
38418
  class DsMobileInviteMemberSheetComponent {
37949
38419
  modalController;
38420
+ elementRef = inject(ElementRef);
37950
38421
  nameInput;
37951
38422
  viewContainer;
37952
38423
  sheetWrapper;
@@ -37966,6 +38437,10 @@ class DsMobileInviteMemberSheetComponent {
37966
38437
  this.modalController = modalController;
37967
38438
  }
37968
38439
  ngAfterViewInit() {
38440
+ const ionModal = this.elementRef.nativeElement.closest('ion-modal');
38441
+ if (ionModal) {
38442
+ ionModal.canDismiss = (_data, role) => this.handleCanDismiss(role);
38443
+ }
37969
38444
  if (this.nameInput) {
37970
38445
  this.isReadonly = false;
37971
38446
  setTimeout(() => {
@@ -38072,6 +38547,43 @@ class DsMobileInviteMemberSheetComponent {
38072
38547
  delay(ms) {
38073
38548
  return new Promise(resolve => setTimeout(resolve, ms));
38074
38549
  }
38550
+ async handleCanDismiss(role) {
38551
+ if (role === 'success' || role === 'cancel') {
38552
+ return true;
38553
+ }
38554
+ if (this.currentView() === 'step2') {
38555
+ const action = await this.showDiscardConfirmationSheet();
38556
+ if (action !== 'discard')
38557
+ return false;
38558
+ }
38559
+ return true;
38560
+ }
38561
+ async showDiscardConfirmationSheet() {
38562
+ const { DsMobileConfirmationSheetComponent } = await Promise.resolve().then(function () { return dsMobileConfirmationSheet; });
38563
+ const sheet = await this.modalController.create({
38564
+ component: DsMobileConfirmationSheetComponent,
38565
+ componentProps: {
38566
+ title: 'Du har ændringer der ikke er gemt',
38567
+ message: 'Er du sikker på, at du vil kassere invitationen?',
38568
+ buttonText: 'Kassér invitation',
38569
+ showIllustration: false,
38570
+ secondaryButtonText: 'Bliv og rediger',
38571
+ secondaryButtonVariant: 'secondary',
38572
+ },
38573
+ breakpoints: [0, 1],
38574
+ initialBreakpoint: 1,
38575
+ handle: true,
38576
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
38577
+ backdropDismiss: false,
38578
+ showBackdrop: true,
38579
+ });
38580
+ await sheet.present();
38581
+ disableModalShadowPointerEvents(sheet);
38582
+ const result = await sheet.onDidDismiss();
38583
+ if (result.role === 'confirm')
38584
+ return 'discard';
38585
+ return null;
38586
+ }
38075
38587
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsMobileInviteMemberSheetComponent, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Component });
38076
38588
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.23", type: DsMobileInviteMemberSheetComponent, isStandalone: true, selector: "ds-mobile-invite-member-sheet", viewQueries: [{ propertyName: "nameInput", first: true, predicate: ["nameInput"], descendants: true }, { propertyName: "viewContainer", first: true, predicate: ["viewContainer"], descendants: true, read: ElementRef }, { propertyName: "sheetWrapper", first: true, predicate: ["sheetWrapper"], descendants: true, read: ElementRef }], ngImport: i0, template: `
38077
38589
  <div class="sheet-content" #sheetWrapper>
@@ -38853,6 +39365,7 @@ class TenantChatPageComponent {
38853
39365
  [notificationCount]="notificationService.unreadCount()"
38854
39366
  [avatarInitials]="userService.avatarInitials()"
38855
39367
  [avatarType]="userService.avatarType()"
39368
+ [avatarSrc]="userService.avatarSrc()"
38856
39369
  (notificationClick)="handleNotificationClick()"
38857
39370
  (refresh)="handleRefresh($event)">
38858
39371
 
@@ -38929,6 +39442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
38929
39442
  [notificationCount]="notificationService.unreadCount()"
38930
39443
  [avatarInitials]="userService.avatarInitials()"
38931
39444
  [avatarType]="userService.avatarType()"
39445
+ [avatarSrc]="userService.avatarSrc()"
38932
39446
  (notificationClick)="handleNotificationClick()"
38933
39447
  (refresh)="handleRefresh($event)">
38934
39448
 
@@ -39137,6 +39651,7 @@ class ServicesPageComponent {
39137
39651
  [notificationCount]="notificationService.unreadCount()"
39138
39652
  [avatarInitials]="userService.avatarInitials()"
39139
39653
  [avatarType]="userService.avatarType()"
39654
+ [avatarSrc]="userService.avatarSrc()"
39140
39655
  (notificationClick)="handleNotificationClick()"
39141
39656
  (refresh)="handleRefresh($event)"
39142
39657
  >
@@ -39186,6 +39701,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
39186
39701
  [notificationCount]="notificationService.unreadCount()"
39187
39702
  [avatarInitials]="userService.avatarInitials()"
39188
39703
  [avatarType]="userService.avatarType()"
39704
+ [avatarSrc]="userService.avatarSrc()"
39189
39705
  (notificationClick)="handleNotificationClick()"
39190
39706
  (refresh)="handleRefresh($event)"
39191
39707
  >
@@ -39260,6 +39776,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
39260
39776
  }]
39261
39777
  }], ctorParameters: () => [{ type: i1.ModalController }] });
39262
39778
 
39779
+ class ProfileModalService {
39780
+ modalController;
39781
+ constructor(modalController) {
39782
+ this.modalController = modalController;
39783
+ }
39784
+ async open() {
39785
+ const modal = await this.modalController.create({
39786
+ component: ProfileModalComponent,
39787
+ cssClass: 'ds-modal-base',
39788
+ mode: 'ios',
39789
+ presentingElement: document.querySelector('ion-router-outlet') || undefined,
39790
+ backdropDismiss: true,
39791
+ showBackdrop: true,
39792
+ animated: true,
39793
+ });
39794
+ await modal.present();
39795
+ }
39796
+ async close(data) {
39797
+ return this.modalController.dismiss(data);
39798
+ }
39799
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
39800
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalService, providedIn: 'root' });
39801
+ }
39802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalService, decorators: [{
39803
+ type: Injectable,
39804
+ args: [{
39805
+ providedIn: 'root',
39806
+ }]
39807
+ }], ctorParameters: () => [{ type: i1.ModalController }] });
39808
+
39263
39809
  /**
39264
39810
  * Services Barrel File
39265
39811
  *
@@ -39283,5 +39829,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
39283
39829
  * Generated bundle index. Do not edit.
39284
39830
  */
39285
39831
 
39286
- export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DEFAULT_NOTIFICATION_PREFS, DEFAULT_SERVICE_PAGE_LABELS, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAddGroupTenantsModalComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingCancelConfirmationComponent, DsMobileBookingConfirmationWrapperComponent, DsMobileBookingDetailSheetComponent, DsMobileBookingDetailSheetService, DsMobileBookingModalComponent, DsMobileBookingModalService, DsMobileBookingSummaryComponent, DsMobileBottomSheetHeaderComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCapacitySheetComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileCommunityAdminPickerComponent, DsMobileCommunityAdminsModalComponent, DsMobileConfirmationSheetComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileCountBadgeComponent, DsMobileCreateGroupModalComponent, DsMobileDropdownComponent, DsMobileEditGroupModalComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFacilityArchiveConfirmationComponent, DsMobileFacilityCreationConfirmationWrapperComponent, DsMobileFacilityCreationModalComponent, DsMobileFacilityCreationModalService, DsMobileFacilityDeleteConfirmationComponent, DsMobileFacilityDetailModalComponent, DsMobileFacilityDetailModalService, DsMobileFileAttachmentComponent, DsMobileGlassSpinnerComponent, DsMobileGroupAvatarStackComponent, DsMobileGroupMembersModalComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileImagePlaceholderComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemBookingComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxImageWithDescriptionComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileListSearchComponent, DsMobileLoaderOverlayComponent, DsMobileLongPressDirective, DsMobileMediaActionsPanelComponent, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobileNotificationButtonComponent, DsMobileNotificationModalComponent, DsMobileNotificationModalService, DsMobileNotificationPromptComponent, DsMobileOfflineBannerComponent, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobilePillComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobilePriceSheetComponent, DsMobileProfileActionsSheetComponent, DsMobilePromptBottomSheetComponent, DsMobilePropertyBannerComponent, DsMobileRichTextEditorComponent, DsMobileSectionComponent, DsMobileServiceVendorModalService, DsMobileServiceVendorSheetComponent, DsMobileSwiperComponent, DsMobileSwiperWithNavComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsMobileTenantPickerModalComponent, DsMobileToggleComponent, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, FamilyAccessPageComponent, FamilyAccessService, InquiriesService, InviteSuccessPageComponent, MediaPickerService, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, NOTIFICATION_ICON_MAP, NotificationPromptService, NotificationService, PUSH_BACKEND_ADAPTER, PageLoadingService, PeerChatLauncherService, PeerMessagingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, PushNotificationService, RelativeTimePipe, SAMPLE_NOTIFICATIONS, SectionHeaderComponent, ServicesPageComponent, SettingsModalComponent, SettingsModalService, SignInPageComponent, SignInToAcceptPageComponent, TenantChatPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, VENDOR_MODAL_SERVICE, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition, dateBucket, extractPushPayload, isPeerDirectConversation, isPeerGroupConversation, notificationItemFromPush, peerTenantToParticipant, pushPayloadToNotificationItem };
39832
+ export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DEFAULT_NOTIFICATION_PREFS, DEFAULT_SERVICE_PAGE_LABELS, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAddGroupTenantsModalComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingCancelConfirmationComponent, DsMobileBookingConfirmationWrapperComponent, DsMobileBookingDetailSheetComponent, DsMobileBookingDetailSheetService, DsMobileBookingModalComponent, DsMobileBookingModalService, DsMobileBookingSummaryComponent, DsMobileBottomSheetHeaderComponent, DsMobileBottomSheetService, DsMobileBottomSheetWrapperComponent, DsMobileCapacitySheetComponent, DsMobileCardInlineBannerComponent, DsMobileCardInlineComponent, DsMobileCardInlineContactComponent, DsMobileCardInlineFileComponent, DsMobileChatModalComponent, DsMobileChatModalService, DsMobileActionsBottomSheetComponent as DsMobileCommentActionsBottomSheetComponent, DsMobileCommentComponent, DsMobileCommunityAdminPickerComponent, DsMobileCommunityAdminsModalComponent, DsMobileConfirmationSheetComponent, DsMobileContactListItemComponent, DsMobileContentComponent, DsMobileCountBadgeComponent, DsMobileCreateGroupModalComponent, DsMobileDropdownComponent, DsMobileEditGroupModalComponent, DsMobileEmptyStateComponent, DsMobileFabComponent, DsMobileFacilityArchiveConfirmationComponent, DsMobileFacilityCreationConfirmationWrapperComponent, DsMobileFacilityCreationModalComponent, DsMobileFacilityCreationModalService, DsMobileFacilityDeleteConfirmationComponent, DsMobileFacilityDetailModalComponent, DsMobileFacilityDetailModalService, DsMobileFileAttachmentComponent, DsMobileGlassSpinnerComponent, DsMobileGroupAvatarStackComponent, DsMobileGroupMembersModalComponent, DsMobileHandbookDetailModalComponent, DsMobileHandbookDetailModalService, DsMobileHandbookFolderComponent, DsMobileHandbookFolderMiniComponent, DsMobileHeaderContentComponent, DsMobileHeaderContentTileComponent, DsMobileIllustrationComponent, DsMobileImagePlaceholderComponent, DsMobileInlinePhotoComponent, DsMobileInlineTabsComponent, DsMobileInteractiveListItemBookingComponent, DsMobileInteractiveListItemInquiryComponent, DsMobileInteractiveListItemMessageComponent, DsMobileInteractiveListItemPostComponent, DsMobileLightboxImageComponent as DsMobileLightboxComponent, DsMobileLightboxFooterComponent, DsMobileLightboxHeaderComponent, DsMobileLightboxImageComponent, DsMobileLightboxImageWithDescriptionComponent, DsMobileLightboxPdfComponent, DsMobileLightboxService, DsMobileListItemComponent, DsMobileListItemStaticComponent, DsMobileListSearchComponent, DsMobileLoaderOverlayComponent, DsMobileLongPressDirective, DsMobileMediaActionsPanelComponent, DsMobileMessageBubbleComponent, DsMobileMessageComposerComponent, DsMobileModalBaseComponent, DsMobileModalService, DsMobileNewInquiryModalComponent, DsMobileNewInquiryModalService, DsMobileNotificationButtonComponent, DsMobileNotificationModalComponent, DsMobileNotificationModalService, DsMobileNotificationPromptComponent, DsMobileOfflineBannerComponent, DsMobilePageDetailsComponent, DsMobilePageMainComponent, DsMobilePillComponent, DsMobileActionsBottomSheetComponent as DsMobilePostActionsBottomSheetComponent, DsMobilePostComposerComponent, DsMobilePostCreateBottomSheetComponent, DsMobilePostDetailModalComponent, DsMobilePostDetailModalService, DsMobilePriceSheetComponent, DsMobileProfileActionsSheetComponent, DsMobilePromptBottomSheetComponent, DsMobilePropertyBannerComponent, DsMobileRichTextEditorComponent, DsMobileSectionComponent, DsMobileServiceVendorModalService, DsMobileServiceVendorSheetComponent, DsMobileSwiperComponent, DsMobileSwiperWithNavComponent, DsMobileSystemMessageBannerComponent, DsMobileTabBarComponent, DsMobileTabsComponent, DsMobileTenantPickerModalComponent, DsMobileToggleComponent, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, FamilyAccessPageComponent, FamilyAccessService, InquiriesService, InviteSuccessPageComponent, MediaPickerService, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, NOTIFICATION_ICON_MAP, NotificationPromptService, NotificationService, PUSH_BACKEND_ADAPTER, PageLoadingService, PeerChatLauncherService, PeerMessagingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, ProfileModalComponent, ProfileModalService, PushNotificationService, RelativeTimePipe, SAMPLE_NOTIFICATIONS, SectionHeaderComponent, ServicesPageComponent, SettingsModalComponent, SettingsModalService, SignInPageComponent, SignInToAcceptPageComponent, TenantChatPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, VENDOR_MODAL_SERVICE, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition, dateBucket, extractPushPayload, isPeerDirectConversation, isPeerGroupConversation, notificationItemFromPush, peerTenantToParticipant, pushPayloadToNotificationItem };
39287
39833
  //# sourceMappingURL=propbinder-mobile-design.mjs.map