@propbinder/mobile-design 0.2.9 → 0.2.11

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.
@@ -755,16 +755,16 @@ class DsMobileListItemComponent {
755
755
  if (isPlatformBrowser(this.platformId)) {
756
756
  // Show button on tablet breakpoint and above (768px+)
757
757
  const isDesktopViewport = window.innerWidth >= 768;
758
- console.log('[ListItem] Desktop detection:', {
759
- innerWidth: window.innerWidth,
760
- isDesktopViewport
761
- });
758
+ // console.log('[ListItem] Desktop detection:', {
759
+ // innerWidth: window.innerWidth,
760
+ // isDesktopViewport
761
+ // });
762
762
  this.isDesktop.set(isDesktopViewport);
763
763
  // Listen for window resize to update detection
764
764
  window.addEventListener('resize', () => {
765
765
  const newIsDesktop = window.innerWidth >= 768;
766
766
  if (newIsDesktop !== this.isDesktop()) {
767
- console.log('[ListItem] Viewport changed, updating desktop detection:', newIsDesktop);
767
+ // console.log('[ListItem] Viewport changed, updating desktop detection:', newIsDesktop);
768
768
  this.isDesktop.set(newIsDesktop);
769
769
  }
770
770
  });
@@ -870,15 +870,15 @@ class DsMobileListItemComponent {
870
870
  * Handle click events
871
871
  */
872
872
  handleClick(event) {
873
- console.log('[ListItem] Click event fired', {
874
- interactive: this.interactive(),
875
- disabled: this.disabled(),
876
- loading: this.loading(),
877
- longPressTriggered: this.longPressTriggered,
878
- target: event.target
879
- });
873
+ // console.log('[ListItem] Click event fired', {
874
+ // interactive: this.interactive(),
875
+ // disabled: this.disabled(),
876
+ // loading: this.loading(),
877
+ // longPressTriggered: this.longPressTriggered,
878
+ // target: event.target
879
+ // });
880
880
  if (!this.interactive() || this.disabled() || this.loading()) {
881
- console.log('[ListItem] Click ignored - not interactive or disabled/loading');
881
+ // console.log('[ListItem] Click ignored - not interactive or disabled/loading');
882
882
  return;
883
883
  }
884
884
  // Don't emit click if it came from an interactive child element
@@ -887,15 +887,15 @@ class DsMobileListItemComponent {
887
887
  const closestInteractive = target.closest('button, a, input, select, textarea, [role="button"]');
888
888
  // Check if the interactive element is a child, not the host itself
889
889
  if (closestInteractive && closestInteractive !== event.currentTarget) {
890
- console.log('[ListItem] Click ignored - came from interactive child:', closestInteractive);
890
+ // console.log('[ListItem] Click ignored - came from interactive child:', closestInteractive);
891
891
  return;
892
892
  }
893
893
  if (!this.longPressTriggered) {
894
- console.log('[ListItem] Emitting itemClick');
894
+ // console.log('[ListItem] Emitting itemClick');
895
895
  this.itemClick.emit();
896
896
  }
897
897
  else {
898
- console.log('[ListItem] Click ignored - long press was triggered');
898
+ // console.log('[ListItem] Click ignored - long press was triggered');
899
899
  }
900
900
  this.longPressTriggered = false;
901
901
  }
@@ -926,7 +926,7 @@ class DsMobileListItemComponent {
926
926
  * Emits moreButtonClick for parent components to handle
927
927
  */
928
928
  handleMoreButtonClick(event) {
929
- console.log('[ListItem] Desktop more button clicked');
929
+ // console.log('[ListItem] Desktop more button clicked');
930
930
  // Stop propagation to prevent triggering itemClick
931
931
  event.stopPropagation();
932
932
  event.preventDefault();
@@ -939,42 +939,43 @@ class DsMobileListItemComponent {
939
939
  <div class="content-leading">
940
940
  <ng-content select="[content-leading]" />
941
941
  </div>
942
-
942
+
943
943
  <div class="content-main">
944
944
  @if (title()) {
945
- <h3 class="structured-title">{{ title() }}</h3>
945
+ <h3 class="structured-title">{{ title() }}</h3>
946
+ } @if (subtitle()) {
947
+ <p class="structured-subtitle">{{ subtitle() }}</p>
946
948
  }
947
- @if (subtitle()) {
948
- <p class="structured-subtitle">{{ subtitle() }}</p>
949
- }
950
-
949
+
951
950
  <ng-content select="[content-main]" />
952
951
  <ng-content />
953
952
  </div>
954
-
953
+
955
954
  <div class="content-trailing">
956
- @if (interactive() && enableLongPress() && showDesktopMoreButton() && isDesktop()) {
957
- <ds-icon-button
958
- class="desktop-more-button"
959
- icon="remixMoreFill"
960
- variant="secondary"
961
- size="sm"
962
- (clicked)="handleMoreButtonClick($event)"
963
- aria-label="More options">
964
- </ds-icon-button>
955
+ @if (interactive() && enableLongPress() && showDesktopMoreButton() &&
956
+ isDesktop()) {
957
+ <ds-icon-button
958
+ class="desktop-more-button"
959
+ icon="remixMoreFill"
960
+ variant="secondary"
961
+ size="sm"
962
+ (clicked)="handleMoreButtonClick($event)"
963
+ aria-label="More options"
964
+ >
965
+ </ds-icon-button>
965
966
  }
966
967
  <ng-content select="[content-trailing]" />
967
968
  </div>
968
969
  </div>
969
- `, 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: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}.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:var(--color-background-neutral-primary, #ffffff);border-radius:16px;z-index:-1;pointer-events:none}:host(.interactive){cursor:pointer}@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}\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"] }] });
970
+ `, 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: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}.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:var(--color-background-neutral-primary, #ffffff);border-radius:16px;z-index:-1;pointer-events:none}:host(.interactive){cursor:pointer}@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}\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"] }] });
970
971
  }
971
972
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileListItemComponent, decorators: [{
972
973
  type: Component,
973
974
  args: [{ selector: 'ds-mobile-list-item', standalone: true, imports: [CommonModule, DsIconButtonComponent], hostDirectives: [
974
975
  {
975
976
  directive: DsMobileLongPressDirective,
976
- outputs: ['longPress']
977
- }
977
+ outputs: ['longPress'],
978
+ },
978
979
  ], host: {
979
980
  '[class.interactive]': 'interactive() && !disabled()',
980
981
  '[class.disabled]': 'disabled()',
@@ -993,40 +994,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
993
994
  '(click)': 'handleClick($event)',
994
995
  '(keydown.enter)': 'handleKeyDown($event)',
995
996
  '(keydown.space)': 'handleKeyDown($event)',
996
- '(longPress)': 'handleLongPress()'
997
+ '(longPress)': 'handleLongPress()',
997
998
  }, template: `
998
999
  <div class="list-item-inner">
999
1000
  <div class="content-leading">
1000
1001
  <ng-content select="[content-leading]" />
1001
1002
  </div>
1002
-
1003
+
1003
1004
  <div class="content-main">
1004
1005
  @if (title()) {
1005
- <h3 class="structured-title">{{ title() }}</h3>
1006
- }
1007
- @if (subtitle()) {
1008
- <p class="structured-subtitle">{{ subtitle() }}</p>
1006
+ <h3 class="structured-title">{{ title() }}</h3>
1007
+ } @if (subtitle()) {
1008
+ <p class="structured-subtitle">{{ subtitle() }}</p>
1009
1009
  }
1010
-
1010
+
1011
1011
  <ng-content select="[content-main]" />
1012
1012
  <ng-content />
1013
1013
  </div>
1014
-
1014
+
1015
1015
  <div class="content-trailing">
1016
- @if (interactive() && enableLongPress() && showDesktopMoreButton() && isDesktop()) {
1017
- <ds-icon-button
1018
- class="desktop-more-button"
1019
- icon="remixMoreFill"
1020
- variant="secondary"
1021
- size="sm"
1022
- (clicked)="handleMoreButtonClick($event)"
1023
- aria-label="More options">
1024
- </ds-icon-button>
1016
+ @if (interactive() && enableLongPress() && showDesktopMoreButton() &&
1017
+ isDesktop()) {
1018
+ <ds-icon-button
1019
+ class="desktop-more-button"
1020
+ icon="remixMoreFill"
1021
+ variant="secondary"
1022
+ size="sm"
1023
+ (clicked)="handleMoreButtonClick($event)"
1024
+ aria-label="More options"
1025
+ >
1026
+ </ds-icon-button>
1025
1027
  }
1026
1028
  <ng-content select="[content-trailing]" />
1027
1029
  </div>
1028
1030
  </div>
1029
- `, 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: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}.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:var(--color-background-neutral-primary, #ffffff);border-radius:16px;z-index:-1;pointer-events:none}:host(.interactive){cursor:pointer}@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}\n"] }]
1031
+ `, 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: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}.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:var(--color-background-neutral-primary, #ffffff);border-radius:16px;z-index:-1;pointer-events:none}:host(.interactive){cursor:pointer}@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}\n"] }]
1030
1032
  }], 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 }] }], 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 }] }], 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"] }] } });
1031
1033
 
1032
1034
  /**
@@ -3028,7 +3030,7 @@ class WhitelabelDemoModalService {
3028
3030
  */
3029
3031
  async open() {
3030
3032
  try {
3031
- console.log('[WhitelabelDemoModal] Opening...');
3033
+ // console.log('[WhitelabelDemoModal] Opening...');
3032
3034
  const modal = await this.modalController.create({
3033
3035
  component: WhitelabelDemoModalComponent,
3034
3036
  cssClass: 'ds-whitelabel-demo-modal',
@@ -3040,14 +3042,14 @@ class WhitelabelDemoModalService {
3040
3042
  keyboardClose: true,
3041
3043
  // Control the presenting element animation
3042
3044
  enterAnimation: undefined, // Use default
3043
- leaveAnimation: undefined // Use default
3045
+ leaveAnimation: undefined, // Use default
3044
3046
  });
3045
- console.log('[WhitelabelDemoModal] Modal created, presenting...');
3047
+ // console.log('[WhitelabelDemoModal] Modal created, presenting...');
3046
3048
  await modal.present();
3047
- console.log('[WhitelabelDemoModal] Modal presented');
3049
+ // console.log('[WhitelabelDemoModal] Modal presented');
3048
3050
  }
3049
3051
  catch (error) {
3050
- console.error('[WhitelabelDemoModal] Error opening modal:', error);
3052
+ // console.error('[WhitelabelDemoModal] Error opening modal:', error);
3051
3053
  throw error;
3052
3054
  }
3053
3055
  }
@@ -3074,7 +3076,7 @@ class WhitelabelDemoModalService {
3074
3076
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: WhitelabelDemoModalService, decorators: [{
3075
3077
  type: Injectable,
3076
3078
  args: [{
3077
- providedIn: 'root'
3079
+ providedIn: 'root',
3078
3080
  }]
3079
3081
  }], ctorParameters: () => [{ type: i1.ModalController }] });
3080
3082
 
@@ -7578,19 +7580,19 @@ class DsMobileTabBarComponent {
7578
7580
  this.setupBreakpointDetection();
7579
7581
  // Debug: Log initial state
7580
7582
  setTimeout(() => {
7581
- console.log('[ds-mobile-tab-bar] Initial state:', {
7582
- isDesktop: this.isDesktop(),
7583
- windowWidth: window.innerWidth,
7584
- mediaQuery: this.mediaQuery?.matches,
7585
- userAgent: navigator.userAgent
7586
- });
7583
+ // console.log('[ds-mobile-tab-bar] Initial state:', {
7584
+ // isDesktop: this.isDesktop(),
7585
+ // windowWidth: window.innerWidth,
7586
+ // mediaQuery: this.mediaQuery?.matches,
7587
+ // userAgent: navigator.userAgent
7588
+ // });
7587
7589
  }, 100);
7588
7590
  // Watch for isDesktop changes and update slot reactively
7589
7591
  // effect() must be called in constructor (injection context)
7590
7592
  effect(() => {
7591
7593
  // This effect runs whenever isDesktop() changes
7592
7594
  const _ = this.isDesktop(); // Read the signal to create dependency
7593
- console.log('[ds-mobile-tab-bar] effect() triggered, isDesktop:', this.isDesktop());
7595
+ // console.log('[ds-mobile-tab-bar] effect() triggered, isDesktop:', this.isDesktop());
7594
7596
  if (this.elementRef.nativeElement) {
7595
7597
  // Use setTimeout to ensure DOM is ready
7596
7598
  setTimeout(() => this.updateSlot(), 0);
@@ -7601,7 +7603,7 @@ class DsMobileTabBarComponent {
7601
7603
  // Listen to router events to detect active tab from URL
7602
7604
  if (this.router) {
7603
7605
  this.routerSubscription = this.router.events
7604
- .pipe(filter(event => event instanceof NavigationEnd))
7606
+ .pipe(filter((event) => event instanceof NavigationEnd))
7605
7607
  .subscribe((event) => {
7606
7608
  const url = event.urlAfterRedirects || event.url;
7607
7609
  // Extract the route segment (e.g., /tab-bar-test/home -> home)
@@ -7609,7 +7611,7 @@ class DsMobileTabBarComponent {
7609
7611
  const lastSegment = segments[segments.length - 1];
7610
7612
  // Find matching tab by route
7611
7613
  if (this.tabs && lastSegment) {
7612
- const matchingTab = this.tabs.find(tab => tab.route === lastSegment);
7614
+ const matchingTab = this.tabs.find((tab) => tab.route === lastSegment);
7613
7615
  if (matchingTab) {
7614
7616
  this.activeTab.set(matchingTab.route);
7615
7617
  }
@@ -7641,14 +7643,14 @@ class DsMobileTabBarComponent {
7641
7643
  const hostSlotValue = this.isDesktop() ? 'top' : 'bottom';
7642
7644
  const currentHostSlot = hostElement.getAttribute('slot');
7643
7645
  if (currentHostSlot !== hostSlotValue) {
7644
- console.log('[ds-mobile-tab-bar] updateSlot: Setting HOST slot from', currentHostSlot, 'to', hostSlotValue);
7646
+ // console.log('[ds-mobile-tab-bar] updateSlot: Setting HOST slot from', currentHostSlot, 'to', hostSlotValue);
7645
7647
  hostElement.setAttribute('slot', hostSlotValue);
7646
7648
  hostElement.slot = hostSlotValue;
7647
7649
  }
7648
7650
  // Get the ion-tab-bar element
7649
7651
  const tabBar = this.elementRef.nativeElement.querySelector('ion-tab-bar');
7650
7652
  if (!tabBar) {
7651
- console.log('[ds-mobile-tab-bar] updateSlot: tabBar not found, retrying...');
7653
+ // console.log('[ds-mobile-tab-bar] updateSlot: tabBar not found, retrying...');
7652
7654
  // Retry if element not found yet
7653
7655
  setTimeout(() => this.updateSlot(), 50);
7654
7656
  return;
@@ -7657,26 +7659,26 @@ class DsMobileTabBarComponent {
7657
7659
  const currentSlot = tabBar.getAttribute('slot');
7658
7660
  const currentSlotProperty = tabBar.slot;
7659
7661
  // Debug logging
7660
- console.log('[ds-mobile-tab-bar] updateSlot:', {
7661
- isDesktop: this.isDesktop(),
7662
- windowWidth: window.innerWidth,
7663
- slotValue,
7664
- currentSlotAttribute: currentSlot,
7665
- currentSlotProperty: currentSlotProperty,
7666
- tabBarElement: tabBar,
7667
- tabBarParent: tabBar.parentElement?.tagName,
7668
- tabBarInIonTabs: tabBar.closest('ion-tabs') !== null
7669
- });
7662
+ // console.log('[ds-mobile-tab-bar] updateSlot:', {
7663
+ // isDesktop: this.isDesktop(),
7664
+ // windowWidth: window.innerWidth,
7665
+ // slotValue,
7666
+ // currentSlotAttribute: currentSlot,
7667
+ // currentSlotProperty: currentSlotProperty,
7668
+ // tabBarElement: tabBar,
7669
+ // tabBarParent: tabBar.parentElement?.tagName,
7670
+ // tabBarInIonTabs: tabBar.closest('ion-tabs') !== null
7671
+ // });
7670
7672
  // Only update if different to avoid unnecessary DOM manipulation
7671
7673
  if (currentSlot !== slotValue || currentSlotProperty !== slotValue) {
7672
- console.log('[ds-mobile-tab-bar] updateSlot: Setting slot from', currentSlot, 'to', slotValue);
7674
+ // console.log('[ds-mobile-tab-bar] updateSlot: Setting slot from', currentSlot, 'to', slotValue);
7673
7675
  // Set both attribute and property to ensure it works
7674
7676
  tabBar.setAttribute('slot', slotValue);
7675
7677
  tabBar.slot = slotValue;
7676
7678
  // Also try setting it on the parent ion-tabs
7677
7679
  const parentIonTabs = tabBar.closest('ion-tabs');
7678
7680
  if (parentIonTabs) {
7679
- console.log('[ds-mobile-tab-bar] updateSlot: Found parent ion-tabs');
7681
+ // console.log('[ds-mobile-tab-bar] updateSlot: Found parent ion-tabs');
7680
7682
  // Force Ionic to recognize the slot change
7681
7683
  parentIonTabs.forceUpdate?.();
7682
7684
  }
@@ -7685,143 +7687,150 @@ class DsMobileTabBarComponent {
7685
7687
  // Verify it was set
7686
7688
  const verifySlot = tabBar.getAttribute('slot');
7687
7689
  const verifySlotProperty = tabBar.slot;
7688
- console.log('[ds-mobile-tab-bar] updateSlot: After update, slot attribute:', verifySlot, 'slot property:', verifySlotProperty);
7690
+ // console.log('[ds-mobile-tab-bar] updateSlot: After update, slot attribute:', verifySlot, 'slot property:', verifySlotProperty);
7689
7691
  // Check computed styles
7690
7692
  const computedStyle = window.getComputedStyle(tabBar);
7691
- const parentComputedStyle = tabBar.parentElement ? window.getComputedStyle(tabBar.parentElement) : null;
7693
+ const parentComputedStyle = tabBar.parentElement
7694
+ ? window.getComputedStyle(tabBar.parentElement)
7695
+ : null;
7692
7696
  const ionTabsForStyles = tabBar.closest('ion-tabs');
7693
- const ionTabsComputedStyle = ionTabsForStyles ? window.getComputedStyle(ionTabsForStyles) : null;
7694
- console.log('[ds-mobile-tab-bar] updateSlot: Computed styles:', {
7695
- tabBar: {
7696
- position: computedStyle.position,
7697
- top: computedStyle.top,
7698
- bottom: computedStyle.bottom,
7699
- order: computedStyle.order,
7700
- display: computedStyle.display,
7701
- zIndex: computedStyle.zIndex,
7702
- transform: computedStyle.transform
7703
- },
7704
- parent: parentComputedStyle ? {
7705
- display: parentComputedStyle.display,
7706
- flexDirection: parentComputedStyle.flexDirection,
7707
- gridTemplateRows: parentComputedStyle.gridTemplateRows
7708
- } : null,
7709
- ionTabs: ionTabsComputedStyle ? {
7710
- display: ionTabsComputedStyle.display,
7711
- flexDirection: ionTabsComputedStyle.flexDirection,
7712
- gridTemplateRows: ionTabsComputedStyle.gridTemplateRows,
7713
- position: ionTabsComputedStyle.position
7714
- } : null,
7715
- tabBarRect: tabBar.getBoundingClientRect(),
7716
- windowHeight: window.innerHeight
7717
- });
7697
+ const ionTabsComputedStyle = ionTabsForStyles
7698
+ ? window.getComputedStyle(ionTabsForStyles)
7699
+ : null;
7700
+ // console.log('[ds-mobile-tab-bar] updateSlot: Computed styles:', {
7701
+ // tabBar: {
7702
+ // position: computedStyle.position,
7703
+ // top: computedStyle.top,
7704
+ // bottom: computedStyle.bottom,
7705
+ // order: computedStyle.order,
7706
+ // display: computedStyle.display,
7707
+ // zIndex: computedStyle.zIndex,
7708
+ // transform: computedStyle.transform
7709
+ // },
7710
+ // parent: parentComputedStyle ? {
7711
+ // display: parentComputedStyle.display,
7712
+ // flexDirection: parentComputedStyle.flexDirection,
7713
+ // gridTemplateRows: parentComputedStyle.gridTemplateRows
7714
+ // } : null,
7715
+ // ionTabs: ionTabsComputedStyle ? {
7716
+ // display: ionTabsComputedStyle.display,
7717
+ // flexDirection: ionTabsComputedStyle.flexDirection,
7718
+ // gridTemplateRows: ionTabsComputedStyle.gridTemplateRows,
7719
+ // position: ionTabsComputedStyle.position
7720
+ // } : null,
7721
+ // tabBarRect: tabBar.getBoundingClientRect(),
7722
+ // windowHeight: window.innerHeight
7723
+ // });
7718
7724
  }
7719
7725
  else {
7720
- console.log('[ds-mobile-tab-bar] updateSlot: Slot already correct, no update needed');
7726
+ // console.log('[ds-mobile-tab-bar] updateSlot: Slot already correct, no update needed');
7721
7727
  // Even if slot is correct, check computed styles to see why it's not at top
7722
7728
  const computedStyle = window.getComputedStyle(tabBar);
7723
7729
  const ionTabsForStyles = tabBar.closest('ion-tabs');
7724
- const ionTabsComputedStyle = ionTabsForStyles ? window.getComputedStyle(ionTabsForStyles) : null;
7730
+ const ionTabsComputedStyle = ionTabsForStyles
7731
+ ? window.getComputedStyle(ionTabsForStyles)
7732
+ : null;
7725
7733
  const tabBarRect = tabBar.getBoundingClientRect();
7726
7734
  // Log key values directly so they're always visible
7727
- console.log('[ds-mobile-tab-bar] KEY VALUES:');
7728
- console.log(' tabBar.position:', computedStyle.position);
7729
- console.log(' tabBar.top:', computedStyle.top);
7730
- console.log(' tabBar.bottom:', computedStyle.bottom);
7731
- console.log(' tabBar.order:', computedStyle.order);
7732
- console.log(' tabBar.display:', computedStyle.display);
7733
- console.log(' tabBarRect.top:', tabBarRect.top, 'px from top');
7734
- console.log(' tabBarRect.bottom:', tabBarRect.bottom, 'px from top');
7735
- console.log(' window.innerHeight:', window.innerHeight);
7735
+ // console.log('[ds-mobile-tab-bar] KEY VALUES:');
7736
+ // console.log(' tabBar.position:', computedStyle.position);
7737
+ // console.log(' tabBar.top:', computedStyle.top);
7738
+ // console.log(' tabBar.bottom:', computedStyle.bottom);
7739
+ // console.log(' tabBar.order:', computedStyle.order);
7740
+ // console.log(' tabBar.display:', computedStyle.display);
7741
+ // console.log(' tabBarRect.top:', tabBarRect.top, 'px from top');
7742
+ // console.log(' tabBarRect.bottom:', tabBarRect.bottom, 'px from top');
7743
+ // console.log(' window.innerHeight:', window.innerHeight);
7736
7744
  if (ionTabsComputedStyle) {
7737
- console.log(' ionTabs.display:', ionTabsComputedStyle.display);
7738
- console.log(' ionTabs.flexDirection:', ionTabsComputedStyle.flexDirection);
7739
- console.log(' ionTabs.gridTemplateRows:', ionTabsComputedStyle.gridTemplateRows);
7745
+ // console.log(' ionTabs.display:', ionTabsComputedStyle.display);
7746
+ // console.log(' ionTabs.flexDirection:', ionTabsComputedStyle.flexDirection);
7747
+ // console.log(' ionTabs.gridTemplateRows:', ionTabsComputedStyle.gridTemplateRows);
7740
7748
  }
7741
7749
  if (ionTabsForStyles) {
7742
7750
  const children = Array.from(ionTabsForStyles.children);
7743
- console.log(' ionTabs children count:', children.length);
7751
+ // console.log(' ionTabs children count:', children.length);
7744
7752
  children.forEach((child, index) => {
7745
- console.log(` [${index}] ${child.tagName} slot="${child.getAttribute('slot')}" order="${window.getComputedStyle(child).order}"`);
7753
+ // console.log(` [${index}] ${child.tagName} slot="${child.getAttribute('slot')}" order="${window.getComputedStyle(child).order}"`);
7746
7754
  });
7747
7755
  }
7748
- console.log('[ds-mobile-tab-bar] updateSlot: Computed styles (slot correct but visually wrong):', {
7749
- tabBar: {
7750
- position: computedStyle.position,
7751
- top: computedStyle.top,
7752
- bottom: computedStyle.bottom,
7753
- order: computedStyle.order,
7754
- display: computedStyle.display,
7755
- zIndex: computedStyle.zIndex,
7756
- transform: computedStyle.transform,
7757
- marginTop: computedStyle.marginTop,
7758
- marginBottom: computedStyle.marginBottom,
7759
- width: computedStyle.width,
7760
- height: computedStyle.height
7761
- },
7762
- ionTabs: ionTabsComputedStyle ? {
7763
- display: ionTabsComputedStyle.display,
7764
- flexDirection: ionTabsComputedStyle.flexDirection,
7765
- gridTemplateRows: ionTabsComputedStyle.gridTemplateRows,
7766
- gridTemplateColumns: ionTabsComputedStyle.gridTemplateColumns,
7767
- position: ionTabsComputedStyle.position,
7768
- alignItems: ionTabsComputedStyle.alignItems,
7769
- justifyContent: ionTabsComputedStyle.justifyContent,
7770
- height: ionTabsComputedStyle.height,
7771
- minHeight: ionTabsComputedStyle.minHeight
7772
- } : null,
7773
- tabBarRect: {
7774
- top: tabBarRect.top,
7775
- bottom: tabBarRect.bottom,
7776
- height: tabBarRect.height,
7777
- y: tabBarRect.y,
7778
- left: tabBarRect.left,
7779
- right: tabBarRect.right,
7780
- width: tabBarRect.width
7781
- },
7782
- windowHeight: window.innerHeight,
7783
- distanceFromTop: tabBarRect.top,
7784
- distanceFromBottom: window.innerHeight - tabBarRect.bottom,
7785
- // Check if tab bar is actually in the DOM at the right position
7786
- tabBarParent: tabBar.parentElement?.tagName,
7787
- tabBarNextSibling: tabBar.nextElementSibling?.tagName,
7788
- tabBarPreviousSibling: tabBar.previousElementSibling?.tagName,
7789
- // Check all children of ion-tabs to see DOM order
7790
- ionTabsChildren: ionTabsForStyles ? Array.from(ionTabsForStyles.children).map((child) => ({
7791
- tagName: child.tagName,
7792
- slot: child.getAttribute('slot'),
7793
- order: window.getComputedStyle(child).order
7794
- })) : null
7795
- });
7756
+ // console.log('[ds-mobile-tab-bar] updateSlot: Computed styles (slot correct but visually wrong):', {
7757
+ // tabBar: {
7758
+ // position: computedStyle.position,
7759
+ // top: computedStyle.top,
7760
+ // bottom: computedStyle.bottom,
7761
+ // order: computedStyle.order,
7762
+ // display: computedStyle.display,
7763
+ // zIndex: computedStyle.zIndex,
7764
+ // transform: computedStyle.transform,
7765
+ // marginTop: computedStyle.marginTop,
7766
+ // marginBottom: computedStyle.marginBottom,
7767
+ // width: computedStyle.width,
7768
+ // height: computedStyle.height
7769
+ // },
7770
+ // ionTabs: ionTabsComputedStyle ? {
7771
+ // display: ionTabsComputedStyle.display,
7772
+ // flexDirection: ionTabsComputedStyle.flexDirection,
7773
+ // gridTemplateRows: ionTabsComputedStyle.gridTemplateRows,
7774
+ // gridTemplateColumns: ionTabsComputedStyle.gridTemplateColumns,
7775
+ // position: ionTabsComputedStyle.position,
7776
+ // alignItems: ionTabsComputedStyle.alignItems,
7777
+ // justifyContent: ionTabsComputedStyle.justifyContent,
7778
+ // height: ionTabsComputedStyle.height,
7779
+ // minHeight: ionTabsComputedStyle.minHeight
7780
+ // } : null,
7781
+ // tabBarRect: {
7782
+ // top: tabBarRect.top,
7783
+ // bottom: tabBarRect.bottom,
7784
+ // height: tabBarRect.height,
7785
+ // y: tabBarRect.y,
7786
+ // left: tabBarRect.left,
7787
+ // right: tabBarRect.right,
7788
+ // width: tabBarRect.width
7789
+ // },
7790
+ // windowHeight: window.innerHeight,
7791
+ // distanceFromTop: tabBarRect.top,
7792
+ // distanceFromBottom: window.innerHeight - tabBarRect.bottom,
7793
+ // // Check if tab bar is actually in the DOM at the right position
7794
+ // tabBarParent: tabBar.parentElement?.tagName,
7795
+ // tabBarNextSibling: tabBar.nextElementSibling?.tagName,
7796
+ // tabBarPreviousSibling: tabBar.previousElementSibling?.tagName,
7797
+ // // Check all children of ion-tabs to see DOM order
7798
+ // ionTabsChildren: ionTabsForStyles ? Array.from(ionTabsForStyles.children).map((child: any) => ({
7799
+ // tagName: child.tagName,
7800
+ // slot: child.getAttribute('slot'),
7801
+ // order: window.getComputedStyle(child).order
7802
+ // })) : null
7803
+ // });
7796
7804
  }
7797
7805
  }
7798
7806
  setupSlotEnforcement() {
7799
7807
  const hostElement = this.elementRef.nativeElement;
7800
7808
  const tabBar = this.elementRef.nativeElement.querySelector('ion-tab-bar');
7801
7809
  if (!tabBar) {
7802
- console.log('[ds-mobile-tab-bar] setupSlotEnforcement: tabBar not found, retrying...');
7810
+ // console.log('[ds-mobile-tab-bar] setupSlotEnforcement: tabBar not found, retrying...');
7803
7811
  // Retry if element not found yet
7804
7812
  setTimeout(() => this.setupSlotEnforcement(), 50);
7805
7813
  return;
7806
7814
  }
7807
- console.log('[ds-mobile-tab-bar] setupSlotEnforcement: Setting up MutationObserver');
7815
+ // console.log('[ds-mobile-tab-bar] setupSlotEnforcement: Setting up MutationObserver');
7808
7816
  const observer = new MutationObserver((mutations) => {
7809
7817
  mutations.forEach((mutation) => {
7810
- if (mutation.type === 'attributes' && mutation.attributeName === 'slot') {
7818
+ if (mutation.type === 'attributes' &&
7819
+ mutation.attributeName === 'slot') {
7811
7820
  const target = mutation.target;
7812
7821
  const expectedSlot = this.isDesktop() ? 'top' : 'bottom';
7813
7822
  // Check both host element and tab bar
7814
7823
  if (target === hostElement || target === tabBar) {
7815
7824
  const currentSlot = target.getAttribute('slot');
7816
- console.log('[ds-mobile-tab-bar] Slot changed by external source:', {
7817
- target: target.tagName,
7818
- currentSlot,
7819
- expectedSlot,
7820
- isDesktop: this.isDesktop()
7821
- });
7825
+ // console.log('[ds-mobile-tab-bar] Slot changed by external source:', {
7826
+ // target: target.tagName,
7827
+ // currentSlot,
7828
+ // expectedSlot,
7829
+ // isDesktop: this.isDesktop()
7830
+ // });
7822
7831
  // If Ionic or something else changed it, force it back
7823
7832
  if (currentSlot !== expectedSlot) {
7824
- console.log('[ds-mobile-tab-bar] Enforcing slot back to:', expectedSlot);
7833
+ // console.log('[ds-mobile-tab-bar] Enforcing slot back to:', expectedSlot);
7825
7834
  // Use requestAnimationFrame to avoid infinite loops
7826
7835
  requestAnimationFrame(() => {
7827
7836
  target.setAttribute('slot', expectedSlot);
@@ -7835,11 +7844,11 @@ class DsMobileTabBarComponent {
7835
7844
  // Observe both host element and tab bar for slot changes
7836
7845
  observer.observe(hostElement, {
7837
7846
  attributes: true,
7838
- attributeFilter: ['slot']
7847
+ attributeFilter: ['slot'],
7839
7848
  });
7840
7849
  observer.observe(tabBar, {
7841
7850
  attributes: true,
7842
- attributeFilter: ['slot']
7851
+ attributeFilter: ['slot'],
7843
7852
  });
7844
7853
  // Store observer for cleanup
7845
7854
  this.slotEnforcementObserver = observer;
@@ -7866,11 +7875,11 @@ class DsMobileTabBarComponent {
7866
7875
  this.mediaQuery.addEventListener('change', this.handleBreakpointChange);
7867
7876
  }
7868
7877
  handleBreakpointChange = (e) => {
7869
- console.log('[ds-mobile-tab-bar] handleBreakpointChange:', {
7870
- matches: e.matches,
7871
- windowWidth: window.innerWidth,
7872
- previousIsDesktop: this.isDesktop()
7873
- });
7878
+ // console.log('[ds-mobile-tab-bar] handleBreakpointChange:', {
7879
+ // matches: e.matches,
7880
+ // windowWidth: window.innerWidth,
7881
+ // previousIsDesktop: this.isDesktop()
7882
+ // });
7874
7883
  this.isDesktop.set(e.matches);
7875
7884
  // Force update the slot when breakpoint changes
7876
7885
  this.updateSlot();
@@ -7880,13 +7889,15 @@ class DsMobileTabBarComponent {
7880
7889
  attributes: true,
7881
7890
  attributeFilter: ['title'],
7882
7891
  subtree: true,
7883
- childList: true
7892
+ childList: true,
7884
7893
  };
7885
7894
  this.mutationObserver = new MutationObserver((mutations) => {
7886
7895
  mutations.forEach((mutation) => {
7887
- if (mutation.type === 'attributes' && mutation.attributeName === 'title') {
7896
+ if (mutation.type === 'attributes' &&
7897
+ mutation.attributeName === 'title') {
7888
7898
  const target = mutation.target;
7889
- if (target.tagName === 'ION-TAB-BUTTON' && target.hasAttribute('title')) {
7899
+ if (target.tagName === 'ION-TAB-BUTTON' &&
7900
+ target.hasAttribute('title')) {
7890
7901
  target.removeAttribute('title');
7891
7902
  }
7892
7903
  }
@@ -7944,13 +7955,13 @@ class DsMobileTabBarComponent {
7944
7955
  attributes: true,
7945
7956
  attributeFilter: ['selected', 'tab'],
7946
7957
  subtree: true,
7947
- childList: true
7958
+ childList: true,
7948
7959
  });
7949
7960
  // Also watch the parent ion-tabs for changes
7950
7961
  observer.observe(ionTabs, {
7951
7962
  attributes: true,
7952
7963
  attributeFilter: ['selected', 'tab'],
7953
- subtree: true
7964
+ subtree: true,
7954
7965
  });
7955
7966
  // Periodic check as fallback (in case events don't fire)
7956
7967
  setInterval(() => {
@@ -8030,17 +8041,42 @@ class DsMobileTabBarComponent {
8030
8041
  actionGroups: menuItems,
8031
8042
  currentLanguage: 'da', // TODO: Get from language service
8032
8043
  availableLanguages: [
8033
- { code: 'da', nativeName: 'Dansk', englishName: 'Danish', flagIcon: '/Assets/country-flags/denmark.svg' },
8034
- { code: 'en', nativeName: 'English', englishName: 'English', flagIcon: '/Assets/country-flags/united kingdom.svg' },
8035
- { code: 'sv', nativeName: 'Svenska', englishName: 'Swedish', flagIcon: '/Assets/country-flags/sweden.svg' },
8036
- { code: 'no', nativeName: 'Norsk', englishName: 'Norwegian', flagIcon: '/Assets/country-flags/norway.svg' },
8037
- { code: 'de', nativeName: 'Deutsch', englishName: 'German', flagIcon: '/Assets/country-flags/germany.svg' }
8038
- ]
8044
+ {
8045
+ code: 'da',
8046
+ nativeName: 'Dansk',
8047
+ englishName: 'Danish',
8048
+ flagIcon: '/Assets/country-flags/denmark.svg',
8049
+ },
8050
+ {
8051
+ code: 'en',
8052
+ nativeName: 'English',
8053
+ englishName: 'English',
8054
+ flagIcon: '/Assets/country-flags/united kingdom.svg',
8055
+ },
8056
+ {
8057
+ code: 'sv',
8058
+ nativeName: 'Svenska',
8059
+ englishName: 'Swedish',
8060
+ flagIcon: '/Assets/country-flags/sweden.svg',
8061
+ },
8062
+ {
8063
+ code: 'no',
8064
+ nativeName: 'Norsk',
8065
+ englishName: 'Norwegian',
8066
+ flagIcon: '/Assets/country-flags/norway.svg',
8067
+ },
8068
+ {
8069
+ code: 'de',
8070
+ nativeName: 'Deutsch',
8071
+ englishName: 'German',
8072
+ flagIcon: '/Assets/country-flags/germany.svg',
8073
+ },
8074
+ ],
8039
8075
  },
8040
8076
  breakpoints: [0, 1],
8041
8077
  initialBreakpoint: 1,
8042
8078
  handle: true,
8043
- cssClass: ['ds-bottom-sheet', 'auto-height']
8079
+ cssClass: ['ds-bottom-sheet', 'auto-height'],
8044
8080
  });
8045
8081
  await sheet.present();
8046
8082
  const result = await sheet.onWillDismiss();
@@ -8051,34 +8087,35 @@ class DsMobileTabBarComponent {
8051
8087
  }
8052
8088
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileTabBarComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
8053
8089
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: DsMobileTabBarComponent, isStandalone: true, selector: "ds-mobile-tab-bar", inputs: { tabs: "tabs", avatarType: "avatarType", avatarInitials: "avatarInitials", avatarSrc: "avatarSrc", avatarIconName: "avatarIconName", profileMenuItems: "profileMenuItems" }, outputs: { avatarClick: "avatarClick", profileActionSelected: "profileActionSelected" }, ngImport: i0, template: `
8054
- <ion-tab-bar
8055
- [attr.slot]="isDesktop() ? 'top' : 'bottom'"
8090
+ <ion-tab-bar
8091
+ [attr.slot]="isDesktop() ? 'top' : 'bottom'"
8056
8092
  class="ds-tab-bar"
8057
- [class.ds-tab-bar--desktop]="isDesktop()">
8058
-
8093
+ [class.ds-tab-bar--desktop]="isDesktop()"
8094
+ >
8059
8095
  <!-- Logo (desktop only, positioned via CSS) -->
8060
8096
  <div class="ds-tab-bar__logo">
8061
8097
  <ds-logo variant="mark" size="lg" />
8062
8098
  </div>
8063
-
8099
+
8064
8100
  <!-- Tab buttons container -->
8065
8101
  <div class="ds-tab-bar__tabs" *ngIf="tabs">
8066
- <ion-tab-button
8102
+ <ion-tab-button
8067
8103
  *ngFor="let tab of tabs; trackBy: trackByTabId"
8068
8104
  [tab]="tab.route"
8069
8105
  [attr.data-icon]="tab.icon"
8070
8106
  [attr.data-icon-active]="tab.iconActive"
8071
8107
  [attr.aria-label]="tab.label"
8072
8108
  class="ds-tab-button ion-activatable"
8073
- [class.tab-selected]="isTabActive(tab.route)">
8109
+ [class.tab-selected]="isTabActive(tab.route)"
8110
+ >
8074
8111
  <div class="tab-icon-ripple"></div>
8075
8112
  <div class="tab-icon-wrapper">
8076
- <ds-icon
8113
+ <ds-icon
8077
8114
  [name]="tab.icon"
8078
8115
  [size]="isDesktop() ? '20px' : '24px'"
8079
8116
  class="tab-icon-inactive"
8080
8117
  />
8081
- <ds-icon
8118
+ <ds-icon
8082
8119
  [name]="tab.iconActive"
8083
8120
  [size]="isDesktop() ? '20px' : '24px'"
8084
8121
  class="tab-icon-active"
@@ -8087,7 +8124,7 @@ class DsMobileTabBarComponent {
8087
8124
  <ion-label [attr.aria-hidden]="true">{{ tab.label }}</ion-label>
8088
8125
  </ion-tab-button>
8089
8126
  </div>
8090
-
8127
+
8091
8128
  <!-- Avatar (desktop only, positioned via CSS) -->
8092
8129
  <div class="ds-tab-bar__actions">
8093
8130
  <ds-avatar
@@ -8111,36 +8148,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
8111
8148
  IonLabel,
8112
8149
  DsIconComponent,
8113
8150
  DsAvatarComponent,
8114
- DsLogoComponent
8151
+ DsLogoComponent,
8115
8152
  ], template: `
8116
- <ion-tab-bar
8117
- [attr.slot]="isDesktop() ? 'top' : 'bottom'"
8153
+ <ion-tab-bar
8154
+ [attr.slot]="isDesktop() ? 'top' : 'bottom'"
8118
8155
  class="ds-tab-bar"
8119
- [class.ds-tab-bar--desktop]="isDesktop()">
8120
-
8156
+ [class.ds-tab-bar--desktop]="isDesktop()"
8157
+ >
8121
8158
  <!-- Logo (desktop only, positioned via CSS) -->
8122
8159
  <div class="ds-tab-bar__logo">
8123
8160
  <ds-logo variant="mark" size="lg" />
8124
8161
  </div>
8125
-
8162
+
8126
8163
  <!-- Tab buttons container -->
8127
8164
  <div class="ds-tab-bar__tabs" *ngIf="tabs">
8128
- <ion-tab-button
8165
+ <ion-tab-button
8129
8166
  *ngFor="let tab of tabs; trackBy: trackByTabId"
8130
8167
  [tab]="tab.route"
8131
8168
  [attr.data-icon]="tab.icon"
8132
8169
  [attr.data-icon-active]="tab.iconActive"
8133
8170
  [attr.aria-label]="tab.label"
8134
8171
  class="ds-tab-button ion-activatable"
8135
- [class.tab-selected]="isTabActive(tab.route)">
8172
+ [class.tab-selected]="isTabActive(tab.route)"
8173
+ >
8136
8174
  <div class="tab-icon-ripple"></div>
8137
8175
  <div class="tab-icon-wrapper">
8138
- <ds-icon
8176
+ <ds-icon
8139
8177
  [name]="tab.icon"
8140
8178
  [size]="isDesktop() ? '20px' : '24px'"
8141
8179
  class="tab-icon-inactive"
8142
8180
  />
8143
- <ds-icon
8181
+ <ds-icon
8144
8182
  [name]="tab.iconActive"
8145
8183
  [size]="isDesktop() ? '20px' : '24px'"
8146
8184
  class="tab-icon-active"
@@ -8149,7 +8187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
8149
8187
  <ion-label [attr.aria-hidden]="true">{{ tab.label }}</ion-label>
8150
8188
  </ion-tab-button>
8151
8189
  </div>
8152
-
8190
+
8153
8191
  <!-- Avatar (desktop only, positioned via CSS) -->
8154
8192
  <div class="ds-tab-bar__actions">
8155
8193
  <ds-avatar
@@ -9838,8 +9876,8 @@ class DsMobileModalService {
9838
9876
  * ```
9839
9877
  */
9840
9878
  async open(options) {
9841
- console.log('[Modal] Opening modal with options:', options);
9842
- const { component, componentProps, cssClass, presentationStyle = 'card', backdropDismiss = true, showBackdrop = true, keyboardClose = true, swipeToClose, initialBreakpoint, breakpoints, animated = true, mode = 'ios', handleNavigationBack = true } = options;
9879
+ // console.log('[Modal] Opening modal with options:', options);
9880
+ const { component, componentProps, cssClass, presentationStyle = 'card', backdropDismiss = true, showBackdrop = true, keyboardClose = true, swipeToClose, initialBreakpoint, breakpoints, animated = true, mode = 'ios', handleNavigationBack = true, } = options;
9843
9881
  // Build modal configuration
9844
9882
  const modalConfig = {
9845
9883
  component,
@@ -9872,9 +9910,9 @@ class DsMobileModalService {
9872
9910
  };
9873
9911
  }
9874
9912
  const modal = await this.modalController.create(modalConfig);
9875
- console.log('[Modal] Modal created, presenting...');
9913
+ // console.log('[Modal] Modal created, presenting...');
9876
9914
  await modal.present();
9877
- console.log('[Modal] Modal presented');
9915
+ // console.log('[Modal] Modal presented');
9878
9916
  return modal;
9879
9917
  }
9880
9918
  /**
@@ -9895,7 +9933,7 @@ class DsMobileModalService {
9895
9933
  componentProps,
9896
9934
  presentationStyle: 'fullscreen',
9897
9935
  backdropDismiss: false,
9898
- showBackdrop: false
9936
+ showBackdrop: false,
9899
9937
  });
9900
9938
  }
9901
9939
  /**
@@ -9916,7 +9954,7 @@ class DsMobileModalService {
9916
9954
  componentProps,
9917
9955
  presentationStyle: 'card',
9918
9956
  backdropDismiss: true,
9919
- showBackdrop: true
9957
+ showBackdrop: true,
9920
9958
  });
9921
9959
  }
9922
9960
  /**
@@ -9945,7 +9983,7 @@ class DsMobileModalService {
9945
9983
  showBackdrop: true,
9946
9984
  swipeToClose: options?.swipeToClose ?? true,
9947
9985
  initialBreakpoint: options?.initialBreakpoint ?? 0.5,
9948
- breakpoints: options?.breakpoints ?? [0, 0.5, 0.75, 1]
9986
+ breakpoints: options?.breakpoints ?? [0, 0.5, 0.75, 1],
9949
9987
  });
9950
9988
  }
9951
9989
  /**
@@ -10019,7 +10057,7 @@ class DsMobileModalService {
10019
10057
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileModalService, decorators: [{
10020
10058
  type: Injectable,
10021
10059
  args: [{
10022
- providedIn: 'root'
10060
+ providedIn: 'root',
10023
10061
  }]
10024
10062
  }], ctorParameters: () => [{ type: i1.ModalController }] });
10025
10063
 
@@ -11621,8 +11659,8 @@ class DsMobilePostDetailModalService extends BaseModalService {
11621
11659
  * @returns Promise that resolves when the modal is presented
11622
11660
  */
11623
11661
  async open(postData, options) {
11624
- console.log('[PostDetailModal] Opening with data:', postData);
11625
- console.log('[PostDetailModal] options.onSubmitComment =', options?.onSubmitComment);
11662
+ // console.log('[PostDetailModal] Opening with data:', postData);
11663
+ // console.log('[PostDetailModal] options.onSubmitComment =', options?.onSubmitComment);
11626
11664
  const modal = await this.createModal(DsMobilePostDetailModalComponent, {
11627
11665
  postData: postData,
11628
11666
  loading: options?.loading ?? false,
@@ -11634,9 +11672,9 @@ class DsMobilePostDetailModalService extends BaseModalService {
11634
11672
  }, {
11635
11673
  keyboardClose: true, // Keep keyboard close behavior for this modal
11636
11674
  });
11637
- console.log('[PostDetailModal] Modal created, presenting...');
11675
+ // console.log('[PostDetailModal] Modal created, presenting...');
11638
11676
  await modal.present();
11639
- console.log('[PostDetailModal] Modal presented');
11677
+ // console.log('[PostDetailModal] Modal presented');
11640
11678
  }
11641
11679
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobilePostDetailModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
11642
11680
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobilePostDetailModalService, providedIn: 'root' });
@@ -13212,17 +13250,17 @@ class DsMobileChatModalService extends BaseModalService {
13212
13250
  * @returns Promise that resolves when the modal is presented
13213
13251
  */
13214
13252
  async open(chatData, options) {
13215
- console.log('[ChatModal] Opening with data:', chatData);
13253
+ // console.log('[ChatModal] Opening with data:', chatData);
13216
13254
  const modal = await this.createModal(DsMobileChatModalComponent, {
13217
13255
  chatData: chatData,
13218
13256
  loading: options?.loading ?? false,
13219
- error: options?.error
13257
+ error: options?.error,
13220
13258
  }, {
13221
13259
  keyboardClose: true, // Keep keyboard close behavior for this modal
13222
13260
  });
13223
- console.log('[ChatModal] Modal created, presenting...');
13261
+ // console.log('[ChatModal] Modal created, presenting...');
13224
13262
  await modal.present();
13225
- console.log('[ChatModal] Modal presented');
13263
+ // console.log('[ChatModal] Modal presented');
13226
13264
  }
13227
13265
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileChatModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
13228
13266
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileChatModalService, providedIn: 'root' });
@@ -13230,7 +13268,7 @@ class DsMobileChatModalService extends BaseModalService {
13230
13268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileChatModalService, decorators: [{
13231
13269
  type: Injectable,
13232
13270
  args: [{
13233
- providedIn: 'root'
13271
+ providedIn: 'root',
13234
13272
  }]
13235
13273
  }], ctorParameters: () => [{ type: i1.ModalController }] });
13236
13274
 
@@ -13753,17 +13791,17 @@ class DsMobileNewInquiryModalService extends BaseModalService {
13753
13791
  * @returns Promise that resolves when the modal is presented
13754
13792
  */
13755
13793
  async open(options) {
13756
- console.log('[NewInquiryModal] Opening modal with options:', options);
13794
+ // console.log('[NewInquiryModal] Opening modal with options:', options);
13757
13795
  const modal = await this.createModal(DsMobileNewInquiryModalComponent, {
13758
13796
  onSubmit: options?.onSubmit,
13759
13797
  loading: options?.loading ?? false,
13760
- error: options?.error
13798
+ error: options?.error,
13761
13799
  }, {
13762
13800
  keyboardClose: false, // Don't close on keyboard hide for this modal
13763
13801
  });
13764
- console.log('[NewInquiryModal] Modal created, presenting...');
13802
+ // console.log('[NewInquiryModal] Modal created, presenting...');
13765
13803
  await modal.present();
13766
- console.log('[NewInquiryModal] Modal presented');
13804
+ // console.log('[NewInquiryModal] Modal presented');
13767
13805
  }
13768
13806
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileNewInquiryModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
13769
13807
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileNewInquiryModalService, providedIn: 'root' });
@@ -13771,7 +13809,7 @@ class DsMobileNewInquiryModalService extends BaseModalService {
13771
13809
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileNewInquiryModalService, decorators: [{
13772
13810
  type: Injectable,
13773
13811
  args: [{
13774
- providedIn: 'root'
13812
+ providedIn: 'root',
13775
13813
  }]
13776
13814
  }], ctorParameters: () => [{ type: i1.ModalController }] });
13777
13815
 
@@ -14320,17 +14358,17 @@ class DsMobileHandbookDetailModalService extends BaseModalService {
14320
14358
  * @returns Promise that resolves when the modal is presented
14321
14359
  */
14322
14360
  async open(handbookData, options) {
14323
- console.log('[HandbookDetailModal] Opening with data:', handbookData);
14361
+ // console.log('[HandbookDetailModal] Opening with data:', handbookData);
14324
14362
  const modal = await this.createModal(DsMobileHandbookDetailModalComponent, {
14325
14363
  handbookData: handbookData,
14326
14364
  loading: options?.loading ?? false,
14327
- error: options?.error
14365
+ error: options?.error,
14328
14366
  }, {
14329
14367
  keyboardClose: true, // Keep keyboard close behavior for this modal
14330
14368
  });
14331
- console.log('[HandbookDetailModal] Modal created, presenting...');
14369
+ // console.log('[HandbookDetailModal] Modal created, presenting...');
14332
14370
  await modal.present();
14333
- console.log('[HandbookDetailModal] Modal presented');
14371
+ // console.log('[HandbookDetailModal] Modal presented');
14334
14372
  }
14335
14373
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileHandbookDetailModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
14336
14374
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileHandbookDetailModalService, providedIn: 'root' });
@@ -14338,7 +14376,7 @@ class DsMobileHandbookDetailModalService extends BaseModalService {
14338
14376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMobileHandbookDetailModalService, decorators: [{
14339
14377
  type: Injectable,
14340
14378
  args: [{
14341
- providedIn: 'root'
14379
+ providedIn: 'root',
14342
14380
  }]
14343
14381
  }], ctorParameters: () => [{ type: i1.ModalController }] });
14344
14382