@propbinder/mobile-design 0.2.92 → 0.2.98

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
@@ -22865,6 +22880,10 @@ class DsMobileCardInlineContactComponent {
22865
22880
  * Phone number (optional)
22866
22881
  */
22867
22882
  phoneNumber = input('', ...(ngDevMode ? [{ debugName: "phoneNumber" }] : []));
22883
+ /**
22884
+ * Email address (optional)
22885
+ */
22886
+ email = input('', ...(ngDevMode ? [{ debugName: "email" }] : []));
22868
22887
  /**
22869
22888
  * Layout variant
22870
22889
  * - 'default' - Standard padding and column layout
@@ -22895,7 +22914,7 @@ class DsMobileCardInlineContactComponent {
22895
22914
  this.contactClick.emit();
22896
22915
  }
22897
22916
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileCardInlineContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22898
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileCardInlineContactComponent, isStandalone: true, selector: "ds-mobile-card-inline-contact", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, imageUrl: { classPropertyName: "imageUrl", publicName: "imageUrl", isSignal: true, isRequired: false, transformFunction: null }, contactPerson: { classPropertyName: "contactPerson", publicName: "contactPerson", isSignal: true, isRequired: false, transformFunction: null }, phoneNumber: { classPropertyName: "phoneNumber", publicName: "phoneNumber", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, showChevron: { classPropertyName: "showChevron", publicName: "showChevron", isSignal: true, isRequired: false, transformFunction: null }, showEditButton: { classPropertyName: "showEditButton", publicName: "showEditButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contactClick: "contactClick", editClick: "editClick" }, ngImport: i0, template: `
22917
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileCardInlineContactComponent, isStandalone: true, selector: "ds-mobile-card-inline-contact", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, imageUrl: { classPropertyName: "imageUrl", publicName: "imageUrl", isSignal: true, isRequired: false, transformFunction: null }, contactPerson: { classPropertyName: "contactPerson", publicName: "contactPerson", isSignal: true, isRequired: false, transformFunction: null }, phoneNumber: { classPropertyName: "phoneNumber", publicName: "phoneNumber", isSignal: true, isRequired: false, transformFunction: null }, email: { classPropertyName: "email", publicName: "email", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, showChevron: { classPropertyName: "showChevron", publicName: "showChevron", isSignal: true, isRequired: false, transformFunction: null }, showEditButton: { classPropertyName: "showEditButton", publicName: "showEditButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contactClick: "contactClick", editClick: "editClick" }, ngImport: i0, template: `
22899
22918
  <ds-mobile-card-inline
22900
22919
  [variant]="layout()"
22901
22920
  [disabled]="!clickable()"
@@ -22916,17 +22935,23 @@ class DsMobileCardInlineContactComponent {
22916
22935
  <div content-main class="item-content">
22917
22936
  <div class="item-name">{{ name() }}</div>
22918
22937
 
22919
- @if (contactPerson() || phoneNumber()) {
22938
+ @if (contactPerson() || phoneNumber() || email()) {
22920
22939
  <div class="item-meta">
22921
22940
  @if (contactPerson()) {
22922
22941
  <span>{{ contactPerson() }}</span>
22923
22942
  }
22924
- @if (contactPerson() && phoneNumber()) {
22943
+ @if (contactPerson() && (phoneNumber() || email())) {
22925
22944
  <span>·</span>
22926
22945
  }
22927
22946
  @if (phoneNumber()) {
22928
22947
  <span>{{ phoneNumber() }}</span>
22929
22948
  }
22949
+ @if (phoneNumber() && email()) {
22950
+ <span>·</span>
22951
+ }
22952
+ @if (email()) {
22953
+ <span>{{ email() }}</span>
22954
+ }
22930
22955
  </div>
22931
22956
  }
22932
22957
  </div>
@@ -22966,17 +22991,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
22966
22991
  <div content-main class="item-content">
22967
22992
  <div class="item-name">{{ name() }}</div>
22968
22993
 
22969
- @if (contactPerson() || phoneNumber()) {
22994
+ @if (contactPerson() || phoneNumber() || email()) {
22970
22995
  <div class="item-meta">
22971
22996
  @if (contactPerson()) {
22972
22997
  <span>{{ contactPerson() }}</span>
22973
22998
  }
22974
- @if (contactPerson() && phoneNumber()) {
22999
+ @if (contactPerson() && (phoneNumber() || email())) {
22975
23000
  <span>·</span>
22976
23001
  }
22977
23002
  @if (phoneNumber()) {
22978
23003
  <span>{{ phoneNumber() }}</span>
22979
23004
  }
23005
+ @if (phoneNumber() && email()) {
23006
+ <span>·</span>
23007
+ }
23008
+ @if (email()) {
23009
+ <span>{{ email() }}</span>
23010
+ }
22980
23011
  </div>
22981
23012
  }
22982
23013
  </div>
@@ -22992,7 +23023,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
22992
23023
  }
22993
23024
  </ds-mobile-card-inline>
22994
23025
  `, styles: [".item-image{width:36px;height:36px;border-radius:8px;object-fit:cover;flex-shrink:0;background:var(--color-background-neutral-tertiary, #E5E7EB)}:host ::ng-deep .item-trailing ds-icon-button .btn{border-radius:50%}\n"] }]
22995
- }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], initials: [{ type: i0.Input, args: [{ isSignal: true, alias: "initials", required: false }] }], imageUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageUrl", required: false }] }], contactPerson: [{ type: i0.Input, args: [{ isSignal: true, alias: "contactPerson", required: false }] }], phoneNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "phoneNumber", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], showChevron: [{ type: i0.Input, args: [{ isSignal: true, alias: "showChevron", required: false }] }], showEditButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEditButton", required: false }] }], contactClick: [{ type: i0.Output, args: ["contactClick"] }], editClick: [{ type: i0.Output, args: ["editClick"] }] } });
23026
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], initials: [{ type: i0.Input, args: [{ isSignal: true, alias: "initials", required: false }] }], imageUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageUrl", required: false }] }], contactPerson: [{ type: i0.Input, args: [{ isSignal: true, alias: "contactPerson", required: false }] }], phoneNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "phoneNumber", required: false }] }], email: [{ type: i0.Input, args: [{ isSignal: true, alias: "email", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], showChevron: [{ type: i0.Input, args: [{ isSignal: true, alias: "showChevron", required: false }] }], showEditButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEditButton", required: false }] }], contactClick: [{ type: i0.Output, args: ["contactClick"] }], editClick: [{ type: i0.Output, args: ["editClick"] }] } });
22996
23027
 
22997
23028
  /**
22998
23029
  * DsMobileNewInquiryModalComponent
@@ -27737,6 +27768,15 @@ class DsMobileHandbookDetailModalComponent {
27737
27768
  * Error state - when set, shows error message
27738
27769
  */
27739
27770
  error;
27771
+ // Translations
27772
+ textItems = 'emner';
27773
+ textClose = 'Luk';
27774
+ textEmptyTitle = 'Ingen emner endnu';
27775
+ textEmptyDescription = 'Denne mappe er tom';
27776
+ textCall = 'Ring';
27777
+ textCopyPhone = 'Kopier nummer';
27778
+ textEmail = 'Skriv e-mail';
27779
+ textCopyEmail = 'Kopier e-mail';
27740
27780
  // Signal for reactive handbook data
27741
27781
  handbook = signal({
27742
27782
  title: '',
@@ -27805,26 +27845,27 @@ class DsMobileHandbookDetailModalComponent {
27805
27845
  * Handle contact click - shows bottom sheet with call and copy actions
27806
27846
  */
27807
27847
  async handleContactClick(contact) {
27808
- // Only show actions if there's a phone number
27809
- if (!contact.phoneNumber) {
27848
+ // Only show actions if there's a phone number or email
27849
+ if (!contact.phoneNumber && !contact.email) {
27810
27850
  return;
27811
27851
  }
27812
- const actionGroups = [
27813
- {
27852
+ const actionGroups = [];
27853
+ if (contact.phoneNumber) {
27854
+ actionGroups.push({
27814
27855
  actions: [
27815
- {
27816
- action: 'call',
27817
- title: 'Ring',
27818
- icon: 'remixPhoneLine',
27819
- },
27820
- {
27821
- action: 'copy',
27822
- title: 'Kopier nummer',
27823
- icon: 'remixFileCopyLine',
27824
- },
27856
+ { action: 'call', title: this.textCall, icon: 'remixPhoneLine' },
27857
+ { action: 'copy_phone', title: this.textCopyPhone, icon: 'remixFileCopyLine' },
27825
27858
  ],
27826
- },
27827
- ];
27859
+ });
27860
+ }
27861
+ if (contact.email) {
27862
+ actionGroups.push({
27863
+ actions: [
27864
+ { action: 'email', title: this.textEmail, icon: 'remixMailLine' },
27865
+ { action: 'copy_email', title: this.textCopyEmail, icon: 'remixFileCopyLine' },
27866
+ ],
27867
+ });
27868
+ }
27828
27869
  const sheet = await this.modalController.create({
27829
27870
  component: DsMobileActionsBottomSheetComponent,
27830
27871
  componentProps: {
@@ -27848,27 +27889,34 @@ class DsMobileHandbookDetailModalComponent {
27848
27889
  async handleContactAction(action, contact) {
27849
27890
  switch (action) {
27850
27891
  case 'call':
27851
- // Open phone dialer with the contact's phone number
27852
- if (contact.phoneNumber) {
27892
+ if (contact.phoneNumber)
27853
27893
  window.location.href = `tel:${contact.phoneNumber}`;
27854
- }
27855
27894
  break;
27895
+ case 'copy_phone':
27856
27896
  case 'copy':
27857
- // Copy phone number to clipboard
27858
27897
  if (contact.phoneNumber) {
27859
27898
  try {
27860
- // Try modern Clipboard API first
27861
27899
  await navigator.clipboard.writeText(contact.phoneNumber);
27862
- console.log('Phone number copied to clipboard:', contact.phoneNumber);
27863
- // TODO: Show toast notification if you have a toast service
27864
27900
  }
27865
27901
  catch (err) {
27866
- console.error('Failed to copy phone number:', err);
27867
- // Fallback: Try older execCommand method
27868
27902
  this.fallbackCopyToClipboard(contact.phoneNumber);
27869
27903
  }
27870
27904
  }
27871
27905
  break;
27906
+ case 'email':
27907
+ if (contact.email)
27908
+ window.location.href = `mailto:${contact.email}`;
27909
+ break;
27910
+ case 'copy_email':
27911
+ if (contact.email) {
27912
+ try {
27913
+ await navigator.clipboard.writeText(contact.email);
27914
+ }
27915
+ catch (err) {
27916
+ this.fallbackCopyToClipboard(contact.email);
27917
+ }
27918
+ }
27919
+ break;
27872
27920
  }
27873
27921
  }
27874
27922
  /**
@@ -27905,8 +27953,8 @@ class DsMobileHandbookDetailModalComponent {
27905
27953
  // Attachment action is now handled by DsMobileCardInlineFileComponent via fileUrl input
27906
27954
  }
27907
27955
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileHandbookDetailModalComponent, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Component });
27908
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileHandbookDetailModalComponent, isStandalone: true, selector: "ds-mobile-handbook-detail-modal", inputs: { handbookData: "handbookData", loading: "loading", error: "error" }, ngImport: i0, template: `
27909
- <ds-mobile-modal-base [loading]="loading" [error]="error" [headerTitle]="handbook().title" [headerMeta]="handbook().itemCount + ' emner'" closeButtonLabel="Luk">
27956
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileHandbookDetailModalComponent, isStandalone: true, selector: "ds-mobile-handbook-detail-modal", inputs: { handbookData: "handbookData", loading: "loading", error: "error", textItems: "textItems", textClose: "textClose", textEmptyTitle: "textEmptyTitle", textEmptyDescription: "textEmptyDescription", textCall: "textCall", textCopyPhone: "textCopyPhone", textEmail: "textEmail", textCopyEmail: "textCopyEmail" }, ngImport: i0, template: `
27957
+ <ds-mobile-modal-base [loading]="loading" [error]="error" [headerTitle]="handbook().title" [headerMeta]="handbook().itemCount + ' ' + textItems" [closeButtonLabel]="textClose">
27910
27958
  <!-- Header Folder Icon -->
27911
27959
  <ds-mobile-handbook-folder-mini header-leading [variant]="handbook().variant" [customColor]="handbook().customColor" [iconName]="handbook().iconName">
27912
27960
  </ds-mobile-handbook-folder-mini>
@@ -27940,6 +27988,7 @@ class DsMobileHandbookDetailModalComponent {
27940
27988
  [initials]="contact.initials"
27941
27989
  [contactPerson]="contact.contactPerson || ''"
27942
27990
  [phoneNumber]="contact.phoneNumber || ''"
27991
+ [email]="contact.email || ''"
27943
27992
  [clickable]="true"
27944
27993
  (contactClick)="handleContactClick(contact)"
27945
27994
  >
@@ -27967,13 +28016,13 @@ class DsMobileHandbookDetailModalComponent {
27967
28016
  <ds-mobile-section>
27968
28017
  <div class="handbook-empty-state">
27969
28018
  <img src="/Assets/Empty%20state-chat.png" alt="No items yet" class="empty-state-image" />
27970
- <h3 class="empty-state-title">No items yet</h3>
27971
- <p class="empty-state-description">This folder is empty</p>
28019
+ <h3 class="empty-state-title">{{ textEmptyTitle }}</h3>
28020
+ <p class="empty-state-description">{{ textEmptyDescription }}</p>
27972
28021
  </div>
27973
28022
  </ds-mobile-section>
27974
28023
  }
27975
28024
  </ds-mobile-modal-base>
27976
- `, isInline: true, styles: [".handbook-detail-container{display:flex;flex-direction:column;width:100%;flex:1}.handbook-item{width:100%;display:flex;flex-direction:column;gap:24px;padding:0;border-bottom:none}.handbook-item.last-item{border-bottom:none}.item-text-group{display:flex;flex-direction:column;gap:8px}.item-title{font-family:Brockmann,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin:0}::ng-deep .item-description p{margin:0 0 12px}::ng-deep .item-description p:last-child{margin-bottom:0}::ng-deep .item-description strong,::ng-deep .item-description b{font-weight:600}::ng-deep .item-description em,::ng-deep .item-description i{font-style:italic}::ng-deep .item-description u{text-decoration:underline;text-underline-offset:2px}::ng-deep .item-description h1,::ng-deep .item-description h2,::ng-deep .item-description h3,::ng-deep .item-description h4{font-family:Brockmann,sans-serif;font-weight:600;line-height:1.4;color:var(--color-text-primary, #1a1a1a);margin:0;padding-top:16px;padding-bottom:4px}::ng-deep .item-description h1:first-child,::ng-deep .item-description h2:first-child,::ng-deep .item-description h3:first-child,::ng-deep .item-description h4:first-child{padding-top:0}::ng-deep .item-description h1{font-size:var(--font-size-xl, 20px)}::ng-deep .item-description h2{font-size:var(--font-size-lg, 18px)}::ng-deep .item-description h3,::ng-deep .item-description h4{font-size:var(--font-size-base, 16px)}::ng-deep .item-description ul,::ng-deep .item-description ol{padding-left:20px;margin:0 0 12px}::ng-deep .item-description ul:last-child,::ng-deep .item-description ol:last-child{margin-bottom:0}::ng-deep .item-description li{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin-bottom:4px}::ng-deep .item-description li:last-child{margin-bottom:0}.item-image{width:100%;max-width:100%;height:280px;-o-object-fit:cover;object-fit:cover;border-radius:12px;display:block}.contacts-attachments-group{display:flex;flex-direction:column;gap:8px}.handbook-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}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a)}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373)}@supports (padding: env(safe-area-inset-bottom)){.handbook-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsMobileHandbookFolderMiniComponent, selector: "ds-mobile-handbook-folder-mini", inputs: ["variant", "customColor", "iconName"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "imageUrl", "contactPerson", "phoneNumber", "layout", "clickable", "showChevron", "showEditButton"], outputs: ["contactClick", "editClick"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["headerTitleInteractive", "showHeader"], outputs: ["titleClick"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
28025
+ `, isInline: true, styles: [".handbook-detail-container{display:flex;flex-direction:column;width:100%;flex:1}.handbook-item{width:100%;display:flex;flex-direction:column;gap:24px;padding:0;border-bottom:none}.handbook-item.last-item{border-bottom:none}.item-text-group{display:flex;flex-direction:column;gap:8px}.item-title{font-family:Brockmann,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:var(--color-text-primary, #1a1a1a);margin:0}.item-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin:0}::ng-deep .item-description p{margin:0 0 12px}::ng-deep .item-description p:last-child{margin-bottom:0}::ng-deep .item-description strong,::ng-deep .item-description b{font-weight:600}::ng-deep .item-description em,::ng-deep .item-description i{font-style:italic}::ng-deep .item-description u{text-decoration:underline;text-underline-offset:2px}::ng-deep .item-description h1,::ng-deep .item-description h2,::ng-deep .item-description h3,::ng-deep .item-description h4{font-family:Brockmann,sans-serif;font-weight:600;line-height:1.4;color:var(--color-text-primary, #1a1a1a);margin:0;padding-top:16px;padding-bottom:4px}::ng-deep .item-description h1:first-child,::ng-deep .item-description h2:first-child,::ng-deep .item-description h3:first-child,::ng-deep .item-description h4:first-child{padding-top:0}::ng-deep .item-description h1{font-size:var(--font-size-xl, 20px)}::ng-deep .item-description h2{font-size:var(--font-size-lg, 18px)}::ng-deep .item-description h3,::ng-deep .item-description h4{font-size:var(--font-size-base, 16px)}::ng-deep .item-description ul,::ng-deep .item-description ol{padding-left:20px;margin:0 0 12px}::ng-deep .item-description ul:last-child,::ng-deep .item-description ol:last-child{margin-bottom:0}::ng-deep .item-description li{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);line-height:22px;color:var(--color-text-primary, #1a1a1a);margin-bottom:4px}::ng-deep .item-description li:last-child{margin-bottom:0}.item-image{width:100%;max-width:100%;height:280px;-o-object-fit:cover;object-fit:cover;border-radius:12px;display:block}.contacts-attachments-group{display:flex;flex-direction:column;gap:8px}.handbook-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}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a)}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373)}@supports (padding: env(safe-area-inset-bottom)){.handbook-detail-container{padding-bottom:calc(20px + env(safe-area-inset-bottom))}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsMobileHandbookFolderMiniComponent, selector: "ds-mobile-handbook-folder-mini", inputs: ["variant", "customColor", "iconName"] }, { kind: "component", type: DsMobileCardInlineFileComponent, selector: "ds-mobile-card-inline-file", inputs: ["fileName", "fileSize", "variant", "layout", "fileUrl"], outputs: ["fileClick"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "imageUrl", "contactPerson", "phoneNumber", "email", "layout", "clickable", "showChevron", "showEditButton"], outputs: ["contactClick", "editClick"] }, { kind: "component", type: DsMobileSwiperComponent, selector: "ds-mobile-swiper", inputs: ["slideWidth", "gap", "pagination", "autoHeight", "progressiveOpacity", "progressiveScale"] }, { kind: "component", type: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["headerTitleInteractive", "showHeader"], outputs: ["titleClick"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
27977
28026
  }
27978
28027
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileHandbookDetailModalComponent, decorators: [{
27979
28028
  type: Component,
@@ -27986,7 +28035,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
27986
28035
  DsMobileModalBaseComponent,
27987
28036
  DsMobileSectionComponent,
27988
28037
  ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: `
27989
- <ds-mobile-modal-base [loading]="loading" [error]="error" [headerTitle]="handbook().title" [headerMeta]="handbook().itemCount + ' emner'" closeButtonLabel="Luk">
28038
+ <ds-mobile-modal-base [loading]="loading" [error]="error" [headerTitle]="handbook().title" [headerMeta]="handbook().itemCount + ' ' + textItems" [closeButtonLabel]="textClose">
27990
28039
  <!-- Header Folder Icon -->
27991
28040
  <ds-mobile-handbook-folder-mini header-leading [variant]="handbook().variant" [customColor]="handbook().customColor" [iconName]="handbook().iconName">
27992
28041
  </ds-mobile-handbook-folder-mini>
@@ -28020,6 +28069,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
28020
28069
  [initials]="contact.initials"
28021
28070
  [contactPerson]="contact.contactPerson || ''"
28022
28071
  [phoneNumber]="contact.phoneNumber || ''"
28072
+ [email]="contact.email || ''"
28023
28073
  [clickable]="true"
28024
28074
  (contactClick)="handleContactClick(contact)"
28025
28075
  >
@@ -28047,8 +28097,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
28047
28097
  <ds-mobile-section>
28048
28098
  <div class="handbook-empty-state">
28049
28099
  <img src="/Assets/Empty%20state-chat.png" alt="No items yet" class="empty-state-image" />
28050
- <h3 class="empty-state-title">No items yet</h3>
28051
- <p class="empty-state-description">This folder is empty</p>
28100
+ <h3 class="empty-state-title">{{ textEmptyTitle }}</h3>
28101
+ <p class="empty-state-description">{{ textEmptyDescription }}</p>
28052
28102
  </div>
28053
28103
  </ds-mobile-section>
28054
28104
  }
@@ -28060,6 +28110,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
28060
28110
  type: Input
28061
28111
  }], error: [{
28062
28112
  type: Input
28113
+ }], textItems: [{
28114
+ type: Input
28115
+ }], textClose: [{
28116
+ type: Input
28117
+ }], textEmptyTitle: [{
28118
+ type: Input
28119
+ }], textEmptyDescription: [{
28120
+ type: Input
28121
+ }], textCall: [{
28122
+ type: Input
28123
+ }], textCopyPhone: [{
28124
+ type: Input
28125
+ }], textEmail: [{
28126
+ type: Input
28127
+ }], textCopyEmail: [{
28128
+ type: Input
28063
28129
  }] } });
28064
28130
 
28065
28131
  /**
@@ -29014,9 +29080,51 @@ const SAMPLE_NOTIFICATIONS = [
29014
29080
  { 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
29081
  ];
29016
29082
 
29083
+ const TYPE_TO_CATEGORY = {
29084
+ inquiry_update: 'inquiries',
29085
+ inquiry_assigned: 'inquiries',
29086
+ inquiry_resolved: 'inquiries',
29087
+ community_post: 'community',
29088
+ community_comment: 'community',
29089
+ community_like: 'community',
29090
+ community_mention: 'community',
29091
+ booking_confirmed: 'bookings',
29092
+ booking_cancelled: 'bookings',
29093
+ booking_reminder: 'bookings',
29094
+ facility_available: 'bookings',
29095
+ message_new: 'messages',
29096
+ message_group: 'messages',
29097
+ service_update: 'services',
29098
+ handbook_update: 'handbook',
29099
+ system_announcement: 'system',
29100
+ system_welcome: 'system',
29101
+ invite_received: 'system',
29102
+ family_access: 'system',
29103
+ };
29017
29104
  class NotificationService {
29018
29105
  notifications = signal(SAMPLE_NOTIFICATIONS, ...(ngDevMode ? [{ debugName: "notifications" }] : []));
29019
29106
  unreadCount = computed(() => this.notifications().filter(n => !n.read).length, ...(ngDevMode ? [{ debugName: "unreadCount" }] : []));
29107
+ /**
29108
+ * Push notification delivery preferences per category.
29109
+ * Controls which types of push notifications the device receives —
29110
+ * does NOT filter the in-app notification list.
29111
+ */
29112
+ disabledPushCategories = signal(new Set(), ...(ngDevMode ? [{ debugName: "disabledPushCategories" }] : []));
29113
+ isPushEnabled(category) {
29114
+ return !this.disabledPushCategories().has(category);
29115
+ }
29116
+ setPushEnabled(category, enabled) {
29117
+ this.disabledPushCategories.update(set => {
29118
+ const next = new Set(set);
29119
+ if (enabled) {
29120
+ next.delete(category);
29121
+ }
29122
+ else {
29123
+ next.add(category);
29124
+ }
29125
+ return next;
29126
+ });
29127
+ }
29020
29128
  /**
29021
29129
  * Add a new notification to the top of the list.
29022
29130
  * Intended for downstream push integration — call this when a
@@ -30544,6 +30652,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
30544
30652
  }]
30545
30653
  }], ctorParameters: () => [{ type: i1.ModalController }] });
30546
30654
 
30655
+ class DsMobileToggleComponent {
30656
+ checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
30657
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
30658
+ changed = output();
30659
+ handleClick(event) {
30660
+ event.stopPropagation();
30661
+ this.toggle();
30662
+ }
30663
+ toggle() {
30664
+ if (this.disabled())
30665
+ return;
30666
+ const next = !this.checked();
30667
+ this.checked.set(next);
30668
+ this.changed.emit(next);
30669
+ }
30670
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30671
+ 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: `
30672
+ <div class="track" [class.active]="checked()">
30673
+ <div class="knob"></div>
30674
+ </div>
30675
+ `, 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"] });
30676
+ }
30677
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileToggleComponent, decorators: [{
30678
+ type: Component,
30679
+ args: [{ selector: 'ds-mobile-toggle', standalone: true, host: {
30680
+ '(click)': 'handleClick($event)',
30681
+ '[class.disabled]': 'disabled()',
30682
+ '[attr.role]': '"switch"',
30683
+ '[attr.aria-checked]': 'checked()',
30684
+ '[attr.aria-disabled]': 'disabled() || null',
30685
+ '[attr.tabindex]': 'disabled() ? -1 : 0',
30686
+ '(keydown.enter)': 'toggle()',
30687
+ '(keydown.space)': '$event.preventDefault(); toggle()',
30688
+ }, template: `
30689
+ <div class="track" [class.active]="checked()">
30690
+ <div class="knob"></div>
30691
+ </div>
30692
+ `, 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"] }]
30693
+ }], 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"] }] } });
30694
+
30547
30695
  // Mobile Page Components
30548
30696
 
30549
30697
  class MobileCommunityPageComponent {
@@ -31102,7 +31250,7 @@ class MobileCommunityPageComponent {
31102
31250
  }
31103
31251
  </ds-mobile-section>
31104
31252
  </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"] }] });
31253
+ `, 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
31254
  }
31107
31255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileCommunityPageComponent, decorators: [{
31108
31256
  type: Component,
@@ -31682,7 +31830,7 @@ class MobileHandbookPageComponent {
31682
31830
  </div>
31683
31831
  </ds-mobile-section>
31684
31832
  </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"] }] });
31833
+ `, 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
31834
  }
31687
31835
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileHandbookPageComponent, decorators: [{
31688
31836
  type: Component,
@@ -32264,16 +32412,44 @@ class MobileHomePageComponent {
32264
32412
  // (hides tab bar + renders loading screen at the correct DOM level)
32265
32413
  pageLoading = inject(PageLoadingService);
32266
32414
  // 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
32415
+ recentPosts = computed(() => this.postsService
32416
+ .posts()
32417
+ .filter((post) => post.id !== 'post-4') // Exclude pinned post
32269
32418
  .slice(0, 3), ...(ngDevMode ? [{ debugName: "recentPosts" }] : []));
32270
32419
  inquiriesService = inject(InquiriesService);
32271
32420
  openInquiries = computed(() => this.inquiriesService.openInquiries().slice(0, 3), ...(ngDevMode ? [{ debugName: "openInquiries" }] : []));
32272
32421
  recentPeerMessages = computed(() => this.peerMessaging.conversations().slice(0, 3), ...(ngDevMode ? [{ debugName: "recentPeerMessages" }] : []));
32273
32422
  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>' },
32423
+ {
32424
+ id: 'v-1',
32425
+ name: 'CleanTeam ApS',
32426
+ category: 'Rengøring',
32427
+ description: 'Trappevask og vinduespolering',
32428
+ phone: '+45 70 20 30 40',
32429
+ logo: '/Assets/dummy-logos/cleanteam-logo.svg',
32430
+ thumbnail: '/Assets/Dummy-photos/clean-team.jpg',
32431
+ 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>',
32432
+ },
32433
+ {
32434
+ id: 'v-3',
32435
+ name: 'Blik Partner A/S',
32436
+ category: 'VVS',
32437
+ description: 'VVS-service og akut udkald',
32438
+ phone: '+45 33 44 55 66',
32439
+ thumbnail: '/Assets/Dummy-photos/plumbing.jpg',
32440
+ 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>',
32441
+ },
32442
+ {
32443
+ id: 'v-4',
32444
+ name: 'ElektroTek ApS',
32445
+ category: 'Elektriker',
32446
+ description: 'El-installationer og fejlsøgning',
32447
+ phone: '+45 23 45 67 89',
32448
+ logo: '/Assets/dummy-logos/electrician-logo.svg',
32449
+ thumbnail: '/Assets/Dummy-photos/electrician.jpg',
32450
+ heroImage: '/Assets/Dummy-photos/electrician.jpg',
32451
+ 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>',
32452
+ },
32277
32453
  ], ...(ngDevMode ? [{ debugName: "allVendors" }] : []));
32278
32454
  previewVendors = computed(() => this.allVendors().slice(0, 3), ...(ngDevMode ? [{ debugName: "previewVendors" }] : []));
32279
32455
  modalCtrl = inject(ModalController);
@@ -32329,11 +32505,11 @@ class MobileHomePageComponent {
32329
32505
  ...post,
32330
32506
  postId: post.id,
32331
32507
  avatarType: post.avatarType === 'icon' ? undefined : post.avatarType,
32332
- focusComment
32508
+ focusComment,
32333
32509
  };
32334
32510
  await this.postModal.open(postData, {
32335
32511
  currentUserName: 'Lars Mikkelsen',
32336
- currentUserInitials: this.userService.avatarInitials()
32512
+ currentUserInitials: this.userService.avatarInitials(),
32337
32513
  });
32338
32514
  }
32339
32515
  }
@@ -32421,7 +32597,7 @@ class MobileHomePageComponent {
32421
32597
  initialBreakpoint: 1,
32422
32598
  handle: true,
32423
32599
  backdropDismiss: true,
32424
- cssClass: 'auto-height'
32600
+ cssClass: 'auto-height',
32425
32601
  });
32426
32602
  const result = await sheet.onWillDismiss();
32427
32603
  if (result.role === 'select' && result.data) {
@@ -32432,7 +32608,7 @@ class MobileHomePageComponent {
32432
32608
  if (post) {
32433
32609
  this.postsService.updatePost(postId, {
32434
32610
  isLiked: !post.isLiked,
32435
- likeCount: post.isLiked ? post.likeCount - 1 : post.likeCount + 1
32611
+ likeCount: post.isLiked ? post.likeCount - 1 : post.likeCount + 1,
32436
32612
  });
32437
32613
  }
32438
32614
  break;
@@ -32452,6 +32628,7 @@ class MobileHomePageComponent {
32452
32628
  @if (!pageLoading.isCoveringScreen()) {
32453
32629
  <ds-mobile-page-main
32454
32630
  class="home-content"
32631
+ [showNotification]="true"
32455
32632
  [class.home-content--animating]="pageLoading.isRevealAnimation()"
32456
32633
  [firstEntry]="pageLoading.isRevealAnimation()"
32457
32634
  #pageComponent
@@ -32462,208 +32639,178 @@ class MobileHomePageComponent {
32462
32639
  [avatarType]="userService.avatarType()"
32463
32640
  (notificationClick)="handleNotificationClick()"
32464
32641
  (refresh)="handleRefresh($event)"
32642
+ >
32643
+ <!-- Offline indicator -->
32644
+ @if (pageComponent.isOffline()) {
32645
+ <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
32646
+ }
32647
+
32648
+ <!-- Property banner → beboere (prototype IA) -->
32649
+ <div
32650
+ header-content
32651
+ class="property-banner-nav"
32652
+ role="button"
32653
+ tabindex="0"
32654
+ (click)="navigateToTenants()"
32655
+ (keydown.enter)="navigateToTenants()"
32656
+ (keydown.space)="$event.preventDefault(); navigateToTenants()"
32657
+ aria-label="Se beboere på ejendommen"
32465
32658
  >
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>
32659
+ <ds-mobile-property-banner address="Toftegårds Allé 5A, 2. tv." photoUrl="/Assets/Dummy-photos/building.jpg" [tenantCount]="24"> </ds-mobile-property-banner>
32660
+ </div>
32492
32661
 
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>
32662
+ @if (familyAccessService.acceptedInviteContext(); as invite) {
32663
+ <ds-mobile-section [showBorder]="false" padding="20px 20px 0">
32664
+ <div class="welcome-toast">
32665
+ <div class="toast-icon">
32666
+ <ds-icon name="remixUserSmileLine" size="12px" />
32667
+ </div>
32668
+ <div class="welcome-toast-content">
32669
+ <p class="welcome-toast-heading">Du er nu familiemedlem!</p>
32670
+ <p class="welcome-toast-text">
32671
+ Tilknyttet <strong>{{ invite.propertyAddress }}</strong> via <strong>{{ invite.inviterName }}</strong>
32672
+ </p>
32673
+ </div>
32674
+ <button class="toast-dismiss" (click)="familyAccessService.clearAcceptedInviteContext()" aria-label="Luk">
32675
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
32676
+ <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
32677
+ </svg>
32678
+ </button>
32504
32679
  </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>
32680
+ </ds-mobile-section>
32681
+ }
32682
+
32683
+ <!-- Recent Community Posts Section (with content) -->
32684
+ <ds-mobile-section headline="Seneste opslag" linkText="Se alle" (linkClick)="navigateToCommunity()">
32685
+ <div class="posts-list">
32686
+ @for (post of recentPosts(); track post.id) {
32687
+ <ds-mobile-interactive-list-item-post
32688
+ [authorName]="post.authorName"
32689
+ [authorRole]="post.authorRole"
32690
+ [timestamp]="post.timestamp"
32691
+ [avatarType]="post.avatarType"
32692
+ [avatarSrc]="post.avatarSrc || ''"
32693
+ [avatarInitials]="post.avatarInitials || ''"
32694
+ [showBadge]="post.showBadge || false"
32695
+ [clickable]="true"
32696
+ [moreActions]="true"
32697
+ (postClick)="openPost(post.id)"
32698
+ (commentClick)="openPost(post.id, true)"
32699
+ (longPress)="handlePostLongPress(post.id)"
32700
+ >
32701
+ <post-content>
32702
+ @if (post.content) {
32703
+ <post-text>{{ post.content }}</post-text>
32704
+ }
32705
+ </post-content>
32706
+
32707
+ <post-actions>
32708
+ <action-like [count]="post.likeCount" [active]="post.isLiked" />
32709
+ <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
32710
+ </post-actions>
32711
+ </ds-mobile-interactive-list-item-post>
32712
+ }
32510
32713
  </div>
32511
32714
  </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
32715
 
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"
32716
+ <ds-mobile-section headline="Seneste beskeder" linkText="Se alle" (linkClick)="navigateToMessages()">
32717
+ <div class="messages-preview-list">
32718
+ @for (conv of recentPeerMessages(); track conv.id) {
32719
+ @if (isPeerGroupConversation(conv)) {
32720
+ <ds-mobile-interactive-list-item-message
32721
+ [senderName]="conv.title"
32722
+ [senderRole]="conv.memberIds.length + ' medlemmer'"
32723
+ [timestamp]="conv.timestamp"
32724
+ [message]="conv.lastMessage"
32725
+ [avatarInitials]="''"
32726
+ [avatarType]="'initials'"
32727
+ [groupStackMembers]="peerChat.resolveGroupMembers(conv)"
32728
+ [groupCustomAvatarUrl]="conv.customAvatarUrl ?? ''"
32729
+ groupStackExcludeParticipantId="me"
32730
+ [showAvatarBadge]="false"
32731
+ [unread]="conv.unread"
32732
+ [clickable]="true"
32733
+ (messageClick)="openPeerMessagePreview(conv)"
32734
+ >
32735
+ </ds-mobile-interactive-list-item-message>
32736
+ } @else {
32737
+ <ds-mobile-interactive-list-item-message
32738
+ [senderName]="conv.participant.name"
32739
+ [senderRole]="conv.participant.role ?? ''"
32740
+ [timestamp]="conv.timestamp"
32741
+ [message]="conv.lastMessage"
32742
+ [avatarInitials]="conv.participant.avatarInitials ?? ''"
32743
+ [avatarType]="conv.participant.avatarType ?? 'initials'"
32744
+ [showAvatarBadge]="false"
32745
+ [unread]="conv.unread"
32746
+ [clickable]="true"
32747
+ (messageClick)="openPeerMessagePreview(conv)"
32748
+ >
32749
+ </ds-mobile-interactive-list-item-message>
32750
+ }
32751
+ }
32752
+ </div>
32753
+ </ds-mobile-section>
32754
+
32755
+ <!-- Services preview -->
32756
+ @if (previewVendors().length > 0) {
32757
+ <ds-mobile-section headline="Services" linkText="Se alle" contentGap="0px" (linkClick)="navigateToServices()">
32758
+ @for (vendor of previewVendors(); track vendor.id) {
32759
+ <ds-mobile-interactive-list-item-service
32760
+ [title]="vendor.name"
32761
+ [description]="vendor.description || ''"
32762
+ [logo]="vendor.logo || ''"
32763
+ (serviceClick)="openVendorSheet(vendor)"
32764
+ />
32765
+ }
32766
+ </ds-mobile-section>
32767
+ }
32768
+
32769
+ <!-- Recent Community Posts Section (empty state) -->
32770
+ <ds-mobile-section>
32771
+ <div class="empty-state">
32772
+ <ds-mobile-illustration variant="post" alt="No posts" />
32773
+ <h3 class="empty-state-title">Ingen opslag endnu</h3>
32774
+ <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
32775
+
32776
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToCommunity()"> Gå til fællesområdet </ds-button>
32777
+ </div>
32778
+ </ds-mobile-section>
32779
+
32780
+ <!-- Open Inquiries Section (with content) -->
32781
+ <ds-mobile-section headline="Åbne henvendelser" linkText="Se alle" (linkClick)="navigateToInquiries()">
32782
+ <div class="inquiries-list">
32783
+ @for (inquiry of openInquiries(); track inquiry.id) {
32784
+ <ds-mobile-interactive-list-item-inquiry
32785
+ [title]="inquiry.title"
32786
+ [description]="inquiry.description"
32787
+ [status]="inquiry.status"
32788
+ [timestamp]="inquiry.timestamp"
32789
+ [iconName]="'remixTodoLine'"
32583
32790
  [clickable]="true"
32584
- (messageClick)="openPeerMessagePreview(conv)">
32585
- </ds-mobile-interactive-list-item-message>
32791
+ [showChevron]="false"
32792
+ [enableLongPress]="false"
32793
+ (inquiryClick)="openInquiryDetail(inquiry.id)"
32794
+ >
32795
+ </ds-mobile-interactive-list-item-inquiry>
32586
32796
  }
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
- }
32797
+ </div>
32606
32798
  </ds-mobile-section>
32607
- }
32608
32799
 
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()) -->
32800
+ <!-- Open Inquiries Section (empty state) -->
32801
+ <ds-mobile-section>
32802
+ <div class="empty-state">
32803
+ <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
32804
+ <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
32805
+ <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
32665
32806
 
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"] }] });
32807
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToInquiries()"> til henvendelser </ds-button>
32808
+ </div>
32809
+ </ds-mobile-section>
32810
+ </ds-mobile-page-main>
32811
+ }
32812
+ <!-- end @if (!isCoveringScreen()) -->
32813
+ `, 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
32814
  }
32668
32815
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileHomePageComponent, decorators: [{
32669
32816
  type: Component,
@@ -32683,7 +32830,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
32683
32830
  PostTextComponent,
32684
32831
  PostActionsComponent,
32685
32832
  ActionLikeComponent,
32686
- ActionCommentComponent
32833
+ ActionCommentComponent,
32687
32834
  ], template: `
32688
32835
  <!-- Full-screen loading state (first entry) — rendered by layout, not here -->
32689
32836
 
@@ -32693,6 +32840,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
32693
32840
  @if (!pageLoading.isCoveringScreen()) {
32694
32841
  <ds-mobile-page-main
32695
32842
  class="home-content"
32843
+ [showNotification]="true"
32696
32844
  [class.home-content--animating]="pageLoading.isRevealAnimation()"
32697
32845
  [firstEntry]="pageLoading.isRevealAnimation()"
32698
32846
  #pageComponent
@@ -32703,208 +32851,178 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
32703
32851
  [avatarType]="userService.avatarType()"
32704
32852
  (notificationClick)="handleNotificationClick()"
32705
32853
  (refresh)="handleRefresh($event)"
32854
+ >
32855
+ <!-- Offline indicator -->
32856
+ @if (pageComponent.isOffline()) {
32857
+ <ds-mobile-offline-banner offline-indicator title="Ingen internetforbindelse" message="Nogle funktioner kan være utilgængelige"> </ds-mobile-offline-banner>
32858
+ }
32859
+
32860
+ <!-- Property banner → beboere (prototype IA) -->
32861
+ <div
32862
+ header-content
32863
+ class="property-banner-nav"
32864
+ role="button"
32865
+ tabindex="0"
32866
+ (click)="navigateToTenants()"
32867
+ (keydown.enter)="navigateToTenants()"
32868
+ (keydown.space)="$event.preventDefault(); navigateToTenants()"
32869
+ aria-label="Se beboere på ejendommen"
32706
32870
  >
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>
32871
+ <ds-mobile-property-banner address="Toftegårds Allé 5A, 2. tv." photoUrl="/Assets/Dummy-photos/building.jpg" [tenantCount]="24"> </ds-mobile-property-banner>
32872
+ </div>
32733
32873
 
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>
32874
+ @if (familyAccessService.acceptedInviteContext(); as invite) {
32875
+ <ds-mobile-section [showBorder]="false" padding="20px 20px 0">
32876
+ <div class="welcome-toast">
32877
+ <div class="toast-icon">
32878
+ <ds-icon name="remixUserSmileLine" size="12px" />
32879
+ </div>
32880
+ <div class="welcome-toast-content">
32881
+ <p class="welcome-toast-heading">Du er nu familiemedlem!</p>
32882
+ <p class="welcome-toast-text">
32883
+ Tilknyttet <strong>{{ invite.propertyAddress }}</strong> via <strong>{{ invite.inviterName }}</strong>
32884
+ </p>
32885
+ </div>
32886
+ <button class="toast-dismiss" (click)="familyAccessService.clearAcceptedInviteContext()" aria-label="Luk">
32887
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
32888
+ <path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
32889
+ </svg>
32890
+ </button>
32745
32891
  </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>
32892
+ </ds-mobile-section>
32893
+ }
32894
+
32895
+ <!-- Recent Community Posts Section (with content) -->
32896
+ <ds-mobile-section headline="Seneste opslag" linkText="Se alle" (linkClick)="navigateToCommunity()">
32897
+ <div class="posts-list">
32898
+ @for (post of recentPosts(); track post.id) {
32899
+ <ds-mobile-interactive-list-item-post
32900
+ [authorName]="post.authorName"
32901
+ [authorRole]="post.authorRole"
32902
+ [timestamp]="post.timestamp"
32903
+ [avatarType]="post.avatarType"
32904
+ [avatarSrc]="post.avatarSrc || ''"
32905
+ [avatarInitials]="post.avatarInitials || ''"
32906
+ [showBadge]="post.showBadge || false"
32907
+ [clickable]="true"
32908
+ [moreActions]="true"
32909
+ (postClick)="openPost(post.id)"
32910
+ (commentClick)="openPost(post.id, true)"
32911
+ (longPress)="handlePostLongPress(post.id)"
32912
+ >
32913
+ <post-content>
32914
+ @if (post.content) {
32915
+ <post-text>{{ post.content }}</post-text>
32916
+ }
32917
+ </post-content>
32918
+
32919
+ <post-actions>
32920
+ <action-like [count]="post.likeCount" [active]="post.isLiked" />
32921
+ <action-comment [count]="post.commentCount" (commentClick)="openPost(post.id, true)" />
32922
+ </post-actions>
32923
+ </ds-mobile-interactive-list-item-post>
32924
+ }
32751
32925
  </div>
32752
32926
  </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
32927
 
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"
32928
+ <ds-mobile-section headline="Seneste beskeder" linkText="Se alle" (linkClick)="navigateToMessages()">
32929
+ <div class="messages-preview-list">
32930
+ @for (conv of recentPeerMessages(); track conv.id) {
32931
+ @if (isPeerGroupConversation(conv)) {
32932
+ <ds-mobile-interactive-list-item-message
32933
+ [senderName]="conv.title"
32934
+ [senderRole]="conv.memberIds.length + ' medlemmer'"
32935
+ [timestamp]="conv.timestamp"
32936
+ [message]="conv.lastMessage"
32937
+ [avatarInitials]="''"
32938
+ [avatarType]="'initials'"
32939
+ [groupStackMembers]="peerChat.resolveGroupMembers(conv)"
32940
+ [groupCustomAvatarUrl]="conv.customAvatarUrl ?? ''"
32941
+ groupStackExcludeParticipantId="me"
32942
+ [showAvatarBadge]="false"
32943
+ [unread]="conv.unread"
32944
+ [clickable]="true"
32945
+ (messageClick)="openPeerMessagePreview(conv)"
32946
+ >
32947
+ </ds-mobile-interactive-list-item-message>
32948
+ } @else {
32949
+ <ds-mobile-interactive-list-item-message
32950
+ [senderName]="conv.participant.name"
32951
+ [senderRole]="conv.participant.role ?? ''"
32952
+ [timestamp]="conv.timestamp"
32953
+ [message]="conv.lastMessage"
32954
+ [avatarInitials]="conv.participant.avatarInitials ?? ''"
32955
+ [avatarType]="conv.participant.avatarType ?? 'initials'"
32956
+ [showAvatarBadge]="false"
32957
+ [unread]="conv.unread"
32958
+ [clickable]="true"
32959
+ (messageClick)="openPeerMessagePreview(conv)"
32960
+ >
32961
+ </ds-mobile-interactive-list-item-message>
32962
+ }
32963
+ }
32964
+ </div>
32965
+ </ds-mobile-section>
32966
+
32967
+ <!-- Services preview -->
32968
+ @if (previewVendors().length > 0) {
32969
+ <ds-mobile-section headline="Services" linkText="Se alle" contentGap="0px" (linkClick)="navigateToServices()">
32970
+ @for (vendor of previewVendors(); track vendor.id) {
32971
+ <ds-mobile-interactive-list-item-service
32972
+ [title]="vendor.name"
32973
+ [description]="vendor.description || ''"
32974
+ [logo]="vendor.logo || ''"
32975
+ (serviceClick)="openVendorSheet(vendor)"
32976
+ />
32977
+ }
32978
+ </ds-mobile-section>
32979
+ }
32980
+
32981
+ <!-- Recent Community Posts Section (empty state) -->
32982
+ <ds-mobile-section>
32983
+ <div class="empty-state">
32984
+ <ds-mobile-illustration variant="post" alt="No posts" />
32985
+ <h3 class="empty-state-title">Ingen opslag endnu</h3>
32986
+ <p class="empty-state-description">Der er ingen opslag i fællesområdet i øjeblikket</p>
32987
+
32988
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToCommunity()"> Gå til fællesområdet </ds-button>
32989
+ </div>
32990
+ </ds-mobile-section>
32991
+
32992
+ <!-- Open Inquiries Section (with content) -->
32993
+ <ds-mobile-section headline="Åbne henvendelser" linkText="Se alle" (linkClick)="navigateToInquiries()">
32994
+ <div class="inquiries-list">
32995
+ @for (inquiry of openInquiries(); track inquiry.id) {
32996
+ <ds-mobile-interactive-list-item-inquiry
32997
+ [title]="inquiry.title"
32998
+ [description]="inquiry.description"
32999
+ [status]="inquiry.status"
33000
+ [timestamp]="inquiry.timestamp"
33001
+ [iconName]="'remixTodoLine'"
32824
33002
  [clickable]="true"
32825
- (messageClick)="openPeerMessagePreview(conv)">
32826
- </ds-mobile-interactive-list-item-message>
33003
+ [showChevron]="false"
33004
+ [enableLongPress]="false"
33005
+ (inquiryClick)="openInquiryDetail(inquiry.id)"
33006
+ >
33007
+ </ds-mobile-interactive-list-item-inquiry>
32827
33008
  }
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
- }
33009
+ </div>
32847
33010
  </ds-mobile-section>
32848
- }
32849
33011
 
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()) -->
33012
+ <!-- Open Inquiries Section (empty state) -->
33013
+ <ds-mobile-section>
33014
+ <div class="empty-state">
33015
+ <ds-mobile-illustration variant="inquiry" alt="No inquiries" />
33016
+ <h3 class="empty-state-title">Ingen åbne henvendelser</h3>
33017
+ <p class="empty-state-description">Du har ingen åbne henvendelser i øjeblikket</p>
32906
33018
 
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"] }]
33019
+ <ds-button variant="secondary" trailingIcon="remixArrowRightSLine" (click)="navigateToInquiries()"> til henvendelser </ds-button>
33020
+ </div>
33021
+ </ds-mobile-section>
33022
+ </ds-mobile-page-main>
33023
+ }
33024
+ <!-- end @if (!isCoveringScreen()) -->
33025
+ `, 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
33026
  }], 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
33027
  type: ViewChild,
32910
33028
  args: ['pageComponent']
@@ -33064,7 +33182,7 @@ class MobileInquiriesPageComponent {
33064
33182
  ariaLabel="Create new inquiry"
33065
33183
  (clicked)="createNewInquiry()">
33066
33184
  </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"] }] });
33185
+ `, 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
33186
  }
33069
33187
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileInquiriesPageComponent, decorators: [{
33070
33188
  type: Component,
@@ -34992,8 +35110,8 @@ class MobileTabsExampleComponent {
34992
35110
  },
34993
35111
  {
34994
35112
  action: 'settings',
34995
- title: 'Indstillinger',
34996
- icon: 'remixSettings3Line',
35113
+ title: 'Notifikationer',
35114
+ icon: 'remixNotificationLine',
34997
35115
  destructive: false,
34998
35116
  },
34999
35117
  {
@@ -36005,7 +36123,7 @@ class MobileBookingPageComponent {
36005
36123
  ariaLabel="Opret facilitet"
36006
36124
  (clicked)="openFacilityCreationModal()">
36007
36125
  </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"] }] });
36126
+ `, 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
36127
  }
36010
36128
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileBookingPageComponent, decorators: [{
36011
36129
  type: Component,
@@ -37257,7 +37375,7 @@ class DsMobileInviteMemberSheetComponent {
37257
37375
  </div>
37258
37376
  </div>
37259
37377
  </div>
37260
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%}.sheet-content{overflow:hidden;width:100%;flex:1;background:var(--color-background-neutral-primary, #ffffff)}.view-container{display:grid;grid-template-columns:50% 50%;width:200%;transform:translate(0);transition:transform .3s cubic-bezier(.4,0,.2,1),height .3s cubic-bezier(.4,0,.2,1),opacity .15s ease-in-out;overflow:hidden}.view-container.show-step2{transform:translate(-50%)}.view{width:100%;display:flex;flex-direction:column}.view-container:not(.is-animating) .view:not(.active){height:0!important;overflow:hidden!important}.step-content{flex:1;overflow-y:auto;background:var(--color-background-neutral-primary, #ffffff)}.info-card{background:var(--color-background-neutral-secondary, #F5F6F8);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:10px}.info-row{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:var(--text-color-default-secondary, #545B66)}.info-row svg{flex-shrink:0;margin-top:1px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsMobileBottomSheetHeaderComponent, selector: "ds-mobile-bottom-sheet-header", inputs: ["title", "leftButtonLabel", "rightButtonLabel", "rightButtonDisabled", "rightButtonLoading", "showLeftButton", "showRightButton"], outputs: ["leftButtonClick", "rightButtonClick"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsTextInputComponent, selector: "ds-text-input", inputs: ["type", "label", "placeholder", "disabled", "readonly", "required", "hasError", "errorMessage", "autocomplete", "inputmode", "autoClearError", "validator"], outputs: ["valueChange", "blur", "focus", "errorCleared"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "imageUrl", "contactPerson", "phoneNumber", "layout", "clickable", "showChevron", "showEditButton"], outputs: ["contactClick", "editClick"] }] });
37378
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%}.sheet-content{overflow:hidden;width:100%;flex:1;background:var(--color-background-neutral-primary, #ffffff)}.view-container{display:grid;grid-template-columns:50% 50%;width:200%;transform:translate(0);transition:transform .3s cubic-bezier(.4,0,.2,1),height .3s cubic-bezier(.4,0,.2,1),opacity .15s ease-in-out;overflow:hidden}.view-container.show-step2{transform:translate(-50%)}.view{width:100%;display:flex;flex-direction:column}.view-container:not(.is-animating) .view:not(.active){height:0!important;overflow:hidden!important}.step-content{flex:1;overflow-y:auto;background:var(--color-background-neutral-primary, #ffffff)}.info-card{background:var(--color-background-neutral-secondary, #F5F6F8);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:10px}.info-row{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:var(--text-color-default-secondary, #545B66)}.info-row svg{flex-shrink:0;margin-top:1px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsMobileBottomSheetHeaderComponent, selector: "ds-mobile-bottom-sheet-header", inputs: ["title", "leftButtonLabel", "rightButtonLabel", "rightButtonDisabled", "rightButtonLoading", "showLeftButton", "showRightButton"], outputs: ["leftButtonClick", "rightButtonClick"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsTextInputComponent, selector: "ds-text-input", inputs: ["type", "label", "placeholder", "disabled", "readonly", "required", "hasError", "errorMessage", "autocomplete", "inputmode", "autoClearError", "validator"], outputs: ["valueChange", "blur", "focus", "errorCleared"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "imageUrl", "contactPerson", "phoneNumber", "email", "layout", "clickable", "showChevron", "showEditButton"], outputs: ["contactClick", "editClick"] }] });
37261
37379
  }
37262
37380
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileInviteMemberSheetComponent, decorators: [{
37263
37381
  type: Component,
@@ -37779,7 +37897,7 @@ class AcceptInvitePageComponent {
37779
37897
  </ds-mobile-section>
37780
37898
  }
37781
37899
  </ds-mobile-page-details>
37782
- `, isInline: true, styles: [".field-group{display:flex;flex-direction:column;gap:8px}.section-label{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;color:var(--text-color-default-primary);margin:0;letter-spacing:-.2px;line-height:1.4}.accept-cta{padding:8px 0 4px}.accept-cta ds-button{display:block;width:100%}.accept-cta ::ng-deep ds-button>button{width:100%;border-radius:9999px}.accept-hint{margin:10px 0 0;font-size:13px;color:var(--text-color-default-tertiary, #7C8694);text-align:center}.expired-banner{display:flex;align-items:center;gap:10px;padding:14px 16px;border-radius:12px;background:var(--color-background-warning-secondary, #FEF3C7)}.expired-banner__icon{width:20px;height:20px;flex-shrink:0;color:var(--color-warning-base, #D97706)}.expired-banner__text{font-family:Brockmann,sans-serif;font-size:14px;font-weight:500;line-height:1.4;color:var(--color-warning-content, #92400E);margin:0}.resend-cta{padding:8px 0 4px}.resend-cta ds-button{display:block;width:100%}.resend-cta ::ng-deep ds-button>button{width:100%;border-radius:9999px}.resend-hint{margin:10px 0 0;font-size:13px;color:var(--text-color-default-tertiary, #7C8694);text-align:center}@keyframes slideDown{0%{transform:translateY(-8px);opacity:0}to{transform:translateY(0);opacity:1}}.success-notice{padding:14px 16px;border-radius:12px;background:var(--color-background-success-secondary, #DCFCE7);display:flex;align-items:center;gap:10px;font-family:Brockmann,sans-serif;font-size:14px;font-weight:500;color:var(--color-success-base, #158452);animation:slideDown .2s ease-out}.success-check{width:20px;height:20px;border-radius:50%;background:var(--color-success-base, #158452);display:flex;align-items:center;justify-content:center;flex-shrink: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: DsMobilePageDetailsComponent, selector: "ds-mobile-page-details", inputs: ["title", "editableTitle", "backRoute", "contentPadding", "tabs", "activeTab", "showRefresh", "scrollThreshold", "headerFadeDistance"], outputs: ["back", "tabChange", "refresh", "scroll", "titleClick"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "imageUrl", "contactPerson", "phoneNumber", "layout", "clickable", "showChevron", "showEditButton"], outputs: ["contactClick", "editClick"] }] });
37900
+ `, isInline: true, styles: [".field-group{display:flex;flex-direction:column;gap:8px}.section-label{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;color:var(--text-color-default-primary);margin:0;letter-spacing:-.2px;line-height:1.4}.accept-cta{padding:8px 0 4px}.accept-cta ds-button{display:block;width:100%}.accept-cta ::ng-deep ds-button>button{width:100%;border-radius:9999px}.accept-hint{margin:10px 0 0;font-size:13px;color:var(--text-color-default-tertiary, #7C8694);text-align:center}.expired-banner{display:flex;align-items:center;gap:10px;padding:14px 16px;border-radius:12px;background:var(--color-background-warning-secondary, #FEF3C7)}.expired-banner__icon{width:20px;height:20px;flex-shrink:0;color:var(--color-warning-base, #D97706)}.expired-banner__text{font-family:Brockmann,sans-serif;font-size:14px;font-weight:500;line-height:1.4;color:var(--color-warning-content, #92400E);margin:0}.resend-cta{padding:8px 0 4px}.resend-cta ds-button{display:block;width:100%}.resend-cta ::ng-deep ds-button>button{width:100%;border-radius:9999px}.resend-hint{margin:10px 0 0;font-size:13px;color:var(--text-color-default-tertiary, #7C8694);text-align:center}@keyframes slideDown{0%{transform:translateY(-8px);opacity:0}to{transform:translateY(0);opacity:1}}.success-notice{padding:14px 16px;border-radius:12px;background:var(--color-background-success-secondary, #DCFCE7);display:flex;align-items:center;gap:10px;font-family:Brockmann,sans-serif;font-size:14px;font-weight:500;color:var(--color-success-base, #158452);animation:slideDown .2s ease-out}.success-check{width:20px;height:20px;border-radius:50%;background:var(--color-success-base, #158452);display:flex;align-items:center;justify-content:center;flex-shrink: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: DsMobilePageDetailsComponent, selector: "ds-mobile-page-details", inputs: ["title", "editableTitle", "backRoute", "contentPadding", "tabs", "activeTab", "showRefresh", "scrollThreshold", "headerFadeDistance"], outputs: ["back", "tabChange", "refresh", "scroll", "titleClick"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "paddingDesktop", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileCardInlineContactComponent, selector: "ds-mobile-card-inline-contact", inputs: ["name", "initials", "imageUrl", "contactPerson", "phoneNumber", "email", "layout", "clickable", "showChevron", "showEditButton"], outputs: ["contactClick", "editClick"] }] });
37783
37901
  }
37784
37902
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AcceptInvitePageComponent, decorators: [{
37785
37903
  type: Component,
@@ -38013,7 +38131,7 @@ class TenantChatPageComponent {
38013
38131
  ariaLabel="Vælg beboer at skrive med"
38014
38132
  (clicked)="goToTenants()">
38015
38133
  </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"] }] });
38134
+ `, 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
38135
  }
38018
38136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: TenantChatPageComponent, decorators: [{
38019
38137
  type: Component,
@@ -38270,7 +38388,7 @@ class ServicesPageComponent {
38270
38388
  </ds-mobile-section>
38271
38389
  }
38272
38390
  </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"] }] });
38391
+ `, 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
38392
  }
38275
38393
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ServicesPageComponent, decorators: [{
38276
38394
  type: Component,
@@ -38325,6 +38443,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
38325
38443
  args: ['pageComponent']
38326
38444
  }] } });
38327
38445
 
38446
+ const PREFS = [
38447
+ { key: 'messages', label: 'Beskeder', description: 'Nye beskeder fra beboere og administration' },
38448
+ { key: 'bookings', label: 'Bookinger', description: 'Bekræftelser, aflysninger og påmindelser' },
38449
+ { key: 'community', label: 'Fællesskab', description: 'Opslag, kommentarer og omtaler' },
38450
+ { key: 'inquiries', label: 'Henvendelser', description: 'Opdateringer på dine henvendelser' },
38451
+ { key: 'services', label: 'Service', description: 'Opdateringer fra serviceleverandører' },
38452
+ { key: 'handbook', label: 'Håndbog', description: 'Ændringer i beboerhåndbogen' },
38453
+ { key: 'system', label: 'System', description: 'Meddelelser, invitationer og familieadgang' },
38454
+ ];
38455
+ class SettingsModalComponent {
38456
+ notificationService = inject(NotificationService);
38457
+ prefs = PREFS;
38458
+ enabledSignals = new Map(PREFS.map(p => [p.key, computed(() => this.notificationService.isPushEnabled(p.key))]));
38459
+ isEnabled(key) {
38460
+ return this.enabledSignals.get(key);
38461
+ }
38462
+ toggle(key) {
38463
+ const current = this.notificationService.isPushEnabled(key);
38464
+ this.notificationService.setPushEnabled(key, !current);
38465
+ Haptics.impact({ style: ImpactStyle.Light }).catch(() => {
38466
+ if ('vibrate' in navigator)
38467
+ navigator.vibrate(10);
38468
+ });
38469
+ }
38470
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
38471
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: SettingsModalComponent, isStandalone: true, selector: "app-settings-modal", ngImport: i0, template: `
38472
+ <ds-mobile-modal-base headerTitle="Notifikationer" [showHeader]="true">
38473
+
38474
+ <div class="settings-content">
38475
+ @for (pref of prefs; track pref.key; let isFirst = $first; let isLast = $last) {
38476
+ <ds-mobile-list-item
38477
+ [showDivider]="!isLast"
38478
+ [flushTop]="isFirst"
38479
+ [interactive]="true"
38480
+ [enableLongPress]="false"
38481
+ [moreActions]="false"
38482
+ [title]="pref.label"
38483
+ [subtitle]="pref.description"
38484
+ (itemClick)="toggle(pref.key)"
38485
+ >
38486
+ <ds-mobile-toggle
38487
+ content-trailing
38488
+ [checked]="isEnabled(pref.key)()"
38489
+ (changed)="toggle(pref.key)"
38490
+ />
38491
+ </ds-mobile-list-item>
38492
+ }
38493
+ </div>
38494
+
38495
+ </ds-mobile-modal-base>
38496
+ `, 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"] }] });
38497
+ }
38498
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalComponent, decorators: [{
38499
+ type: Component,
38500
+ args: [{ selector: 'app-settings-modal', standalone: true, imports: [
38501
+ DsMobileModalBaseComponent,
38502
+ DsMobileListItemComponent,
38503
+ DsMobileToggleComponent,
38504
+ ], template: `
38505
+ <ds-mobile-modal-base headerTitle="Notifikationer" [showHeader]="true">
38506
+
38507
+ <div class="settings-content">
38508
+ @for (pref of prefs; track pref.key; let isFirst = $first; let isLast = $last) {
38509
+ <ds-mobile-list-item
38510
+ [showDivider]="!isLast"
38511
+ [flushTop]="isFirst"
38512
+ [interactive]="true"
38513
+ [enableLongPress]="false"
38514
+ [moreActions]="false"
38515
+ [title]="pref.label"
38516
+ [subtitle]="pref.description"
38517
+ (itemClick)="toggle(pref.key)"
38518
+ >
38519
+ <ds-mobile-toggle
38520
+ content-trailing
38521
+ [checked]="isEnabled(pref.key)()"
38522
+ (changed)="toggle(pref.key)"
38523
+ />
38524
+ </ds-mobile-list-item>
38525
+ }
38526
+ </div>
38527
+
38528
+ </ds-mobile-modal-base>
38529
+ `, styles: [".settings-content{padding:20px}\n"] }]
38530
+ }] });
38531
+
38532
+ class SettingsModalService {
38533
+ modalController;
38534
+ constructor(modalController) {
38535
+ this.modalController = modalController;
38536
+ }
38537
+ async open() {
38538
+ const modal = await this.modalController.create({
38539
+ component: SettingsModalComponent,
38540
+ cssClass: 'ds-modal-base',
38541
+ mode: 'ios',
38542
+ presentingElement: document.querySelector('ion-router-outlet') || undefined,
38543
+ backdropDismiss: true,
38544
+ showBackdrop: true,
38545
+ animated: true,
38546
+ });
38547
+ await modal.present();
38548
+ }
38549
+ async close(data) {
38550
+ return this.modalController.dismiss(data);
38551
+ }
38552
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
38553
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalService, providedIn: 'root' });
38554
+ }
38555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SettingsModalService, decorators: [{
38556
+ type: Injectable,
38557
+ args: [{
38558
+ providedIn: 'root',
38559
+ }]
38560
+ }], ctorParameters: () => [{ type: i1.ModalController }] });
38561
+
38328
38562
  /**
38329
38563
  * Services Barrel File
38330
38564
  *
@@ -38348,5 +38582,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
38348
38582
  * Generated bundle index. Do not edit.
38349
38583
  */
38350
38584
 
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 };
38585
+ 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
38586
  //# sourceMappingURL=propbinder-mobile-design.mjs.map