@propbinder/mobile-design 0.2.30 → 0.2.33

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.
@@ -49,7 +49,7 @@ const DEFAULT_CONFIG = {
49
49
  signInBgGradientEnd: '#8A9BFF', // Gradient bottom color
50
50
  signInContentColor: '#1a1a1a', // Default dark text color
51
51
  organizationName: 'Propbinder',
52
- organizationId: 'default'
52
+ organizationId: 'default',
53
53
  };
54
54
  /**
55
55
  * WhitelabelService
@@ -92,11 +92,16 @@ class WhitelabelService {
92
92
  }
93
93
  // Otherwise calculate height based on logoSize
94
94
  switch (size) {
95
- case 'sm': return 24;
96
- case 'md': return 28;
97
- case 'lg': return 32;
98
- case 'xl': return 36;
99
- default: return 28;
95
+ case 'sm':
96
+ return 24;
97
+ case 'md':
98
+ return 28;
99
+ case 'lg':
100
+ return 32;
101
+ case 'xl':
102
+ return 36;
103
+ default:
104
+ return 28;
100
105
  }
101
106
  }, ...(ngDevMode ? [{ debugName: "logoHeight" }] : []));
102
107
  appIconSurface = computed(() => this._config().appIconSurface, ...(ngDevMode ? [{ debugName: "appIconSurface" }] : []));
@@ -154,9 +159,7 @@ class WhitelabelService {
154
159
  if (isOnSignInPage) {
155
160
  // On sign-in page - use sign-in background color
156
161
  const config = this._config();
157
- const backgroundColor = config.signInBgType === 'gradient'
158
- ? config.signInBgGradientStart
159
- : config.signInBgSolid;
162
+ const backgroundColor = config.signInBgType === 'gradient' ? config.signInBgGradientStart : config.signInBgSolid;
160
163
  const style = this.getStatusBarStyleForColor(backgroundColor);
161
164
  StatusBar.setBackgroundColor({ color: backgroundColor }).catch(() => { });
162
165
  StatusBar.setStyle({ style }).catch(() => { });
@@ -176,9 +179,9 @@ class WhitelabelService {
176
179
  * Call this early in app initialization (app.config.ts or app.component.ts)
177
180
  */
178
181
  initialize(config) {
179
- this._config.update(current => ({
182
+ this._config.update((current) => ({
180
183
  ...current,
181
- ...config
184
+ ...config,
182
185
  }));
183
186
  }
184
187
  /**
@@ -193,7 +196,7 @@ class WhitelabelService {
193
196
  // const response = await fetch(`/api/whitelabel/${organizationId || 'default'}`);
194
197
  // const config = await response.json();
195
198
  // this.initialize(config);
196
- console.log('Loading whitelabel config from API for:', organizationId);
199
+ //console.log('Loading whitelabel config from API for:', organizationId);
197
200
  // Example: Different configs for different organizations
198
201
  if (organizationId === 'demo-client') {
199
202
  this.initialize({
@@ -209,7 +212,7 @@ class WhitelabelService {
209
212
  headerAccent: 'rgba(255, 255, 255, 0.15)',
210
213
  onHeaderAccent: '#FFFFFF',
211
214
  organizationName: 'Demo Client',
212
- organizationId: 'demo-client'
215
+ organizationId: 'demo-client',
213
216
  });
214
217
  }
215
218
  else if (organizationId === 'cobblestone') {
@@ -233,7 +236,7 @@ class WhitelabelService {
233
236
  signInBgGradientEnd: '#BDC3C7',
234
237
  signInContentColor: '#1a1a1a',
235
238
  organizationName: 'Cobblestone',
236
- organizationId: 'cobblestone'
239
+ organizationId: 'cobblestone',
237
240
  });
238
241
  }
239
242
  // Add more organization-specific configs as needed
@@ -253,9 +256,9 @@ class WhitelabelService {
253
256
  * Update only the brand colors
254
257
  */
255
258
  updateColors(colors) {
256
- this._config.update(current => ({
259
+ this._config.update((current) => ({
257
260
  ...current,
258
- ...colors
261
+ ...colors,
259
262
  }));
260
263
  }
261
264
  /**
@@ -269,11 +272,13 @@ class WhitelabelService {
269
272
  */
270
273
  hexToRgb(hex) {
271
274
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
272
- return result ? {
273
- r: parseInt(result[1], 16),
274
- g: parseInt(result[2], 16),
275
- b: parseInt(result[3], 16)
276
- } : null;
275
+ return result
276
+ ? {
277
+ r: parseInt(result[1], 16),
278
+ g: parseInt(result[2], 16),
279
+ b: parseInt(result[3], 16),
280
+ }
281
+ : null;
277
282
  }
278
283
  /**
279
284
  * Calculate relative luminance of a color (WCAG standard)
@@ -419,7 +424,7 @@ class WhitelabelService {
419
424
  }
420
425
  // Update tab button selected color directly
421
426
  // CSS variable inheritance doesn't always work dynamically with Ionic components
422
- document.querySelectorAll('ion-tab-button').forEach(tabButton => {
427
+ document.querySelectorAll('ion-tab-button').forEach((tabButton) => {
423
428
  tabButton.style.setProperty('--color-selected', accent);
424
429
  });
425
430
  // ============================================
@@ -536,21 +541,21 @@ class WhitelabelService {
536
541
  }
537
542
  // Update native StatusBar color (Capacitor - Android only, iOS ignores this)
538
543
  this.updateNativeStatusBar(headerSurface);
539
- console.log('Applied whitelabel colors:', {
540
- appIconSurface,
541
- appIconContent,
542
- accent,
543
- accentHover,
544
- accentActive,
545
- onAccent,
546
- headerSurface,
547
- headerContent,
548
- headerAccent,
549
- headerAccentHover,
550
- headerAccentActive,
551
- onHeaderAccent,
552
- signInContentColor
553
- });
544
+ // console.log('Applied whitelabel colors:', {
545
+ // appIconSurface,
546
+ // appIconContent,
547
+ // accent,
548
+ // accentHover,
549
+ // accentActive,
550
+ // onAccent,
551
+ // headerSurface,
552
+ // headerContent,
553
+ // headerAccent,
554
+ // headerAccentHover,
555
+ // headerAccentActive,
556
+ // onHeaderAccent,
557
+ // signInContentColor
558
+ // });
554
559
  }
555
560
  }
556
561
  /**
@@ -574,7 +579,7 @@ class WhitelabelService {
574
579
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WhitelabelService, decorators: [{
575
580
  type: Injectable,
576
581
  args: [{
577
- providedIn: 'root'
582
+ providedIn: 'root',
578
583
  }]
579
584
  }], ctorParameters: () => [] });
580
585
 
@@ -5538,15 +5543,15 @@ class DsMobileContentComponent {
5538
5543
  */
5539
5544
  layout = input('stacked', ...(ngDevMode ? [{ debugName: "layout" }] : []));
5540
5545
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5541
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DsMobileContentComponent, isStandalone: true, selector: "ds-mobile-content", inputs: { layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.layout-stacked": "layout() === \"stacked\"", "class.layout-grid-2": "layout() === \"grid-2\"", "class.layout-grid-3": "layout() === \"grid-3\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:32px;max-width:640px;margin:0 auto}:host.layout-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}:host.layout-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}@media (max-width: 768px){:host.layout-grid-2,:host.layout-grid-3{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
5546
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DsMobileContentComponent, isStandalone: true, selector: "ds-mobile-content", inputs: { layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.layout-stacked": "layout() === \"stacked\"", "class.layout-grid-2": "layout() === \"grid-2\"", "class.layout-grid-3": "layout() === \"grid-3\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:flex;flex-direction:column;gap:16px;max-width:640px;margin:0 auto}:host.layout-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}:host.layout-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}@media (max-width: 768px){:host.layout-grid-2,:host.layout-grid-3{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
5542
5547
  }
5543
5548
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileContentComponent, decorators: [{
5544
5549
  type: Component,
5545
5550
  args: [{ selector: 'ds-mobile-content', standalone: true, imports: [CommonModule], host: {
5546
5551
  '[class.layout-stacked]': 'layout() === "stacked"',
5547
5552
  '[class.layout-grid-2]': 'layout() === "grid-2"',
5548
- '[class.layout-grid-3]': 'layout() === "grid-3"'
5549
- }, template: `<ng-content />`, styles: [":host{display:flex;flex-direction:column;gap:32px;max-width:640px;margin:0 auto}:host.layout-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}:host.layout-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}@media (max-width: 768px){:host.layout-grid-2,:host.layout-grid-3{grid-template-columns:1fr}}\n"] }]
5553
+ '[class.layout-grid-3]': 'layout() === "grid-3"',
5554
+ }, template: `<ng-content />`, styles: [":host{display:flex;flex-direction:column;gap:16px;max-width:640px;margin:0 auto}:host.layout-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}:host.layout-grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}@media (max-width: 768px){:host.layout-grid-2,:host.layout-grid-3{grid-template-columns:1fr}}\n"] }]
5550
5555
  }], propDecorators: { layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }] } });
5551
5556
  /**
5552
5557
  * SectionHeaderComponent
@@ -5565,7 +5570,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5565
5570
  args: [{ selector: 'section-header', standalone: true, host: {
5566
5571
  '[class.w-half]': 'width() === "half"',
5567
5572
  '[class.w-third]': 'width() === "third"',
5568
- '[class.w-full]': 'width() === "full"'
5573
+ '[class.w-full]': 'width() === "full"',
5569
5574
  }, template: `<ng-content />`, styles: [":host{height:20px;border-radius:8px;background:var(--color-background-neutral-tertiary);display:block}:host.w-half{width:50%}:host.w-third{width:33%}:host.w-full{width:100%}\n"] }]
5570
5575
  }], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }] } });
5571
5576
  /**
@@ -13327,7 +13332,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
13327
13332
  <ng-content select="[fixed-bottom]"></ng-content>
13328
13333
  <ng-content select="[footer]"></ng-content>
13329
13334
  </div>
13330
- `, isInline: true, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative;padding-bottom:var(--fixed-bottom-height, 0px);transition:padding-bottom .3s ease-out}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:calc(env(safe-area-inset-bottom,0px) + 16px)}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@supports (padding: env(safe-area-inset-bottom)){.modal-content-container{padding-bottom:env(safe-area-inset-bottom)}}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }] });
13335
+ `, isInline: true, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative;padding-bottom:var(--fixed-bottom-height, 0px);transition:padding-bottom .3s ease-out}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:calc(env(safe-area-inset-bottom,0px) + 16px)}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff);padding-bottom:var(--keyboard-height, 0px);transition:padding-bottom .3s cubic-bezier(.215,.61,.355,1)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@supports (padding: env(safe-area-inset-bottom)){.modal-content-container{padding-bottom:env(safe-area-inset-bottom)}}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: DsIconButtonComponent, selector: "ds-icon-button", inputs: ["variant", "size", "icon", "disabled", "loading", "pressed", "expanded", "ariaLabel", "tooltip", "tooltipDisabled", "tooltipPlacement"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsIconComponent, selector: "ds-icon", inputs: ["name", "size", "color", "interactive"] }] });
13331
13336
  }
13332
13337
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileModalBaseComponent, decorators: [{
13333
13338
  type: Component,
@@ -13416,7 +13421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
13416
13421
  <ng-content select="[fixed-bottom]"></ng-content>
13417
13422
  <ng-content select="[footer]"></ng-content>
13418
13423
  </div>
13419
- `, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative;padding-bottom:var(--fixed-bottom-height, 0px);transition:padding-bottom .3s ease-out}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:calc(env(safe-area-inset-bottom,0px) + 16px)}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@supports (padding: env(safe-area-inset-bottom)){.modal-content-container{padding-bottom:env(safe-area-inset-bottom)}}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"] }]
13424
+ `, styles: [":host{display:block;position:relative;height:100%;width:100%}:host(.is-auto-height){height:auto}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-base-content.is-auto-height{--height: auto;height:auto!important;flex:0 0 auto;display:block;contain:none!important}.modal-base-content.is-auto-height::part(scroll){position:relative!important;display:block!important;height:auto!important;overflow:visible!important}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.modal-wrapper.is-auto-height{flex:0 0 auto}.modal-header{position:sticky;top:0;z-index:10;background:var(--color-background-neutral-primary, #ffffff);border-bottom:1px solid var(--border-color-default);padding:16px}.header-content{display:flex;align-items:center;justify-content:space-between;gap:12px}.header-leading{flex-shrink:0;display:flex;align-items:center}.header-leading:empty{display:none}.header-content:has(.header-leading:empty){gap:16px}.header-main{display:flex;flex-direction:column;min-width:0;flex:1;gap:2px}.modal-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.close-button{flex-shrink:0;border-radius:50%}.close-button::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.close-button-absolute{position:absolute;top:16px;right:16px;z-index:100;flex-shrink:0;border-radius:50%}.close-button-absolute::ng-deep button{border-radius:50%!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important}.modal-content-container{display:flex;flex-direction:column;width:100%;max-width:640px;margin:0 auto;flex:1;position:relative;padding-bottom:var(--fixed-bottom-height, 0px);transition:padding-bottom .3s ease-out}:host-context(ion-modal.auto-height) .modal-content-container,.modal-wrapper.is-auto-height .modal-content-container{flex:0 0 auto}.modal-wrapper.headerless .modal-content-container{padding-top:0}.modal-main-content{display:flex;flex-direction:column;width:100%;padding-top:0;padding-left:var(--modal-content-padding, 20px);padding-right:var(--modal-content-padding, 20px);padding-bottom:var(--modal-content-padding, 20px)}.modal-main-content.content-hidden,.state-hidden{display:none}.custom-loading-slot,.custom-error-slot{width:100%}.modal-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.loading-spinner{width:48px;height:48px;border:3px solid var(--color-background-neutral-secondary, #f0f0f0);border-top-color:var(--color-primary-base, #2563eb);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin-top:16px}.modal-error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:16px}.error-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--color-text-primary, #1a1a1a);margin:0}.error-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--color-text-secondary, #737373);margin:0}.modal-fixed-bottom{position:fixed;bottom:0;left:0;right:0;z-index:1000;pointer-events:none;background:var(--color-background-neutral-primary, #ffffff);box-shadow:0 300px 0 300px var(--color-background-neutral-primary, #ffffff);transform:translateY(calc(-1 * var(--keyboard-height, 0px)));transition:transform .3s cubic-bezier(.215,.61,.355,1);max-width:100vw;padding-bottom:calc(env(safe-area-inset-bottom,0px) + 16px)}.modal-fixed-bottom.is-auto-height{position:relative;bottom:auto;left:auto;right:auto;transform:none!important;box-shadow:none;z-index:1;background:var(--color-background-neutral-primary, #ffffff);padding-bottom:var(--keyboard-height, 0px);transition:padding-bottom .3s cubic-bezier(.215,.61,.355,1)}.modal-fixed-bottom>*{pointer-events:auto}.modal-fixed-bottom.bottom-hidden{display:none}@supports (padding: env(safe-area-inset-bottom)){.modal-content-container{padding-bottom:env(safe-area-inset-bottom)}}@media (prefers-reduced-motion: reduce){.modal-fixed-bottom{transition:none}.loading-spinner{animation:none}}\n"] }]
13420
13425
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { ionContent: [{
13421
13426
  type: ViewChild,
13422
13427
  args: [IonContent, { read: IonContent }]
@@ -16358,6 +16363,7 @@ class DsMobileNewInquiryModalService extends BaseModalService {
16358
16363
  breakpoints: [0, 1],
16359
16364
  initialBreakpoint: 1,
16360
16365
  handle: false,
16366
+ presentingElement: undefined,
16361
16367
  });
16362
16368
  console.log('[NewInquiryModal] Modal created, presenting...');
16363
16369
  await modal.present();
@@ -24092,36 +24098,36 @@ class MobileTabsExampleComponent {
24092
24098
  label: 'Hjem',
24093
24099
  route: 'home',
24094
24100
  icon: 'remixHomeSmile2Line',
24095
- iconActive: 'remixHomeSmile2Fill'
24101
+ iconActive: 'remixHomeSmile2Fill',
24096
24102
  },
24097
24103
  {
24098
24104
  id: 'inquiries',
24099
24105
  label: 'Henvendelser',
24100
24106
  route: 'inquiries',
24101
24107
  icon: 'remixFileList3Line',
24102
- iconActive: 'remixFileList3Fill'
24108
+ iconActive: 'remixFileList3Fill',
24103
24109
  },
24104
24110
  {
24105
24111
  id: 'announcements',
24106
24112
  label: 'Fællesskab',
24107
24113
  route: 'announcements',
24108
24114
  icon: 'remixCommunityLine',
24109
- iconActive: 'remixCommunityFill'
24115
+ iconActive: 'remixCommunityFill',
24110
24116
  },
24111
24117
  {
24112
24118
  id: 'booking',
24113
24119
  label: 'Booking',
24114
24120
  route: 'booking',
24115
24121
  icon: 'remixCalendarCheckLine',
24116
- iconActive: 'remixCalendarCheckFill'
24122
+ iconActive: 'remixCalendarCheckFill',
24117
24123
  },
24118
24124
  {
24119
24125
  id: 'handbook',
24120
24126
  label: 'Håndbog',
24121
24127
  route: 'handbook',
24122
24128
  icon: 'remixBook2Line',
24123
- iconActive: 'remixBook2Fill'
24124
- }
24129
+ iconActive: 'remixBook2Fill',
24130
+ },
24125
24131
  ];
24126
24132
  /**
24127
24133
  * Profile menu items configuration.
@@ -24137,21 +24143,21 @@ class MobileTabsExampleComponent {
24137
24143
  action: 'profile',
24138
24144
  title: 'Min profil',
24139
24145
  icon: 'remixUser3Line',
24140
- destructive: false
24146
+ destructive: false,
24141
24147
  },
24142
24148
  {
24143
24149
  action: 'settings',
24144
24150
  title: 'Indstillinger',
24145
24151
  icon: 'remixSettings3Line',
24146
- destructive: false
24152
+ destructive: false,
24147
24153
  },
24148
24154
  {
24149
24155
  action: 'appearance',
24150
24156
  title: 'Udseende',
24151
24157
  icon: 'remixPaletteLine',
24152
- destructive: false
24153
- }
24154
- ]
24158
+ destructive: false,
24159
+ },
24160
+ ],
24155
24161
  },
24156
24162
  {
24157
24163
  actions: [
@@ -24162,9 +24168,9 @@ class MobileTabsExampleComponent {
24162
24168
  flagIcon: '/Assets/country-flags/denmark.svg',
24163
24169
  icon: 'remixGlobalLine',
24164
24170
  destructive: false,
24165
- showChevron: true
24166
- }
24167
- ]
24171
+ showChevron: true,
24172
+ },
24173
+ ],
24168
24174
  },
24169
24175
  {
24170
24176
  actions: [
@@ -24172,10 +24178,10 @@ class MobileTabsExampleComponent {
24172
24178
  action: 'logout',
24173
24179
  title: 'Log ud',
24174
24180
  icon: 'remixLogoutBoxLine',
24175
- destructive: true
24176
- }
24177
- ]
24178
- }
24181
+ destructive: true,
24182
+ },
24183
+ ],
24184
+ },
24179
24185
  ];
24180
24186
  }
24181
24187
  /**
@@ -24214,10 +24220,11 @@ class MobileTabsExampleComponent {
24214
24220
  [avatarInitials]="userService.avatarInitials()"
24215
24221
  [avatarType]="userService.avatarType()"
24216
24222
  [profileMenuItems]="profileMenuItems"
24217
- (profileActionSelected)="handleProfileAction($event)">
24223
+ (profileActionSelected)="handleProfileAction($event)"
24224
+ >
24218
24225
  </ds-mobile-tab-bar>
24219
24226
  </ion-tabs>
24220
- `, isInline: true, styles: [":host{display:block;height:100vh;width:100vw;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonTabs, selector: "ion-tabs" }, { kind: "component", type: DsMobileTabBarComponent, selector: "ds-mobile-tab-bar", inputs: ["tabs", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "profileMenuItems"], outputs: ["avatarClick", "profileActionSelected"] }] });
24227
+ `, isInline: true, styles: [":host{display:block;height:100dvh;width:100vw;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonTabs, selector: "ion-tabs" }, { kind: "component", type: DsMobileTabBarComponent, selector: "ds-mobile-tab-bar", inputs: ["tabs", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "profileMenuItems"], outputs: ["avatarClick", "profileActionSelected"] }] });
24221
24228
  }
24222
24229
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileTabsExampleComponent, decorators: [{
24223
24230
  type: Component,
@@ -24230,10 +24237,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
24230
24237
  [avatarInitials]="userService.avatarInitials()"
24231
24238
  [avatarType]="userService.avatarType()"
24232
24239
  [profileMenuItems]="profileMenuItems"
24233
- (profileActionSelected)="handleProfileAction($event)">
24240
+ (profileActionSelected)="handleProfileAction($event)"
24241
+ >
24234
24242
  </ds-mobile-tab-bar>
24235
24243
  </ion-tabs>
24236
- `, styles: [":host{display:block;height:100vh;width:100vw;position:relative}\n"] }]
24244
+ `, styles: [":host{display:block;height:100dvh;width:100vw;position:relative}\n"] }]
24237
24245
  }], ctorParameters: () => [{ type: UserService }, { type: i1$4.Router }] });
24238
24246
 
24239
24247
  class MobileBookingPageComponent {