@propbinder/mobile-design 0.4.0 → 0.4.41

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.
@@ -1923,23 +1923,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
1923
1923
  */
1924
1924
  class DsMobileActionsBottomSheetComponent {
1925
1925
  modalController;
1926
- /**
1927
- * Custom action groups to display (overrides isOwnContent)
1928
- */
1926
+ /** Custom action groups to display (overrides isOwnContent). Set via Ionic componentProps. */
1929
1927
  customActionGroups;
1930
- /**
1931
- * Whether this content belongs to the current user (for preset content actions)
1932
- */
1928
+ /** Whether this content belongs to the current user (for preset content actions). */
1933
1929
  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) {
1930
+ get actionGroups() {
1931
+ if (this.customActionGroups?.length) {
1940
1932
  return this.customActionGroups;
1941
1933
  }
1942
- // Otherwise fall back to preset content actions
1943
1934
  if (this.isOwnContent) {
1944
1935
  // Own content: Group 1 (Edit, Delete) + Group 2 (Like, Reply)
1945
1936
  return [
@@ -1998,7 +1989,7 @@ class DsMobileActionsBottomSheetComponent {
1998
1989
  },
1999
1990
  ];
2000
1991
  }
2001
- }, ...(ngDevMode ? [{ debugName: "actionGroups" }] : []));
1992
+ }
2002
1993
  constructor(modalController) {
2003
1994
  this.modalController = modalController;
2004
1995
  }
@@ -2013,7 +2004,7 @@ class DsMobileActionsBottomSheetComponent {
2013
2004
  <ds-mobile-bottom-sheet-wrapper>
2014
2005
  <!-- Actions List -->
2015
2006
  <div class="actions-list">
2016
- @for (group of actionGroups(); track $index; let isLast = $last) {
2007
+ @for (group of actionGroups; track $index; let isLast = $last) {
2017
2008
  <!-- Action Group -->
2018
2009
  <div class="action-group">
2019
2010
  @for (actionItem of group.actions; track actionItem.action; let isLastInGroup = $last) {
@@ -2042,7 +2033,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
2042
2033
  <ds-mobile-bottom-sheet-wrapper>
2043
2034
  <!-- Actions List -->
2044
2035
  <div class="actions-list">
2045
- @for (group of actionGroups(); track $index; let isLast = $last) {
2036
+ @for (group of actionGroups; track $index; let isLast = $last) {
2046
2037
  <!-- Action Group -->
2047
2038
  <div class="action-group">
2048
2039
  @for (actionItem of group.actions; track actionItem.action; let isLastInGroup = $last) {
@@ -2110,6 +2101,11 @@ function disableModalShadowPointerEvents(modal) {
2110
2101
  }, { once: true });
2111
2102
  }
2112
2103
 
2104
+ var modalShadowFix = /*#__PURE__*/Object.freeze({
2105
+ __proto__: null,
2106
+ disableModalShadowPointerEvents: disableModalShadowPointerEvents
2107
+ });
2108
+
2113
2109
  /**
2114
2110
  * DsMobileBottomSheetService
2115
2111
  *
@@ -4602,6 +4598,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
4602
4598
  class UserService {
4603
4599
  // User identity
4604
4600
  _displayName = signal('', ...(ngDevMode ? [{ debugName: "_displayName" }] : []));
4601
+ _email = signal('lars.m@email.dk', ...(ngDevMode ? [{ debugName: "_email" }] : []));
4602
+ _phone = signal('+45 28 91 44 02', ...(ngDevMode ? [{ debugName: "_phone" }] : []));
4605
4603
  _address = signal('', ...(ngDevMode ? [{ debugName: "_address" }] : []));
4606
4604
  // User avatar configuration
4607
4605
  _avatarInitials = signal('LM', ...(ngDevMode ? [{ debugName: "_avatarInitials" }] : []));
@@ -4611,6 +4609,8 @@ class UserService {
4611
4609
  _profileMenuItems = signal(undefined, ...(ngDevMode ? [{ debugName: "_profileMenuItems" }] : []));
4612
4610
  // Readonly computed values
4613
4611
  displayName = this._displayName.asReadonly();
4612
+ email = this._email.asReadonly();
4613
+ phone = this._phone.asReadonly();
4614
4614
  address = this._address.asReadonly();
4615
4615
  avatarInitials = this._avatarInitials.asReadonly();
4616
4616
  avatarType = this._avatarType.asReadonly();
@@ -4622,6 +4622,12 @@ class UserService {
4622
4622
  setDisplayName(name) {
4623
4623
  this._displayName.set(name);
4624
4624
  }
4625
+ setEmail(email) {
4626
+ this._email.set(email);
4627
+ }
4628
+ setPhone(phone) {
4629
+ this._phone.set(phone);
4630
+ }
4625
4631
  setAddress(address) {
4626
4632
  this._address.set(address);
4627
4633
  }
@@ -11628,6 +11634,11 @@ class MobileModalBase {
11628
11634
  * @default 'follow'
11629
11635
  */
11630
11636
  keyboardContentBehavior = input('follow', ...(ngDevMode ? [{ debugName: "keyboardContentBehavior" }] : []));
11637
+ /**
11638
+ * Show border below the header
11639
+ * @default true
11640
+ */
11641
+ showHeaderBorder = input(true, ...(ngDevMode ? [{ debugName: "showHeaderBorder" }] : []));
11631
11642
  /**
11632
11643
  * Optional interceptor called instead of the default dismiss when the close button is tapped.
11633
11644
  * Return a function to take over close behavior (e.g. navigate back within the modal).
@@ -11930,14 +11941,14 @@ class MobileModalBase {
11930
11941
  return fixedBottomHeight + keyboardHeight;
11931
11942
  }
11932
11943
  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 });
11944
+ 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
11945
  }
11935
11946
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileModalBase, decorators: [{
11936
11947
  type: Directive
11937
11948
  }], propDecorators: { ionContent: [{
11938
11949
  type: ViewChild,
11939
11950
  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"] }] } });
11951
+ }], 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
11952
 
11942
11953
  /**
11943
11954
  * DsMobileModalBaseComponent
@@ -12113,7 +12124,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12113
12124
  <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12114
12125
  <!-- Header (conditional) -->
12115
12126
  @if (shouldShowHeader()) {
12116
- <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()">
12127
+ <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()" [class.no-border]="!showHeaderBorder()">
12117
12128
  <div class="header-content">
12118
12129
  <!-- Leading slot (avatar, icon) - always rendered, CSS handles empty state -->
12119
12130
  <div class="header-leading">
@@ -12200,7 +12211,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12200
12211
  <ng-content select="[fixed-bottom]"></ng-content>
12201
12212
  <ng-content select="[footer]"></ng-content>
12202
12213
  </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"] }] });
12214
+ `, 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
12215
  }
12205
12216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsMobileModalBaseComponent, decorators: [{
12206
12217
  type: Component,
@@ -12218,7 +12229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
12218
12229
  <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12219
12230
  <!-- Header (conditional) -->
12220
12231
  @if (shouldShowHeader()) {
12221
- <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()">
12232
+ <div class="modal-header" [class.no-leading-content]="!hasHeaderLeadingContent()" [class.no-border]="!showHeaderBorder()">
12222
12233
  <div class="header-content">
12223
12234
  <!-- Leading slot (avatar, icon) - always rendered, CSS handles empty state -->
12224
12235
  <div class="header-leading">
@@ -12305,7 +12316,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
12305
12316
  <ng-content select="[fixed-bottom]"></ng-content>
12306
12317
  <ng-content select="[footer]"></ng-content>
12307
12318
  </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"] }]
12319
+ `, 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
12320
  }], 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
12321
  type: ViewChild,
12311
12322
  args: [IonContent, { read: IonContent }]
@@ -13541,7 +13552,6 @@ const DEFAULT_PANEL_LABELS = {
13541
13552
  groupNamePlaceholder: 'Gruppenavn',
13542
13553
  takePhoto: 'Tag et billede',
13543
13554
  chooseFromLibrary: 'Vælg fra bibliotek',
13544
- deletePhoto: 'Slet billede',
13545
13555
  };
13546
13556
  class DsMobileChatGroupPanelsComponent {
13547
13557
  modalCtrl = inject(ModalController);
@@ -13944,7 +13954,7 @@ class DsMobileChatGroupPanelsComponent {
13944
13954
  </ds-mobile-action-list-item>
13945
13955
  @if (editAvatarUrl()) {
13946
13956
  <ds-mobile-action-list-item
13947
- [title]="lbl().deletePhoto"
13957
+ [title]="'Slet billede'"
13948
13958
  [showDivider]="false"
13949
13959
  (itemClick)="deleteImage()">
13950
13960
  <ds-icon action-icon name="remixDeleteBinLine" size="24px" />
@@ -14167,7 +14177,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
14167
14177
  </ds-mobile-action-list-item>
14168
14178
  @if (editAvatarUrl()) {
14169
14179
  <ds-mobile-action-list-item
14170
- [title]="lbl().deletePhoto"
14180
+ [title]="'Slet billede'"
14171
14181
  [showDivider]="false"
14172
14182
  (itemClick)="deleteImage()">
14173
14183
  <ds-icon action-icon name="remixDeleteBinLine" size="24px" />
@@ -17152,6 +17162,7 @@ class DsMobileChatModalComponent {
17152
17162
  [loading]="loading"
17153
17163
  [error]="localError() || error"
17154
17164
  [showHeader]="true"
17165
+ [showHeaderBorder]="groupPanelView() === 'chat' || groupPanelView() === 'add-members'"
17155
17166
  [headerTitle]="groupHeaderTitle()"
17156
17167
  [headerMeta]="groupHeaderMeta()"
17157
17168
  [headerTitleInteractive]="groupHeaderTitleInteractive()"
@@ -17408,7 +17419,7 @@ class DsMobileChatModalComponent {
17408
17419
  </ds-mobile-message-composer>
17409
17420
  </div>
17410
17421
  </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"] }] });
17422
+ `, 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
17423
  }
17413
17424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsMobileChatModalComponent, decorators: [{
17414
17425
  type: Component,
@@ -17435,6 +17446,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
17435
17446
  [loading]="loading"
17436
17447
  [error]="localError() || error"
17437
17448
  [showHeader]="true"
17449
+ [showHeaderBorder]="groupPanelView() === 'chat' || groupPanelView() === 'add-members'"
17438
17450
  [headerTitle]="groupHeaderTitle()"
17439
17451
  [headerMeta]="groupHeaderMeta()"
17440
17452
  [headerTitleInteractive]="groupHeaderTitleInteractive()"
@@ -17691,7 +17703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
17691
17703
  </ds-mobile-message-composer>
17692
17704
  </div>
17693
17705
  </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"] }]
17706
+ `, 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
17707
  }], ctorParameters: () => [{ type: DsMobileLightboxService }], propDecorators: { chatData: [{
17696
17708
  type: Input
17697
17709
  }], loading: [{
@@ -19365,7 +19377,7 @@ class DsMobileInteractiveListItemBookingComponent {
19365
19377
  getStatusVariant() {
19366
19378
  const status = this.availabilityStatus();
19367
19379
  if (status === 'available-today')
19368
- return 'brand';
19380
+ return 'success';
19369
19381
  if (status === 'available-from')
19370
19382
  return 'warning';
19371
19383
  return 'grey';
@@ -19457,7 +19469,7 @@ class DsMobileInteractiveListItemBookingComponent {
19457
19469
  </div>
19458
19470
  }
19459
19471
  </ds-mobile-list-item>
19460
- `, isInline: true, styles: [":host{display:block}:host:first-child{--item-padding-top: 0}:host:last-child{--divider-display: none;--item-padding-bottom: 0}.booking-thumbnail{position:relative;flex-shrink:0;width:64px;height:64px;border-radius:12px;overflow:hidden;background:var(--color-surface-secondary, #f5f5f5);display:flex;align-items:center;justify-content:center}.booking-thumbnail img{width:100%;height:100%;object-fit:cover}.booking-thumbnail-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-color-default-tertiary, #737373)}.booking-content{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0}.booking-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-primary, #202227);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.booking-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:400;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-secondary, #545B66);margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booking-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66);display:flex;align-items:center;gap:8px;margin-top:4px}.booking-status{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:500;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-status.available-today{color:var(--color-accent, #5d5fef)}.booking-status.available-from{color:var(--color-warning, #f59e0b)}.booking-status.unavailable{color:var(--text-color-default-tertiary, #737373)}.booking-datetime{display:flex;align-items:center;gap:4px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-trailing{display:flex;align-items:center;color:var(--color-text-tertiary, #a3a3a3)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsShapeIndicatorComponent, selector: "ds-shape-indicator", inputs: ["shape", "variant", "label"] }, { kind: "component", type: DsMobileListItemComponent, selector: "ds-mobile-list-item", inputs: ["leadingSize", "variant", "align", "flushTop", "interactive", "disabled", "loading", "enableLongPress", "showDesktopMoreButton", "moreActions", "moreButtonAriaLabel", "interactiveOffset", "title", "subtitle", "showDivider", "dividerSpacing"], outputs: ["itemClick", "moreButtonClick"] }, { kind: "component", type: DsMobileGlassSpinnerComponent, selector: "ds-mobile-glass-spinner", inputs: ["spinnerSize", "borderRadius"] }] });
19472
+ `, isInline: true, styles: [":host{display:block}:host:first-child{--item-padding-top: 0}:host:last-child{--divider-display: none;--item-padding-bottom: 0}.booking-thumbnail{position:relative;flex-shrink:0;width:64px;height:64px;border-radius:12px;overflow:hidden;background:var(--color-surface-secondary, #f5f5f5);display:flex;align-items:center;justify-content:center}.booking-thumbnail img{width:100%;height:100%;object-fit:cover}.booking-thumbnail-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-color-default-tertiary, #737373)}.booking-content{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0}.booking-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-primary, #202227);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.booking-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:400;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-secondary, #545B66);margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booking-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66);display:flex;align-items:center;gap:8px;margin-top:4px}.booking-status{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:500;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-status.available-today{color:var(--color-success-base, #158452)}.booking-status.available-from{color:var(--color-warning, #f59e0b)}.booking-status.unavailable{color:var(--text-color-default-tertiary, #737373)}.booking-datetime{display:flex;align-items:center;gap:4px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-trailing{display:flex;align-items:center;color:var(--color-text-tertiary, #a3a3a3)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsShapeIndicatorComponent, selector: "ds-shape-indicator", inputs: ["shape", "variant", "label"] }, { kind: "component", type: DsMobileListItemComponent, selector: "ds-mobile-list-item", inputs: ["leadingSize", "variant", "align", "flushTop", "interactive", "disabled", "loading", "enableLongPress", "showDesktopMoreButton", "moreActions", "moreButtonAriaLabel", "interactiveOffset", "title", "subtitle", "showDivider", "dividerSpacing"], outputs: ["itemClick", "moreButtonClick"] }, { kind: "component", type: DsMobileGlassSpinnerComponent, selector: "ds-mobile-glass-spinner", inputs: ["spinnerSize", "borderRadius"] }] });
19461
19473
  }
19462
19474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: DsMobileInteractiveListItemBookingComponent, decorators: [{
19463
19475
  type: Component,
@@ -19537,7 +19549,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
19537
19549
  </div>
19538
19550
  }
19539
19551
  </ds-mobile-list-item>
19540
- `, styles: [":host{display:block}:host:first-child{--item-padding-top: 0}:host:last-child{--divider-display: none;--item-padding-bottom: 0}.booking-thumbnail{position:relative;flex-shrink:0;width:64px;height:64px;border-radius:12px;overflow:hidden;background:var(--color-surface-secondary, #f5f5f5);display:flex;align-items:center;justify-content:center}.booking-thumbnail img{width:100%;height:100%;object-fit:cover}.booking-thumbnail-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-color-default-tertiary, #737373)}.booking-content{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0}.booking-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-primary, #202227);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.booking-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:400;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-secondary, #545B66);margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booking-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66);display:flex;align-items:center;gap:8px;margin-top:4px}.booking-status{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:500;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-status.available-today{color:var(--color-accent, #5d5fef)}.booking-status.available-from{color:var(--color-warning, #f59e0b)}.booking-status.unavailable{color:var(--text-color-default-tertiary, #737373)}.booking-datetime{display:flex;align-items:center;gap:4px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-trailing{display:flex;align-items:center;color:var(--color-text-tertiary, #a3a3a3)}\n"] }]
19552
+ `, styles: [":host{display:block}:host:first-child{--item-padding-top: 0}:host:last-child{--divider-display: none;--item-padding-bottom: 0}.booking-thumbnail{position:relative;flex-shrink:0;width:64px;height:64px;border-radius:12px;overflow:hidden;background:var(--color-surface-secondary, #f5f5f5);display:flex;align-items:center;justify-content:center}.booking-thumbnail img{width:100%;height:100%;object-fit:cover}.booking-thumbnail-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--text-color-default-tertiary, #737373)}.booking-content{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0}.booking-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-primary, #202227);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.booking-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm, 14px);font-weight:400;line-height:20px;letter-spacing:-.3px;color:var(--text-color-default-secondary, #545B66);margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booking-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs, 12px);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66);display:flex;align-items:center;gap:8px;margin-top:4px}.booking-status{display:flex;align-items:center;gap:6px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:500;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-status.available-today{color:var(--color-success-base, #158452)}.booking-status.available-from{color:var(--color-warning, #f59e0b)}.booking-status.unavailable{color:var(--text-color-default-tertiary, #737373)}.booking-datetime{display:flex;align-items:center;gap:4px;font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--text-color-default-secondary, #545B66)}.booking-trailing{display:flex;align-items:center;color:var(--color-text-tertiary, #a3a3a3)}\n"] }]
19541
19553
  }], ctorParameters: () => [], propDecorators: { thumbnail: [{ type: i0.Input, args: [{ isSignal: true, alias: "thumbnail", required: false }] }], facilityTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "facilityTitle", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], bookingDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "bookingDate", required: false }] }], bookingTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "bookingTime", required: false }] }], availabilityStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "availabilityStatus", required: false }] }], statusLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusLabel", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], showChevron: [{ type: i0.Input, args: [{ isSignal: true, alias: "showChevron", required: false }] }], enableLongPress: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableLongPress", required: false }] }], moreActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreActions", required: false }] }], bookingClick: [{ type: i0.Output, args: ["bookingClick"] }], longPress: [{ type: i0.Output, args: ["longPress"] }] } });
19542
19554
 
19543
19555
  /**
@@ -31329,6 +31341,465 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
31329
31341
  `, styles: [".settings-content{padding:20px}\n"] }]
31330
31342
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], prefs: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefs", required: false }] }] } });
31331
31343
 
31344
+ class ProfileModalComponent {
31345
+ userService = inject(UserService);
31346
+ modalController = inject(ModalController);
31347
+ closeInterceptor = () => this.close();
31348
+ editingName = signal(false, ...(ngDevMode ? [{ debugName: "editingName" }] : []));
31349
+ editingEmail = signal(false, ...(ngDevMode ? [{ debugName: "editingEmail" }] : []));
31350
+ editingPhone = signal(false, ...(ngDevMode ? [{ debugName: "editingPhone" }] : []));
31351
+ keyboardOffset = signal(false, ...(ngDevMode ? [{ debugName: "keyboardOffset" }] : []));
31352
+ hasChanges = signal(false, ...(ngDevMode ? [{ debugName: "hasChanges" }] : []));
31353
+ originalName = '';
31354
+ originalEmail = '';
31355
+ originalPhone = '';
31356
+ originalAvatarSrc = '';
31357
+ originalAvatarType = 'initials';
31358
+ originalAvatarInitials = '';
31359
+ nameInputRef;
31360
+ emailInputRef;
31361
+ phoneInputRef;
31362
+ photoFileInputRef;
31363
+ constructor() {
31364
+ this.originalName = this.userService.displayName();
31365
+ this.originalEmail = this.userService.email();
31366
+ this.originalPhone = this.userService.phone();
31367
+ this.originalAvatarSrc = this.userService.avatarSrc();
31368
+ this.originalAvatarType = this.userService.avatarType();
31369
+ this.originalAvatarInitials = this.userService.avatarInitials();
31370
+ }
31371
+ checkForChanges() {
31372
+ this.hasChanges.set(this.userService.displayName() !== this.originalName ||
31373
+ this.userService.email() !== this.originalEmail ||
31374
+ this.userService.phone() !== this.originalPhone ||
31375
+ this.userService.avatarSrc() !== this.originalAvatarSrc ||
31376
+ this.userService.avatarType() !== this.originalAvatarType);
31377
+ }
31378
+ async close() {
31379
+ if (!this.hasChanges()) {
31380
+ await this.modalController.dismiss();
31381
+ return;
31382
+ }
31383
+ const action = await this.showUnsavedChangesSheet();
31384
+ if (!action)
31385
+ return;
31386
+ if (action === 'discard') {
31387
+ this.userService.setDisplayName(this.originalName);
31388
+ this.userService.setEmail(this.originalEmail);
31389
+ this.userService.setPhone(this.originalPhone);
31390
+ this.userService.setAvatarSrc(this.originalAvatarSrc);
31391
+ this.userService.setAvatarType(this.originalAvatarType);
31392
+ this.userService.setAvatarInitials(this.originalAvatarInitials);
31393
+ }
31394
+ await this.modalController.dismiss();
31395
+ }
31396
+ async showUnsavedChangesSheet() {
31397
+ const { DsMobileConfirmationSheetComponent } = await Promise.resolve().then(function () { return dsMobileConfirmationSheet; });
31398
+ const { disableModalShadowPointerEvents } = await Promise.resolve().then(function () { return modalShadowFix; });
31399
+ const sheet = await this.modalController.create({
31400
+ component: DsMobileConfirmationSheetComponent,
31401
+ componentProps: {
31402
+ title: 'Du har ændringer der ikke er gemt',
31403
+ message: 'Vil du gemme eller kassere dine ændringer?',
31404
+ buttonText: 'Gem ændringer',
31405
+ showIllustration: false,
31406
+ secondaryButtonText: 'Kassér ændringer',
31407
+ secondaryButtonVariant: 'secondary',
31408
+ },
31409
+ breakpoints: [0, 1],
31410
+ initialBreakpoint: 1,
31411
+ handle: true,
31412
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
31413
+ backdropDismiss: false,
31414
+ showBackdrop: true,
31415
+ });
31416
+ await sheet.present();
31417
+ disableModalShadowPointerEvents(sheet);
31418
+ const result = await sheet.onDidDismiss();
31419
+ if (result.role === 'confirm')
31420
+ return 'save';
31421
+ if (result.role === 'backdrop')
31422
+ return 'discard';
31423
+ return null;
31424
+ }
31425
+ startEdit(field) {
31426
+ if (field === 'name') {
31427
+ this.editingName.set(true);
31428
+ this.keyboardOffset.set(false);
31429
+ setTimeout(() => this.nameInputRef?.nativeElement.focus());
31430
+ }
31431
+ else if (field === 'email') {
31432
+ this.editingEmail.set(true);
31433
+ this.keyboardOffset.set(false);
31434
+ setTimeout(() => this.emailInputRef?.nativeElement.focus());
31435
+ }
31436
+ else {
31437
+ this.editingPhone.set(true);
31438
+ this.keyboardOffset.set(true);
31439
+ setTimeout(() => this.phoneInputRef?.nativeElement.focus());
31440
+ }
31441
+ }
31442
+ saveName(event) {
31443
+ const val = event.target.value.trim();
31444
+ if (val) {
31445
+ this.userService.setDisplayName(val);
31446
+ const parts = val.split(' ');
31447
+ const initials = parts.length >= 2
31448
+ ? (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()
31449
+ : val.substring(0, 2).toUpperCase();
31450
+ this.userService.setAvatarInitials(initials);
31451
+ }
31452
+ this.keyboardOffset.set(false);
31453
+ this.editingName.set(false);
31454
+ this.checkForChanges();
31455
+ }
31456
+ saveEmail(event) {
31457
+ const val = event.target.value.trim();
31458
+ if (val)
31459
+ this.userService.setEmail(val);
31460
+ this.keyboardOffset.set(false);
31461
+ this.editingEmail.set(false);
31462
+ this.checkForChanges();
31463
+ }
31464
+ savePhone(event) {
31465
+ const val = event.target.value.trim();
31466
+ if (val)
31467
+ this.userService.setPhone(val);
31468
+ this.keyboardOffset.set(false);
31469
+ this.editingPhone.set(false);
31470
+ this.checkForChanges();
31471
+ }
31472
+ async openPhotoActions() {
31473
+ const photoActions = [
31474
+ {
31475
+ actions: [
31476
+ { action: 'take-photo', title: 'Take a picture', icon: 'remixCamera3Line' },
31477
+ { action: 'choose-library', title: 'Choose from library', icon: 'remixImageLine' },
31478
+ ],
31479
+ },
31480
+ ];
31481
+ if (this.userService.avatarSrc()) {
31482
+ photoActions[0].actions.push({
31483
+ action: 'delete-photo',
31484
+ title: 'Delete photo',
31485
+ icon: 'remixDeleteBinLine',
31486
+ destructive: true,
31487
+ });
31488
+ }
31489
+ const sheet = await this.modalController.create({
31490
+ component: DsMobileActionsBottomSheetComponent,
31491
+ componentProps: { customActionGroups: photoActions },
31492
+ breakpoints: [0, 1],
31493
+ initialBreakpoint: 1,
31494
+ handle: true,
31495
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
31496
+ backdropDismiss: true,
31497
+ });
31498
+ await sheet.present();
31499
+ disableModalShadowPointerEvents(sheet);
31500
+ const result = await sheet.onWillDismiss();
31501
+ if (!result.data?.action)
31502
+ return;
31503
+ const input = this.photoFileInputRef?.nativeElement;
31504
+ if (!input)
31505
+ return;
31506
+ switch (result.data.action) {
31507
+ case 'take-photo':
31508
+ input.setAttribute('capture', 'environment');
31509
+ input.click();
31510
+ break;
31511
+ case 'choose-library':
31512
+ input.removeAttribute('capture');
31513
+ input.click();
31514
+ break;
31515
+ case 'delete-photo':
31516
+ this.userService.setAvatarSrc('');
31517
+ this.userService.setAvatarType('initials');
31518
+ this.checkForChanges();
31519
+ break;
31520
+ }
31521
+ }
31522
+ onPhotoSelected(event) {
31523
+ const file = event.target.files?.[0];
31524
+ if (!file)
31525
+ return;
31526
+ const url = URL.createObjectURL(file);
31527
+ this.userService.setAvatarSrc(url);
31528
+ this.userService.setAvatarType('photo');
31529
+ event.target.value = '';
31530
+ this.checkForChanges();
31531
+ }
31532
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31533
+ 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: `
31534
+ <ds-mobile-modal-base headerTitle="My profile" [showHeader]="true" [showHeaderBorder]="false" [enableKeyboardHandling]="true" [onCloseRequest]="closeInterceptor">
31535
+ <div header-leading>
31536
+ <ds-icon-button
31537
+ class="back-btn"
31538
+ icon="remixArrowLeftSLine"
31539
+ variant="secondary"
31540
+ size="lg"
31541
+ (clicked)="close()"
31542
+ aria-label="Tilbage"
31543
+ />
31544
+ </div>
31545
+
31546
+ <div class="profile-content" [class.keyboard-offset]="keyboardOffset()">
31547
+
31548
+ <!-- Hero -->
31549
+ <div class="profile-hero">
31550
+ <button
31551
+ type="button"
31552
+ class="profile-hero-avatar"
31553
+ (click)="openPhotoActions()"
31554
+ aria-label="Edit profile photo"
31555
+ >
31556
+ <ds-avatar-with-badge
31557
+ [type]="userService.avatarType()"
31558
+ [initials]="userService.avatarInitials()"
31559
+ [src]="userService.avatarSrc()"
31560
+ size="xl"
31561
+ [showBadge]="false"
31562
+ />
31563
+ <span class="profile-hero-avatar-edit" aria-hidden="true">
31564
+ <ds-icon name="remixEditLine" size="14px" />
31565
+ </span>
31566
+ </button>
31567
+ <div class="profile-hero-text">
31568
+ <h2 class="profile-hero-name">{{ userService.displayName() }}</h2>
31569
+ <p class="profile-hero-email">{{ userService.email() }}</p>
31570
+ </div>
31571
+ </div>
31572
+
31573
+ <!-- Fields -->
31574
+ <div class="field-group">
31575
+
31576
+ <!-- Full name -->
31577
+ <div class="field">
31578
+ <p class="field-label">Full name</p>
31579
+ <div class="field-pill" [class.editing]="editingName()" (click)="!editingName() && startEdit('name')">
31580
+ @if (!editingName()) {
31581
+ <p class="field-pill-value">{{ userService.displayName() }}</p>
31582
+ } @else {
31583
+ <input
31584
+ #nameInput
31585
+ type="text"
31586
+ class="field-pill-input"
31587
+ [value]="userService.displayName()"
31588
+ (blur)="saveName($event)"
31589
+ (keydown.enter)="nameInputRef?.nativeElement?.blur()"
31590
+ />
31591
+ }
31592
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingName()" />
31593
+ </div>
31594
+ </div>
31595
+
31596
+ <!-- Email address -->
31597
+ <div class="field">
31598
+ <p class="field-label">Email address</p>
31599
+ <div class="field-pill" [class.editing]="editingEmail()" (click)="!editingEmail() && startEdit('email')">
31600
+ @if (!editingEmail()) {
31601
+ <p class="field-pill-value">{{ userService.email() }}</p>
31602
+ } @else {
31603
+ <input
31604
+ #emailInput
31605
+ type="email"
31606
+ class="field-pill-input"
31607
+ [value]="userService.email()"
31608
+ (blur)="saveEmail($event)"
31609
+ (keydown.enter)="emailInputRef?.nativeElement?.blur()"
31610
+ />
31611
+ }
31612
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingEmail()" />
31613
+ </div>
31614
+ </div>
31615
+
31616
+ <!-- Phone -->
31617
+ <div class="field">
31618
+ <p class="field-label">Phone</p>
31619
+ <div class="field-pill" [class.editing]="editingPhone()" (click)="!editingPhone() && startEdit('phone')">
31620
+ @if (!editingPhone()) {
31621
+ <p class="field-pill-value">{{ userService.phone() }}</p>
31622
+ } @else {
31623
+ <input
31624
+ #phoneInput
31625
+ type="tel"
31626
+ class="field-pill-input"
31627
+ [value]="userService.phone()"
31628
+ (blur)="savePhone($event)"
31629
+ (keydown.enter)="phoneInputRef?.nativeElement?.blur()"
31630
+ />
31631
+ }
31632
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingPhone()" />
31633
+ </div>
31634
+ </div>
31635
+
31636
+ <!-- Address (read-only) -->
31637
+ <div class="field">
31638
+ <p class="field-label">Adress</p>
31639
+ <div class="field-pill field-pill--readonly">
31640
+ <p class="field-pill-value">{{ userService.address() }}</p>
31641
+ </div>
31642
+ </div>
31643
+
31644
+ </div>
31645
+ </div>
31646
+
31647
+ <input
31648
+ #photoFileInput
31649
+ type="file"
31650
+ accept="image/*"
31651
+ class="visually-hidden"
31652
+ (change)="onPhotoSelected($event)"
31653
+ />
31654
+
31655
+ </ds-mobile-modal-base>
31656
+ `, 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"] }] });
31657
+ }
31658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalComponent, decorators: [{
31659
+ type: Component,
31660
+ args: [{ selector: 'app-profile-modal', standalone: true, imports: [
31661
+ DsMobileModalBaseComponent,
31662
+ DsAvatarWithBadgeComponent,
31663
+ DsIconComponent,
31664
+ DsIconButtonComponent,
31665
+ ], template: `
31666
+ <ds-mobile-modal-base headerTitle="My profile" [showHeader]="true" [showHeaderBorder]="false" [enableKeyboardHandling]="true" [onCloseRequest]="closeInterceptor">
31667
+ <div header-leading>
31668
+ <ds-icon-button
31669
+ class="back-btn"
31670
+ icon="remixArrowLeftSLine"
31671
+ variant="secondary"
31672
+ size="lg"
31673
+ (clicked)="close()"
31674
+ aria-label="Tilbage"
31675
+ />
31676
+ </div>
31677
+
31678
+ <div class="profile-content" [class.keyboard-offset]="keyboardOffset()">
31679
+
31680
+ <!-- Hero -->
31681
+ <div class="profile-hero">
31682
+ <button
31683
+ type="button"
31684
+ class="profile-hero-avatar"
31685
+ (click)="openPhotoActions()"
31686
+ aria-label="Edit profile photo"
31687
+ >
31688
+ <ds-avatar-with-badge
31689
+ [type]="userService.avatarType()"
31690
+ [initials]="userService.avatarInitials()"
31691
+ [src]="userService.avatarSrc()"
31692
+ size="xl"
31693
+ [showBadge]="false"
31694
+ />
31695
+ <span class="profile-hero-avatar-edit" aria-hidden="true">
31696
+ <ds-icon name="remixEditLine" size="14px" />
31697
+ </span>
31698
+ </button>
31699
+ <div class="profile-hero-text">
31700
+ <h2 class="profile-hero-name">{{ userService.displayName() }}</h2>
31701
+ <p class="profile-hero-email">{{ userService.email() }}</p>
31702
+ </div>
31703
+ </div>
31704
+
31705
+ <!-- Fields -->
31706
+ <div class="field-group">
31707
+
31708
+ <!-- Full name -->
31709
+ <div class="field">
31710
+ <p class="field-label">Full name</p>
31711
+ <div class="field-pill" [class.editing]="editingName()" (click)="!editingName() && startEdit('name')">
31712
+ @if (!editingName()) {
31713
+ <p class="field-pill-value">{{ userService.displayName() }}</p>
31714
+ } @else {
31715
+ <input
31716
+ #nameInput
31717
+ type="text"
31718
+ class="field-pill-input"
31719
+ [value]="userService.displayName()"
31720
+ (blur)="saveName($event)"
31721
+ (keydown.enter)="nameInputRef?.nativeElement?.blur()"
31722
+ />
31723
+ }
31724
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingName()" />
31725
+ </div>
31726
+ </div>
31727
+
31728
+ <!-- Email address -->
31729
+ <div class="field">
31730
+ <p class="field-label">Email address</p>
31731
+ <div class="field-pill" [class.editing]="editingEmail()" (click)="!editingEmail() && startEdit('email')">
31732
+ @if (!editingEmail()) {
31733
+ <p class="field-pill-value">{{ userService.email() }}</p>
31734
+ } @else {
31735
+ <input
31736
+ #emailInput
31737
+ type="email"
31738
+ class="field-pill-input"
31739
+ [value]="userService.email()"
31740
+ (blur)="saveEmail($event)"
31741
+ (keydown.enter)="emailInputRef?.nativeElement?.blur()"
31742
+ />
31743
+ }
31744
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingEmail()" />
31745
+ </div>
31746
+ </div>
31747
+
31748
+ <!-- Phone -->
31749
+ <div class="field">
31750
+ <p class="field-label">Phone</p>
31751
+ <div class="field-pill" [class.editing]="editingPhone()" (click)="!editingPhone() && startEdit('phone')">
31752
+ @if (!editingPhone()) {
31753
+ <p class="field-pill-value">{{ userService.phone() }}</p>
31754
+ } @else {
31755
+ <input
31756
+ #phoneInput
31757
+ type="tel"
31758
+ class="field-pill-input"
31759
+ [value]="userService.phone()"
31760
+ (blur)="savePhone($event)"
31761
+ (keydown.enter)="phoneInputRef?.nativeElement?.blur()"
31762
+ />
31763
+ }
31764
+ <ds-icon name="remixEditLine" size="16px" class="field-pill-chevron" [class.hidden]="editingPhone()" />
31765
+ </div>
31766
+ </div>
31767
+
31768
+ <!-- Address (read-only) -->
31769
+ <div class="field">
31770
+ <p class="field-label">Adress</p>
31771
+ <div class="field-pill field-pill--readonly">
31772
+ <p class="field-pill-value">{{ userService.address() }}</p>
31773
+ </div>
31774
+ </div>
31775
+
31776
+ </div>
31777
+ </div>
31778
+
31779
+ <input
31780
+ #photoFileInput
31781
+ type="file"
31782
+ accept="image/*"
31783
+ class="visually-hidden"
31784
+ (change)="onPhotoSelected($event)"
31785
+ />
31786
+
31787
+ </ds-mobile-modal-base>
31788
+ `, 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"] }]
31789
+ }], ctorParameters: () => [], propDecorators: { nameInputRef: [{
31790
+ type: ViewChild,
31791
+ args: ['nameInput']
31792
+ }], emailInputRef: [{
31793
+ type: ViewChild,
31794
+ args: ['emailInput']
31795
+ }], phoneInputRef: [{
31796
+ type: ViewChild,
31797
+ args: ['phoneInput']
31798
+ }], photoFileInputRef: [{
31799
+ type: ViewChild,
31800
+ args: ['photoFileInput']
31801
+ }] } });
31802
+
31332
31803
  // Mobile Page Components
31333
31804
 
31334
31805
  class MobileCommunityPageComponent {
@@ -31640,6 +32111,7 @@ class MobileCommunityPageComponent {
31640
32111
  [notificationCount]="notificationService.unreadCount()"
31641
32112
  [avatarInitials]="userService.avatarInitials()"
31642
32113
  [avatarType]="userService.avatarType()"
32114
+ [avatarSrc]="userService.avatarSrc()"
31643
32115
  [contentLoading]="isLoading()"
31644
32116
  [contentLoadingVariant]="'card'"
31645
32117
  (notificationClick)="handleNotificationClick()"
@@ -31900,6 +32372,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
31900
32372
  [notificationCount]="notificationService.unreadCount()"
31901
32373
  [avatarInitials]="userService.avatarInitials()"
31902
32374
  [avatarType]="userService.avatarType()"
32375
+ [avatarSrc]="userService.avatarSrc()"
31903
32376
  [contentLoading]="isLoading()"
31904
32377
  [contentLoadingVariant]="'card'"
31905
32378
  (notificationClick)="handleNotificationClick()"
@@ -32411,7 +32884,7 @@ class MobileHandbookPageComponent {
32411
32884
  }
32412
32885
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileHandbookPageComponent, deps: [{ token: UserService }], target: i0.ɵɵFactoryTarget.Component });
32413
32886
  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)">
32887
+ <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
32888
  <!-- Offline indicator -->
32416
32889
  @if (pageComponent.isOffline()) {
32417
32890
  <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
@@ -32437,7 +32910,7 @@ class MobileHandbookPageComponent {
32437
32910
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: MobileHandbookPageComponent, decorators: [{
32438
32911
  type: Component,
32439
32912
  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)">
32913
+ <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
32914
  <!-- Offline indicator -->
32442
32915
  @if (pageComponent.isOffline()) {
32443
32916
  <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
@@ -33239,6 +33712,7 @@ class MobileHomePageComponent {
33239
33712
  [notificationCount]="notificationService.unreadCount()"
33240
33713
  [avatarInitials]="userService.avatarInitials()"
33241
33714
  [avatarType]="userService.avatarType()"
33715
+ [avatarSrc]="userService.avatarSrc()"
33242
33716
  (notificationClick)="handleNotificationClick()"
33243
33717
  (refresh)="handleRefresh($event)"
33244
33718
  >
@@ -33451,6 +33925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
33451
33925
  [notificationCount]="notificationService.unreadCount()"
33452
33926
  [avatarInitials]="userService.avatarInitials()"
33453
33927
  [avatarType]="userService.avatarType()"
33928
+ [avatarSrc]="userService.avatarSrc()"
33454
33929
  (notificationClick)="handleNotificationClick()"
33455
33930
  (refresh)="handleRefresh($event)"
33456
33931
  >
@@ -33726,6 +34201,7 @@ class MobileInquiriesPageComponent {
33726
34201
  [notificationCount]="notificationService.unreadCount()"
33727
34202
  [avatarInitials]="userService.avatarInitials()"
33728
34203
  [avatarType]="userService.avatarType()"
34204
+ [avatarSrc]="userService.avatarSrc()"
33729
34205
  [contentLoading]="isLoading()"
33730
34206
  [contentLoadingVariant]="'list'"
33731
34207
  (notificationClick)="handleNotificationClick()"
@@ -33801,6 +34277,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
33801
34277
  [notificationCount]="notificationService.unreadCount()"
33802
34278
  [avatarInitials]="userService.avatarInitials()"
33803
34279
  [avatarType]="userService.avatarType()"
34280
+ [avatarSrc]="userService.avatarSrc()"
33804
34281
  [contentLoading]="isLoading()"
33805
34282
  [contentLoadingVariant]="'list'"
33806
34283
  (notificationClick)="handleNotificationClick()"
@@ -36112,33 +36589,10 @@ class MobileTabsExampleComponent {
36112
36589
  * NOTE: Desktop only - called directly from tab bar.
36113
36590
  * Mobile actions are handled globally in AppComponent via UserService.
36114
36591
  */
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);
36592
+ handleProfileAction(_result) {
36593
+ // All profile actions are handled globally in AppComponent via UserService.
36594
+ // ds-mobile-page-main already calls notifyProfileAction() internally,
36595
+ // so no forwarding is needed here.
36142
36596
  }
36143
36597
  handleMoreMenuAction(item) {
36144
36598
  if (item.route) {
@@ -36208,6 +36662,7 @@ class MobileTabsExampleComponent {
36208
36662
  [notificationCount]="notificationService.unreadCount()"
36209
36663
  [avatarInitials]="userService.avatarInitials()"
36210
36664
  [avatarType]="userService.avatarType()"
36665
+ [avatarSrc]="userService.avatarSrc()"
36211
36666
  [profileMenuItems]="profileMenuItems"
36212
36667
  (notificationClick)="handleNotificationClick()"
36213
36668
  (profileActionSelected)="handleProfileAction($event)"
@@ -36252,6 +36707,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
36252
36707
  [notificationCount]="notificationService.unreadCount()"
36253
36708
  [avatarInitials]="userService.avatarInitials()"
36254
36709
  [avatarType]="userService.avatarType()"
36710
+ [avatarSrc]="userService.avatarSrc()"
36255
36711
  [profileMenuItems]="profileMenuItems"
36256
36712
  (notificationClick)="handleNotificationClick()"
36257
36713
  (profileActionSelected)="handleProfileAction($event)"
@@ -36799,6 +37255,7 @@ class MobileBookingPageComponent {
36799
37255
  [notificationCount]="notificationService.unreadCount()"
36800
37256
  [avatarInitials]="userService.avatarInitials()"
36801
37257
  [avatarType]="userService.avatarType()"
37258
+ [avatarSrc]="userService.avatarSrc()"
36802
37259
  (notificationClick)="handleNotificationClick()"
36803
37260
  (refresh)="handleRefresh($event)">
36804
37261
 
@@ -36924,6 +37381,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
36924
37381
  [notificationCount]="notificationService.unreadCount()"
36925
37382
  [avatarInitials]="userService.avatarInitials()"
36926
37383
  [avatarType]="userService.avatarType()"
37384
+ [avatarSrc]="userService.avatarSrc()"
36927
37385
  (notificationClick)="handleNotificationClick()"
36928
37386
  (refresh)="handleRefresh($event)">
36929
37387
 
@@ -37947,6 +38405,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
37947
38405
 
37948
38406
  class DsMobileInviteMemberSheetComponent {
37949
38407
  modalController;
38408
+ elementRef = inject(ElementRef);
37950
38409
  nameInput;
37951
38410
  viewContainer;
37952
38411
  sheetWrapper;
@@ -37966,6 +38425,10 @@ class DsMobileInviteMemberSheetComponent {
37966
38425
  this.modalController = modalController;
37967
38426
  }
37968
38427
  ngAfterViewInit() {
38428
+ const ionModal = this.elementRef.nativeElement.closest('ion-modal');
38429
+ if (ionModal) {
38430
+ ionModal.canDismiss = (_data, role) => this.handleCanDismiss(role);
38431
+ }
37969
38432
  if (this.nameInput) {
37970
38433
  this.isReadonly = false;
37971
38434
  setTimeout(() => {
@@ -38072,6 +38535,43 @@ class DsMobileInviteMemberSheetComponent {
38072
38535
  delay(ms) {
38073
38536
  return new Promise(resolve => setTimeout(resolve, ms));
38074
38537
  }
38538
+ async handleCanDismiss(role) {
38539
+ if (role === 'success' || role === 'cancel') {
38540
+ return true;
38541
+ }
38542
+ if (this.currentView() === 'step2') {
38543
+ const action = await this.showDiscardConfirmationSheet();
38544
+ if (action !== 'discard')
38545
+ return false;
38546
+ }
38547
+ return true;
38548
+ }
38549
+ async showDiscardConfirmationSheet() {
38550
+ const { DsMobileConfirmationSheetComponent } = await Promise.resolve().then(function () { return dsMobileConfirmationSheet; });
38551
+ const sheet = await this.modalController.create({
38552
+ component: DsMobileConfirmationSheetComponent,
38553
+ componentProps: {
38554
+ title: 'Du har ændringer der ikke er gemt',
38555
+ message: 'Er du sikker på, at du vil kassere invitationen?',
38556
+ buttonText: 'Kassér invitation',
38557
+ showIllustration: false,
38558
+ secondaryButtonText: 'Bliv og rediger',
38559
+ secondaryButtonVariant: 'secondary',
38560
+ },
38561
+ breakpoints: [0, 1],
38562
+ initialBreakpoint: 1,
38563
+ handle: true,
38564
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
38565
+ backdropDismiss: false,
38566
+ showBackdrop: true,
38567
+ });
38568
+ await sheet.present();
38569
+ disableModalShadowPointerEvents(sheet);
38570
+ const result = await sheet.onDidDismiss();
38571
+ if (result.role === 'confirm')
38572
+ return 'discard';
38573
+ return null;
38574
+ }
38075
38575
  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
38576
  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
38577
  <div class="sheet-content" #sheetWrapper>
@@ -38853,6 +39353,7 @@ class TenantChatPageComponent {
38853
39353
  [notificationCount]="notificationService.unreadCount()"
38854
39354
  [avatarInitials]="userService.avatarInitials()"
38855
39355
  [avatarType]="userService.avatarType()"
39356
+ [avatarSrc]="userService.avatarSrc()"
38856
39357
  (notificationClick)="handleNotificationClick()"
38857
39358
  (refresh)="handleRefresh($event)">
38858
39359
 
@@ -38929,6 +39430,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
38929
39430
  [notificationCount]="notificationService.unreadCount()"
38930
39431
  [avatarInitials]="userService.avatarInitials()"
38931
39432
  [avatarType]="userService.avatarType()"
39433
+ [avatarSrc]="userService.avatarSrc()"
38932
39434
  (notificationClick)="handleNotificationClick()"
38933
39435
  (refresh)="handleRefresh($event)">
38934
39436
 
@@ -39137,6 +39639,7 @@ class ServicesPageComponent {
39137
39639
  [notificationCount]="notificationService.unreadCount()"
39138
39640
  [avatarInitials]="userService.avatarInitials()"
39139
39641
  [avatarType]="userService.avatarType()"
39642
+ [avatarSrc]="userService.avatarSrc()"
39140
39643
  (notificationClick)="handleNotificationClick()"
39141
39644
  (refresh)="handleRefresh($event)"
39142
39645
  >
@@ -39186,6 +39689,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
39186
39689
  [notificationCount]="notificationService.unreadCount()"
39187
39690
  [avatarInitials]="userService.avatarInitials()"
39188
39691
  [avatarType]="userService.avatarType()"
39692
+ [avatarSrc]="userService.avatarSrc()"
39189
39693
  (notificationClick)="handleNotificationClick()"
39190
39694
  (refresh)="handleRefresh($event)"
39191
39695
  >
@@ -39260,6 +39764,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
39260
39764
  }]
39261
39765
  }], ctorParameters: () => [{ type: i1.ModalController }] });
39262
39766
 
39767
+ class ProfileModalService {
39768
+ modalController;
39769
+ constructor(modalController) {
39770
+ this.modalController = modalController;
39771
+ }
39772
+ async open() {
39773
+ const modal = await this.modalController.create({
39774
+ component: ProfileModalComponent,
39775
+ cssClass: 'ds-modal-base',
39776
+ mode: 'ios',
39777
+ presentingElement: document.querySelector('ion-router-outlet') || undefined,
39778
+ backdropDismiss: true,
39779
+ showBackdrop: true,
39780
+ animated: true,
39781
+ });
39782
+ await modal.present();
39783
+ }
39784
+ async close(data) {
39785
+ return this.modalController.dismiss(data);
39786
+ }
39787
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
39788
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalService, providedIn: 'root' });
39789
+ }
39790
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ProfileModalService, decorators: [{
39791
+ type: Injectable,
39792
+ args: [{
39793
+ providedIn: 'root',
39794
+ }]
39795
+ }], ctorParameters: () => [{ type: i1.ModalController }] });
39796
+
39263
39797
  /**
39264
39798
  * Services Barrel File
39265
39799
  *
@@ -39283,5 +39817,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
39283
39817
  * Generated bundle index. Do not edit.
39284
39818
  */
39285
39819
 
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 };
39820
+ 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
39821
  //# sourceMappingURL=propbinder-mobile-design.mjs.map