@propbinder/mobile-design 0.2.22 → 0.2.23

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.
@@ -1212,10 +1212,15 @@ class DsMobileListItemComponent {
1212
1212
  // (but not the host element itself)
1213
1213
  const target = event.target;
1214
1214
  const closestInteractive = target.closest('button, a, input, select, textarea, [role="button"]');
1215
- // Check if the interactive element is a child, not the host itself
1215
+ // Only block if the interactive element is a REAL child action (like a button in trailing slot),
1216
+ // but NOT if it's just the host itself or something inside leading/main that shouldn't block.
1216
1217
  if (closestInteractive && closestInteractive !== event.currentTarget) {
1217
- // console.log('[ListItem] Click ignored - came from interactive child:', closestInteractive);
1218
- return;
1218
+ // If the target is inside content-leading or content-main, we generally want to allow the click
1219
+ const isInsidePrimaryContent = !!target.closest('[content-leading], [content-main], .structured-title, .structured-subtitle');
1220
+ if (!isInsidePrimaryContent) {
1221
+ // console.log('[ListItem] Click ignored - came from interactive child in trailing/unknown slot:', closestInteractive);
1222
+ return;
1223
+ }
1219
1224
  }
1220
1225
  if (!this.longPressTriggered) {
1221
1226
  // console.log('[ListItem] Emitting itemClick');
@@ -11805,21 +11810,14 @@ class MobileModalBase {
11805
11810
  * - Any custom CSS padding value
11806
11811
  *
11807
11812
  * @default '0'
11808
- *
11809
- * @example
11810
- * ```html
11811
- * <!-- Default: sections handle padding -->
11812
- * <ds-mobile-modal-base headerTitle="Details">
11813
- * <ds-mobile-section headline="Info">...</ds-mobile-section>
11814
- * </ds-mobile-modal-base>
11815
- *
11816
- * <!-- Legacy: content without sections -->
11817
- * <ds-mobile-modal-base headerTitle="Details" contentPadding="20px">
11818
- * <div>Padded content</div>
11819
- * </ds-mobile-modal-base>
11820
- * ```
11821
11813
  */
11822
11814
  contentPadding = input('0', ...(ngDevMode ? [{ debugName: "contentPadding" }] : []));
11815
+ /**
11816
+ * Enable auto-height behavior for bottom sheets
11817
+ * When true, sets [fullscreen]="false" on ion-content and enforces flex: 0 0 auto
11818
+ * @default false
11819
+ */
11820
+ isAutoHeight = input(false, ...(ngDevMode ? [{ debugName: "isAutoHeight" }] : []));
11823
11821
  /**
11824
11822
  * Emitted when modal is closed
11825
11823
  */
@@ -12065,14 +12063,14 @@ class MobileModalBase {
12065
12063
  });
12066
12064
  }
12067
12065
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileModalBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12068
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", type: MobileModalBase, isStandalone: true, inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerMeta: { classPropertyName: "headerMeta", publicName: "headerMeta", isSignal: true, isRequired: false, transformFunction: null }, closeButtonLabel: { classPropertyName: "closeButtonLabel", publicName: "closeButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, enableKeyboardHandling: { classPropertyName: "enableKeyboardHandling", publicName: "enableKeyboardHandling", isSignal: true, isRequired: false, transformFunction: null }, hasFixedBottom: { classPropertyName: "hasFixedBottom", publicName: "hasFixedBottom", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", keyboardWillShow: "keyboardWillShow", keyboardWillHide: "keyboardWillHide" }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], ngImport: i0 });
12066
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", type: MobileModalBase, isStandalone: true, inputs: { loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerMeta: { classPropertyName: "headerMeta", publicName: "headerMeta", isSignal: true, isRequired: false, transformFunction: null }, closeButtonLabel: { classPropertyName: "closeButtonLabel", publicName: "closeButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, enableKeyboardHandling: { classPropertyName: "enableKeyboardHandling", publicName: "enableKeyboardHandling", isSignal: true, isRequired: false, transformFunction: null }, hasFixedBottom: { classPropertyName: "hasFixedBottom", publicName: "hasFixedBottom", isSignal: true, isRequired: false, transformFunction: null }, contentPadding: { classPropertyName: "contentPadding", publicName: "contentPadding", isSignal: true, isRequired: false, transformFunction: null }, isAutoHeight: { classPropertyName: "isAutoHeight", publicName: "isAutoHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", keyboardWillShow: "keyboardWillShow", keyboardWillHide: "keyboardWillHide" }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], ngImport: i0 });
12069
12067
  }
12070
12068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileModalBase, decorators: [{
12071
12069
  type: Directive
12072
12070
  }], propDecorators: { ionContent: [{
12073
12071
  type: ViewChild,
12074
12072
  args: [IonContent, { read: IonContent }]
12075
- }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerMeta: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerMeta", required: false }] }], closeButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButtonLabel", required: false }] }], enableKeyboardHandling: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableKeyboardHandling", required: false }] }], hasFixedBottom: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasFixedBottom", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], keyboardWillShow: [{ type: i0.Output, args: ["keyboardWillShow"] }], keyboardWillHide: [{ type: i0.Output, args: ["keyboardWillHide"] }] } });
12073
+ }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerMeta: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerMeta", required: false }] }], closeButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButtonLabel", required: false }] }], enableKeyboardHandling: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableKeyboardHandling", required: false }] }], hasFixedBottom: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasFixedBottom", required: false }] }], contentPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPadding", required: false }] }], isAutoHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAutoHeight", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], keyboardWillShow: [{ type: i0.Output, args: ["keyboardWillShow"] }], keyboardWillHide: [{ type: i0.Output, args: ["keyboardWillHide"] }] } });
12076
12074
 
12077
12075
  /**
12078
12076
  * DsMobileModalBaseComponent
@@ -12204,10 +12202,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12204
12202
  if (showHeaderValue === false)
12205
12203
  return false;
12206
12204
  // Auto-detect: show header if there's any header content
12207
- return !!(this.headerTitle() ||
12208
- this.headerMeta() ||
12209
- this.hasContentInSlot(this.headerLeading) ||
12210
- this.hasContentInSlot(this.headerMain));
12205
+ return !!(this.headerTitle() || this.headerMeta() || this.hasContentInSlot(this.headerLeading) || this.hasContentInSlot(this.headerMain));
12211
12206
  }
12212
12207
  /**
12213
12208
  * Check if a content child slot has actual content
@@ -12216,13 +12211,12 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12216
12211
  if (!slot)
12217
12212
  return false;
12218
12213
  const element = slot.nativeElement;
12219
- return element && (element.childNodes.length > 0 ||
12220
- element.textContent?.trim().length > 0);
12214
+ return element && (element.childNodes.length > 0 || element.textContent?.trim().length > 0);
12221
12215
  }
12222
12216
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileModalBaseComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
12223
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileModalBaseComponent, isStandalone: true, selector: "ds-mobile-modal-base", inputs: { showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--modal-content-padding": "contentPadding()" } }, queries: [{ propertyName: "customLoadingState", first: true, predicate: ["[loading-state]"], descendants: true, read: ElementRef }, { propertyName: "customErrorState", first: true, predicate: ["[error-state]"], descendants: true, read: ElementRef }, { propertyName: "headerLeading", first: true, predicate: ["[header-leading]"], descendants: true, read: ElementRef }, { propertyName: "headerMain", first: true, predicate: ["[header-main]"], descendants: true, read: ElementRef }], viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], usesInheritance: true, ngImport: i0, template: `
12224
- <ion-content [fullscreen]="true" [scrollY]="true" class="modal-base-content">
12225
- <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()">
12217
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DsMobileModalBaseComponent, isStandalone: true, selector: "ds-mobile-modal-base", inputs: { showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--modal-content-padding": "contentPadding()", "class.is-auto-height": "isAutoHeight()" } }, queries: [{ propertyName: "customLoadingState", first: true, predicate: ["[loading-state]"], descendants: true, read: ElementRef }, { propertyName: "customErrorState", first: true, predicate: ["[error-state]"], descendants: true, read: ElementRef }, { propertyName: "headerLeading", first: true, predicate: ["[header-leading]"], descendants: true, read: ElementRef }, { propertyName: "headerMain", first: true, predicate: ["[header-main]"], descendants: true, read: ElementRef }], viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, read: IonContent }], usesInheritance: true, ngImport: i0, template: `
12218
+ <ion-content [fullscreen]="!isAutoHeight()" [scrollY]="!isAutoHeight()" class="modal-base-content" [class.is-auto-height]="isAutoHeight()">
12219
+ <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12226
12220
  <!-- Header (conditional) -->
12227
12221
  @if (shouldShowHeader()) {
12228
12222
  <div class="modal-header">
@@ -12231,7 +12225,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12231
12225
  <div class="header-leading">
12232
12226
  <ng-content select="[header-leading]"></ng-content>
12233
12227
  </div>
12234
-
12228
+
12235
12229
  <!-- Main (title + meta or custom) -->
12236
12230
  <div class="header-main">
12237
12231
  @if (headerTitle()) {
@@ -12242,30 +12236,16 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12242
12236
  }
12243
12237
  <ng-content select="[header-main]"></ng-content>
12244
12238
  </div>
12245
-
12239
+
12246
12240
  <!-- Close button (in header) -->
12247
- <ds-icon-button
12248
- icon="remixCloseLine"
12249
- variant="secondary"
12250
- size="lg"
12251
- (clicked)="close()"
12252
- class="close-button"
12253
- [attr.aria-label]="closeButtonLabel()"
12254
- />
12241
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (clicked)="close()" class="close-button" [attr.aria-label]="closeButtonLabel()" />
12255
12242
  </div>
12256
12243
  </div>
12257
12244
  }
12258
-
12245
+
12259
12246
  <!-- Absolute close button (when header is hidden) -->
12260
12247
  @if (!shouldShowHeader()) {
12261
- <ds-icon-button
12262
- icon="remixCloseLine"
12263
- variant="secondary"
12264
- size="lg"
12265
- (clicked)="close()"
12266
- class="close-button-absolute"
12267
- [attr.aria-label]="closeButtonLabel()"
12268
- />
12248
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (clicked)="close()" class="close-button-absolute" [attr.aria-label]="closeButtonLabel()" />
12269
12249
  }
12270
12250
 
12271
12251
  <!-- Content Container -->
@@ -12274,7 +12254,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12274
12254
  <div class="custom-loading-slot" [class.state-hidden]="!(loading() && hasCustomLoadingState)">
12275
12255
  <ng-content select="[loading-state]"></ng-content>
12276
12256
  </div>
12277
-
12257
+
12278
12258
  <!-- Default Loading State -->
12279
12259
  @if (loading() && !hasCustomLoadingState) {
12280
12260
  <div class="modal-loading-state">
@@ -12282,12 +12262,12 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12282
12262
  <p class="loading-text">Loading...</p>
12283
12263
  </div>
12284
12264
  }
12285
-
12265
+
12286
12266
  <!-- Custom Error State Slot - always present -->
12287
12267
  <div class="custom-error-slot" [class.state-hidden]="!(error() && !loading() && hasCustomErrorState)">
12288
12268
  <ng-content select="[error-state]"></ng-content>
12289
12269
  </div>
12290
-
12270
+
12291
12271
  <!-- Default Error State -->
12292
12272
  @if (error() && !loading() && !hasCustomErrorState) {
12293
12273
  <div class="modal-error-state">
@@ -12296,7 +12276,7 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12296
12276
  <p class="error-state-description">{{ error() }}</p>
12297
12277
  </div>
12298
12278
  }
12299
-
12279
+
12300
12280
  <!-- Main content - always rendered but hidden when loading/error -->
12301
12281
  <div class="modal-main-content" [class.content-hidden]="loading() || !!error()">
12302
12282
  <ng-content></ng-content>
@@ -12306,24 +12286,20 @@ class DsMobileModalBaseComponent extends MobileModalBase {
12306
12286
  </ion-content>
12307
12287
 
12308
12288
  <!-- Fixed Bottom Component / Footer (slides with keyboard) -->
12309
- <div class="modal-fixed-bottom" [class.bottom-hidden]="!hasFixedBottom() || loading() || error()">
12289
+ <div class="modal-fixed-bottom" [class.bottom-hidden]="!hasFixedBottom() || loading() || error()" [class.is-auto-height]="isAutoHeight()">
12310
12290
  <ng-content select="[fixed-bottom]"></ng-content>
12311
12291
  <ng-content select="[footer]"></ng-content>
12312
12292
  </div>
12313
- `, isInline: true, styles: [":host{display:block;position:relative;height:100%;width:100%}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.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-sm);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}.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:8px}.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"] }] });
12293
+ `, 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-sm);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"] }] });
12314
12294
  }
12315
12295
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileModalBaseComponent, decorators: [{
12316
12296
  type: Component,
12317
- args: [{ selector: 'ds-mobile-modal-base', standalone: true, imports: [
12318
- CommonModule,
12319
- IonContent,
12320
- DsIconButtonComponent,
12321
- DsIconComponent
12322
- ], schemas: [CUSTOM_ELEMENTS_SCHEMA], host: {
12323
- '[style.--modal-content-padding]': 'contentPadding()'
12297
+ args: [{ selector: 'ds-mobile-modal-base', standalone: true, imports: [CommonModule, IonContent, DsIconButtonComponent, DsIconComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], host: {
12298
+ '[style.--modal-content-padding]': 'contentPadding()',
12299
+ '[class.is-auto-height]': 'isAutoHeight()',
12324
12300
  }, template: `
12325
- <ion-content [fullscreen]="true" [scrollY]="true" class="modal-base-content">
12326
- <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()">
12301
+ <ion-content [fullscreen]="!isAutoHeight()" [scrollY]="!isAutoHeight()" class="modal-base-content" [class.is-auto-height]="isAutoHeight()">
12302
+ <div class="modal-wrapper" [class.headerless]="!shouldShowHeader()" [class.is-auto-height]="isAutoHeight()">
12327
12303
  <!-- Header (conditional) -->
12328
12304
  @if (shouldShowHeader()) {
12329
12305
  <div class="modal-header">
@@ -12332,7 +12308,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12332
12308
  <div class="header-leading">
12333
12309
  <ng-content select="[header-leading]"></ng-content>
12334
12310
  </div>
12335
-
12311
+
12336
12312
  <!-- Main (title + meta or custom) -->
12337
12313
  <div class="header-main">
12338
12314
  @if (headerTitle()) {
@@ -12343,30 +12319,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12343
12319
  }
12344
12320
  <ng-content select="[header-main]"></ng-content>
12345
12321
  </div>
12346
-
12322
+
12347
12323
  <!-- Close button (in header) -->
12348
- <ds-icon-button
12349
- icon="remixCloseLine"
12350
- variant="secondary"
12351
- size="lg"
12352
- (clicked)="close()"
12353
- class="close-button"
12354
- [attr.aria-label]="closeButtonLabel()"
12355
- />
12324
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (clicked)="close()" class="close-button" [attr.aria-label]="closeButtonLabel()" />
12356
12325
  </div>
12357
12326
  </div>
12358
12327
  }
12359
-
12328
+
12360
12329
  <!-- Absolute close button (when header is hidden) -->
12361
12330
  @if (!shouldShowHeader()) {
12362
- <ds-icon-button
12363
- icon="remixCloseLine"
12364
- variant="secondary"
12365
- size="lg"
12366
- (clicked)="close()"
12367
- class="close-button-absolute"
12368
- [attr.aria-label]="closeButtonLabel()"
12369
- />
12331
+ <ds-icon-button icon="remixCloseLine" variant="secondary" size="lg" (clicked)="close()" class="close-button-absolute" [attr.aria-label]="closeButtonLabel()" />
12370
12332
  }
12371
12333
 
12372
12334
  <!-- Content Container -->
@@ -12375,7 +12337,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12375
12337
  <div class="custom-loading-slot" [class.state-hidden]="!(loading() && hasCustomLoadingState)">
12376
12338
  <ng-content select="[loading-state]"></ng-content>
12377
12339
  </div>
12378
-
12340
+
12379
12341
  <!-- Default Loading State -->
12380
12342
  @if (loading() && !hasCustomLoadingState) {
12381
12343
  <div class="modal-loading-state">
@@ -12383,12 +12345,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12383
12345
  <p class="loading-text">Loading...</p>
12384
12346
  </div>
12385
12347
  }
12386
-
12348
+
12387
12349
  <!-- Custom Error State Slot - always present -->
12388
12350
  <div class="custom-error-slot" [class.state-hidden]="!(error() && !loading() && hasCustomErrorState)">
12389
12351
  <ng-content select="[error-state]"></ng-content>
12390
12352
  </div>
12391
-
12353
+
12392
12354
  <!-- Default Error State -->
12393
12355
  @if (error() && !loading() && !hasCustomErrorState) {
12394
12356
  <div class="modal-error-state">
@@ -12397,7 +12359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12397
12359
  <p class="error-state-description">{{ error() }}</p>
12398
12360
  </div>
12399
12361
  }
12400
-
12362
+
12401
12363
  <!-- Main content - always rendered but hidden when loading/error -->
12402
12364
  <div class="modal-main-content" [class.content-hidden]="loading() || !!error()">
12403
12365
  <ng-content></ng-content>
@@ -12407,11 +12369,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
12407
12369
  </ion-content>
12408
12370
 
12409
12371
  <!-- Fixed Bottom Component / Footer (slides with keyboard) -->
12410
- <div class="modal-fixed-bottom" [class.bottom-hidden]="!hasFixedBottom() || loading() || error()">
12372
+ <div class="modal-fixed-bottom" [class.bottom-hidden]="!hasFixedBottom() || loading() || error()" [class.is-auto-height]="isAutoHeight()">
12411
12373
  <ng-content select="[fixed-bottom]"></ng-content>
12412
12374
  <ng-content select="[footer]"></ng-content>
12413
12375
  </div>
12414
- `, styles: [":host{display:block;position:relative;height:100%;width:100%}.modal-base-content{--background: var(--color-background-neutral-primary, #ffffff)}.modal-wrapper{display:flex;flex-direction:column;width:100%;background:var(--color-background-neutral-primary, #ffffff)}.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-sm);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}.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:8px}.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"] }]
12376
+ `, 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-sm);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"] }]
12415
12377
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { ionContent: [{
12416
12378
  type: ViewChild,
12417
12379
  args: [IonContent, { read: IonContent }]
@@ -14907,6 +14869,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
14907
14869
  * ```
14908
14870
  */
14909
14871
  class DsMobileNewInquiryModalComponent {
14872
+ modalController = inject(ModalController);
14910
14873
  titleInputRef;
14911
14874
  titleInput;
14912
14875
  fileInput;
@@ -15004,9 +14967,9 @@ class DsMobileNewInquiryModalComponent {
15004
14967
  id: `photo-${Date.now()}`,
15005
14968
  src: image.webPath,
15006
14969
  type: 'image',
15007
- name: `Photo ${this.attachments().length + 1}`
14970
+ name: `Photo ${this.attachments().length + 1}`,
15008
14971
  };
15009
- this.attachments.update(attachments => [...attachments, newAttachment]);
14972
+ this.attachments.update((attachments) => [...attachments, newAttachment]);
15010
14973
  }
15011
14974
  }
15012
14975
  catch (error) {
@@ -15018,7 +14981,7 @@ class DsMobileNewInquiryModalComponent {
15018
14981
  * Remove an attachment
15019
14982
  */
15020
14983
  removeAttachment(attachmentId) {
15021
- this.attachments.update(attachments => attachments.filter(a => a.id !== attachmentId));
14984
+ this.attachments.update((attachments) => attachments.filter((a) => a.id !== attachmentId));
15022
14985
  }
15023
14986
  /**
15024
14987
  * Handle attachment button click
@@ -15069,7 +15032,7 @@ class DsMobileNewInquiryModalComponent {
15069
15032
  const k = 1024;
15070
15033
  const sizes = ['B', 'KB', 'MB', 'GB'];
15071
15034
  const i = Math.floor(Math.log(bytes) / Math.log(k));
15072
- return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
15035
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
15073
15036
  }
15074
15037
  /**
15075
15038
  * Handle file selection from file input
@@ -15083,7 +15046,7 @@ class DsMobileNewInquiryModalComponent {
15083
15046
  // Process each selected file (up to the limit)
15084
15047
  const remainingSlots = 6 - this.attachments().length;
15085
15048
  const filesToProcess = Array.from(files).slice(0, remainingSlots);
15086
- filesToProcess.forEach(file => {
15049
+ filesToProcess.forEach((file) => {
15087
15050
  const fileType = this.detectFileType(file);
15088
15051
  // Create a data URL for preview
15089
15052
  const reader = new FileReader();
@@ -15095,9 +15058,9 @@ class DsMobileNewInquiryModalComponent {
15095
15058
  src: result,
15096
15059
  type: fileType,
15097
15060
  name: file.name,
15098
- size: this.formatFileSize(file.size)
15061
+ size: this.formatFileSize(file.size),
15099
15062
  };
15100
- this.attachments.update(attachments => [...attachments, newAttachment]);
15063
+ this.attachments.update((attachments) => [...attachments, newAttachment]);
15101
15064
  }
15102
15065
  };
15103
15066
  reader.readAsDataURL(file);
@@ -15117,13 +15080,14 @@ class DsMobileNewInquiryModalComponent {
15117
15080
  const inquiryData = {
15118
15081
  title: this.title.trim(),
15119
15082
  description: this.description.trim(),
15120
- attachments: this.attachments()
15083
+ attachments: this.attachments(),
15121
15084
  };
15122
15085
  console.log('[NewInquiryModal] Submitting inquiry:', inquiryData);
15123
15086
  if (this.onSubmit) {
15124
15087
  await this.onSubmit(inquiryData);
15125
15088
  }
15126
- // Success - modal will be closed by the service
15089
+ // Success - close the modal
15090
+ this.modalController.dismiss();
15127
15091
  }
15128
15092
  catch (error) {
15129
15093
  console.error('[NewInquiryModal] Error submitting inquiry:', error);
@@ -15141,8 +15105,9 @@ class DsMobileNewInquiryModalComponent {
15141
15105
  [showHeader]="false"
15142
15106
  [hasFixedBottom]="true"
15143
15107
  [enableKeyboardHandling]="true"
15144
- closeButtonLabel="Close">
15145
-
15108
+ [isAutoHeight]="true"
15109
+ closeButtonLabel="Close"
15110
+ >
15146
15111
  <!-- Form Content -->
15147
15112
  <ds-mobile-section>
15148
15113
  <!-- Title Field (Large Ghost Textarea) -->
@@ -15175,10 +15140,7 @@ class DsMobileNewInquiryModalComponent {
15175
15140
  <div class="attachment-previews-section">
15176
15141
  <div class="image-previews">
15177
15142
  @for (attachment of attachments(); track attachment.id) {
15178
- <ds-mobile-attachment-preview
15179
- [attachment]="attachment"
15180
- (remove)="removeAttachment($event)"
15181
- />
15143
+ <ds-mobile-attachment-preview [attachment]="attachment" (remove)="removeAttachment($event)" />
15182
15144
  }
15183
15145
  </div>
15184
15146
  </div>
@@ -15189,13 +15151,7 @@ class DsMobileNewInquiryModalComponent {
15189
15151
  <div class="submit-content">
15190
15152
  <!-- Upload Actions (Left) -->
15191
15153
  <div class="upload-actions">
15192
- <ds-icon-button
15193
- icon="remixImageLine"
15194
- variant="secondary"
15195
- size="md"
15196
- (clicked)="addPhoto()"
15197
- [disabled]="attachments().length >= 6"
15198
- aria-label="Add photo">
15154
+ <ds-icon-button icon="remixImageLine" variant="secondary" size="md" (clicked)="addPhoto()" [disabled]="attachments().length >= 6" aria-label="Add photo">
15199
15155
  </ds-icon-button>
15200
15156
  <ds-icon-button
15201
15157
  icon="remixAttachmentLine"
@@ -15203,34 +15159,21 @@ class DsMobileNewInquiryModalComponent {
15203
15159
  size="md"
15204
15160
  (clicked)="handleAddAttachment()"
15205
15161
  [disabled]="attachments().length >= 6"
15206
- aria-label="Add attachment">
15162
+ aria-label="Add attachment"
15163
+ >
15207
15164
  </ds-icon-button>
15208
-
15165
+
15209
15166
  <!-- Hidden file input for file selection -->
15210
- <input
15211
- #fileInput
15212
- type="file"
15213
- accept="*/*"
15214
- multiple
15215
- (change)="handleFileSelect($event)"
15216
- style="display: none;"
15217
- aria-hidden="true"
15218
- />
15167
+ <input #fileInput type="file" accept="*/*" multiple (change)="handleFileSelect($event)" style="display: none;" aria-hidden="true" />
15219
15168
  </div>
15220
15169
 
15221
15170
  <!-- Submit Button (Right) -->
15222
- <ds-button
15223
- variant="primary"
15224
- size="lg"
15225
- [disabled]="!isFormValid() || isSubmitting()"
15226
- (clicked)="handleSubmit()">
15227
- Submit
15228
- </ds-button>
15171
+ <ds-button variant="primary" size="lg" [disabled]="!isFormValid() || isSubmitting()" (clicked)="handleSubmit()"> Submit </ds-button>
15229
15172
  </div>
15230
15173
  </div>
15231
15174
  </div>
15232
15175
  </ds-mobile-modal-base>
15233
- `, isInline: true, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ".inquiry-title-input{flex:0 0 auto}.inquiry-title-input ::ng-deep textarea{font-size:var(--font-size-2xl);font-weight:400;line-height:1.2;max-height:200px;overflow-y:auto;resize:none;box-sizing:border-box;padding-right:52px}.fixed-bottom-container{background:var(--color-background-neutral-primary);border-top:1px solid var(--border-color-default)}.attachment-previews-section{padding:16px 20px;border-bottom:1px solid var(--border-color-default)}.image-previews{display:flex;flex-wrap:wrap;gap:8px}.submit-container{padding:16px 20px}.submit-content{display:flex;align-items:center;justify-content:space-between;gap:16px}.upload-actions{display:flex;align-items:center;gap:8px}.upload-actions ds-icon-button::ng-deep button{width:44px;height:44px;border-radius:50%}.submit-content ds-button::ng-deep button{border-radius:100px}.inquiry-description-input{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep .textarea-container{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep textarea{flex:1;min-height:200px;resize:none}@media (min-width: 768px){.submit-container{padding:20px 32px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsButtonComponent, selector: "ds-button", inputs: ["variant", "size", "disabled", "loading", "pressed", "expanded", "leadingIcon", "trailingIcon", "ariaLabel", "iconOnly"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsTextareaComponent, selector: "ds-textarea", inputs: ["variant", "placeholder", "disabled", "readonly", "required", "ghost", "rows", "cols", "maxlength", "minlength", "ariaLabel", "ariaDescribedBy", "ariaLabelledBy"], outputs: ["valueChange", "focused", "blurred"] }, { 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: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["showHeader"] }, { kind: "component", type: DsMobileAttachmentPreviewComponent, selector: "ds-mobile-attachment-preview", inputs: ["attachment"], outputs: ["remove"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
15176
+ `, isInline: true, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ".inquiry-title-input{flex:0 0 auto}.inquiry-title-input ::ng-deep textarea{font-size:var(--font-size-2xl);font-weight:400;line-height:1.2;max-height:200px;overflow-y:auto;resize:none;box-sizing:border-box;padding-right:52px}.fixed-bottom-container{background:var(--color-background-neutral-primary);border-top:1px solid var(--border-color-default)}.attachment-previews-section{padding:16px 20px;border-bottom:1px solid var(--border-color-default)}.image-previews{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px}.image-previews::-webkit-scrollbar{display:none}.submit-container{padding:16px 20px}.submit-content{display:flex;align-items:center;justify-content:space-between;gap:16px}.upload-actions{display:flex;align-items:center;gap:8px}.upload-actions ds-icon-button::ng-deep button{width:44px;height:44px;border-radius:50%}.submit-content ds-button::ng-deep button{border-radius:100px}.inquiry-description-input{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep .textarea-container{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep textarea{flex:1;min-height:80px;resize:none}@media (min-width: 768px){.submit-container{padding:20px 32px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DsButtonComponent, selector: "ds-button", inputs: ["variant", "size", "disabled", "loading", "pressed", "expanded", "leadingIcon", "trailingIcon", "ariaLabel", "iconOnly"], outputs: ["clicked", "focused", "blurred"] }, { kind: "component", type: DsTextareaComponent, selector: "ds-textarea", inputs: ["variant", "placeholder", "disabled", "readonly", "required", "ghost", "rows", "cols", "maxlength", "minlength", "ariaLabel", "ariaDescribedBy", "ariaLabelledBy"], outputs: ["valueChange", "focused", "blurred"] }, { 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: DsMobileModalBaseComponent, selector: "ds-mobile-modal-base", inputs: ["showHeader"] }, { kind: "component", type: DsMobileAttachmentPreviewComponent, selector: "ds-mobile-attachment-preview", inputs: ["attachment"], outputs: ["remove"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }] });
15234
15177
  }
15235
15178
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileNewInquiryModalComponent, decorators: [{
15236
15179
  type: Component,
@@ -15242,7 +15185,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15242
15185
  DsIconButtonComponent,
15243
15186
  DsMobileModalBaseComponent,
15244
15187
  DsMobileAttachmentPreviewComponent,
15245
- DsMobileSectionComponent
15188
+ DsMobileSectionComponent,
15246
15189
  ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: `
15247
15190
  <ds-mobile-modal-base
15248
15191
  [loading]="loading"
@@ -15250,8 +15193,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15250
15193
  [showHeader]="false"
15251
15194
  [hasFixedBottom]="true"
15252
15195
  [enableKeyboardHandling]="true"
15253
- closeButtonLabel="Close">
15254
-
15196
+ [isAutoHeight]="true"
15197
+ closeButtonLabel="Close"
15198
+ >
15255
15199
  <!-- Form Content -->
15256
15200
  <ds-mobile-section>
15257
15201
  <!-- Title Field (Large Ghost Textarea) -->
@@ -15284,10 +15228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15284
15228
  <div class="attachment-previews-section">
15285
15229
  <div class="image-previews">
15286
15230
  @for (attachment of attachments(); track attachment.id) {
15287
- <ds-mobile-attachment-preview
15288
- [attachment]="attachment"
15289
- (remove)="removeAttachment($event)"
15290
- />
15231
+ <ds-mobile-attachment-preview [attachment]="attachment" (remove)="removeAttachment($event)" />
15291
15232
  }
15292
15233
  </div>
15293
15234
  </div>
@@ -15298,13 +15239,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15298
15239
  <div class="submit-content">
15299
15240
  <!-- Upload Actions (Left) -->
15300
15241
  <div class="upload-actions">
15301
- <ds-icon-button
15302
- icon="remixImageLine"
15303
- variant="secondary"
15304
- size="md"
15305
- (clicked)="addPhoto()"
15306
- [disabled]="attachments().length >= 6"
15307
- aria-label="Add photo">
15242
+ <ds-icon-button icon="remixImageLine" variant="secondary" size="md" (clicked)="addPhoto()" [disabled]="attachments().length >= 6" aria-label="Add photo">
15308
15243
  </ds-icon-button>
15309
15244
  <ds-icon-button
15310
15245
  icon="remixAttachmentLine"
@@ -15312,34 +15247,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15312
15247
  size="md"
15313
15248
  (clicked)="handleAddAttachment()"
15314
15249
  [disabled]="attachments().length >= 6"
15315
- aria-label="Add attachment">
15250
+ aria-label="Add attachment"
15251
+ >
15316
15252
  </ds-icon-button>
15317
-
15253
+
15318
15254
  <!-- Hidden file input for file selection -->
15319
- <input
15320
- #fileInput
15321
- type="file"
15322
- accept="*/*"
15323
- multiple
15324
- (change)="handleFileSelect($event)"
15325
- style="display: none;"
15326
- aria-hidden="true"
15327
- />
15255
+ <input #fileInput type="file" accept="*/*" multiple (change)="handleFileSelect($event)" style="display: none;" aria-hidden="true" />
15328
15256
  </div>
15329
15257
 
15330
15258
  <!-- Submit Button (Right) -->
15331
- <ds-button
15332
- variant="primary"
15333
- size="lg"
15334
- [disabled]="!isFormValid() || isSubmitting()"
15335
- (clicked)="handleSubmit()">
15336
- Submit
15337
- </ds-button>
15259
+ <ds-button variant="primary" size="lg" [disabled]="!isFormValid() || isSubmitting()" (clicked)="handleSubmit()"> Submit </ds-button>
15338
15260
  </div>
15339
15261
  </div>
15340
15262
  </div>
15341
15263
  </ds-mobile-modal-base>
15342
- `, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ".inquiry-title-input{flex:0 0 auto}.inquiry-title-input ::ng-deep textarea{font-size:var(--font-size-2xl);font-weight:400;line-height:1.2;max-height:200px;overflow-y:auto;resize:none;box-sizing:border-box;padding-right:52px}.fixed-bottom-container{background:var(--color-background-neutral-primary);border-top:1px solid var(--border-color-default)}.attachment-previews-section{padding:16px 20px;border-bottom:1px solid var(--border-color-default)}.image-previews{display:flex;flex-wrap:wrap;gap:8px}.submit-container{padding:16px 20px}.submit-content{display:flex;align-items:center;justify-content:space-between;gap:16px}.upload-actions{display:flex;align-items:center;gap:8px}.upload-actions ds-icon-button::ng-deep button{width:44px;height:44px;border-radius:50%}.submit-content ds-button::ng-deep button{border-radius:100px}.inquiry-description-input{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep .textarea-container{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep textarea{flex:1;min-height:200px;resize:none}@media (min-width: 768px){.submit-container{padding:20px 32px}}\n"] }]
15264
+ `, styles: [".author-details{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.author-name{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:600;line-height:20px;letter-spacing:-.3px;color:var(--color-text-primary, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.author-meta{font-family:Brockmann,sans-serif;font-size:var(--font-size-xs);font-weight:400;line-height:1.2;letter-spacing:-.26px;color:var(--color-text-tertiary, #737373);display:flex;align-items:center;gap:6px}.author-meta .separator{color:var(--color-text-tertiary, #a0a0a0)}.lightbox-context .author-name,.overlay-context .author-name{color:#fffffff2}.lightbox-context .author-meta,.overlay-context .author-meta{color:#ffffffb3}.lightbox-context .author-meta .separator,.overlay-context .author-meta .separator{color:#ffffff80}.section-headline{font-size:var(--font-size-base);font-weight:600;color:var(--text-color-default-primary);padding:16px 0;margin:0;letter-spacing:-.2px;display:flex;align-items:center;gap:6px}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;line-height:1.3;color:var(--text-color-default-primary, #202227);margin:0 0 8px}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);font-weight:400;line-height:1.4;color:var(--text-color-default-secondary, #545B66);margin:0}.ghost-input-clean ::ng-deep .ds-input,.ghost-input-clean ::ng-deep .ds-textarea,.ghost-input-clean ::ng-deep .textarea-container{outline:none!important;border:none!important}.ghost-input-clean ::ng-deep .ds-input:hover,.ghost-input-clean ::ng-deep .ds-textarea:hover,.ghost-input-clean ::ng-deep .textarea-container:hover,.ghost-input-clean ::ng-deep .ds-input:focus,.ghost-input-clean ::ng-deep .ds-textarea:focus,.ghost-input-clean ::ng-deep .textarea-container:focus,.ghost-input-clean ::ng-deep .ds-input:focus-within,.ghost-input-clean ::ng-deep .ds-textarea:focus-within,.ghost-input-clean ::ng-deep .textarea-container:focus-within{outline:none!important;border:none!important;box-shadow:none!important}.ghost-input-clean ::ng-deep textarea{outline:none!important;border:none!important;box-shadow:none!important;resize:none!important}.ghost-input-clean ::ng-deep textarea:hover,.ghost-input-clean ::ng-deep textarea:focus{outline:none!important;border:none!important;box-shadow:none!important}\n", ".inquiry-title-input{flex:0 0 auto}.inquiry-title-input ::ng-deep textarea{font-size:var(--font-size-2xl);font-weight:400;line-height:1.2;max-height:200px;overflow-y:auto;resize:none;box-sizing:border-box;padding-right:52px}.fixed-bottom-container{background:var(--color-background-neutral-primary);border-top:1px solid var(--border-color-default)}.attachment-previews-section{padding:16px 20px;border-bottom:1px solid var(--border-color-default)}.image-previews{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px}.image-previews::-webkit-scrollbar{display:none}.submit-container{padding:16px 20px}.submit-content{display:flex;align-items:center;justify-content:space-between;gap:16px}.upload-actions{display:flex;align-items:center;gap:8px}.upload-actions ds-icon-button::ng-deep button{width:44px;height:44px;border-radius:50%}.submit-content ds-button::ng-deep button{border-radius:100px}.inquiry-description-input{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep .textarea-container{display:flex;flex:1;min-height:0}.inquiry-description-input ::ng-deep textarea{flex:1;min-height:80px;resize:none}@media (min-width: 768px){.submit-container{padding:20px 32px}}\n"] }]
15343
15265
  }], propDecorators: { titleInputRef: [{
15344
15266
  type: ViewChild,
15345
15267
  args: ['titleInput', { read: ElementRef }]
@@ -15373,16 +15295,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
15373
15295
  *
15374
15296
  * @example
15375
15297
  * ```typescript
15376
- * constructor(private inquiryModal: DsMobileNewInquiryModalService) {}
15298
+ * constructor(private newInquiryModal: DsMobileNewInquiryModalService) {}
15377
15299
  *
15378
- * async createNewInquiry() {
15379
- * await this.inquiryModal.open({
15300
+ * async createNewInquiry(): Promise<void> {
15301
+ * console.log('[InquiriesPage] FAB clicked, opening modal...');
15302
+ *
15303
+ * await this.newInquiryModal.open({
15380
15304
  * onSubmit: async (data) => {
15381
15305
  * console.log('Creating inquiry:', data);
15382
15306
  * // Call your API to create the inquiry
15383
15307
  * await this.apiService.createInquiry(data);
15384
15308
  * // Close the modal
15385
- * await this.inquiryModal.close();
15309
+ * await this.newInquiryModal.close();
15386
15310
  * }
15387
15311
  * });
15388
15312
  * }
@@ -15406,10 +15330,14 @@ class DsMobileNewInquiryModalService extends BaseModalService {
15406
15330
  error: options?.error,
15407
15331
  }, {
15408
15332
  keyboardClose: false, // Don't close on keyboard hide for this modal
15333
+ cssClass: ['ds-modal-base', 'auto-height'],
15334
+ breakpoints: [0, 1],
15335
+ initialBreakpoint: 1,
15336
+ handle: false,
15409
15337
  });
15410
- // console.log('[NewInquiryModal] Modal created, presenting...');
15338
+ console.log('[NewInquiryModal] Modal created, presenting...');
15411
15339
  await modal.present();
15412
- // console.log('[NewInquiryModal] Modal presented');
15340
+ console.log('[NewInquiryModal] Modal presented');
15413
15341
  }
15414
15342
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileNewInquiryModalService, deps: [{ token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Injectable });
15415
15343
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileNewInquiryModalService, providedIn: 'root' });
@@ -16524,7 +16452,7 @@ class DsMobileFabComponent {
16524
16452
  /**
16525
16453
  * Emitted when the FAB is clicked
16526
16454
  */
16527
- fabClick = output();
16455
+ clicked = output();
16528
16456
  ngAfterViewInit() {
16529
16457
  // Only calculate position on mobile (not desktop)
16530
16458
  if (!this.platform.is('desktop')) {
@@ -16564,14 +16492,14 @@ class DsMobileFabComponent {
16564
16492
  */
16565
16493
  handleClick() {
16566
16494
  if (!this.disabled()) {
16567
- this.fabClick.emit();
16495
+ this.clicked.emit();
16568
16496
  }
16569
16497
  }
16570
16498
  ngOnDestroy() {
16571
16499
  this.resizeObserver?.disconnect();
16572
16500
  }
16573
16501
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DsMobileFabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
16574
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DsMobileFabComponent, isStandalone: true, selector: "ds-mobile-fab", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fabClick: "fabClick" }, host: { properties: { "class.fab-bottom-right": "position() === \"bottom-right\"", "class.fab-bottom-left": "position() === \"bottom-left\"", "class.fab-bottom-center": "position() === \"bottom-center\"" } }, ngImport: i0, template: `
16502
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DsMobileFabComponent, isStandalone: true, selector: "ds-mobile-fab", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.fab-bottom-right": "position() === \"bottom-right\"", "class.fab-bottom-left": "position() === \"bottom-left\"", "class.fab-bottom-center": "position() === \"bottom-center\"" } }, ngImport: i0, template: `
16575
16503
  <div class="fab-container">
16576
16504
  <ds-icon-button
16577
16505
  [icon]="icon()"
@@ -16579,7 +16507,7 @@ class DsMobileFabComponent {
16579
16507
  [size]="size()"
16580
16508
  [ariaLabel]="ariaLabel()"
16581
16509
  [disabled]="disabled()"
16582
- (click)="handleClick()"
16510
+ (clicked)="handleClick()"
16583
16511
  class="fab-button">
16584
16512
  </ds-icon-button>
16585
16513
  </div>
@@ -16599,12 +16527,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
16599
16527
  [size]="size()"
16600
16528
  [ariaLabel]="ariaLabel()"
16601
16529
  [disabled]="disabled()"
16602
- (click)="handleClick()"
16530
+ (clicked)="handleClick()"
16603
16531
  class="fab-button">
16604
16532
  </ds-icon-button>
16605
16533
  </div>
16606
16534
  `, styles: [":host{display:block;position:fixed;z-index:1000;pointer-events:none}.fab-container{position:relative;pointer-events:none;animation:fabEnter .3s cubic-bezier(.4,0,.2,1) forwards}@keyframes fabEnter{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}:host(.fab-bottom-right){bottom:var(--fab-calculated-bottom, 84px);right:20px}:host(.fab-bottom-left){bottom:var(--fab-calculated-bottom, 84px);left:20px}:host(.fab-bottom-center){bottom:var(--fab-calculated-bottom, 84px);left:50%;transform:translate(-50%)}@supports (padding-right: env(safe-area-inset-right)){:host(.fab-bottom-right){right:calc(20px + env(safe-area-inset-right))}}@supports (padding-left: env(safe-area-inset-left)){:host(.fab-bottom-left){left:calc(20px + env(safe-area-inset-left))}}@media (min-width: 768px){:host-context(.plt-desktop).fab-bottom-right{bottom:40px;right:40px}:host-context(.plt-desktop).fab-bottom-left{bottom:40px;left:40px}:host-context(.plt-desktop).fab-bottom-center{bottom:40px}@supports (padding-right: env(safe-area-inset-right)){:host-context(.plt-desktop).fab-bottom-right{right:calc(40px + env(safe-area-inset-right))}}@supports (padding-left: env(safe-area-inset-left)){:host-context(.plt-desktop).fab-bottom-left{left:calc(40px + env(safe-area-inset-left))}}}.fab-button{pointer-events:auto;display:block}.fab-button::ng-deep button{width:56px!important;height:56px!important;min-width:56px!important;min-height:56px!important;border-radius:50%!important;padding:0!important;display:flex!important;align-items:center!important;justify-content:center!important;background:var(--color-accent)!important;color:var(--color-on-accent)!important;border:none!important;box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f;transition:all .2s cubic-bezier(.4,0,.2,1)}.fab-button::ng-deep button:hover:not(:disabled){background:var(--color-accent-hover)!important;box-shadow:0 5px 7px -2px #0003,0 8px 14px #00000024,0 2px 22px #0000001f;transform:scale(1.05)}.fab-button::ng-deep button:active:not(:disabled){background:var(--color-accent-active)!important;box-shadow:0 2px 4px -1px #0003,0 4px 8px #00000024,0 1px 14px #0000001f;transform:scale(.95)}.fab-button::ng-deep button:disabled{opacity:.5;cursor:not-allowed;box-shadow:0 2px 4px -1px #0000001a,0 4px 8px #00000014,0 1px 14px #0000000f}.fab-button::ng-deep button .btn__icon,.fab-button::ng-deep button .btn__icon svg{color:var(--color-on-accent)!important;fill:var(--color-on-accent)!important}.fab-button::ng-deep button .btn__icon{display:flex!important;align-items:center!important;justify-content:center!important;flex-shrink:0!important}.fab-button::ng-deep button .btn__icon svg{width:24px!important;height:24px!important}\n"] }]
16607
- }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], fabClick: [{ type: i0.Output, args: ["fabClick"] }] } });
16535
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
16608
16536
 
16609
16537
  /**
16610
16538
  * DsMobileOfflineBannerComponent
@@ -18993,7 +18921,7 @@ class MobileInquiriesPageComponent {
18993
18921
  }, 1000);
18994
18922
  }
18995
18923
  async createNewInquiry() {
18996
- console.log('Opening new inquiry modal...');
18924
+ console.log('[InquiriesPage] FAB clicked, opening modal...');
18997
18925
  await this.newInquiryModal.open({
18998
18926
  onSubmit: async (data) => {
18999
18927
  console.log('New inquiry submitted:', data);
@@ -19082,9 +19010,9 @@ class MobileInquiriesPageComponent {
19082
19010
  icon="remixAddLine"
19083
19011
  position="bottom-right"
19084
19012
  ariaLabel="Create new inquiry"
19085
- (fabClick)="createNewInquiry()">
19013
+ (clicked)="createNewInquiry()">
19086
19014
  </ds-mobile-fab>
19087
- `, isInline: true, styles: [".inquiry-list-wrapper{display:flex;flex-direction:column;margin-top:-12px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size"] }, { kind: "component", type: DsMobileInteractiveListItemInquiryComponent, selector: "ds-mobile-interactive-list-item-inquiry", inputs: ["title", "description", "status", "statusLabel", "timestamp", "iconName", "iconColor", "variant", "clickable", "showChevron", "enableLongPress"], outputs: ["inquiryClick", "longPress"] }, { kind: "component", type: DsMobileInlineTabsComponent, selector: "ds-mobile-inline-tabs", inputs: ["tabs", "activeTab"], outputs: ["tabChange"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["fabClick"] }] });
19015
+ `, isInline: true, styles: [".inquiry-list-wrapper{display:flex;flex-direction:column;margin-top:-12px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"], dependencies: [{ kind: "component", type: DsMobilePageMainComponent, selector: "ds-mobile-page-main", inputs: ["title", "headerTitle", "headerSubtitle", "avatarType", "avatarInitials", "avatarSrc", "avatarIconName", "showRefresh", "showCondensedHeader", "scrollThreshold", "headerFadeDistance", "contentPadding", "profileMenuItems"], outputs: ["avatarClick", "profileActionSelected", "refresh", "scroll"] }, { kind: "component", type: DsMobileSectionComponent, selector: "ds-mobile-section", inputs: ["headline", "icon", "linkText", "padding", "gap", "contentGap", "showBorder", "overflow"], outputs: ["linkClick"] }, { kind: "component", type: DsMobileIllustrationComponent, selector: "ds-mobile-illustration", inputs: ["variant", "size"] }, { kind: "component", type: DsMobileInteractiveListItemInquiryComponent, selector: "ds-mobile-interactive-list-item-inquiry", inputs: ["title", "description", "status", "statusLabel", "timestamp", "iconName", "iconColor", "variant", "clickable", "showChevron", "enableLongPress"], outputs: ["inquiryClick", "longPress"] }, { kind: "component", type: DsMobileInlineTabsComponent, selector: "ds-mobile-inline-tabs", inputs: ["tabs", "activeTab"], outputs: ["tabChange"] }, { kind: "component", type: DsMobileOfflineBannerComponent, selector: "ds-mobile-offline-banner", inputs: ["icon", "title", "message"] }, { kind: "component", type: DsMobileFabComponent, selector: "ds-mobile-fab", inputs: ["icon", "position", "size", "ariaLabel", "disabled"], outputs: ["clicked"] }] });
19088
19016
  }
19089
19017
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MobileInquiriesPageComponent, decorators: [{
19090
19018
  type: Component,
@@ -19165,7 +19093,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
19165
19093
  icon="remixAddLine"
19166
19094
  position="bottom-right"
19167
19095
  ariaLabel="Create new inquiry"
19168
- (fabClick)="createNewInquiry()">
19096
+ (clicked)="createNewInquiry()">
19169
19097
  </ds-mobile-fab>
19170
19098
  `, styles: [".inquiry-list-wrapper{display:flex;flex-direction:column;margin-top:-12px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center}.empty-state-title{font-family:Brockmann,sans-serif;font-size:var(--font-size-base);font-weight:600;color:var(--color-text-primary);margin-top:-16px;z-index:4}.empty-state-description{font-family:Brockmann,sans-serif;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin:0}\n"] }]
19171
19099
  }], ctorParameters: () => [{ type: UserService }, { type: i1.NavController }, { type: DsMobileNewInquiryModalService }], propDecorators: { pageComponent: [{