@propbinder/mobile-design 0.2.92 → 0.2.97

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.
@@ -1467,10 +1467,15 @@ class DsMobileListItemComponent {
1467
1467
  }
1468
1468
 
1469
1469
  <div class="content-main">
1470
- @if (title()) {
1471
- <h3 class="structured-title">{{ title() }}</h3>
1472
- } @if (subtitle()) {
1473
- <p class="structured-subtitle">{{ subtitle() }}</p>
1470
+ @if (title() || subtitle()) {
1471
+ <div class="structured-text">
1472
+ @if (title()) {
1473
+ <h3 class="structured-title">{{ title() }}</h3>
1474
+ }
1475
+ @if (subtitle()) {
1476
+ <p class="structured-subtitle">{{ subtitle() }}</p>
1477
+ }
1478
+ </div>
1474
1479
  }
1475
1480
 
1476
1481
  <ng-content select="[content-main]" />
@@ -1492,7 +1497,7 @@ class DsMobileListItemComponent {
1492
1497
  <ng-content select="[content-trailing]" />
1493
1498
  </div>
1494
1499
  </div>
1495
- `, isInline: true, styles: [":host{display:block;position:relative;padding:var(--item-padding-top, 12px) 0 var(--item-padding-bottom, 12px) 0;box-sizing:border-box;--leading-size: 32px;--content-gap: 12px;--interactive-offset: 8px}:host(.flush-top){padding-top:0}:host:after{content:\"\";position:absolute;bottom:0;left:calc(var(--leading-size) + var(--content-gap));right:0;height:1px;background:var(--border-color-default, #e5e5e5);z-index:1;display:var(--divider-display, block)}:host(.no-divider):after{display:none}:host(.no-leading-content):after{left:0}.list-item-inner{display:flex;flex-direction:row;align-items:flex-start;gap:var(--content-gap);position:relative}:host(.align-center) .list-item-inner{align-items:center}:host(.align-bottom) .list-item-inner{align-items:flex-end}:host(.interactive) .list-item-inner:before{content:\"\";position:absolute;top:calc(-1 * var(--interactive-offset));left:calc(-1 * var(--interactive-offset));right:calc(-1 * var(--interactive-offset));bottom:calc(-1 * var(--interactive-offset));background:transparent;border-radius:16px;z-index:0;pointer-events:none}:host(.interactive){cursor:pointer;-webkit-tap-highlight-color:transparent}@media (hover: hover) and (pointer: fine){:host(.interactive):hover .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}}:host(.interactive):active .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}:host(.interactive):focus-visible{outline:none}:host(.interactive):focus-visible .list-item-inner:before{outline:2px solid var(--color-brand-primary, #5d5fef);outline-offset:2px}:host(.disabled){opacity:.5;pointer-events:none}:host(.loading){pointer-events:none}:host(.variant-compact) .list-item-inner{gap:8px}.content-leading{flex-shrink:0;width:var(--leading-size);height:var(--leading-size);display:flex;align-items:flex-start;justify-content:center;position:relative;z-index:1}:host(.align-center) .content-leading{align-items:center}:host(.align-bottom) .content-leading{align-items:flex-end}.content-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px;position:relative;z-index:1;justify-content:flex-start}:host(.align-center) .content-main{justify-content:center}:host(.align-bottom) .content-main{justify-content:flex-end}.content-trailing{flex-shrink:0;display:flex;align-items:flex-start;position:relative;z-index:1}.structured-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}.structured-subtitle{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;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.desktop-more-button::ng-deep button{border-radius:50%!important;box-sizing:border-box!important;width:32px!important;height:32px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }] });
1500
+ `, isInline: true, styles: [":host{display:block;position:relative;padding:var(--item-padding-top, 12px) 0 var(--item-padding-bottom, 12px) 0;box-sizing:border-box;--leading-size: 32px;--content-gap: 12px;--interactive-offset: 8px}:host(.flush-top){padding-top:0}:host:after{content:\"\";position:absolute;bottom:0;left:calc(var(--leading-size) + var(--content-gap));right:0;height:1px;background:var(--border-color-default, #e5e5e5);z-index:1;display:var(--divider-display, block)}:host(.no-divider):after{display:none}:host(.no-leading-content):after{left:0}.list-item-inner{display:flex;flex-direction:row;align-items:flex-start;gap:var(--content-gap);position:relative}:host(.align-center) .list-item-inner{align-items:center}:host(.align-bottom) .list-item-inner{align-items:flex-end}:host(.interactive) .list-item-inner:before{content:\"\";position:absolute;top:calc(-1 * var(--interactive-offset));left:calc(-1 * var(--interactive-offset));right:calc(-1 * var(--interactive-offset));bottom:calc(-1 * var(--interactive-offset));background:transparent;border-radius:16px;z-index:0;pointer-events:none}:host(.interactive){cursor:pointer;-webkit-tap-highlight-color:transparent}@media (hover: hover) and (pointer: fine){:host(.interactive):hover .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}}:host(.interactive):active .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}:host(.interactive):focus-visible{outline:none}:host(.interactive):focus-visible .list-item-inner:before{outline:2px solid var(--color-brand-primary, #5d5fef);outline-offset:2px}:host(.disabled){opacity:.5;pointer-events:none}:host(.loading){pointer-events:none}:host(.variant-compact) .list-item-inner{gap:8px}.content-leading{flex-shrink:0;width:var(--leading-size);height:var(--leading-size);display:flex;align-items:flex-start;justify-content:center;position:relative;z-index:1}:host(.align-center) .content-leading{align-items:center}:host(.align-bottom) .content-leading{align-items:flex-end}.content-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px;position:relative;z-index:1;justify-content:flex-start}:host(.align-center) .content-main{justify-content:center}:host(.align-bottom) .content-main{justify-content:flex-end}.content-trailing{flex-shrink:0;display:flex;align-items:flex-start;position:relative;z-index:1}.structured-text{display:flex;flex-direction:column;gap:2px}.structured-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}.structured-subtitle{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;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.desktop-more-button::ng-deep button{border-radius:50%!important;box-sizing:border-box!important;width:32px!important;height:32px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }] });
1496
1501
  }
1497
1502
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileListItemComponent, decorators: [{
1498
1503
  type: Component,
@@ -1531,10 +1536,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1531
1536
  }
1532
1537
 
1533
1538
  <div class="content-main">
1534
- @if (title()) {
1535
- <h3 class="structured-title">{{ title() }}</h3>
1536
- } @if (subtitle()) {
1537
- <p class="structured-subtitle">{{ subtitle() }}</p>
1539
+ @if (title() || subtitle()) {
1540
+ <div class="structured-text">
1541
+ @if (title()) {
1542
+ <h3 class="structured-title">{{ title() }}</h3>
1543
+ }
1544
+ @if (subtitle()) {
1545
+ <p class="structured-subtitle">{{ subtitle() }}</p>
1546
+ }
1547
+ </div>
1538
1548
  }
1539
1549
 
1540
1550
  <ng-content select="[content-main]" />
@@ -1556,7 +1566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1556
1566
  <ng-content select="[content-trailing]" />
1557
1567
  </div>
1558
1568
  </div>
1559
- `, styles: [":host{display:block;position:relative;padding:var(--item-padding-top, 12px) 0 var(--item-padding-bottom, 12px) 0;box-sizing:border-box;--leading-size: 32px;--content-gap: 12px;--interactive-offset: 8px}:host(.flush-top){padding-top:0}:host:after{content:\"\";position:absolute;bottom:0;left:calc(var(--leading-size) + var(--content-gap));right:0;height:1px;background:var(--border-color-default, #e5e5e5);z-index:1;display:var(--divider-display, block)}:host(.no-divider):after{display:none}:host(.no-leading-content):after{left:0}.list-item-inner{display:flex;flex-direction:row;align-items:flex-start;gap:var(--content-gap);position:relative}:host(.align-center) .list-item-inner{align-items:center}:host(.align-bottom) .list-item-inner{align-items:flex-end}:host(.interactive) .list-item-inner:before{content:\"\";position:absolute;top:calc(-1 * var(--interactive-offset));left:calc(-1 * var(--interactive-offset));right:calc(-1 * var(--interactive-offset));bottom:calc(-1 * var(--interactive-offset));background:transparent;border-radius:16px;z-index:0;pointer-events:none}:host(.interactive){cursor:pointer;-webkit-tap-highlight-color:transparent}@media (hover: hover) and (pointer: fine){:host(.interactive):hover .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}}:host(.interactive):active .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}:host(.interactive):focus-visible{outline:none}:host(.interactive):focus-visible .list-item-inner:before{outline:2px solid var(--color-brand-primary, #5d5fef);outline-offset:2px}:host(.disabled){opacity:.5;pointer-events:none}:host(.loading){pointer-events:none}:host(.variant-compact) .list-item-inner{gap:8px}.content-leading{flex-shrink:0;width:var(--leading-size);height:var(--leading-size);display:flex;align-items:flex-start;justify-content:center;position:relative;z-index:1}:host(.align-center) .content-leading{align-items:center}:host(.align-bottom) .content-leading{align-items:flex-end}.content-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px;position:relative;z-index:1;justify-content:flex-start}:host(.align-center) .content-main{justify-content:center}:host(.align-bottom) .content-main{justify-content:flex-end}.content-trailing{flex-shrink:0;display:flex;align-items:flex-start;position:relative;z-index:1}.structured-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}.structured-subtitle{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;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.desktop-more-button::ng-deep button{border-radius:50%!important;box-sizing:border-box!important;width:32px!important;height:32px!important}\n"] }]
1569
+ `, styles: [":host{display:block;position:relative;padding:var(--item-padding-top, 12px) 0 var(--item-padding-bottom, 12px) 0;box-sizing:border-box;--leading-size: 32px;--content-gap: 12px;--interactive-offset: 8px}:host(.flush-top){padding-top:0}:host:after{content:\"\";position:absolute;bottom:0;left:calc(var(--leading-size) + var(--content-gap));right:0;height:1px;background:var(--border-color-default, #e5e5e5);z-index:1;display:var(--divider-display, block)}:host(.no-divider):after{display:none}:host(.no-leading-content):after{left:0}.list-item-inner{display:flex;flex-direction:row;align-items:flex-start;gap:var(--content-gap);position:relative}:host(.align-center) .list-item-inner{align-items:center}:host(.align-bottom) .list-item-inner{align-items:flex-end}:host(.interactive) .list-item-inner:before{content:\"\";position:absolute;top:calc(-1 * var(--interactive-offset));left:calc(-1 * var(--interactive-offset));right:calc(-1 * var(--interactive-offset));bottom:calc(-1 * var(--interactive-offset));background:transparent;border-radius:16px;z-index:0;pointer-events:none}:host(.interactive){cursor:pointer;-webkit-tap-highlight-color:transparent}@media (hover: hover) and (pointer: fine){:host(.interactive):hover .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}}:host(.interactive):active .list-item-inner:before{background:var(--color-background-neutral-primary-hover, #f5f5f5)}:host(.interactive):focus-visible{outline:none}:host(.interactive):focus-visible .list-item-inner:before{outline:2px solid var(--color-brand-primary, #5d5fef);outline-offset:2px}:host(.disabled){opacity:.5;pointer-events:none}:host(.loading){pointer-events:none}:host(.variant-compact) .list-item-inner{gap:8px}.content-leading{flex-shrink:0;width:var(--leading-size);height:var(--leading-size);display:flex;align-items:flex-start;justify-content:center;position:relative;z-index:1}:host(.align-center) .content-leading{align-items:center}:host(.align-bottom) .content-leading{align-items:flex-end}.content-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px;position:relative;z-index:1;justify-content:flex-start}:host(.align-center) .content-main{justify-content:center}:host(.align-bottom) .content-main{justify-content:flex-end}.content-trailing{flex-shrink:0;display:flex;align-items:flex-start;position:relative;z-index:1}.structured-text{display:flex;flex-direction:column;gap:2px}.structured-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}.structured-subtitle{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;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.desktop-more-button::ng-deep button{border-radius:50%!important;box-sizing:border-box!important;width:32px!important;height:32px!important}\n"] }]
1560
1570
  }], ctorParameters: () => [], propDecorators: { leadingSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingSize", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], flushTop: [{ type: i0.Input, args: [{ isSignal: true, alias: "flushTop", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], enableLongPress: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableLongPress", required: false }] }], showDesktopMoreButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDesktopMoreButton", required: false }] }], moreActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreActions", required: false }] }], moreButtonAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreButtonAriaLabel", required: false }] }], interactiveOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactiveOffset", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], showDivider: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDivider", required: false }] }], dividerSpacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "dividerSpacing", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], moreButtonClick: [{ type: i0.Output, args: ["moreButtonClick"] }] } });
1561
1571
 
1562
1572
  /**
@@ -5888,6 +5898,7 @@ class DsMobilePageMainComponent extends MobilePageBase {
5888
5898
  avatarSrc = input('', ...(ngDevMode ? [{ debugName: "avatarSrc" }] : []));
5889
5899
  avatarIconName = input('remixUser3Line', ...(ngDevMode ? [{ debugName: "avatarIconName" }] : []));
5890
5900
  // Inputs - Notifications
5901
+ showNotification = input(true, ...(ngDevMode ? [{ debugName: "showNotification" }] : []));
5891
5902
  notificationCount = input(0, ...(ngDevMode ? [{ debugName: "notificationCount" }] : []));
5892
5903
  // Inputs - Features
5893
5904
  showRefresh = input(true, ...(ngDevMode ? [{ debugName: "showRefresh" }] : []));
@@ -5926,7 +5937,7 @@ class DsMobilePageMainComponent extends MobilePageBase {
5926
5937
  * {
5927
5938
  * actions: [
5928
5939
  * { action: 'profile', title: 'Min profil', icon: 'remixUser3Line' },
5929
- * { action: 'settings', title: 'Indstillinger', icon: 'remixSettings3Line' }
5940
+ * { action: 'settings', title: 'Notifikationer', icon: 'remixNotificationLine' }
5930
5941
  * ]
5931
5942
  * },
5932
5943
  * {
@@ -5975,8 +5986,8 @@ class DsMobilePageMainComponent extends MobilePageBase {
5975
5986
  },
5976
5987
  {
5977
5988
  action: 'settings',
5978
- title: 'Indstillinger',
5979
- icon: 'remixSettings3Line',
5989
+ title: 'Notifikationer',
5990
+ icon: 'remixNotificationLine',
5980
5991
  destructive: false,
5981
5992
  },
5982
5993
  {
@@ -6129,7 +6140,7 @@ class DsMobilePageMainComponent extends MobilePageBase {
6129
6140
  this.refresh.emit(event);
6130
6141
  }
6131
6142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobilePageMainComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
6132
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobilePageMainComponent, isStandalone: true, selector: "ds-mobile-page-main", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerSubtitle: { classPropertyName: "headerSubtitle", publicName: "headerSubtitle", isSignal: true, isRequired: false, transformFunction: null }, firstEntry: { classPropertyName: "firstEntry", publicName: "firstEntry", isSignal: true, isRequired: false, transformFunction: null }, avatarType: { classPropertyName: "avatarType", publicName: "avatarType", isSignal: true, isRequired: false, transformFunction: null }, avatarInitials: { classPropertyName: "avatarInitials", publicName: "avatarInitials", isSignal: true, isRequired: false, transformFunction: null }, avatarSrc: { classPropertyName: "avatarSrc", publicName: "avatarSrc", isSignal: true, isRequired: false, transformFunction: null }, avatarIconName: { classPropertyName: "avatarIconName", publicName: "avatarIconName", isSignal: true, isRequired: false, transformFunction: null }, notificationCount: { classPropertyName: "notificationCount", publicName: "notificationCount", isSignal: true, isRequired: false, transformFunction: null }, showRefresh: { classPropertyName: "showRefresh", publicName: "showRefresh", isSignal: true, isRequired: false, transformFunction: null }, showCondensedHeader: { classPropertyName: "showCondensedHeader", publicName: "showCondensedHeader", isSignal: true, isRequired: false, transformFunction: null }, scrollThreshold: { classPropertyName: "scrollThreshold", publicName: "scrollThreshold", isSignal: true, isRequired: false, transformFunction: null }, headerFadeDistance: { classPropertyName: "headerFadeDistance", publicName: "headerFadeDistance", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null }, profileMenuItems: { classPropertyName: "profileMenuItems", publicName: "profileMenuItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { notificationClick: "notificationClick", avatarClick: "avatarClick", profileActionSelected: "profileActionSelected", refresh: "refresh", scroll: "scroll" }, host: { properties: { "style.--content-wrapper-padding": "contentPadding()" } }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
6143
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobilePageMainComponent, isStandalone: true, selector: "ds-mobile-page-main", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerSubtitle: { classPropertyName: "headerSubtitle", publicName: "headerSubtitle", isSignal: true, isRequired: false, transformFunction: null }, firstEntry: { classPropertyName: "firstEntry", publicName: "firstEntry", isSignal: true, isRequired: false, transformFunction: null }, avatarType: { classPropertyName: "avatarType", publicName: "avatarType", isSignal: true, isRequired: false, transformFunction: null }, avatarInitials: { classPropertyName: "avatarInitials", publicName: "avatarInitials", isSignal: true, isRequired: false, transformFunction: null }, avatarSrc: { classPropertyName: "avatarSrc", publicName: "avatarSrc", isSignal: true, isRequired: false, transformFunction: null }, avatarIconName: { classPropertyName: "avatarIconName", publicName: "avatarIconName", isSignal: true, isRequired: false, transformFunction: null }, showNotification: { classPropertyName: "showNotification", publicName: "showNotification", isSignal: true, isRequired: false, transformFunction: null }, notificationCount: { classPropertyName: "notificationCount", publicName: "notificationCount", isSignal: true, isRequired: false, transformFunction: null }, showRefresh: { classPropertyName: "showRefresh", publicName: "showRefresh", isSignal: true, isRequired: false, transformFunction: null }, showCondensedHeader: { classPropertyName: "showCondensedHeader", publicName: "showCondensedHeader", isSignal: true, isRequired: false, transformFunction: null }, scrollThreshold: { classPropertyName: "scrollThreshold", publicName: "scrollThreshold", isSignal: true, isRequired: false, transformFunction: null }, headerFadeDistance: { classPropertyName: "headerFadeDistance", publicName: "headerFadeDistance", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null }, profileMenuItems: { classPropertyName: "profileMenuItems", publicName: "profileMenuItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { notificationClick: "notificationClick", avatarClick: "avatarClick", profileActionSelected: "profileActionSelected", refresh: "refresh", scroll: "scroll" }, host: { properties: { "style.--content-wrapper-padding": "contentPadding()" } }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
6133
6144
  <!-- Fixed header at top -->
6134
6145
  <ion-header>
6135
6146
  <ion-toolbar>
@@ -6142,10 +6153,12 @@ class DsMobilePageMainComponent extends MobilePageBase {
6142
6153
 
6143
6154
  <!-- Notification + Avatar -->
6144
6155
  <div class="header-main__actions">
6145
- <ds-mobile-notification-button
6146
- [count]="notificationCount()"
6147
- (clicked)="notificationClick.emit()"
6148
- />
6156
+ @if (showNotification()) {
6157
+ <ds-mobile-notification-button
6158
+ [count]="notificationCount()"
6159
+ (clicked)="notificationClick.emit()"
6160
+ />
6161
+ }
6149
6162
  <ds-avatar
6150
6163
  [size]="'md'"
6151
6164
  [type]="avatarType()"
@@ -6229,10 +6242,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6229
6242
 
6230
6243
  <!-- Notification + Avatar -->
6231
6244
  <div class="header-main__actions">
6232
- <ds-mobile-notification-button
6233
- [count]="notificationCount()"
6234
- (clicked)="notificationClick.emit()"
6235
- />
6245
+ @if (showNotification()) {
6246
+ <ds-mobile-notification-button
6247
+ [count]="notificationCount()"
6248
+ (clicked)="notificationClick.emit()"
6249
+ />
6250
+ }
6236
6251
  <ds-avatar
6237
6252
  [size]="'md'"
6238
6253
  [type]="avatarType()"
@@ -6301,7 +6316,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6301
6316
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { ionContent: [{
6302
6317
  type: ViewChild,
6303
6318
  args: [IonContent]
6304
- }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerSubtitle", required: false }] }], firstEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstEntry", required: false }] }], avatarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarType", required: false }] }], avatarInitials: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarInitials", required: false }] }], avatarSrc: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarSrc", required: false }] }], avatarIconName: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarIconName", required: false }] }], notificationCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "notificationCount", required: false }] }], showRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRefresh", required: false }] }], showCondensedHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCondensedHeader", required: false }] }], scrollThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollThreshold", required: false }] }], headerFadeDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerFadeDistance", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], profileMenuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "profileMenuItems", required: false }] }], notificationClick: [{ type: i0.Output, args: ["notificationClick"] }], avatarClick: [{ type: i0.Output, args: ["avatarClick"] }], profileActionSelected: [{ type: i0.Output, args: ["profileActionSelected"] }], refresh: [{ type: i0.Output, args: ["refresh"] }], scroll: [{ type: i0.Output, args: ["scroll"] }] } });
6319
+ }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerSubtitle", required: false }] }], firstEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstEntry", required: false }] }], avatarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarType", required: false }] }], avatarInitials: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarInitials", required: false }] }], avatarSrc: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarSrc", required: false }] }], avatarIconName: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarIconName", required: false }] }], showNotification: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNotification", required: false }] }], notificationCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "notificationCount", required: false }] }], showRefresh: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRefresh", required: false }] }], showCondensedHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCondensedHeader", required: false }] }], scrollThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollThreshold", required: false }] }], headerFadeDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerFadeDistance", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], profileMenuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "profileMenuItems", required: false }] }], notificationClick: [{ type: i0.Output, args: ["notificationClick"] }], avatarClick: [{ type: i0.Output, args: ["avatarClick"] }], profileActionSelected: [{ type: i0.Output, args: ["profileActionSelected"] }], refresh: [{ type: i0.Output, args: ["refresh"] }], scroll: [{ type: i0.Output, args: ["scroll"] }] } });
6305
6320
 
6306
6321
  /**
6307
6322
  * DsMobileInlineTabsComponent
@@ -29014,9 +29029,51 @@ const SAMPLE_NOTIFICATIONS = [
29014
29029
  { id: '19', type: 'system_welcome', leading: 'logo', title: 'Velkommen!', message: 'Velkommen til Propbinder – vi glæder os til at hjælpe dig.', createdAt: daysAgo(11), read: true },
29015
29030
  ];
29016
29031
 
29032
+ const TYPE_TO_CATEGORY = {
29033
+ inquiry_update: 'inquiries',
29034
+ inquiry_assigned: 'inquiries',
29035
+ inquiry_resolved: 'inquiries',
29036
+ community_post: 'community',
29037
+ community_comment: 'community',
29038
+ community_like: 'community',
29039
+ community_mention: 'community',
29040
+ booking_confirmed: 'bookings',
29041
+ booking_cancelled: 'bookings',
29042
+ booking_reminder: 'bookings',
29043
+ facility_available: 'bookings',
29044
+ message_new: 'messages',
29045
+ message_group: 'messages',
29046
+ service_update: 'services',
29047
+ handbook_update: 'handbook',
29048
+ system_announcement: 'system',
29049
+ system_welcome: 'system',
29050
+ invite_received: 'system',
29051
+ family_access: 'system',
29052
+ };
29017
29053
  class NotificationService {
29018
29054
  notifications = signal(SAMPLE_NOTIFICATIONS, ...(ngDevMode ? [{ debugName: "notifications" }] : []));
29019
29055
  unreadCount = computed(() => this.notifications().filter(n => !n.read).length, ...(ngDevMode ? [{ debugName: "unreadCount" }] : []));
29056
+ /**
29057
+ * Push notification delivery preferences per category.
29058
+ * Controls which types of push notifications the device receives —
29059
+ * does NOT filter the in-app notification list.
29060
+ */
29061
+ disabledPushCategories = signal(new Set(), ...(ngDevMode ? [{ debugName: "disabledPushCategories" }] : []));
29062
+ isPushEnabled(category) {
29063
+ return !this.disabledPushCategories().has(category);
29064
+ }
29065
+ setPushEnabled(category, enabled) {
29066
+ this.disabledPushCategories.update(set => {
29067
+ const next = new Set(set);
29068
+ if (enabled) {
29069
+ next.delete(category);
29070
+ }
29071
+ else {
29072
+ next.add(category);
29073
+ }
29074
+ return next;
29075
+ });
29076
+ }
29020
29077
  /**
29021
29078
  * Add a new notification to the top of the list.
29022
29079
  * Intended for downstream push integration — call this when a
@@ -30544,6 +30601,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
30544
30601
  }]
30545
30602
  }], ctorParameters: () => [{ type: i1.ModalController }] });
30546
30603
 
30604
+ class DsMobileToggleComponent {
30605
+ checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
30606
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
30607
+ changed = output();
30608
+ handleClick(event) {
30609
+ event.stopPropagation();
30610
+ this.toggle();
30611
+ }
30612
+ toggle() {
30613
+ if (this.disabled())
30614
+ return;
30615
+ const next = !this.checked();
30616
+ this.checked.set(next);
30617
+ this.changed.emit(next);
30618
+ }
30619
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30620
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DsMobileToggleComponent, isStandalone: true, selector: "ds-mobile-toggle", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", changed: "changed" }, host: { listeners: { "click": "handleClick($event)", "keydown.enter": "toggle()", "keydown.space": "$event.preventDefault(); toggle()" }, properties: { "class.disabled": "disabled()", "attr.role": "\"switch\"", "attr.aria-checked": "checked()", "attr.aria-disabled": "disabled() || null", "attr.tabindex": "disabled() ? -1 : 0" } }, ngImport: i0, template: `
30621
+ <div class="track" [class.active]="checked()">
30622
+ <div class="knob"></div>
30623
+ </div>
30624
+ `, isInline: true, styles: [":host{display:inline-flex;cursor:pointer;-webkit-tap-highlight-color:transparent;flex-shrink:0;outline:none}:host(.disabled){opacity:.4;pointer-events:none}:host:focus-visible .track{outline:2px solid var(--color-brand-primary, #5d5fef);outline-offset:2px}.track{width:40px;height:24px;background:var(--color-background-neutral-tertiary, #e3e6eb);border-radius:var(--border-radius-round, 1000px);padding:4px;box-sizing:border-box;transition:background .2s ease}.track.active{background:var(--color-accent, #6b5ff5)}.knob{width:16px;height:16px;background:var(--color-background-neutral-primary, white);border-radius:var(--border-radius-round, 1000px);transition:transform .2s ease}.track.active .knob{transform:translate(16px)}\n"] });
30625
+ }
30626
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileToggleComponent, decorators: [{
30627
+ type: Component,
30628
+ args: [{ selector: 'ds-mobile-toggle', standalone: true, host: {
30629
+ '(click)': 'handleClick($event)',
30630
+ '[class.disabled]': 'disabled()',
30631
+ '[attr.role]': '"switch"',
30632
+ '[attr.aria-checked]': 'checked()',
30633
+ '[attr.aria-disabled]': 'disabled() || null',
30634
+ '[attr.tabindex]': 'disabled() ? -1 : 0',
30635
+ '(keydown.enter)': 'toggle()',
30636
+ '(keydown.space)': '$event.preventDefault(); toggle()',
30637
+ }, template: `
30638
+ <div class="track" [class.active]="checked()">
30639
+ <div class="knob"></div>
30640
+ </div>
30641
+ `, styles: [":host{display:inline-flex;cursor:pointer;-webkit-tap-highlight-color:transparent;flex-shrink:0;outline:none}:host(.disabled){opacity:.4;pointer-events:none}:host:focus-visible .track{outline:2px solid var(--color-brand-primary, #5d5fef);outline-offset:2px}.track{width:40px;height:24px;background:var(--color-background-neutral-tertiary, #e3e6eb);border-radius:var(--border-radius-round, 1000px);padding:4px;box-sizing:border-box;transition:background .2s ease}.track.active{background:var(--color-accent, #6b5ff5)}.knob{width:16px;height:16px;background:var(--color-background-neutral-primary, white);border-radius:var(--border-radius-round, 1000px);transition:transform .2s ease}.track.active .knob{transform:translate(16px)}\n"] }]
30642
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
30643
+
30547
30644
  // Mobile Page Components
30548
30645
 
30549
30646
  class MobileCommunityPageComponent {
@@ -31102,7 +31199,7 @@ class MobileCommunityPageComponent {
31102
31199
  }
31103
31200
  </ds-mobile-section>
31104
31201
  </ds-mobile-page-main>
31105
- `, isInline: true, styles: [".pinned-posts-swiper-wrapper{padding:0;position:relative}.swiper-nav-buttons{display:contents}.swiper-nav-button{position:absolute;top:50%;transform:translateY(-50%);z-index:10}.swiper-nav-button:first-child{left:-48px}.swiper-nav-button:last-child{right:-48px}::ng-deep .swiper-nav-button button{border-radius:50%!important;width:48px!important;height:48px!important;padding:0!important}@media (max-width: 767px){.swiper-nav-buttons{display:none}}::ng-deep .pinned-posts-swiper .swiper-slide{width:100%;max-width:600px;height:auto}@media (min-width: 768px){::ng-deep .pinned-posts-swiper .swiper-slide{max-width:100%}}.swiper-post-item{width:100%;height:auto}::ng-deep .pinned-posts-swiper .swiper-slide ds-mobile-interactive-list-item-post{height:auto}::ng-deep .pinned-posts-swiper .swiper-wrapper{height:auto;align-items:flex-start}.post-list-wrapper{display:flex;flex-direction:column}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.clickable-image:active{transform:scale(.98);opacity:.9}.community-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin:16px 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}ion-infinite-scroll{--color: var(--color-primary-surface)}ion-infinite-scroll-content{--color: var(--color-primary-surface)}ion-infinite-scroll-content::part(spinner){color:var(--color-primary-surface)}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileInteractiveListItemPostComponent, selector: "ds-mobile-interactive-list-item-post", inputs: ["authorName", "authorRole", "timestamp", "avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "showBadge", "variant", "align", "clickable", "enableLongPress", "moreActions"], outputs: ["postClick", "commentClick", "longPress"] }, { kind: "component", type: DsMobilePostComposerComponent, selector: "ds-mobile-post-composer", inputs: ["avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "placeholder", "buttonText"], outputs: ["composerClick"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { kind: "component", type: PostContentComponent, selector: "post-content" }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostMediaComponent, selector: "post-media" }, { kind: "component", type: PostAttachmentsComponent, selector: "post-attachments" }, { kind: "component", type: PostActionsComponent, selector: "post-actions" }, { kind: "component", type: ActionLikeComponent, selector: "action-like", inputs: ["active", "count"], outputs: ["activeChange", "countChange", "likeClick"] }, { kind: "component", type: ActionCommentComponent, selector: "action-comment", inputs: ["count"], outputs: ["commentClick"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { 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: DsMobileInlinePhotoComponent, selector: "ds-mobile-inline-photo", inputs: ["images", "loadingStates", "author", "maxVisible", "useGrid"], outputs: ["photoClick"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }] });
31202
+ `, isInline: true, styles: [".pinned-posts-swiper-wrapper{padding:0;position:relative}.swiper-nav-buttons{display:contents}.swiper-nav-button{position:absolute;top:50%;transform:translateY(-50%);z-index:10}.swiper-nav-button:first-child{left:-48px}.swiper-nav-button:last-child{right:-48px}::ng-deep .swiper-nav-button button{border-radius:50%!important;width:48px!important;height:48px!important;padding:0!important}@media (max-width: 767px){.swiper-nav-buttons{display:none}}::ng-deep .pinned-posts-swiper .swiper-slide{width:100%;max-width:600px;height:auto}@media (min-width: 768px){::ng-deep .pinned-posts-swiper .swiper-slide{max-width:100%}}.swiper-post-item{width:100%;height:auto}::ng-deep .pinned-posts-swiper .swiper-slide ds-mobile-interactive-list-item-post{height:auto}::ng-deep .pinned-posts-swiper .swiper-wrapper{height:auto;align-items:flex-start}.post-list-wrapper{display:flex;flex-direction:column}.clickable-image{cursor:pointer;transition:transform .2s ease,opacity .2s ease;border-radius:8px;display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.clickable-image:active{transform:scale(.98);opacity:.9}.community-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin:16px 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}ion-infinite-scroll{--color: var(--color-primary-surface)}ion-infinite-scroll-content{--color: var(--color-primary-surface)}ion-infinite-scroll-content::part(spinner){color:var(--color-primary-surface)}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileInteractiveListItemPostComponent, selector: "ds-mobile-interactive-list-item-post", inputs: ["authorName", "authorRole", "timestamp", "avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "showBadge", "variant", "align", "clickable", "enableLongPress", "moreActions"], outputs: ["postClick", "commentClick", "longPress"] }, { kind: "component", type: DsMobilePostComposerComponent, selector: "ds-mobile-post-composer", inputs: ["avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "placeholder", "buttonText"], outputs: ["composerClick"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { kind: "component", type: PostContentComponent, selector: "post-content" }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostMediaComponent, selector: "post-media" }, { kind: "component", type: PostAttachmentsComponent, selector: "post-attachments" }, { kind: "component", type: PostActionsComponent, selector: "post-actions" }, { kind: "component", type: ActionLikeComponent, selector: "action-like", inputs: ["active", "count"], outputs: ["activeChange", "countChange", "likeClick"] }, { kind: "component", type: ActionCommentComponent, selector: "action-comment", inputs: ["count"], outputs: ["commentClick"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { 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: DsMobileInlinePhotoComponent, selector: "ds-mobile-inline-photo", inputs: ["images", "loadingStates", "author", "maxVisible", "useGrid"], outputs: ["photoClick"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }] });
31106
31203
  }
31107
31204
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileCommunityPageComponent, decorators: [{
31108
31205
  type: Component,
@@ -31682,7 +31779,7 @@ class MobileHandbookPageComponent {
31682
31779
  </div>
31683
31780
  </ds-mobile-section>
31684
31781
  </ds-mobile-page-main>
31685
- `, isInline: true, styles: [".folders-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;justify-items:center}@media (min-width: 768px){.folders-grid{grid-template-columns:repeat(3,1fr)}}ds-mobile-handbook-folder{width:100%;min-width:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileHandbookFolderComponent, selector: "ds-mobile-handbook-folder", inputs: ["variant", "customColor", "iconName", "itemCount", "label", "items", "loading", "error"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }] });
31782
+ `, isInline: true, styles: [".folders-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;justify-items:center}@media (min-width: 768px){.folders-grid{grid-template-columns:repeat(3,1fr)}}ds-mobile-handbook-folder{width:100%;min-width:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileHandbookFolderComponent, selector: "ds-mobile-handbook-folder", inputs: ["variant", "customColor", "iconName", "itemCount", "label", "items", "loading", "error"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }] });
31686
31783
  }
31687
31784
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileHandbookPageComponent, decorators: [{
31688
31785
  type: Component,
@@ -32264,16 +32361,44 @@ class MobileHomePageComponent {
32264
32361
  // (hides tab bar + renders loading screen at the correct DOM level)
32265
32362
  pageLoading = inject(PageLoadingService);
32266
32363
  // Get recent posts from PostsService - exclude pinned post (post-4) and limit to 3
32267
- recentPosts = computed(() => this.postsService.posts()
32268
- .filter(post => post.id !== 'post-4') // Exclude pinned post
32364
+ recentPosts = computed(() => this.postsService
32365
+ .posts()
32366
+ .filter((post) => post.id !== 'post-4') // Exclude pinned post
32269
32367
  .slice(0, 3), ...(ngDevMode ? [{ debugName: "recentPosts" }] : []));
32270
32368
  inquiriesService = inject(InquiriesService);
32271
32369
  openInquiries = computed(() => this.inquiriesService.openInquiries().slice(0, 3), ...(ngDevMode ? [{ debugName: "openInquiries" }] : []));
32272
32370
  recentPeerMessages = computed(() => this.peerMessaging.conversations().slice(0, 3), ...(ngDevMode ? [{ debugName: "recentPeerMessages" }] : []));
32273
32371
  allVendors = signal([
32274
- { id: 'v-1', name: 'CleanTeam ApS', category: 'Rengøring', description: 'Trappevask og vinduespolering', phone: '+45 70 20 30 40', logo: '/Assets/dummy-logos/cleanteam-logo.svg', thumbnail: '/Assets/Dummy-photos/clean-team.jpg', fullDescription: '<h3>Rengøring</h3><p>CleanTeam ApS tilbyder professionel trappevask og vinduespolering for ejendommen. Servicen udføres ugentligt og kan tilpasses jeres behov.</p><h3>Pris</h3><p>350 kr. per besøg</p>' },
32275
- { id: 'v-3', name: 'Blik Partner A/S', category: 'VVS', description: 'VVS-service og akut udkald', phone: '+45 33 44 55 66', thumbnail: '/Assets/Dummy-photos/plumbing.jpg', fullDescription: '<h3>VVS</h3><p>BlikPartner A/S er jeres VVS-partner til alt fra løbende vedligeholdelse til akutte udkald. Vi dækker reparation af vandrør, afløb, radiatorer og blandingsbatterier.</p><h3>Pris</h3><p>450 kr. per udkald + tid</p>' },
32276
- { id: 'v-4', name: 'ElektroTek ApS', category: 'Elektriker', description: 'El-installationer og fejlsøgning', phone: '+45 23 45 67 89', logo: '/Assets/dummy-logos/electrician-logo.svg', thumbnail: '/Assets/Dummy-photos/electrician.jpg', heroImage: '/Assets/Dummy-photos/electrician.jpg', fullDescription: '<h3>Elektriker</h3><p>ElektroTek ApS varetager el-installationer, fejlsøgning og lovpligtige eftersyn for ejendommen. Vi udfører også småopgaver som udskiftning af kontakter og lampeudtag.</p><h3>Pris</h3><p>395 kr. per time</p>' },
32372
+ {
32373
+ id: 'v-1',
32374
+ name: 'CleanTeam ApS',
32375
+ category: 'Rengøring',
32376
+ description: 'Trappevask og vinduespolering',
32377
+ phone: '+45 70 20 30 40',
32378
+ logo: '/Assets/dummy-logos/cleanteam-logo.svg',
32379
+ thumbnail: '/Assets/Dummy-photos/clean-team.jpg',
32380
+ fullDescription: '<h3>Rengøring</h3><p>CleanTeam ApS tilbyder professionel trappevask og vinduespolering for ejendommen. Servicen udføres ugentligt og kan tilpasses jeres behov.</p><h3>Pris</h3><p>350 kr. per besøg</p>',
32381
+ },
32382
+ {
32383
+ id: 'v-3',
32384
+ name: 'Blik Partner A/S',
32385
+ category: 'VVS',
32386
+ description: 'VVS-service og akut udkald',
32387
+ phone: '+45 33 44 55 66',
32388
+ thumbnail: '/Assets/Dummy-photos/plumbing.jpg',
32389
+ fullDescription: '<h3>VVS</h3><p>BlikPartner A/S er jeres VVS-partner til alt fra løbende vedligeholdelse til akutte udkald. Vi dækker reparation af vandrør, afløb, radiatorer og blandingsbatterier.</p><h3>Pris</h3><p>450 kr. per udkald + tid</p>',
32390
+ },
32391
+ {
32392
+ id: 'v-4',
32393
+ name: 'ElektroTek ApS',
32394
+ category: 'Elektriker',
32395
+ description: 'El-installationer og fejlsøgning',
32396
+ phone: '+45 23 45 67 89',
32397
+ logo: '/Assets/dummy-logos/electrician-logo.svg',
32398
+ thumbnail: '/Assets/Dummy-photos/electrician.jpg',
32399
+ heroImage: '/Assets/Dummy-photos/electrician.jpg',
32400
+ fullDescription: '<h3>Elektriker</h3><p>ElektroTek ApS varetager el-installationer, fejlsøgning og lovpligtige eftersyn for ejendommen. Vi udfører også småopgaver som udskiftning af kontakter og lampeudtag.</p><h3>Pris</h3><p>395 kr. per time</p>',
32401
+ },
32277
32402
  ], ...(ngDevMode ? [{ debugName: "allVendors" }] : []));
32278
32403
  previewVendors = computed(() => this.allVendors().slice(0, 3), ...(ngDevMode ? [{ debugName: "previewVendors" }] : []));
32279
32404
  modalCtrl = inject(ModalController);
@@ -32329,11 +32454,11 @@ class MobileHomePageComponent {
32329
32454
  ...post,
32330
32455
  postId: post.id,
32331
32456
  avatarType: post.avatarType === 'icon' ? undefined : post.avatarType,
32332
- focusComment
32457
+ focusComment,
32333
32458
  };
32334
32459
  await this.postModal.open(postData, {
32335
32460
  currentUserName: 'Lars Mikkelsen',
32336
- currentUserInitials: this.userService.avatarInitials()
32461
+ currentUserInitials: this.userService.avatarInitials(),
32337
32462
  });
32338
32463
  }
32339
32464
  }
@@ -32421,7 +32546,7 @@ class MobileHomePageComponent {
32421
32546
  initialBreakpoint: 1,
32422
32547
  handle: true,
32423
32548
  backdropDismiss: true,
32424
- cssClass: 'auto-height'
32549
+ cssClass: 'auto-height',
32425
32550
  });
32426
32551
  const result = await sheet.onWillDismiss();
32427
32552
  if (result.role === 'select' && result.data) {
@@ -32432,7 +32557,7 @@ class MobileHomePageComponent {
32432
32557
  if (post) {
32433
32558
  this.postsService.updatePost(postId, {
32434
32559
  isLiked: !post.isLiked,
32435
- likeCount: post.isLiked ? post.likeCount - 1 : post.likeCount + 1
32560
+ likeCount: post.isLiked ? post.likeCount - 1 : post.likeCount + 1,
32436
32561
  });
32437
32562
  }
32438
32563
  break;
@@ -32452,6 +32577,7 @@ class MobileHomePageComponent {
32452
32577
  @if (!pageLoading.isCoveringScreen()) {
32453
32578
  <ds-mobile-page-main
32454
32579
  class="home-content"
32580
+ [showNotification]="true"
32455
32581
  [class.home-content--animating]="pageLoading.isRevealAnimation()"
32456
32582
  [firstEntry]="pageLoading.isRevealAnimation()"
32457
32583
  #pageComponent
@@ -32462,208 +32588,178 @@ class MobileHomePageComponent {
32462
32588
  [avatarType]="userService.avatarType()"
32463
32589
  (notificationClick)="handleNotificationClick()"
32464
32590
  (refresh)="handleRefresh($event)"
32591
+ >
32592
+ <!-- Offline indicator -->
32593
+ @if (pageComponent.isOffline()) {
32594
+ <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
32595
+ }
32596
+
32597
+ <!-- Property banner → beboere (prototype IA) -->
32598
+ <div
32599
+ header-content
32600
+ class="property-banner-nav"
32601
+ role="button"
32602
+ tabindex="0"
32603
+ (click)="navigateToTenants()"
32604
+ (keydown.enter)="navigateToTenants()"
32605
+ (keydown.space)="$event.preventDefault(); navigateToTenants()"
32606
+ aria-label="Se beboere på ejendommen"
32465
32607
  >
32466
-
32467
- <!-- Offline indicator -->
32468
- @if (pageComponent.isOffline()) {
32469
- <ds-mobile-offline-banner
32470
- offline-indicator
32471
- title="Ingen internetforbindelse"
32472
- message="Nogle funktioner kan være utilgængelige">
32473
- </ds-mobile-offline-banner>
32474
- }
32475
-
32476
- <!-- Property banner → beboere (prototype IA) -->
32477
- <div
32478
- header-content
32479
- class="property-banner-nav"
32480
- role="button"
32481
- tabindex="0"
32482
- (click)="navigateToTenants()"
32483
- (keydown.enter)="navigateToTenants()"
32484
- (keydown.space)="$event.preventDefault(); navigateToTenants()"
32485
- aria-label="Se beboere på ejendommen">
32486
- <ds-mobile-property-banner
32487
- address="Toftegårds Allé 5A, 2. tv."
32488
- photoUrl="/Assets/Dummy-photos/building.jpg"
32489
- [tenantCount]="24">
32490
- </ds-mobile-property-banner>
32491
- </div>
32608
+ <ds-mobile-property-banner address="Toftegårds Allé 5A, 2. tv." photoUrl="/Assets/Dummy-photos/building.jpg" [tenantCount]="24"> </ds-mobile-property-banner>
32609
+ </div>
32492
32610
 
32493
- @if (familyAccessService.acceptedInviteContext(); as invite) {
32494
- <ds-mobile-section [showBorder]="false" padding="20px 20px 0">
32495
- <div class="welcome-toast">
32496
- <div class="toast-icon">
32497
- <ds-icon name="remixUserSmileLine" size="12px" />
32498
- </div>
32499
- <div class="welcome-toast-content">
32500
- <p class="welcome-toast-heading">Du er nu familiemedlem!</p>
32501
- <p class="welcome-toast-text">
32502
- Tilknyttet <strong>{{ invite.propertyAddress }}</strong> via <strong>{{ invite.inviterName }}</strong>
32503
- </p>
32611
+ @if (familyAccessService.acceptedInviteContext(); as invite) {
32612
+ <ds-mobile-section [showBorder]="false" padding="20px 20px 0">
32613
+ <div class="welcome-toast">
32614
+ <div class="toast-icon">
32615
+ <ds-icon name="remixUserSmileLine" size="12px" />
32616
+ </div>
32617
+ <div class="welcome-toast-content">
32618
+ <p class="welcome-toast-heading">Du er nu familiemedlem!</p>
32619
+ <p class="welcome-toast-text">
32620
+ Tilknyttet <strong>{{ invite.propertyAddress }}</strong> via <strong>{{ invite.inviterName }}</strong>
32621
+ </p>
32622
+ </div>
32623
+ <button class="toast-dismiss" (click)="familyAccessService.clearAcceptedInviteContext()" aria-label="Luk">
32624
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
32625
+ <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
32626
+ </svg>
32627
+ </button>
32504
32628
  </div>
32505
- <button class="toast-dismiss" (click)="familyAccessService.clearAcceptedInviteContext()" aria-label="Luk">
32506
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
32507
- <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
32508
- </svg>
32509
- </button>
32629
+ </ds-mobile-section>
32630
+ }
32631
+
32632
+ <!-- Recent Community Posts Section (with content) -->
32633
+ <ds-mobile-section headline="Seneste opslag" linkText="Se alle" (linkClick)="navigateToCommunity()">
32634
+ <div class="posts-list">
32635
+ @for (post of recentPosts(); track post.id) {
32636
+ <ds-mobile-interactive-list-item-post
32637
+ [authorName]="post.authorName"
32638
+ [authorRole]="post.authorRole"
32639
+ [timestamp]="post.timestamp"
32640
+ [avatarType]="post.avatarType"
32641
+ [avatarSrc]="post.avatarSrc || ''"
32642
+ [avatarInitials]="post.avatarInitials || ''"
32643
+ [showBadge]="post.showBadge || false"
32644
+ [clickable]="true"
32645
+ [moreActions]="true"
32646
+ (postClick)="openPost(post.id)"
32647
+ (commentClick)="openPost(post.id, true)"
32648
+ (longPress)="handlePostLongPress(post.id)"
32649
+ >
32650
+ <post-content>
32651
+ @if (post.content) {
32652
+ <post-text>{{ post.content }}</post-text>
32653
+ }
32654
+ </post-content>
32655
+
32656
+ <post-actions>
32657
+ <action-like [count]="post.likeCount" [active]="post.isLiked" />
32658
+ <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
32659
+ </post-actions>
32660
+ </ds-mobile-interactive-list-item-post>
32661
+ }
32510
32662
  </div>
32511
32663
  </ds-mobile-section>
32512
- }
32513
-
32514
- <!-- Recent Community Posts Section (with content) -->
32515
- <ds-mobile-section
32516
- headline="Seneste opslag"
32517
- linkText="Se alle"
32518
- (linkClick)="navigateToCommunity()">
32519
-
32520
- <div class="posts-list">
32521
- @for (post of recentPosts(); track post.id) {
32522
- <ds-mobile-interactive-list-item-post
32523
- [authorName]="post.authorName"
32524
- [authorRole]="post.authorRole"
32525
- [timestamp]="post.timestamp"
32526
- [avatarType]="post.avatarType"
32527
- [avatarSrc]="post.avatarSrc || ''"
32528
- [avatarInitials]="post.avatarInitials || ''"
32529
- [showBadge]="post.showBadge || false"
32530
- [clickable]="true"
32531
- [moreActions]="true"
32532
- (postClick)="openPost(post.id)"
32533
- (commentClick)="openPost(post.id, true)"
32534
- (longPress)="handlePostLongPress(post.id)">
32535
-
32536
- <post-content>
32537
- @if (post.content) {
32538
- <post-text>{{ post.content }}</post-text>
32539
- }
32540
- </post-content>
32541
-
32542
- <post-actions>
32543
- <action-like [count]="post.likeCount" [active]="post.isLiked" />
32544
- <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
32545
- </post-actions>
32546
- </ds-mobile-interactive-list-item-post>
32547
- }
32548
- </div>
32549
- </ds-mobile-section>
32550
32664
 
32551
- <ds-mobile-section
32552
- headline="Seneste beskeder"
32553
- linkText="Se alle"
32554
- (linkClick)="navigateToMessages()">
32555
- <div class="messages-preview-list">
32556
- @for (conv of recentPeerMessages(); track conv.id) {
32557
- @if (isPeerGroupConversation(conv)) {
32558
- <ds-mobile-interactive-list-item-message
32559
- [senderName]="conv.title"
32560
- [senderRole]="conv.memberIds.length + ' medlemmer'"
32561
- [timestamp]="conv.timestamp"
32562
- [message]="conv.lastMessage"
32563
- [avatarInitials]="''"
32564
- [avatarType]="'initials'"
32565
- [groupStackMembers]="peerChat.resolveGroupMembers(conv)"
32566
- [groupCustomAvatarUrl]="conv.customAvatarUrl ?? ''"
32567
- groupStackExcludeParticipantId="me"
32568
- [showAvatarBadge]="false"
32569
- [unread]="conv.unread"
32570
- [clickable]="true"
32571
- (messageClick)="openPeerMessagePreview(conv)">
32572
- </ds-mobile-interactive-list-item-message>
32573
- } @else {
32574
- <ds-mobile-interactive-list-item-message
32575
- [senderName]="conv.participant.name"
32576
- [senderRole]="conv.participant.role ?? ''"
32577
- [timestamp]="conv.timestamp"
32578
- [message]="conv.lastMessage"
32579
- [avatarInitials]="conv.participant.avatarInitials ?? ''"
32580
- [avatarType]="conv.participant.avatarType ?? 'initials'"
32581
- [showAvatarBadge]="false"
32582
- [unread]="conv.unread"
32665
+ <ds-mobile-section headline="Seneste beskeder" linkText="Se alle" (linkClick)="navigateToMessages()">
32666
+ <div class="messages-preview-list">
32667
+ @for (conv of recentPeerMessages(); track conv.id) {
32668
+ @if (isPeerGroupConversation(conv)) {
32669
+ <ds-mobile-interactive-list-item-message
32670
+ [senderName]="conv.title"
32671
+ [senderRole]="conv.memberIds.length + ' medlemmer'"
32672
+ [timestamp]="conv.timestamp"
32673
+ [message]="conv.lastMessage"
32674
+ [avatarInitials]="''"
32675
+ [avatarType]="'initials'"
32676
+ [groupStackMembers]="peerChat.resolveGroupMembers(conv)"
32677
+ [groupCustomAvatarUrl]="conv.customAvatarUrl ?? ''"
32678
+ groupStackExcludeParticipantId="me"
32679
+ [showAvatarBadge]="false"
32680
+ [unread]="conv.unread"
32681
+ [clickable]="true"
32682
+ (messageClick)="openPeerMessagePreview(conv)"
32683
+ >
32684
+ </ds-mobile-interactive-list-item-message>
32685
+ } @else {
32686
+ <ds-mobile-interactive-list-item-message
32687
+ [senderName]="conv.participant.name"
32688
+ [senderRole]="conv.participant.role ?? ''"
32689
+ [timestamp]="conv.timestamp"
32690
+ [message]="conv.lastMessage"
32691
+ [avatarInitials]="conv.participant.avatarInitials ?? ''"
32692
+ [avatarType]="conv.participant.avatarType ?? 'initials'"
32693
+ [showAvatarBadge]="false"
32694
+ [unread]="conv.unread"
32695
+ [clickable]="true"
32696
+ (messageClick)="openPeerMessagePreview(conv)"
32697
+ >
32698
+ </ds-mobile-interactive-list-item-message>
32699
+ }
32700
+ }
32701
+ </div>
32702
+ </ds-mobile-section>
32703
+
32704
+ <!-- Services preview -->
32705
+ @if (previewVendors().length > 0) {
32706
+ <ds-mobile-section headline="Services" linkText="Se alle" contentGap="0px" (linkClick)="navigateToServices()">
32707
+ @for (vendor of previewVendors(); track vendor.id) {
32708
+ <ds-mobile-interactive-list-item-service
32709
+ [title]="vendor.name"
32710
+ [description]="vendor.description || ''"
32711
+ [logo]="vendor.logo || ''"
32712
+ (serviceClick)="openVendorSheet(vendor)"
32713
+ />
32714
+ }
32715
+ </ds-mobile-section>
32716
+ }
32717
+
32718
+ <!-- Recent Community Posts Section (empty state) -->
32719
+ <ds-mobile-section>
32720
+ <div class="empty-state">
32721
+ <ds-mobile-illustration variant="post" alt="No posts" />
32722
+ <h3 class="empty-state-title">Ingen opslag endnu</h3>
32723
+ <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
32724
+
32725
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToCommunity()"> Gå til fællesområdet </ds-button>
32726
+ </div>
32727
+ </ds-mobile-section>
32728
+
32729
+ <!-- Open Inquiries Section (with content) -->
32730
+ <ds-mobile-section headline="Åbne henvendelser" linkText="Se alle" (linkClick)="navigateToInquiries()">
32731
+ <div class="inquiries-list">
32732
+ @for (inquiry of openInquiries(); track inquiry.id) {
32733
+ <ds-mobile-interactive-list-item-inquiry
32734
+ [title]="inquiry.title"
32735
+ [description]="inquiry.description"
32736
+ [status]="inquiry.status"
32737
+ [timestamp]="inquiry.timestamp"
32738
+ [iconName]="'remixTodoLine'"
32583
32739
  [clickable]="true"
32584
- (messageClick)="openPeerMessagePreview(conv)">
32585
- </ds-mobile-interactive-list-item-message>
32740
+ [showChevron]="false"
32741
+ [enableLongPress]="false"
32742
+ (inquiryClick)="openInquiryDetail(inquiry.id)"
32743
+ >
32744
+ </ds-mobile-interactive-list-item-inquiry>
32586
32745
  }
32587
- }
32588
- </div>
32589
- </ds-mobile-section>
32590
-
32591
- <!-- Services preview -->
32592
- @if (previewVendors().length > 0) {
32593
- <ds-mobile-section
32594
- headline="Services"
32595
- linkText="Se alle"
32596
- contentGap="0px"
32597
- (linkClick)="navigateToServices()">
32598
- @for (vendor of previewVendors(); track vendor.id) {
32599
- <ds-mobile-interactive-list-item-service
32600
- [title]="vendor.name"
32601
- [description]="vendor.description || ''"
32602
- [logo]="vendor.logo || ''"
32603
- (serviceClick)="openVendorSheet(vendor)"
32604
- />
32605
- }
32746
+ </div>
32606
32747
  </ds-mobile-section>
32607
- }
32608
32748
 
32609
- <!-- Recent Community Posts Section (empty state) -->
32610
- <ds-mobile-section>
32611
- <div class="empty-state">
32612
- <ds-mobile-illustration variant="post" alt="No posts" />
32613
- <h3 class="empty-state-title">Ingen opslag endnu</h3>
32614
- <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
32615
-
32616
- <ds-button
32617
- variant="secondary"
32618
- trailingIcon="remixArrowRightSLine"
32619
- (click)="navigateToCommunity()">
32620
- Gå til fællesområdet
32621
- </ds-button>
32622
- </div>
32623
- </ds-mobile-section>
32624
-
32625
- <!-- Open Inquiries Section (with content) -->
32626
- <ds-mobile-section
32627
- headline="Åbne henvendelser"
32628
- linkText="Se alle"
32629
- (linkClick)="navigateToInquiries()">
32630
-
32631
- <div class="inquiries-list">
32632
- @for (inquiry of openInquiries(); track inquiry.id) {
32633
- <ds-mobile-interactive-list-item-inquiry
32634
- [title]="inquiry.title"
32635
- [description]="inquiry.description"
32636
- [status]="inquiry.status"
32637
- [timestamp]="inquiry.timestamp"
32638
- [iconName]="'remixTodoLine'"
32639
- [clickable]="true"
32640
- [showChevron]="false"
32641
- [enableLongPress]="false"
32642
- (inquiryClick)="openInquiryDetail(inquiry.id)">
32643
- </ds-mobile-interactive-list-item-inquiry>
32644
- }
32645
- </div>
32646
- </ds-mobile-section>
32647
-
32648
- <!-- Open Inquiries Section (empty state) -->
32649
- <ds-mobile-section>
32650
- <div class="empty-state">
32651
- <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
32652
- <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
32653
- <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
32654
-
32655
- <ds-button
32656
- variant="secondary"
32657
- trailingIcon="remixArrowRightSLine"
32658
- (click)="navigateToInquiries()">
32659
- Gå til henvendelser
32660
- </ds-button>
32661
- </div>
32662
- </ds-mobile-section>
32663
- </ds-mobile-page-main>
32664
- } <!-- end @if (!isCoveringScreen()) -->
32749
+ <!-- Open Inquiries Section (empty state) -->
32750
+ <ds-mobile-section>
32751
+ <div class="empty-state">
32752
+ <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
32753
+ <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
32754
+ <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
32665
32755
 
32666
- `, isInline: true, styles: [".posts-list,.messages-preview-list{display:flex;flex-direction:column}.property-banner-nav{display:block;width:100%;border-radius:12px;cursor:pointer;-webkit-tap-highlight-color:transparent}.property-banner-nav:focus-visible{outline:2px solid var(--color-accent, #6B5FF5);outline-offset:2px}.inquiries-list,.services-preview-list{display:flex;flex-direction:column}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.empty-state ds-button{display:block;margin-top:16px}.empty-state ds-button::ng-deep .btn{width:100%;border-radius:9999px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}@keyframes slideDown{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.welcome-toast{padding:10px 14px;border-radius:12px;background:var(--color-background-brand-secondary, #EEF0FF);display:flex;align-items:flex-start;gap:10px;font-size:14px;font-weight:500;color:var(--color-accent, #6B5FF5);animation:slideDown .2s ease-out}.toast-icon{width:20px;height:20px;border-radius:50%;background:var(--color-accent, #6B5FF5);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;margin-top:1px}.welcome-toast-content{flex:1;display:flex;flex-direction:column;gap:2px}.welcome-toast-heading{font-family:Brockmann,sans-serif;font-size:14px;font-weight:600;color:var(--color-brand-content, #3B3691);margin:0}.welcome-toast-text{font-family:Brockmann,sans-serif;font-size:13px;line-height:1.4;color:var(--color-brand-content, #3B3691);margin:0;opacity:.8}.welcome-toast-text strong{font-weight:600;opacity:1}.toast-dismiss{margin-left:auto;background:none;border:none;cursor:pointer;flex-shrink:0;color:var(--color-accent, #6B5FF5);display:flex;align-items:center;justify-content:center}.home-content--animating{animation:homeReveal .3s var(--spring-curve-smooth) both}@keyframes homeReveal{0%{opacity:0;transform:translateY(128px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "component", type: DsButtonComponent, selector: "ds-button", inputs: ["variant", "size", "disabled", "loading", "pressed", "expanded", "leadingIcon", "trailingIcon", "ariaLabel", "iconOnly"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size", "alt"] }, { kind: "component", type: DsMobilePropertyBannerComponent, selector: "ds-mobile-property-banner", inputs: ["address", "photoUrl", "tenantCount"] }, { kind: "component", type: DsMobileInteractiveListItemPostComponent, selector: "ds-mobile-interactive-list-item-post", inputs: ["authorName", "authorRole", "timestamp", "avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "showBadge", "variant", "align", "clickable", "enableLongPress", "moreActions"], outputs: ["postClick", "commentClick", "longPress"] }, { kind: "component", type: DsMobileInteractiveListItemInquiryComponent, selector: "ds-mobile-interactive-list-item-inquiry", inputs: ["title", "description", "status", "statusLabel", "timestamp", "iconName", "iconColor", "variant", "align", "clickable", "showChevron", "enableLongPress", "moreActions"], outputs: ["inquiryClick", "longPress"] }, { kind: "component", type: DsMobileInteractiveListItemMessageComponent, selector: "ds-mobile-interactive-list-item-message", inputs: ["senderName", "senderRole", "timestamp", "message", "avatarInitials", "avatarType", "avatarSrc", "unread", "unreadStyle", "clickable", "align", "showAvatarBadge", "groupStackMembers", "groupCustomAvatarUrl", "groupStackExcludeParticipantId"], outputs: ["messageClick", "longPress"] }, { kind: "component", type: DsMobileInteractiveListItemServiceComponent, selector: "ds-mobile-interactive-list-item-service", inputs: ["title", "description", "logo", "showChevron"], outputs: ["serviceClick"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: PostContentComponent, selector: "post-content" }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostActionsComponent, selector: "post-actions" }, { kind: "component", type: ActionLikeComponent, selector: "action-like", inputs: ["active", "count"], outputs: ["activeChange", "countChange", "likeClick"] }, { kind: "component", type: ActionCommentComponent, selector: "action-comment", inputs: ["count"], outputs: ["commentClick"] }] });
32756
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToInquiries()"> til henvendelser </ds-button>
32757
+ </div>
32758
+ </ds-mobile-section>
32759
+ </ds-mobile-page-main>
32760
+ }
32761
+ <!-- end @if (!isCoveringScreen()) -->
32762
+ `, isInline: true, styles: [".posts-list,.messages-preview-list{display:flex;flex-direction:column}.property-banner-nav{display:block;width:100%;border-radius:12px;cursor:pointer;-webkit-tap-highlight-color:transparent}.property-banner-nav:focus-visible{outline:2px solid var(--color-accent, #6b5ff5);outline-offset:2px}.inquiries-list,.services-preview-list{display:flex;flex-direction:column}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.empty-state ds-button{display:block;margin-top:16px}.empty-state ds-button::ng-deep .btn{width:100%;border-radius:9999px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}@keyframes slideDown{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.welcome-toast{padding:10px 14px;border-radius:12px;background:var(--color-background-brand-secondary, #eef0ff);display:flex;align-items:flex-start;gap:10px;font-size:14px;font-weight:500;color:var(--color-accent, #6b5ff5);animation:slideDown .2s ease-out}.toast-icon{width:20px;height:20px;border-radius:50%;background:var(--color-accent, #6b5ff5);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;margin-top:1px}.welcome-toast-content{flex:1;display:flex;flex-direction:column;gap:2px}.welcome-toast-heading{font-family:Brockmann,sans-serif;font-size:14px;font-weight:600;color:var(--color-brand-content, #3b3691);margin:0}.welcome-toast-text{font-family:Brockmann,sans-serif;font-size:13px;line-height:1.4;color:var(--color-brand-content, #3b3691);margin:0;opacity:.8}.welcome-toast-text strong{font-weight:600;opacity:1}.toast-dismiss{margin-left:auto;background:none;border:none;cursor:pointer;flex-shrink:0;color:var(--color-accent, #6b5ff5);display:flex;align-items:center;justify-content:center}.home-content--animating{animation:homeReveal .3s var(--spring-curve-smooth) both}@keyframes homeReveal{0%{opacity:0;transform:translateY(128px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "component", type: DsButtonComponent, selector: "ds-button", inputs: ["variant", "size", "disabled", "loading", "pressed", "expanded", "leadingIcon", "trailingIcon", "ariaLabel", "iconOnly"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }, { kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size", "alt"] }, { kind: "component", type: DsMobilePropertyBannerComponent, selector: "ds-mobile-property-banner", inputs: ["address", "photoUrl", "tenantCount"] }, { kind: "component", type: DsMobileInteractiveListItemPostComponent, selector: "ds-mobile-interactive-list-item-post", inputs: ["authorName", "authorRole", "timestamp", "avatarInitials", "avatarType", "avatarSrc", "avatarIconName", "showBadge", "variant", "align", "clickable", "enableLongPress", "moreActions"], outputs: ["postClick", "commentClick", "longPress"] }, { kind: "component", type: DsMobileInteractiveListItemInquiryComponent, selector: "ds-mobile-interactive-list-item-inquiry", inputs: ["title", "description", "status", "statusLabel", "timestamp", "iconName", "iconColor", "variant", "align", "clickable", "showChevron", "enableLongPress", "moreActions"], outputs: ["inquiryClick", "longPress"] }, { kind: "component", type: DsMobileInteractiveListItemMessageComponent, selector: "ds-mobile-interactive-list-item-message", inputs: ["senderName", "senderRole", "timestamp", "message", "avatarInitials", "avatarType", "avatarSrc", "unread", "unreadStyle", "clickable", "align", "showAvatarBadge", "groupStackMembers", "groupCustomAvatarUrl", "groupStackExcludeParticipantId"], outputs: ["messageClick", "longPress"] }, { kind: "component", type: DsMobileInteractiveListItemServiceComponent, selector: "ds-mobile-interactive-list-item-service", inputs: ["title", "description", "logo", "showChevron"], outputs: ["serviceClick"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: PostContentComponent, selector: "post-content" }, { kind: "component", type: PostTextComponent, selector: "post-text" }, { kind: "component", type: PostActionsComponent, selector: "post-actions" }, { kind: "component", type: ActionLikeComponent, selector: "action-like", inputs: ["active", "count"], outputs: ["activeChange", "countChange", "likeClick"] }, { kind: "component", type: ActionCommentComponent, selector: "action-comment", inputs: ["count"], outputs: ["commentClick"] }] });
32667
32763
  }
32668
32764
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileHomePageComponent, decorators: [{
32669
32765
  type: Component,
@@ -32683,7 +32779,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
32683
32779
  PostTextComponent,
32684
32780
  PostActionsComponent,
32685
32781
  ActionLikeComponent,
32686
- ActionCommentComponent
32782
+ ActionCommentComponent,
32687
32783
  ], template: `
32688
32784
  <!-- Full-screen loading state (first entry) — rendered by layout, not here -->
32689
32785
 
@@ -32693,6 +32789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
32693
32789
  @if (!pageLoading.isCoveringScreen()) {
32694
32790
  <ds-mobile-page-main
32695
32791
  class="home-content"
32792
+ [showNotification]="true"
32696
32793
  [class.home-content--animating]="pageLoading.isRevealAnimation()"
32697
32794
  [firstEntry]="pageLoading.isRevealAnimation()"
32698
32795
  #pageComponent
@@ -32703,208 +32800,178 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
32703
32800
  [avatarType]="userService.avatarType()"
32704
32801
  (notificationClick)="handleNotificationClick()"
32705
32802
  (refresh)="handleRefresh($event)"
32803
+ >
32804
+ <!-- Offline indicator -->
32805
+ @if (pageComponent.isOffline()) {
32806
+ <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
32807
+ }
32808
+
32809
+ <!-- Property banner → beboere (prototype IA) -->
32810
+ <div
32811
+ header-content
32812
+ class="property-banner-nav"
32813
+ role="button"
32814
+ tabindex="0"
32815
+ (click)="navigateToTenants()"
32816
+ (keydown.enter)="navigateToTenants()"
32817
+ (keydown.space)="$event.preventDefault(); navigateToTenants()"
32818
+ aria-label="Se beboere på ejendommen"
32706
32819
  >
32707
-
32708
- <!-- Offline indicator -->
32709
- @if (pageComponent.isOffline()) {
32710
- <ds-mobile-offline-banner
32711
- offline-indicator
32712
- title="Ingen internetforbindelse"
32713
- message="Nogle funktioner kan være utilgængelige">
32714
- </ds-mobile-offline-banner>
32715
- }
32716
-
32717
- <!-- Property banner → beboere (prototype IA) -->
32718
- <div
32719
- header-content
32720
- class="property-banner-nav"
32721
- role="button"
32722
- tabindex="0"
32723
- (click)="navigateToTenants()"
32724
- (keydown.enter)="navigateToTenants()"
32725
- (keydown.space)="$event.preventDefault(); navigateToTenants()"
32726
- aria-label="Se beboere på ejendommen">
32727
- <ds-mobile-property-banner
32728
- address="Toftegårds Allé 5A, 2. tv."
32729
- photoUrl="/Assets/Dummy-photos/building.jpg"
32730
- [tenantCount]="24">
32731
- </ds-mobile-property-banner>
32732
- </div>
32820
+ <ds-mobile-property-banner address="Toftegårds Allé 5A, 2. tv." photoUrl="/Assets/Dummy-photos/building.jpg" [tenantCount]="24"> </ds-mobile-property-banner>
32821
+ </div>
32733
32822
 
32734
- @if (familyAccessService.acceptedInviteContext(); as invite) {
32735
- <ds-mobile-section [showBorder]="false" padding="20px 20px 0">
32736
- <div class="welcome-toast">
32737
- <div class="toast-icon">
32738
- <ds-icon name="remixUserSmileLine" size="12px" />
32739
- </div>
32740
- <div class="welcome-toast-content">
32741
- <p class="welcome-toast-heading">Du er nu familiemedlem!</p>
32742
- <p class="welcome-toast-text">
32743
- Tilknyttet <strong>{{ invite.propertyAddress }}</strong> via <strong>{{ invite.inviterName }}</strong>
32744
- </p>
32823
+ @if (familyAccessService.acceptedInviteContext(); as invite) {
32824
+ <ds-mobile-section [showBorder]="false" padding="20px 20px 0">
32825
+ <div class="welcome-toast">
32826
+ <div class="toast-icon">
32827
+ <ds-icon name="remixUserSmileLine" size="12px" />
32828
+ </div>
32829
+ <div class="welcome-toast-content">
32830
+ <p class="welcome-toast-heading">Du er nu familiemedlem!</p>
32831
+ <p class="welcome-toast-text">
32832
+ Tilknyttet <strong>{{ invite.propertyAddress }}</strong> via <strong>{{ invite.inviterName }}</strong>
32833
+ </p>
32834
+ </div>
32835
+ <button class="toast-dismiss" (click)="familyAccessService.clearAcceptedInviteContext()" aria-label="Luk">
32836
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
32837
+ <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
32838
+ </svg>
32839
+ </button>
32745
32840
  </div>
32746
- <button class="toast-dismiss" (click)="familyAccessService.clearAcceptedInviteContext()" aria-label="Luk">
32747
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
32748
- <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
32749
- </svg>
32750
- </button>
32841
+ </ds-mobile-section>
32842
+ }
32843
+
32844
+ <!-- Recent Community Posts Section (with content) -->
32845
+ <ds-mobile-section headline="Seneste opslag" linkText="Se alle" (linkClick)="navigateToCommunity()">
32846
+ <div class="posts-list">
32847
+ @for (post of recentPosts(); track post.id) {
32848
+ <ds-mobile-interactive-list-item-post
32849
+ [authorName]="post.authorName"
32850
+ [authorRole]="post.authorRole"
32851
+ [timestamp]="post.timestamp"
32852
+ [avatarType]="post.avatarType"
32853
+ [avatarSrc]="post.avatarSrc || ''"
32854
+ [avatarInitials]="post.avatarInitials || ''"
32855
+ [showBadge]="post.showBadge || false"
32856
+ [clickable]="true"
32857
+ [moreActions]="true"
32858
+ (postClick)="openPost(post.id)"
32859
+ (commentClick)="openPost(post.id, true)"
32860
+ (longPress)="handlePostLongPress(post.id)"
32861
+ >
32862
+ <post-content>
32863
+ @if (post.content) {
32864
+ <post-text>{{ post.content }}</post-text>
32865
+ }
32866
+ </post-content>
32867
+
32868
+ <post-actions>
32869
+ <action-like [count]="post.likeCount" [active]="post.isLiked" />
32870
+ <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
32871
+ </post-actions>
32872
+ </ds-mobile-interactive-list-item-post>
32873
+ }
32751
32874
  </div>
32752
32875
  </ds-mobile-section>
32753
- }
32754
-
32755
- <!-- Recent Community Posts Section (with content) -->
32756
- <ds-mobile-section
32757
- headline="Seneste opslag"
32758
- linkText="Se alle"
32759
- (linkClick)="navigateToCommunity()">
32760
-
32761
- <div class="posts-list">
32762
- @for (post of recentPosts(); track post.id) {
32763
- <ds-mobile-interactive-list-item-post
32764
- [authorName]="post.authorName"
32765
- [authorRole]="post.authorRole"
32766
- [timestamp]="post.timestamp"
32767
- [avatarType]="post.avatarType"
32768
- [avatarSrc]="post.avatarSrc || ''"
32769
- [avatarInitials]="post.avatarInitials || ''"
32770
- [showBadge]="post.showBadge || false"
32771
- [clickable]="true"
32772
- [moreActions]="true"
32773
- (postClick)="openPost(post.id)"
32774
- (commentClick)="openPost(post.id, true)"
32775
- (longPress)="handlePostLongPress(post.id)">
32776
-
32777
- <post-content>
32778
- @if (post.content) {
32779
- <post-text>{{ post.content }}</post-text>
32780
- }
32781
- </post-content>
32782
-
32783
- <post-actions>
32784
- <action-like [count]="post.likeCount" [active]="post.isLiked" />
32785
- <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
32786
- </post-actions>
32787
- </ds-mobile-interactive-list-item-post>
32788
- }
32789
- </div>
32790
- </ds-mobile-section>
32791
32876
 
32792
- <ds-mobile-section
32793
- headline="Seneste beskeder"
32794
- linkText="Se alle"
32795
- (linkClick)="navigateToMessages()">
32796
- <div class="messages-preview-list">
32797
- @for (conv of recentPeerMessages(); track conv.id) {
32798
- @if (isPeerGroupConversation(conv)) {
32799
- <ds-mobile-interactive-list-item-message
32800
- [senderName]="conv.title"
32801
- [senderRole]="conv.memberIds.length + ' medlemmer'"
32802
- [timestamp]="conv.timestamp"
32803
- [message]="conv.lastMessage"
32804
- [avatarInitials]="''"
32805
- [avatarType]="'initials'"
32806
- [groupStackMembers]="peerChat.resolveGroupMembers(conv)"
32807
- [groupCustomAvatarUrl]="conv.customAvatarUrl ?? ''"
32808
- groupStackExcludeParticipantId="me"
32809
- [showAvatarBadge]="false"
32810
- [unread]="conv.unread"
32811
- [clickable]="true"
32812
- (messageClick)="openPeerMessagePreview(conv)">
32813
- </ds-mobile-interactive-list-item-message>
32814
- } @else {
32815
- <ds-mobile-interactive-list-item-message
32816
- [senderName]="conv.participant.name"
32817
- [senderRole]="conv.participant.role ?? ''"
32818
- [timestamp]="conv.timestamp"
32819
- [message]="conv.lastMessage"
32820
- [avatarInitials]="conv.participant.avatarInitials ?? ''"
32821
- [avatarType]="conv.participant.avatarType ?? 'initials'"
32822
- [showAvatarBadge]="false"
32823
- [unread]="conv.unread"
32877
+ <ds-mobile-section headline="Seneste beskeder" linkText="Se alle" (linkClick)="navigateToMessages()">
32878
+ <div class="messages-preview-list">
32879
+ @for (conv of recentPeerMessages(); track conv.id) {
32880
+ @if (isPeerGroupConversation(conv)) {
32881
+ <ds-mobile-interactive-list-item-message
32882
+ [senderName]="conv.title"
32883
+ [senderRole]="conv.memberIds.length + ' medlemmer'"
32884
+ [timestamp]="conv.timestamp"
32885
+ [message]="conv.lastMessage"
32886
+ [avatarInitials]="''"
32887
+ [avatarType]="'initials'"
32888
+ [groupStackMembers]="peerChat.resolveGroupMembers(conv)"
32889
+ [groupCustomAvatarUrl]="conv.customAvatarUrl ?? ''"
32890
+ groupStackExcludeParticipantId="me"
32891
+ [showAvatarBadge]="false"
32892
+ [unread]="conv.unread"
32893
+ [clickable]="true"
32894
+ (messageClick)="openPeerMessagePreview(conv)"
32895
+ >
32896
+ </ds-mobile-interactive-list-item-message>
32897
+ } @else {
32898
+ <ds-mobile-interactive-list-item-message
32899
+ [senderName]="conv.participant.name"
32900
+ [senderRole]="conv.participant.role ?? ''"
32901
+ [timestamp]="conv.timestamp"
32902
+ [message]="conv.lastMessage"
32903
+ [avatarInitials]="conv.participant.avatarInitials ?? ''"
32904
+ [avatarType]="conv.participant.avatarType ?? 'initials'"
32905
+ [showAvatarBadge]="false"
32906
+ [unread]="conv.unread"
32907
+ [clickable]="true"
32908
+ (messageClick)="openPeerMessagePreview(conv)"
32909
+ >
32910
+ </ds-mobile-interactive-list-item-message>
32911
+ }
32912
+ }
32913
+ </div>
32914
+ </ds-mobile-section>
32915
+
32916
+ <!-- Services preview -->
32917
+ @if (previewVendors().length > 0) {
32918
+ <ds-mobile-section headline="Services" linkText="Se alle" contentGap="0px" (linkClick)="navigateToServices()">
32919
+ @for (vendor of previewVendors(); track vendor.id) {
32920
+ <ds-mobile-interactive-list-item-service
32921
+ [title]="vendor.name"
32922
+ [description]="vendor.description || ''"
32923
+ [logo]="vendor.logo || ''"
32924
+ (serviceClick)="openVendorSheet(vendor)"
32925
+ />
32926
+ }
32927
+ </ds-mobile-section>
32928
+ }
32929
+
32930
+ <!-- Recent Community Posts Section (empty state) -->
32931
+ <ds-mobile-section>
32932
+ <div class="empty-state">
32933
+ <ds-mobile-illustration variant="post" alt="No posts" />
32934
+ <h3 class="empty-state-title">Ingen opslag endnu</h3>
32935
+ <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
32936
+
32937
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToCommunity()"> Gå til fællesområdet </ds-button>
32938
+ </div>
32939
+ </ds-mobile-section>
32940
+
32941
+ <!-- Open Inquiries Section (with content) -->
32942
+ <ds-mobile-section headline="Åbne henvendelser" linkText="Se alle" (linkClick)="navigateToInquiries()">
32943
+ <div class="inquiries-list">
32944
+ @for (inquiry of openInquiries(); track inquiry.id) {
32945
+ <ds-mobile-interactive-list-item-inquiry
32946
+ [title]="inquiry.title"
32947
+ [description]="inquiry.description"
32948
+ [status]="inquiry.status"
32949
+ [timestamp]="inquiry.timestamp"
32950
+ [iconName]="'remixTodoLine'"
32824
32951
  [clickable]="true"
32825
- (messageClick)="openPeerMessagePreview(conv)">
32826
- </ds-mobile-interactive-list-item-message>
32952
+ [showChevron]="false"
32953
+ [enableLongPress]="false"
32954
+ (inquiryClick)="openInquiryDetail(inquiry.id)"
32955
+ >
32956
+ </ds-mobile-interactive-list-item-inquiry>
32827
32957
  }
32828
- }
32829
- </div>
32830
- </ds-mobile-section>
32831
-
32832
- <!-- Services preview -->
32833
- @if (previewVendors().length > 0) {
32834
- <ds-mobile-section
32835
- headline="Services"
32836
- linkText="Se alle"
32837
- contentGap="0px"
32838
- (linkClick)="navigateToServices()">
32839
- @for (vendor of previewVendors(); track vendor.id) {
32840
- <ds-mobile-interactive-list-item-service
32841
- [title]="vendor.name"
32842
- [description]="vendor.description || ''"
32843
- [logo]="vendor.logo || ''"
32844
- (serviceClick)="openVendorSheet(vendor)"
32845
- />
32846
- }
32958
+ </div>
32847
32959
  </ds-mobile-section>
32848
- }
32849
32960
 
32850
- <!-- Recent Community Posts Section (empty state) -->
32851
- <ds-mobile-section>
32852
- <div class="empty-state">
32853
- <ds-mobile-illustration variant="post" alt="No posts" />
32854
- <h3 class="empty-state-title">Ingen opslag endnu</h3>
32855
- <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
32856
-
32857
- <ds-button
32858
- variant="secondary"
32859
- trailingIcon="remixArrowRightSLine"
32860
- (click)="navigateToCommunity()">
32861
- Gå til fællesområdet
32862
- </ds-button>
32863
- </div>
32864
- </ds-mobile-section>
32865
-
32866
- <!-- Open Inquiries Section (with content) -->
32867
- <ds-mobile-section
32868
- headline="Åbne henvendelser"
32869
- linkText="Se alle"
32870
- (linkClick)="navigateToInquiries()">
32871
-
32872
- <div class="inquiries-list">
32873
- @for (inquiry of openInquiries(); track inquiry.id) {
32874
- <ds-mobile-interactive-list-item-inquiry
32875
- [title]="inquiry.title"
32876
- [description]="inquiry.description"
32877
- [status]="inquiry.status"
32878
- [timestamp]="inquiry.timestamp"
32879
- [iconName]="'remixTodoLine'"
32880
- [clickable]="true"
32881
- [showChevron]="false"
32882
- [enableLongPress]="false"
32883
- (inquiryClick)="openInquiryDetail(inquiry.id)">
32884
- </ds-mobile-interactive-list-item-inquiry>
32885
- }
32886
- </div>
32887
- </ds-mobile-section>
32888
-
32889
- <!-- Open Inquiries Section (empty state) -->
32890
- <ds-mobile-section>
32891
- <div class="empty-state">
32892
- <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
32893
- <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
32894
- <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
32895
-
32896
- <ds-button
32897
- variant="secondary"
32898
- trailingIcon="remixArrowRightSLine"
32899
- (click)="navigateToInquiries()">
32900
- Gå til henvendelser
32901
- </ds-button>
32902
- </div>
32903
- </ds-mobile-section>
32904
- </ds-mobile-page-main>
32905
- } <!-- end @if (!isCoveringScreen()) -->
32961
+ <!-- Open Inquiries Section (empty state) -->
32962
+ <ds-mobile-section>
32963
+ <div class="empty-state">
32964
+ <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
32965
+ <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
32966
+ <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
32906
32967
 
32907
- `, styles: [".posts-list,.messages-preview-list{display:flex;flex-direction:column}.property-banner-nav{display:block;width:100%;border-radius:12px;cursor:pointer;-webkit-tap-highlight-color:transparent}.property-banner-nav:focus-visible{outline:2px solid var(--color-accent, #6B5FF5);outline-offset:2px}.inquiries-list,.services-preview-list{display:flex;flex-direction:column}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.empty-state ds-button{display:block;margin-top:16px}.empty-state ds-button::ng-deep .btn{width:100%;border-radius:9999px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}@keyframes slideDown{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.welcome-toast{padding:10px 14px;border-radius:12px;background:var(--color-background-brand-secondary, #EEF0FF);display:flex;align-items:flex-start;gap:10px;font-size:14px;font-weight:500;color:var(--color-accent, #6B5FF5);animation:slideDown .2s ease-out}.toast-icon{width:20px;height:20px;border-radius:50%;background:var(--color-accent, #6B5FF5);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;margin-top:1px}.welcome-toast-content{flex:1;display:flex;flex-direction:column;gap:2px}.welcome-toast-heading{font-family:Brockmann,sans-serif;font-size:14px;font-weight:600;color:var(--color-brand-content, #3B3691);margin:0}.welcome-toast-text{font-family:Brockmann,sans-serif;font-size:13px;line-height:1.4;color:var(--color-brand-content, #3B3691);margin:0;opacity:.8}.welcome-toast-text strong{font-weight:600;opacity:1}.toast-dismiss{margin-left:auto;background:none;border:none;cursor:pointer;flex-shrink:0;color:var(--color-accent, #6B5FF5);display:flex;align-items:center;justify-content:center}.home-content--animating{animation:homeReveal .3s var(--spring-curve-smooth) both}@keyframes homeReveal{0%{opacity:0;transform:translateY(128px)}to{opacity:1;transform:translateY(0)}}\n"] }]
32968
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToInquiries()"> til henvendelser </ds-button>
32969
+ </div>
32970
+ </ds-mobile-section>
32971
+ </ds-mobile-page-main>
32972
+ }
32973
+ <!-- end @if (!isCoveringScreen()) -->
32974
+ `, styles: [".posts-list,.messages-preview-list{display:flex;flex-direction:column}.property-banner-nav{display:block;width:100%;border-radius:12px;cursor:pointer;-webkit-tap-highlight-color:transparent}.property-banner-nav:focus-visible{outline:2px solid var(--color-accent, #6b5ff5);outline-offset:2px}.inquiries-list,.services-preview-list{display:flex;flex-direction:column}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center}.empty-state ds-button{display:block;margin-top:16px}.empty-state ds-button::ng-deep .btn{width:100%;border-radius:9999px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}@keyframes slideDown{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}.welcome-toast{padding:10px 14px;border-radius:12px;background:var(--color-background-brand-secondary, #eef0ff);display:flex;align-items:flex-start;gap:10px;font-size:14px;font-weight:500;color:var(--color-accent, #6b5ff5);animation:slideDown .2s ease-out}.toast-icon{width:20px;height:20px;border-radius:50%;background:var(--color-accent, #6b5ff5);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;margin-top:1px}.welcome-toast-content{flex:1;display:flex;flex-direction:column;gap:2px}.welcome-toast-heading{font-family:Brockmann,sans-serif;font-size:14px;font-weight:600;color:var(--color-brand-content, #3b3691);margin:0}.welcome-toast-text{font-family:Brockmann,sans-serif;font-size:13px;line-height:1.4;color:var(--color-brand-content, #3b3691);margin:0;opacity:.8}.welcome-toast-text strong{font-weight:600;opacity:1}.toast-dismiss{margin-left:auto;background:none;border:none;cursor:pointer;flex-shrink:0;color:var(--color-accent, #6b5ff5);display:flex;align-items:center;justify-content:center}.home-content--animating{animation:homeReveal .3s var(--spring-curve-smooth) both}@keyframes homeReveal{0%{opacity:0;transform:translateY(128px)}to{opacity:1;transform:translateY(0)}}\n"] }]
32908
32975
  }], ctorParameters: () => [{ type: i1$3.Router }, { type: i1.NavController }, { type: UserService }, { type: PostsService }, { type: DsMobilePostDetailModalService }, { type: TrackingPermissionService }, { type: DsMobileBottomSheetService }, { type: FamilyAccessService }, { type: PeerMessagingService }, { type: PeerChatLauncherService }, { type: DsMobileLightboxService }], propDecorators: { pageComponent: [{
32909
32976
  type: ViewChild,
32910
32977
  args: ['pageComponent']
@@ -33064,7 +33131,7 @@ class MobileInquiriesPageComponent {
33064
33131
  ariaLabel="Create new inquiry"
33065
33132
  (clicked)="createNewInquiry()">
33066
33133
  </ds-mobile-fab>
33067
- `, isInline: true, styles: [".inquiry-list-wrapper{display:flex;flex-direction:column;margin-top:-12px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size", "alt"] }, { kind: "component", type: DsMobileInteractiveListItemInquiryComponent, selector: "ds-mobile-interactive-list-item-inquiry", inputs: ["title", "description", "status", "statusLabel", "timestamp", "iconName", "iconColor", "variant", "align", "clickable", "showChevron", "enableLongPress", "moreActions"], outputs: ["inquiryClick", "longPress"] }, { kind: "component", type: DsMobileInlineTabsComponent, selector: "ds-mobile-inline-tabs", inputs: ["tabs", "activeTab"], outputs: ["tabChange"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }] });
33134
+ `, isInline: true, styles: [".inquiry-list-wrapper{display:flex;flex-direction:column;margin-top:-12px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size", "alt"] }, { kind: "component", type: DsMobileInteractiveListItemInquiryComponent, selector: "ds-mobile-interactive-list-item-inquiry", inputs: ["title", "description", "status", "statusLabel", "timestamp", "iconName", "iconColor", "variant", "align", "clickable", "showChevron", "enableLongPress", "moreActions"], outputs: ["inquiryClick", "longPress"] }, { kind: "component", type: DsMobileInlineTabsComponent, selector: "ds-mobile-inline-tabs", inputs: ["tabs", "activeTab"], outputs: ["tabChange"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }] });
33068
33135
  }
33069
33136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileInquiriesPageComponent, decorators: [{
33070
33137
  type: Component,
@@ -34992,8 +35059,8 @@ class MobileTabsExampleComponent {
34992
35059
  },
34993
35060
  {
34994
35061
  action: 'settings',
34995
- title: 'Indstillinger',
34996
- icon: 'remixSettings3Line',
35062
+ title: 'Notifikationer',
35063
+ icon: 'remixNotificationLine',
34997
35064
  destructive: false,
34998
35065
  },
34999
35066
  {
@@ -36005,7 +36072,7 @@ class MobileBookingPageComponent {
36005
36072
  ariaLabel="Opret facilitet"
36006
36073
  (clicked)="openFacilityCreationModal()">
36007
36074
  </ds-mobile-fab>
36008
- `, isInline: true, styles: [".bookings-swiper-wrapper{padding:0;position:relative}.swiper-nav-buttons{display:contents}.swiper-nav-button{position:absolute;top:50%;transform:translateY(-50%);z-index:10}.swiper-nav-button:first-child{left:-48px}.swiper-nav-button:last-child{right:-48px}::ng-deep .swiper-nav-button button{border-radius:50%!important;width:48px!important;height:48px!important;padding:0!important}@media (max-width: 767px){.swiper-nav-buttons{display:none}}::ng-deep .bookings-swiper .swiper-slide{width:100%;max-width:600px;height:auto;pointer-events:auto}@media (min-width: 768px){::ng-deep .bookings-swiper .swiper-slide{max-width:100%}}::ng-deep .bookings-swiper .swiper-slide ds-mobile-interactive-list-item-booking{width:100%;pointer-events:auto}.booking-slide-content{position:relative;width:100%}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileInteractiveListItemBookingComponent, selector: "ds-mobile-interactive-list-item-booking", inputs: ["thumbnail", "facilityTitle", "description", "bookingDate", "bookingTime", "availabilityStatus", "statusLabel", "variant", "align", "clickable", "showChevron", "enableLongPress", "moreActions"], outputs: ["bookingClick", "longPress"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { 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: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }, { kind: "component", type: DsMobileLoaderOverlayComponent, selector: "ds-mobile-loader-overlay", inputs: ["spinnerSize", "borderRadius"] }] });
36075
+ `, isInline: true, styles: [".bookings-swiper-wrapper{padding:0;position:relative}.swiper-nav-buttons{display:contents}.swiper-nav-button{position:absolute;top:50%;transform:translateY(-50%);z-index:10}.swiper-nav-button:first-child{left:-48px}.swiper-nav-button:last-child{right:-48px}::ng-deep .swiper-nav-button button{border-radius:50%!important;width:48px!important;height:48px!important;padding:0!important}@media (max-width: 767px){.swiper-nav-buttons{display:none}}::ng-deep .bookings-swiper .swiper-slide{width:100%;max-width:600px;height:auto;pointer-events:auto}@media (min-width: 768px){::ng-deep .bookings-swiper .swiper-slide{max-width:100%}}::ng-deep .bookings-swiper .swiper-slide ds-mobile-interactive-list-item-booking{width:100%;pointer-events:auto}.booking-slide-content{position:relative;width:100%}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileInteractiveListItemBookingComponent, selector: "ds-mobile-interactive-list-item-booking", inputs: ["thumbnail", "facilityTitle", "description", "bookingDate", "bookingTime", "availabilityStatus", "statusLabel", "variant", "align", "clickable", "showChevron", "enableLongPress", "moreActions"], outputs: ["bookingClick", "longPress"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { 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: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }, { kind: "component", type: DsMobileLoaderOverlayComponent, selector: "ds-mobile-loader-overlay", inputs: ["spinnerSize", "borderRadius"] }] });
36009
36076
  }
36010
36077
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileBookingPageComponent, decorators: [{
36011
36078
  type: Component,
@@ -38013,7 +38080,7 @@ class TenantChatPageComponent {
38013
38080
  ariaLabel="Vælg beboer at skrive med"
38014
38081
  (clicked)="goToTenants()">
38015
38082
  </ds-mobile-fab>
38016
- `, isInline: true, styles: [".empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:64px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px;opacity:.4}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileInteractiveListItemMessageComponent, selector: "ds-mobile-interactive-list-item-message", inputs: ["senderName", "senderRole", "timestamp", "message", "avatarInitials", "avatarType", "avatarSrc", "unread", "unreadStyle", "clickable", "align", "showAvatarBadge", "groupStackMembers", "groupCustomAvatarUrl", "groupStackExcludeParticipantId"], outputs: ["messageClick", "longPress"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }] });
38083
+ `, isInline: true, styles: [".empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:64px 20px;text-align:center}.empty-state-image{width:96px;height:96px;margin-bottom:24px;opacity:.4}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileInteractiveListItemMessageComponent, selector: "ds-mobile-interactive-list-item-message", inputs: ["senderName", "senderRole", "timestamp", "message", "avatarInitials", "avatarType", "avatarSrc", "unread", "unreadStyle", "clickable", "align", "showAvatarBadge", "groupStackMembers", "groupCustomAvatarUrl", "groupStackExcludeParticipantId"], outputs: ["messageClick", "longPress"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }] });
38017
38084
  }
38018
38085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: TenantChatPageComponent, decorators: [{
38019
38086
  type: Component,
@@ -38270,7 +38337,7 @@ class ServicesPageComponent {
38270
38337
  </ds-mobile-section>
38271
38338
  }
38272
38339
  </ds-mobile-page-main>
38273
- `, isInline: true, styles: [".empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size", "alt"] }, { kind: "component", type: DsMobileInteractiveListItemServiceComponent, selector: "ds-mobile-interactive-list-item-service", inputs: ["title", "description", "logo", "showChevron"], outputs: ["serviceClick"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }] });
38340
+ `, isInline: true, styles: [".empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "firstEntry", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showNotification", "notificationCount", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["notificationClick", "avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size", "alt"] }, { kind: "component", type: DsMobileInteractiveListItemServiceComponent, selector: "ds-mobile-interactive-list-item-service", inputs: ["title", "description", "logo", "showChevron"], outputs: ["serviceClick"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }] });
38274
38341
  }
38275
38342
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ServicesPageComponent, decorators: [{
38276
38343
  type: Component,
@@ -38325,6 +38392,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
38325
38392
  args: ['pageComponent']
38326
38393
  }] } });
38327
38394
 
38395
+ const PREFS = [
38396
+ { key: 'messages', label: 'Beskeder', description: 'Nye beskeder fra beboere og administration' },
38397
+ { key: 'bookings', label: 'Bookinger', description: 'Bekræftelser, aflysninger og påmindelser' },
38398
+ { key: 'community', label: 'Fællesskab', description: 'Opslag, kommentarer og omtaler' },
38399
+ { key: 'inquiries', label: 'Henvendelser', description: 'Opdateringer på dine henvendelser' },
38400
+ { key: 'services', label: 'Service', description: 'Opdateringer fra serviceleverandører' },
38401
+ { key: 'handbook', label: 'Håndbog', description: 'Ændringer i beboerhåndbogen' },
38402
+ { key: 'system', label: 'System', description: 'Meddelelser, invitationer og familieadgang' },
38403
+ ];
38404
+ class SettingsModalComponent {
38405
+ notificationService = inject(NotificationService);
38406
+ prefs = PREFS;
38407
+ enabledSignals = new Map(PREFS.map(p => [p.key, computed(() => this.notificationService.isPushEnabled(p.key))]));
38408
+ isEnabled(key) {
38409
+ return this.enabledSignals.get(key);
38410
+ }
38411
+ toggle(key) {
38412
+ const current = this.notificationService.isPushEnabled(key);
38413
+ this.notificationService.setPushEnabled(key, !current);
38414
+ Haptics.impact({ style: ImpactStyle.Light }).catch(() => {
38415
+ if ('vibrate' in navigator)
38416
+ navigator.vibrate(10);
38417
+ });
38418
+ }
38419
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
38420
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: SettingsModalComponent, isStandalone: true, selector: "app-settings-modal", ngImport: i0, template: `
38421
+ <ds-mobile-modal-base headerTitle="Notifikationer" [showHeader]="true">
38422
+
38423
+ <div class="settings-content">
38424
+ @for (pref of prefs; track pref.key; let isFirst = $first; let isLast = $last) {
38425
+ <ds-mobile-list-item
38426
+ [showDivider]="!isLast"
38427
+ [flushTop]="isFirst"
38428
+ [interactive]="true"
38429
+ [enableLongPress]="false"
38430
+ [moreActions]="false"
38431
+ [title]="pref.label"
38432
+ [subtitle]="pref.description"
38433
+ (itemClick)="toggle(pref.key)"
38434
+ >
38435
+ <ds-mobile-toggle
38436
+ content-trailing
38437
+ [checked]="isEnabled(pref.key)()"
38438
+ (changed)="toggle(pref.key)"
38439
+ />
38440
+ </ds-mobile-list-item>
38441
+ }
38442
+ </div>
38443
+
38444
+ </ds-mobile-modal-base>
38445
+ `, isInline: true, styles: [".settings-content{padding:20px}\n"], dependencies: [{ kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["headerTitleInteractive", "showHeader"], outputs: ["titleClick"] }, { 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: DsMobileToggleComponent, selector: "ds-mobile-toggle", inputs: ["checked", "disabled"], outputs: ["checkedChange", "changed"] }] });
38446
+ }
38447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalComponent, decorators: [{
38448
+ type: Component,
38449
+ args: [{ selector: 'app-settings-modal', standalone: true, imports: [
38450
+ DsMobileModalBaseComponent,
38451
+ DsMobileListItemComponent,
38452
+ DsMobileToggleComponent,
38453
+ ], template: `
38454
+ <ds-mobile-modal-base headerTitle="Notifikationer" [showHeader]="true">
38455
+
38456
+ <div class="settings-content">
38457
+ @for (pref of prefs; track pref.key; let isFirst = $first; let isLast = $last) {
38458
+ <ds-mobile-list-item
38459
+ [showDivider]="!isLast"
38460
+ [flushTop]="isFirst"
38461
+ [interactive]="true"
38462
+ [enableLongPress]="false"
38463
+ [moreActions]="false"
38464
+ [title]="pref.label"
38465
+ [subtitle]="pref.description"
38466
+ (itemClick)="toggle(pref.key)"
38467
+ >
38468
+ <ds-mobile-toggle
38469
+ content-trailing
38470
+ [checked]="isEnabled(pref.key)()"
38471
+ (changed)="toggle(pref.key)"
38472
+ />
38473
+ </ds-mobile-list-item>
38474
+ }
38475
+ </div>
38476
+
38477
+ </ds-mobile-modal-base>
38478
+ `, styles: [".settings-content{padding:20px}\n"] }]
38479
+ }] });
38480
+
38481
+ class SettingsModalService {
38482
+ modalController;
38483
+ constructor(modalController) {
38484
+ this.modalController = modalController;
38485
+ }
38486
+ async open() {
38487
+ const modal = await this.modalController.create({
38488
+ component: SettingsModalComponent,
38489
+ cssClass: 'ds-modal-base',
38490
+ mode: 'ios',
38491
+ presentingElement: document.querySelector('ion-router-outlet') || undefined,
38492
+ backdropDismiss: true,
38493
+ showBackdrop: true,
38494
+ animated: true,
38495
+ });
38496
+ await modal.present();
38497
+ }
38498
+ async close(data) {
38499
+ return this.modalController.dismiss(data);
38500
+ }
38501
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
38502
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalService, providedIn: 'root' });
38503
+ }
38504
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalService, decorators: [{
38505
+ type: Injectable,
38506
+ args: [{
38507
+ providedIn: 'root',
38508
+ }]
38509
+ }], ctorParameters: () => [{ type: i1.ModalController }] });
38510
+
38328
38511
  /**
38329
38512
  * Services Barrel File
38330
38513
  *
@@ -38348,5 +38531,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
38348
38531
  * Generated bundle index. Do not edit.
38349
38532
  */
38350
38533
 
38351
- export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DEFAULT_SERVICE_PAGE_LABELS, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAddGroupTenantsModalComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingConfirmationWrapperComponent, 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, DsMobileWhenCanBookSheetComponent, DsMobileWhoCanBookSheetComponent, DsTextInputComponent, FamilyAccessPageComponent, FamilyAccessService, InquiriesService, InviteSuccessPageComponent, MediaPickerService, MobileBookingPageComponent, MobileCommunityPageComponent, MobileHandbookPageComponent, MobileHomePageComponent, MobileInquiriesPageComponent, MobileInquiryDetailPageComponent, MobileModalBase, MobilePageBase, MobilePostDetailPageComponent, MobileTabsExampleComponent, NOTIFICATION_ICON_MAP, NotificationPromptService, NotificationService, PageLoadingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, RelativeTimePipe, SAMPLE_NOTIFICATIONS, SectionHeaderComponent, ServicesPageComponent, SignInPageComponent, SignInToAcceptPageComponent, TenantChatPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, VENDOR_MODAL_SERVICE, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition, dateBucket };
38534
+ export { AcceptInvitePageComponent, ActionCommentComponent, ActionLikeComponent, AvatarUploadPageComponent, BaseModalService, ContentRowComponent, CreateAccountPageComponent, DEFAULT_SERVICE_PAGE_LABELS, DsAppIconComponent, DsAvatarWithBadgeComponent, DsLogoComponent, DsMobileAccessSheetComponent, DsMobileActionListItemComponent, DsMobileActionsBottomSheetComponent, DsMobileAddGroupTenantsModalComponent, DsMobileAppLoadingComponent, DsMobileAttachmentPreviewComponent, DsMobileBookingConfirmationWrapperComponent, 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, PageLoadingService, PostActionsComponent, PostAttachmentsComponent, PostContentComponent, PostCreatePageComponent, PostMediaComponent, PostPdfAttachmentComponent, PostTextComponent, PostsService, RelativeTimePipe, SAMPLE_NOTIFICATIONS, SectionHeaderComponent, ServicesPageComponent, SettingsModalService, SignInPageComponent, SignInToAcceptPageComponent, TenantChatPageComponent, TileContentComponent, TileIconComponent, TileLabelComponent, TileValueComponent, TrackingPermissionService, UserService, VENDOR_MODAL_SERVICE, WhitelabelDemoModalComponent, WhitelabelDemoModalService, WhitelabelService, customBackTransition, customPageTransition, dateBucket };
38352
38535
  //# sourceMappingURL=propbinder-mobile-design.mjs.map