@propbinder/mobile-design 0.2.34 → 0.2.36

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/index.d.ts CHANGED
@@ -5426,6 +5426,16 @@ interface ChatModalData {
5426
5426
  currentUserAvatarSrc?: string;
5427
5427
  /** Auto-focus input when modal opens */
5428
5428
  autoFocus?: boolean;
5429
+ /**
5430
+ * Callback executed when a message is sent from the chat.
5431
+ * Use this to handle API calls to your backend.
5432
+ */
5433
+ onSend?: (message: string, attachments: AttachmentData[]) => void | Promise<void>;
5434
+ /**
5435
+ * Optional callback for when a file attachment is clicked.
5436
+ * If not provided, the default behavior will try to open/download the file.
5437
+ */
5438
+ onFileClick?: (file: AttachmentData) => void;
5429
5439
  }
5430
5440
  /**
5431
5441
  * DsMobileChatModalComponent
@@ -5653,7 +5663,16 @@ declare class DsMobileChatModalComponent implements OnInit, AfterViewInit {
5653
5663
  * ],
5654
5664
  * currentUserId: '456',
5655
5665
  * currentUserInitials: 'JD',
5656
- * autoFocus: true
5666
+ * currentUserInitials: 'JD',
5667
+ * autoFocus: true,
5668
+ * onSend: async (message, attachments) => {
5669
+ * console.log('Sending message:', message);
5670
+ * // await this.chatService.sendMessage(participant.id, message, attachments);
5671
+ * },
5672
+ * onFileClick: (file) => {
5673
+ * console.log('File clicked:', file);
5674
+ * // window.open(file.url, '_blank');
5675
+ * }
5657
5676
  * });
5658
5677
  * }
5659
5678
  * ```
@@ -6985,7 +7004,7 @@ declare class DsMobileHandbookFolderMiniComponent {
6985
7004
  * ```
6986
7005
  */
6987
7006
  declare class DsTextInputComponent implements ControlValueAccessor {
6988
- type: _angular_core.InputSignal<"search" | "text" | "url" | "email" | "tel" | "password">;
7007
+ type: _angular_core.InputSignal<"search" | "text" | "email" | "password" | "tel" | "url">;
6989
7008
  placeholder: _angular_core.InputSignal<string>;
6990
7009
  disabled: _angular_core.InputSignal<boolean>;
6991
7010
  readonly: _angular_core.InputSignal<boolean>;
@@ -6993,7 +7012,7 @@ declare class DsTextInputComponent implements ControlValueAccessor {
6993
7012
  hasError: _angular_core.InputSignal<boolean>;
6994
7013
  errorMessage: _angular_core.InputSignal<string>;
6995
7014
  autocomplete: _angular_core.InputSignal<string>;
6996
- inputmode: _angular_core.InputSignal<"search" | "text" | "url" | "numeric" | "email" | "tel" | undefined>;
7015
+ inputmode: _angular_core.InputSignal<"search" | "text" | "numeric" | "email" | "tel" | "url" | undefined>;
6997
7016
  autoClearError: _angular_core.InputSignal<boolean>;
6998
7017
  validator: _angular_core.InputSignal<((value: string) => boolean) | null>;
6999
7018
  valueChange: _angular_core.OutputEmitterRef<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@propbinder/mobile-design",
3
- "version": "0.2.34",
3
+ "version": "0.2.36",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0 || ^21.0.0",
6
6
  "@angular/core": "^20.3.0 || ^21.0.0"
package/styles/ionic.css CHANGED
@@ -279,17 +279,16 @@ ion-modal:not(.ds-bottom-sheet) {
279
279
  --background: var(--color-background-neutral-primary);
280
280
  --border-radius: 16px;
281
281
  --box-shadow: var(--box-shadow-lg);
282
- --height: auto;
283
- max-height: 100dvh;
284
- height: 100dvh !important;
282
+ /* Prevent modal from resizing when keyboard appears */
283
+ height: 100% !important;
284
+ max-height: 100vh !important;
285
285
  }
286
286
 
287
287
  /* Prevent modal container from resizing when keyboard appears */
288
288
  ion-modal:not(.ds-bottom-sheet)::part(content) {
289
289
  position: fixed !important;
290
- max-height: 100dvh !important;
291
- /* Ensure content doesn't get cut off by keyboard or safe area */
292
- padding-bottom: env(safe-area-inset-bottom);
290
+ height: 100% !important;
291
+ max-height: 100vh !important;
293
292
  }
294
293
 
295
294
  /* Prevent ion-content inside modals from resizing */
@@ -329,15 +328,9 @@ ion-toast {
329
328
  --box-shadow: 0px -2px 24px rgba(0, 0, 0, 0.12);
330
329
  --backdrop-opacity: 0.4;
331
330
  transition: --backdrop-opacity 0.3s ease;
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;
331
+ /* Modal at top:0 so backdrop covers full screen including status bar */
332
+ top: 0;
333
+ height: 100%;
341
334
  }
342
335
 
343
336
  /* Backdrop styling */
@@ -355,21 +348,18 @@ ion-toast {
355
348
  margin-bottom: 8px;
356
349
  }
357
350
 
358
- /* Content area styling - Support auto-height by default for sheets */
351
+ /* Content area styling */
359
352
  .ds-bottom-sheet::part(content) {
360
353
  /* Offset content below status bar (backdrop still covers full screen) */
361
354
  margin-top: var(--app-sheet-top-offset);
362
355
  border-radius: var(--border-radius) var(--border-radius) 0 0;
363
356
  background: var(--color-background-neutral-primary, #ffffff);
364
357
  box-shadow: var(--box-shadow);
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;
358
+ position: absolute !important;
359
+ top: 0 !important;
360
+ bottom: 0 !important;
361
+ height: 100% !important;
362
+ max-height: 100% !important;
373
363
  }
374
364
 
375
365
  /* Remove border radius when fully expanded */
@@ -406,8 +396,23 @@ ion-toast {
406
396
  Make action sheets auto-size to their content
407
397
  ============================================ */
408
398
 
409
- /* Auto-height behavior is now part of .ds-bottom-sheet base */
399
+ /* Auto-height modal - override base bottom sheet styles */
400
+ .ds-bottom-sheet.auto-height {
401
+ top: 0 !important;
402
+ height: 100% !important;
403
+ display: flex;
404
+ flex-direction: column;
405
+ justify-content: flex-end;
406
+ }
410
407
 
408
+ .ds-bottom-sheet.auto-height::part(content) {
409
+ position: relative !important;
410
+ height: auto !important;
411
+ max-height: 80vh !important;
412
+ top: auto !important;
413
+ bottom: auto !important;
414
+ margin-top: auto !important;
415
+ }
411
416
  /* Ensure action sheet component sizes naturally */
412
417
  .ds-bottom-sheet ds-mobile-actions-bottom-sheet {
413
418
  display: block;
@@ -621,12 +626,9 @@ ion-modal.ds-modal-base {
621
626
  --background: var(--color-background-neutral-primary, #ffffff);
622
627
  --width: 100%;
623
628
  --max-width: 640px;
624
- /* Subtract top offset from total height to avoid bottom clipping */
625
- --height: calc(100dvh - var(--app-sheet-top-offset, 24px)) !important;
626
- --max-height: calc(100dvh - var(--app-sheet-top-offset, 24px)) !important;
629
+ --height: 100dvh;
630
+ /* Full viewport height - content top offset creates gap */
627
631
  --border-radius: 16px 16px 0 0;
628
- display: flex !important;
629
- align-items: flex-end !important;
630
632
  }
631
633
 
632
634
  ion-modal.ds-modal-base::part(content) {
@@ -635,11 +637,10 @@ ion-modal.ds-modal-base::part(content) {
635
637
  background: var(--color-background-neutral-primary, #ffffff);
636
638
  max-width: 640px;
637
639
  margin: 0 auto;
638
- /* Reset Ionic's default top offset and stick to bottom */
639
- top: auto !important;
640
- bottom: 0 !important;
641
- height: 100% !important;
642
- position: relative !important;
640
+ /* Use top positioning instead of margin-top to work with fixed positioning */
641
+ top: var(--app-sheet-top-offset) !important;
642
+ height: calc(100% - var(--app-sheet-top-offset)) !important;
643
+ max-height: calc(100dvh - var(--app-sheet-top-offset)) !important;
643
644
  }
644
645
 
645
646
  /* Auto-height support for base modals */