@propbinder/mobile-design 0.2.21 → 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.
- package/fesm2022/propbinder-mobile-design.mjs +120 -186
- package/fesm2022/propbinder-mobile-design.mjs.map +1 -1
- package/index.d.ts +22 -26
- package/package.json +1 -1
- package/styles/ionic.css +48 -42
package/index.d.ts
CHANGED
|
@@ -2387,7 +2387,7 @@ declare class DsMobileListItemComponent {
|
|
|
2387
2387
|
* - 'center' - Align to center
|
|
2388
2388
|
* - 'bottom' - Align to bottom
|
|
2389
2389
|
*/
|
|
2390
|
-
align: _angular_core.InputSignal<"
|
|
2390
|
+
align: _angular_core.InputSignal<"top" | "center" | "bottom">;
|
|
2391
2391
|
/**
|
|
2392
2392
|
* Whether the list item is interactive (clickable and long-pressable)
|
|
2393
2393
|
* When true, adds interactive background, cursor pointer, and touch handlers
|
|
@@ -4144,21 +4144,14 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
4144
4144
|
* - Any custom CSS padding value
|
|
4145
4145
|
*
|
|
4146
4146
|
* @default '0'
|
|
4147
|
-
*
|
|
4148
|
-
* @example
|
|
4149
|
-
* ```html
|
|
4150
|
-
* <!-- Default: sections handle padding -->
|
|
4151
|
-
* <ds-mobile-modal-base headerTitle="Details">
|
|
4152
|
-
* <ds-mobile-section headline="Info">...</ds-mobile-section>
|
|
4153
|
-
* </ds-mobile-modal-base>
|
|
4154
|
-
*
|
|
4155
|
-
* <!-- Legacy: content without sections -->
|
|
4156
|
-
* <ds-mobile-modal-base headerTitle="Details" contentPadding="20px">
|
|
4157
|
-
* <div>Padded content</div>
|
|
4158
|
-
* </ds-mobile-modal-base>
|
|
4159
|
-
* ```
|
|
4160
4147
|
*/
|
|
4161
4148
|
contentPadding: _angular_core.InputSignal<string>;
|
|
4149
|
+
/**
|
|
4150
|
+
* Enable auto-height behavior for bottom sheets
|
|
4151
|
+
* When true, sets [fullscreen]="false" on ion-content and enforces flex: 0 0 auto
|
|
4152
|
+
* @default false
|
|
4153
|
+
*/
|
|
4154
|
+
isAutoHeight: _angular_core.InputSignal<boolean>;
|
|
4162
4155
|
/**
|
|
4163
4156
|
* Emitted when modal is closed
|
|
4164
4157
|
*/
|
|
@@ -4200,7 +4193,7 @@ declare abstract class MobileModalBase implements OnInit, OnDestroy {
|
|
|
4200
4193
|
*/
|
|
4201
4194
|
protected cleanupKeyboardListeners(): void;
|
|
4202
4195
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileModalBase, never>;
|
|
4203
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobileModalBase, never, never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerMeta": { "alias": "headerMeta"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "enableKeyboardHandling": { "alias": "enableKeyboardHandling"; "required": false; "isSignal": true; }; "hasFixedBottom": { "alias": "hasFixedBottom"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "keyboardWillShow": "keyboardWillShow"; "keyboardWillHide": "keyboardWillHide"; }, never, never, true, never>;
|
|
4196
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MobileModalBase, never, never, { "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "headerTitle": { "alias": "headerTitle"; "required": false; "isSignal": true; }; "headerMeta": { "alias": "headerMeta"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "enableKeyboardHandling": { "alias": "enableKeyboardHandling"; "required": false; "isSignal": true; }; "hasFixedBottom": { "alias": "hasFixedBottom"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; "isAutoHeight": { "alias": "isAutoHeight"; "required": false; "isSignal": true; }; }, { "closed": "closed"; "keyboardWillShow": "keyboardWillShow"; "keyboardWillHide": "keyboardWillHide"; }, never, never, true, never>;
|
|
4204
4197
|
}
|
|
4205
4198
|
|
|
4206
4199
|
/**
|
|
@@ -4748,7 +4741,7 @@ declare class DsMobileCardInlineComponent {
|
|
|
4748
4741
|
* - 'default' - Column layout with standard padding (gap: 12px, padding: 10px 12px)
|
|
4749
4742
|
* - 'compact' - Row layout with reduced padding (gap: 8px, padding: 10px)
|
|
4750
4743
|
*/
|
|
4751
|
-
variant: _angular_core.InputSignal<"
|
|
4744
|
+
variant: _angular_core.InputSignal<"compact" | "default">;
|
|
4752
4745
|
/**
|
|
4753
4746
|
* Whether the card is disabled
|
|
4754
4747
|
* Disables all interactions and reduces opacity
|
|
@@ -4811,7 +4804,7 @@ declare class DsMobileCardInlineBannerComponent {
|
|
|
4811
4804
|
* - 'default' - Standard padding and column layout
|
|
4812
4805
|
* - 'compact' - Reduced padding and row layout
|
|
4813
4806
|
*/
|
|
4814
|
-
layout: _angular_core.InputSignal<"
|
|
4807
|
+
layout: _angular_core.InputSignal<"compact" | "default">;
|
|
4815
4808
|
/**
|
|
4816
4809
|
* Emits when the banner is clicked
|
|
4817
4810
|
*/
|
|
@@ -4862,7 +4855,7 @@ declare class DsMobileCardInlineContactComponent {
|
|
|
4862
4855
|
* - 'default' - Standard padding and column layout
|
|
4863
4856
|
* - 'compact' - Reduced padding and row layout
|
|
4864
4857
|
*/
|
|
4865
|
-
layout: _angular_core.InputSignal<"
|
|
4858
|
+
layout: _angular_core.InputSignal<"compact" | "default">;
|
|
4866
4859
|
/**
|
|
4867
4860
|
* Whether the contact item is clickable
|
|
4868
4861
|
*/
|
|
@@ -4919,7 +4912,7 @@ declare class DsMobileCardInlineFileComponent {
|
|
|
4919
4912
|
* - 'default' - Standard padding and column layout
|
|
4920
4913
|
* - 'compact' - Reduced padding and row layout
|
|
4921
4914
|
*/
|
|
4922
|
-
layout: _angular_core.InputSignal<"
|
|
4915
|
+
layout: _angular_core.InputSignal<"compact" | "default">;
|
|
4923
4916
|
/**
|
|
4924
4917
|
* Optional URL to open when clicked
|
|
4925
4918
|
* If provided, clicking the card will open this URL in a new tab
|
|
@@ -5360,6 +5353,7 @@ interface NewInquiryData {
|
|
|
5360
5353
|
* ```
|
|
5361
5354
|
*/
|
|
5362
5355
|
declare class DsMobileNewInquiryModalComponent implements OnInit, AfterViewInit {
|
|
5356
|
+
private modalController;
|
|
5363
5357
|
titleInputRef?: ElementRef<HTMLElement>;
|
|
5364
5358
|
titleInput?: DsTextareaComponent;
|
|
5365
5359
|
fileInput?: ElementRef<HTMLInputElement>;
|
|
@@ -5468,16 +5462,18 @@ interface NewInquiryModalOptions {
|
|
|
5468
5462
|
*
|
|
5469
5463
|
* @example
|
|
5470
5464
|
* ```typescript
|
|
5471
|
-
* constructor(private
|
|
5465
|
+
* constructor(private newInquiryModal: DsMobileNewInquiryModalService) {}
|
|
5466
|
+
*
|
|
5467
|
+
* async createNewInquiry(): Promise<void> {
|
|
5468
|
+
* console.log('[InquiriesPage] FAB clicked, opening modal...');
|
|
5472
5469
|
*
|
|
5473
|
-
*
|
|
5474
|
-
* await this.inquiryModal.open({
|
|
5470
|
+
* await this.newInquiryModal.open({
|
|
5475
5471
|
* onSubmit: async (data) => {
|
|
5476
5472
|
* console.log('Creating inquiry:', data);
|
|
5477
5473
|
* // Call your API to create the inquiry
|
|
5478
5474
|
* await this.apiService.createInquiry(data);
|
|
5479
5475
|
* // Close the modal
|
|
5480
|
-
* await this.
|
|
5476
|
+
* await this.newInquiryModal.close();
|
|
5481
5477
|
* }
|
|
5482
5478
|
* });
|
|
5483
5479
|
* }
|
|
@@ -5996,7 +5992,7 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
|
|
|
5996
5992
|
/**
|
|
5997
5993
|
* Emitted when the FAB is clicked
|
|
5998
5994
|
*/
|
|
5999
|
-
|
|
5995
|
+
clicked: _angular_core.OutputEmitterRef<void>;
|
|
6000
5996
|
ngAfterViewInit(): void;
|
|
6001
5997
|
/**
|
|
6002
5998
|
* Calculate the FAB position dynamically based on actual tab bar height
|
|
@@ -6013,7 +6009,7 @@ declare class DsMobileFabComponent implements AfterViewInit, OnDestroy {
|
|
|
6013
6009
|
handleClick(): void;
|
|
6014
6010
|
ngOnDestroy(): void;
|
|
6015
6011
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileFabComponent, never>;
|
|
6016
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileFabComponent, "ds-mobile-fab", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "
|
|
6012
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileFabComponent, "ds-mobile-fab", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
|
|
6017
6013
|
}
|
|
6018
6014
|
|
|
6019
6015
|
type AppIconSize = 'sm' | 'md' | 'lg' | 'xl';
|
|
@@ -6506,7 +6502,7 @@ declare class MobileInquiriesPageComponent {
|
|
|
6506
6502
|
private newInquiryModal;
|
|
6507
6503
|
pageComponent: DsMobilePageMainComponent;
|
|
6508
6504
|
constructor(userService: UserService, navCtrl: NavController, newInquiryModal: DsMobileNewInquiryModalService);
|
|
6509
|
-
filterStatus: _angular_core.WritableSignal<"
|
|
6505
|
+
filterStatus: _angular_core.WritableSignal<"all" | "open" | "closed">;
|
|
6510
6506
|
tabItems: InlineTabItem[];
|
|
6511
6507
|
inquiries: _angular_core.WritableSignal<Inquiry[]>;
|
|
6512
6508
|
filteredInquiries: _angular_core.Signal<Inquiry[]>;
|
package/package.json
CHANGED
package/styles/ionic.css
CHANGED
|
@@ -276,7 +276,7 @@ ion-spinner {
|
|
|
276
276
|
color: var(--color-accent) !important;
|
|
277
277
|
}
|
|
278
278
|
|
|
279
|
-
ion-modal {
|
|
279
|
+
ion-modal:not(.ds-bottom-sheet) {
|
|
280
280
|
--background: var(--color-background-neutral-primary);
|
|
281
281
|
--border-radius: 16px;
|
|
282
282
|
--box-shadow: var(--box-shadow-lg);
|
|
@@ -286,7 +286,7 @@ ion-modal {
|
|
|
286
286
|
}
|
|
287
287
|
|
|
288
288
|
/* Prevent modal container from resizing when keyboard appears */
|
|
289
|
-
ion-modal::part(content) {
|
|
289
|
+
ion-modal:not(.ds-bottom-sheet)::part(content) {
|
|
290
290
|
position: fixed !important;
|
|
291
291
|
height: 100% !important;
|
|
292
292
|
max-height: 100vh !important;
|
|
@@ -329,9 +329,15 @@ ion-toast {
|
|
|
329
329
|
--box-shadow: 0px -2px 24px rgba(0, 0, 0, 0.12);
|
|
330
330
|
--backdrop-opacity: 0.4;
|
|
331
331
|
transition: --backdrop-opacity 0.3s ease;
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
332
|
+
|
|
333
|
+
/* Position the modal container to fill screen */
|
|
334
|
+
top: 0 !important;
|
|
335
|
+
height: 100% !important;
|
|
336
|
+
|
|
337
|
+
/* Align the actual sheet at the bottom */
|
|
338
|
+
display: flex;
|
|
339
|
+
flex-direction: column;
|
|
340
|
+
justify-content: flex-end;
|
|
335
341
|
}
|
|
336
342
|
|
|
337
343
|
/* Backdrop styling */
|
|
@@ -349,18 +355,21 @@ ion-toast {
|
|
|
349
355
|
margin-bottom: 8px;
|
|
350
356
|
}
|
|
351
357
|
|
|
352
|
-
/* Content area styling */
|
|
358
|
+
/* Content area styling - Support auto-height by default for sheets */
|
|
353
359
|
.ds-bottom-sheet::part(content) {
|
|
354
360
|
/* Offset content below status bar (backdrop still covers full screen) */
|
|
355
361
|
margin-top: var(--app-sheet-top-offset);
|
|
356
362
|
border-radius: var(--border-radius) var(--border-radius) 0 0;
|
|
357
363
|
background: var(--color-background-neutral-primary, #ffffff);
|
|
358
364
|
box-shadow: var(--box-shadow);
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
height:
|
|
363
|
-
|
|
365
|
+
|
|
366
|
+
/* Auto-height logic: Only as tall as content */
|
|
367
|
+
height: auto !important;
|
|
368
|
+
max-height: calc(100dvh - var(--app-sheet-top-offset)) !important;
|
|
369
|
+
|
|
370
|
+
/* Sit at the bottom of the flex container */
|
|
371
|
+
position: relative !important;
|
|
372
|
+
margin-top: auto !important;
|
|
364
373
|
}
|
|
365
374
|
|
|
366
375
|
/* Remove border radius when fully expanded */
|
|
@@ -397,48 +406,27 @@ ion-toast {
|
|
|
397
406
|
Make action sheets auto-size to their content
|
|
398
407
|
============================================ */
|
|
399
408
|
|
|
400
|
-
/* Auto-height
|
|
401
|
-
.ds-bottom-sheet.auto-height {
|
|
402
|
-
top: 0 !important;
|
|
403
|
-
height: 100% !important;
|
|
404
|
-
--height: fit-content;
|
|
405
|
-
--max-height: 80vh;
|
|
406
|
-
display: flex;
|
|
407
|
-
align-items: flex-end;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
.ds-bottom-sheet.auto-height .modal-wrapper {
|
|
411
|
-
position: relative !important;
|
|
412
|
-
bottom: auto !important;
|
|
413
|
-
left: auto !important;
|
|
414
|
-
right: auto !important;
|
|
415
|
-
height: auto !important;
|
|
416
|
-
max-height: 80vh !important;
|
|
417
|
-
top: auto !important;
|
|
418
|
-
width: 100%;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
.ds-bottom-sheet.auto-height::part(content) {
|
|
422
|
-
position: relative !important;
|
|
423
|
-
height: auto !important;
|
|
424
|
-
max-height: 80vh !important;
|
|
425
|
-
top: auto !important;
|
|
426
|
-
bottom: auto !important;
|
|
427
|
-
}
|
|
409
|
+
/* Auto-height behavior is now part of .ds-bottom-sheet base */
|
|
428
410
|
|
|
429
411
|
/* Ensure action sheet component sizes naturally */
|
|
430
|
-
.ds-bottom-sheet
|
|
412
|
+
.ds-bottom-sheet ds-mobile-actions-bottom-sheet {
|
|
431
413
|
display: block;
|
|
432
414
|
height: auto;
|
|
433
415
|
}
|
|
434
416
|
|
|
435
417
|
/* Ensure action list scrolls if needed */
|
|
436
|
-
.ds-bottom-sheet
|
|
437
|
-
max-height: calc(
|
|
418
|
+
.ds-bottom-sheet .actions-list {
|
|
419
|
+
max-height: calc(85dvh - 80px); /* Account for handle, padding, and safe area */
|
|
438
420
|
overflow-y: auto;
|
|
439
421
|
-webkit-overflow-scrolling: touch;
|
|
440
422
|
}
|
|
441
423
|
|
|
424
|
+
/* Ensure ion-content doesn't force 100% height in sheets */
|
|
425
|
+
.ds-bottom-sheet ion-content {
|
|
426
|
+
height: auto !important;
|
|
427
|
+
--height: auto;
|
|
428
|
+
}
|
|
429
|
+
|
|
442
430
|
/* ============================================
|
|
443
431
|
Mobile Modal Styles (Generic Modal Service)
|
|
444
432
|
============================================ */
|
|
@@ -630,6 +618,24 @@ ion-tab-button::part(native) {
|
|
|
630
618
|
max-height: calc(100vh - var(--app-sheet-top-offset)) !important;
|
|
631
619
|
}
|
|
632
620
|
|
|
621
|
+
/* Auto-height support for base modals */
|
|
622
|
+
.ds-modal-base.auto-height {
|
|
623
|
+
display: flex;
|
|
624
|
+
flex-direction: column;
|
|
625
|
+
justify-content: flex-end;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
.ds-modal-base.auto-height::part(content) {
|
|
629
|
+
height: auto !important;
|
|
630
|
+
margin-top: auto !important;
|
|
631
|
+
position: relative !important;
|
|
632
|
+
top: auto !important;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
.ds-modal-base.auto-height ion-content {
|
|
636
|
+
height: auto !important;
|
|
637
|
+
--height: auto;
|
|
638
|
+
}
|
|
633
639
|
.ds-modal-base::part(backdrop) {
|
|
634
640
|
background: rgba(0, 0, 0, 0.4);
|
|
635
641
|
backdrop-filter: blur(4px);
|