@propbinder/mobile-design 0.2.47 → 0.2.50

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.
Files changed (221) hide show
  1. package/ng-package.json +24 -0
  2. package/package.json +3 -39
  3. package/src/animations/page-transitions.ts +165 -0
  4. package/src/assets/fonts/brockmann-mediumitalic-webfont.woff2 +0 -0
  5. package/src/assets/fonts/brockmann-regularitalic-webfont.woff2 +0 -0
  6. package/src/assets/fonts/brockmann-semibolditalic-webfont.woff2 +0 -0
  7. package/src/components/action-list-item/ds-mobile-action-list-item.ts +102 -0
  8. package/src/components/action-list-item/index.ts +2 -0
  9. package/src/components/app-icon/ds-app-icon.ts +133 -0
  10. package/src/components/app-icon/index.ts +2 -0
  11. package/src/components/attachment-preview/ds-mobile-attachment-preview.css +139 -0
  12. package/src/components/attachment-preview/ds-mobile-attachment-preview.ts +164 -0
  13. package/src/components/attachment-preview/index.ts +1 -0
  14. package/src/components/avatar-with-badge/ds-avatar-with-badge.ts +142 -0
  15. package/src/components/avatar-with-badge/index.ts +2 -0
  16. package/src/components/booking-modal/ds-mobile-booking-confirmation-wrapper.ts +71 -0
  17. package/src/components/booking-modal/ds-mobile-booking-modal.service.ts +121 -0
  18. package/src/components/booking-modal/ds-mobile-booking-modal.ts +598 -0
  19. package/src/components/booking-modal/ds-mobile-booking-summary.ts +161 -0
  20. package/src/components/booking-modal/index.ts +4 -0
  21. package/src/components/bottom-sheet/ds-mobile-actions-bottom-sheet.ts +266 -0
  22. package/src/components/bottom-sheet/ds-mobile-bottom-sheet-header.ts +146 -0
  23. package/src/components/bottom-sheet/ds-mobile-bottom-sheet-wrapper.ts +156 -0
  24. package/src/components/bottom-sheet/ds-mobile-bottom-sheet.css +101 -0
  25. package/src/components/bottom-sheet/ds-mobile-bottom-sheet.service.ts +169 -0
  26. package/src/components/bottom-sheet/ds-mobile-confirmation-sheet.ts +211 -0
  27. package/src/components/bottom-sheet/ds-mobile-post-create-bottom-sheet.ts +578 -0
  28. package/src/components/bottom-sheet/ds-mobile-profile-actions-sheet.ts +614 -0
  29. package/src/components/bottom-sheet/index.ts +8 -0
  30. package/src/components/bottom-sheet/modal-shadow-fix.ts +42 -0
  31. package/src/components/card-inline/ds-mobile-card-inline.ts +301 -0
  32. package/src/components/card-inline/index.ts +2 -0
  33. package/src/components/card-inline-banner/ds-mobile-card-inline-banner.ts +118 -0
  34. package/src/components/card-inline-banner/index.ts +1 -0
  35. package/src/components/card-inline-contact/ds-mobile-card-inline-contact.ts +120 -0
  36. package/src/components/card-inline-contact/index.ts +1 -0
  37. package/src/components/card-inline-file/ds-mobile-card-inline-file.ts +141 -0
  38. package/src/components/card-inline-file/index.ts +1 -0
  39. package/src/components/chat-modal/ds-mobile-chat-modal.css +159 -0
  40. package/src/components/chat-modal/ds-mobile-chat-modal.service.ts +105 -0
  41. package/src/components/chat-modal/ds-mobile-chat-modal.ts +918 -0
  42. package/src/components/chat-modal/index.ts +8 -0
  43. package/src/components/comment/ds-mobile-comment.ts +568 -0
  44. package/src/components/comment/index.ts +2 -0
  45. package/src/components/contact-list-item/ds-mobile-contact-list-item.ts +182 -0
  46. package/src/components/contact-list-item/index.ts +2 -0
  47. package/src/components/content/ds-mobile-content.ts +139 -0
  48. package/src/components/content/index.ts +2 -0
  49. package/src/components/dropdown/ds-mobile-dropdown.css +199 -0
  50. package/src/components/dropdown/ds-mobile-dropdown.ts +340 -0
  51. package/src/components/dropdown/index.ts +2 -0
  52. package/src/components/ds-mobile-tabs.css +407 -0
  53. package/src/components/ds-mobile-tabs.ts +216 -0
  54. package/src/components/empty-state/ds-mobile-empty-state.ts +120 -0
  55. package/src/components/empty-state/index.ts +2 -0
  56. package/src/components/fab/ds-mobile-fab.ts +315 -0
  57. package/src/components/fab/index.ts +1 -0
  58. package/src/components/facility-creation-modal/ds-mobile-facility-creation-confirmation-wrapper.ts +121 -0
  59. package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.css +189 -0
  60. package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.service.ts +135 -0
  61. package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.ts +656 -0
  62. package/src/components/facility-creation-modal/index.ts +9 -0
  63. package/src/components/facility-creation-modal/sheets/ds-mobile-access-sheet.ts +105 -0
  64. package/src/components/facility-creation-modal/sheets/ds-mobile-price-sheet.ts +188 -0
  65. package/src/components/facility-creation-modal/sheets/ds-mobile-when-can-book-sheet.ts +460 -0
  66. package/src/components/facility-creation-modal/sheets/ds-mobile-who-can-book-sheet.ts +134 -0
  67. package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.service.ts +69 -0
  68. package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.ts +379 -0
  69. package/src/components/facility-detail-modal/index.ts +2 -0
  70. package/src/components/file-attachment/ds-mobile-file-attachment.ts +164 -0
  71. package/src/components/file-attachment/index.ts +2 -0
  72. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.css +214 -0
  73. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.service.ts +84 -0
  74. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.ts +424 -0
  75. package/src/components/handbook-detail-modal/index.ts +3 -0
  76. package/src/components/handbook-folder/ds-mobile-handbook-folder-mini.ts +175 -0
  77. package/src/components/handbook-folder/ds-mobile-handbook-folder.ts +533 -0
  78. package/src/components/handbook-folder/index.ts +4 -0
  79. package/src/components/header-content/ds-mobile-header-content.ts +222 -0
  80. package/src/components/header-content/index.ts +2 -0
  81. package/src/components/illustration/ds-mobile-illustration.ts +124 -0
  82. package/src/components/illustration/index.ts +2 -0
  83. package/src/components/index.ts +124 -0
  84. package/src/components/inline-photo/ds-mobile-inline-photo.ts +361 -0
  85. package/src/components/inline-photo/index.ts +1 -0
  86. package/src/components/inline-tabs/ds-mobile-inline-tabs.ts +132 -0
  87. package/src/components/inline-tabs/index.ts +2 -0
  88. package/src/components/interactive-list-item-booking/ds-mobile-interactive-list-item-booking.ts +350 -0
  89. package/src/components/interactive-list-item-booking/index.ts +1 -0
  90. package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.ts +321 -0
  91. package/src/components/interactive-list-item-inquiry/index.ts +2 -0
  92. package/src/components/interactive-list-item-message/ds-mobile-interactive-list-item-message.ts +237 -0
  93. package/src/components/interactive-list-item-message/index.ts +2 -0
  94. package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.ts +549 -0
  95. package/src/components/interactive-list-item-post/ds-mobile-post-pdf-attachment.ts +124 -0
  96. package/src/components/interactive-list-item-post/index.ts +13 -0
  97. package/src/components/lightbox/ds-mobile-lightbox-footer.ts +315 -0
  98. package/src/components/lightbox/ds-mobile-lightbox-header.ts +202 -0
  99. package/src/components/lightbox/ds-mobile-lightbox-image.ts +484 -0
  100. package/src/components/lightbox/ds-mobile-lightbox-pdf.css +377 -0
  101. package/src/components/lightbox/ds-mobile-lightbox-pdf.ts +374 -0
  102. package/src/components/lightbox/ds-mobile-lightbox.css +587 -0
  103. package/src/components/lightbox/ds-mobile-lightbox.service.ts +296 -0
  104. package/src/components/lightbox/ds-mobile-lightbox.ts +529 -0
  105. package/src/components/lightbox/index.ts +22 -0
  106. package/src/components/list-item/ds-mobile-list-item.ts +603 -0
  107. package/src/components/list-item/index.ts +2 -0
  108. package/src/components/list-item-static/ds-mobile-list-item-static.ts +133 -0
  109. package/src/components/list-item-static/index.ts +2 -0
  110. package/src/components/loader-overlay/ds-mobile-loader-overlay.css +49 -0
  111. package/src/components/loader-overlay/ds-mobile-loader-overlay.ts +77 -0
  112. package/src/components/loader-overlay/index.ts +1 -0
  113. package/src/components/logo/ds-logo.ts +95 -0
  114. package/src/components/logo/index.ts +2 -0
  115. package/src/components/message-bubble/ds-mobile-message-bubble.ts +633 -0
  116. package/src/components/message-bubble/index.ts +7 -0
  117. package/src/components/message-composer/ds-mobile-message-composer.ts +1146 -0
  118. package/src/components/message-composer/index.ts +7 -0
  119. package/src/components/modal/ds-mobile-modal.css +163 -0
  120. package/src/components/modal/ds-mobile-modal.service.ts +329 -0
  121. package/src/components/modal/index.ts +8 -0
  122. package/src/components/modal-base/ds-mobile-modal-base.css +378 -0
  123. package/src/components/modal-base/ds-mobile-modal-base.ts +261 -0
  124. package/src/components/modal-base/index.ts +2 -0
  125. package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.css +112 -0
  126. package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.service.ts +93 -0
  127. package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.ts +442 -0
  128. package/src/components/new-inquiry-modal/index.ts +4 -0
  129. package/src/components/offline-banner/ds-mobile-offline-banner.ts +135 -0
  130. package/src/components/offline-banner/index.ts +1 -0
  131. package/src/components/page-details/ds-mobile-page-details.css +83 -0
  132. package/src/components/page-details/ds-mobile-page-details.ts +282 -0
  133. package/src/components/page-details/index.ts +2 -0
  134. package/src/components/page-main/ds-mobile-page-main.css +68 -0
  135. package/src/components/page-main/ds-mobile-page-main.ts +421 -0
  136. package/src/components/page-main/index.ts +2 -0
  137. package/src/components/post-composer/ds-mobile-post-composer.ts +140 -0
  138. package/src/components/post-composer/index.ts +2 -0
  139. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.css +390 -0
  140. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.service.ts +108 -0
  141. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.ts +722 -0
  142. package/src/components/post-detail-modal/index.ts +9 -0
  143. package/src/components/property-banner/ds-mobile-property-banner.ts +95 -0
  144. package/src/components/property-banner/index.ts +2 -0
  145. package/src/components/section/ds-mobile-section.ts +263 -0
  146. package/src/components/section/index.ts +2 -0
  147. package/src/components/shared/directives/index.ts +2 -0
  148. package/src/components/shared/directives/long-press.directive.ts +212 -0
  149. package/src/components/shared/index.ts +3 -0
  150. package/src/components/shared/mobile-modal-base.ts +457 -0
  151. package/src/components/shared/mobile-page-base.ts +204 -0
  152. package/src/components/swiper/ds-mobile-swiper-with-nav.ts +160 -0
  153. package/src/components/swiper/ds-mobile-swiper.ts +327 -0
  154. package/src/components/swiper/index.ts +3 -0
  155. package/src/components/system-message-banner/ds-mobile-system-message-banner.ts +129 -0
  156. package/src/components/system-message-banner/index.ts +2 -0
  157. package/src/components/tab-bar/ds-mobile-tab-bar.css +533 -0
  158. package/src/components/tab-bar/ds-mobile-tab-bar.ts +735 -0
  159. package/src/components/tab-bar/index.ts +2 -0
  160. package/src/components/tabs/ds-mobile-tabs.css +25 -0
  161. package/src/components/tabs/ds-mobile-tabs.ts +89 -0
  162. package/src/components/tabs/index.ts +2 -0
  163. package/src/components/text-input/ds-text-input.ts +287 -0
  164. package/src/components/text-input/index.ts +2 -0
  165. package/src/examples/booking.page.ts +434 -0
  166. package/src/examples/community.page.ts +776 -0
  167. package/src/examples/handbook.page.ts +324 -0
  168. package/src/examples/home.page.ts +347 -0
  169. package/src/examples/index.ts +12 -0
  170. package/src/examples/inquiries.example.ts +273 -0
  171. package/src/examples/inquiry-detail.example.css +189 -0
  172. package/src/examples/inquiry-detail.example.ts +415 -0
  173. package/src/examples/mobile-tabs-example.component.ts +208 -0
  174. package/src/examples/post-create.page.ts +311 -0
  175. package/src/examples/post-detail.page.ts +296 -0
  176. package/src/examples/sign-in.page.ts +291 -0
  177. package/src/examples/whitelabel-demo-modal.component.ts +1094 -0
  178. package/src/examples/whitelabel-demo-modal.service.ts +77 -0
  179. package/src/models/index.ts +7 -0
  180. package/src/models/post.model.ts +41 -0
  181. package/src/pages/community.page.ts +769 -0
  182. package/src/pages/handbook.page.ts +388 -0
  183. package/src/pages/home.page.ts +303 -0
  184. package/src/pages/index.ts +11 -0
  185. package/src/pages/inquiries.example.ts +273 -0
  186. package/src/pages/inquiry-detail.example.css +189 -0
  187. package/src/pages/inquiry-detail.example.ts +415 -0
  188. package/src/pages/mobile-tabs-example.component.ts +179 -0
  189. package/src/pages/post-create.page.ts +311 -0
  190. package/src/pages/post-detail.page.ts +296 -0
  191. package/src/pages/sign-in.page.ts +291 -0
  192. package/src/pages/whitelabel-demo-modal.component.ts +1094 -0
  193. package/src/pages/whitelabel-demo-modal.service.ts +77 -0
  194. package/src/public-api.ts +6 -0
  195. package/src/services/base-modal.service.ts +101 -0
  196. package/src/services/index.ts +11 -0
  197. package/src/services/posts.service.ts +542 -0
  198. package/src/services/tracking-permission.service.ts +88 -0
  199. package/src/services/user.service.ts +60 -0
  200. package/src/services/whitelabel.service.ts +675 -0
  201. package/{styles → src/styles}/ionic.css +25 -0
  202. package/tsconfig.lib.json +17 -0
  203. package/tsconfig.lib.prod.json +9 -0
  204. package/tsconfig.spec.json +13 -0
  205. package/fesm2022/propbinder-mobile-design.mjs +0 -26136
  206. package/fesm2022/propbinder-mobile-design.mjs.map +0 -1
  207. package/index.d.ts +0 -8154
  208. /package/{assets → src/assets}/fonts/Brockmann-Bold.otf +0 -0
  209. /package/{assets → src/assets}/fonts/Brockmann-BoldItalic.otf +0 -0
  210. /package/{assets → src/assets}/fonts/Brockmann-Medium.otf +0 -0
  211. /package/{assets → src/assets}/fonts/Brockmann-MediumItalic.otf +0 -0
  212. /package/{assets → src/assets}/fonts/Brockmann-Regular.otf +0 -0
  213. /package/{assets → src/assets}/fonts/Brockmann-RegularItalic.otf +0 -0
  214. /package/{assets → src/assets}/fonts/Brockmann-SemiBold.otf +0 -0
  215. /package/{assets → src/assets}/fonts/Brockmann-SemiBoldItalic.otf +0 -0
  216. /package/{assets → src/assets}/fonts/Brockmann_desktop_license.pdf +0 -0
  217. /package/{assets → src/assets}/fonts/brockmann-medium-webfont.woff2 +0 -0
  218. /package/{assets → src/assets}/fonts/brockmann-regular-webfont.woff2 +0 -0
  219. /package/{assets → src/assets}/fonts/brockmann-semibold-webfont.woff2 +0 -0
  220. /package/{styles → src/components/shared}/mobile-common.css +0 -0
  221. /package/{styles → src/components/shared}/mobile-page-base.css +0 -0
@@ -0,0 +1,7 @@
1
+ export { DsMobileMessageComposerComponent } from './ds-mobile-message-composer';
2
+
3
+
4
+
5
+
6
+
7
+
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Mobile Modal Styles
3
+ *
4
+ * Global styles for modals opened via DsMobileModalService.
5
+ * These styles are applied to all modals and handle different presentation styles.
6
+ */
7
+
8
+ /* Base modal styles */
9
+ .ds-mobile-modal {
10
+ --background: var(--color-background-neutral-primary, #ffffff);
11
+ --border-radius: 16px;
12
+ --box-shadow: none;
13
+ --max-width: 640px;
14
+ --width: 100%;
15
+ }
16
+
17
+ .ds-mobile-modal::part(content) {
18
+ max-width: 640px;
19
+ margin: 0 auto;
20
+ }
21
+
22
+ /* Fullscreen presentation */
23
+ .ds-modal-fullscreen {
24
+ --width: 100%;
25
+ --height: 100%;
26
+ --border-radius: 0;
27
+ }
28
+
29
+ .ds-modal-fullscreen::part(content) {
30
+ border-radius: 0;
31
+ }
32
+
33
+ /* Card presentation (default iOS modal style) */
34
+ .ds-modal-card {
35
+ --width: 100%;
36
+ --max-width: 640px;
37
+ --height: auto;
38
+ --max-height: 90%;
39
+ --border-radius: 16px 16px 0 0;
40
+ }
41
+
42
+ .ds-modal-card::part(content) {
43
+ border-radius: 16px 16px 0 0;
44
+ box-shadow: var(--box-shadow);
45
+ max-width: 640px;
46
+ margin: 0 auto;
47
+ }
48
+
49
+ /* Sheet presentation (bottom sheet with breakpoints) */
50
+ .ds-modal-sheet {
51
+ --width: 100%;
52
+ --max-width: 640px;
53
+ --height: auto;
54
+ --border-radius: 16px 16px 0 0;
55
+ }
56
+
57
+ .ds-modal-sheet::part(content) {
58
+ border-radius: 16px 16px 0 0;
59
+ box-shadow: var(--box-shadow);
60
+ max-width: 640px;
61
+ margin: 0 auto;
62
+ }
63
+
64
+ .ds-modal-sheet::part(handle) {
65
+ background: var(--border-color-default);
66
+ width: 36px;
67
+ height: 4px;
68
+ border-radius: 2px;
69
+ margin: 8px auto 0;
70
+ }
71
+
72
+ /* Backdrop styles */
73
+ .ds-mobile-modal::part(backdrop) {
74
+ background: rgba(0, 0, 0, 0.4);
75
+ backdrop-filter: blur(4px);
76
+ }
77
+
78
+ /* Animations */
79
+ .ds-mobile-modal.modal-card-enter-active,
80
+ .ds-mobile-modal.modal-sheet-enter-active {
81
+ animation: slideUp 0.3s ease-out;
82
+ }
83
+
84
+ .ds-mobile-modal.modal-card-leave-active,
85
+ .ds-mobile-modal.modal-sheet-leave-active {
86
+ animation: slideDown 0.3s ease-in;
87
+ }
88
+
89
+ .ds-mobile-modal.modal-fullscreen-enter-active {
90
+ animation: fadeIn 0.2s ease-out;
91
+ }
92
+
93
+ .ds-mobile-modal.modal-fullscreen-leave-active {
94
+ animation: fadeOut 0.2s ease-in;
95
+ }
96
+
97
+ @keyframes slideUp {
98
+ from {
99
+ transform: translateY(100%);
100
+ }
101
+ to {
102
+ transform: translateY(0);
103
+ }
104
+ }
105
+
106
+ @keyframes slideDown {
107
+ from {
108
+ transform: translateY(0);
109
+ }
110
+ to {
111
+ transform: translateY(100%);
112
+ }
113
+ }
114
+
115
+ @keyframes fadeIn {
116
+ from {
117
+ opacity: 0;
118
+ }
119
+ to {
120
+ opacity: 1;
121
+ }
122
+ }
123
+
124
+ @keyframes fadeOut {
125
+ from {
126
+ opacity: 1;
127
+ }
128
+ to {
129
+ opacity: 0;
130
+ }
131
+ }
132
+
133
+ /* Safe area handling for notched devices */
134
+ @supports (padding: env(safe-area-inset-top)) {
135
+ .ds-modal-fullscreen::part(content) {
136
+ padding-top: env(safe-area-inset-top);
137
+ padding-bottom: env(safe-area-inset-bottom);
138
+ }
139
+ }
140
+
141
+ /* Dark mode support (if needed) */
142
+ @media (prefers-color-scheme: dark) {
143
+ .ds-mobile-modal {
144
+ --background: var(--color-background-neutral-primary-dark, #1a1a1a);
145
+ }
146
+
147
+ .ds-mobile-modal::part(backdrop) {
148
+ background: rgba(0, 0, 0, 0.6);
149
+ }
150
+ }
151
+
152
+ /* Accessibility: Reduced motion */
153
+ @media (prefers-reduced-motion: reduce) {
154
+ .ds-mobile-modal.modal-card-enter-active,
155
+ .ds-mobile-modal.modal-card-leave-active,
156
+ .ds-mobile-modal.modal-sheet-enter-active,
157
+ .ds-mobile-modal.modal-sheet-leave-active,
158
+ .ds-mobile-modal.modal-fullscreen-enter-active,
159
+ .ds-mobile-modal.modal-fullscreen-leave-active {
160
+ animation: none;
161
+ }
162
+ }
163
+
@@ -0,0 +1,329 @@
1
+ import { Injectable, Type } from '@angular/core';
2
+ import { ModalController } from '@ionic/angular/standalone';
3
+
4
+ /**
5
+ * Configuration options for modal presentation
6
+ */
7
+ export interface ModalOptions<T = any> {
8
+ /** The component to display in the modal */
9
+ component: Type<T>;
10
+ /** Props to pass to the component */
11
+ componentProps?: Record<string, any>;
12
+ /** CSS class(es) to apply to the modal */
13
+ cssClass?: string | string[];
14
+ /** Modal presentation style */
15
+ presentationStyle?: 'fullscreen' | 'card' | 'sheet';
16
+ /** Enable backdrop dismiss (tap outside to close) */
17
+ backdropDismiss?: boolean;
18
+ /** Show backdrop */
19
+ showBackdrop?: boolean;
20
+ /** Enable keyboard close (ESC key) */
21
+ keyboardClose?: boolean;
22
+ /** Enable swipe to close */
23
+ swipeToClose?: boolean;
24
+ /** Initial breakpoint (0-1) for sheet presentation */
25
+ initialBreakpoint?: number;
26
+ /** Available breakpoints for sheet presentation */
27
+ breakpoints?: number[];
28
+ /** Animation type */
29
+ animated?: boolean;
30
+ /** Mode (ios or md) */
31
+ mode?: 'ios' | 'md';
32
+ /** Whether to handle navigation back button */
33
+ handleNavigationBack?: boolean;
34
+ }
35
+
36
+ /**
37
+ * DsMobileModalService
38
+ *
39
+ * Generic service for displaying any component as a modal.
40
+ * Built on Ionic's modal system with customizable presentation styles.
41
+ *
42
+ * Features:
43
+ * - Open any component as a modal
44
+ * - Fullscreen, card, or sheet presentation styles
45
+ * - Customizable backdrop and dismissal behavior
46
+ * - Native gestures and animations
47
+ * - Type-safe component props
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * import { MobilePostDetailPageComponent } from './post-detail.page';
52
+ *
53
+ * constructor(private modal: DsMobileModalService) {}
54
+ *
55
+ * async openPostModal() {
56
+ * await this.modal.open({
57
+ * component: MobilePostDetailPageComponent,
58
+ * componentProps: {
59
+ * postId: '123',
60
+ * authorName: 'John Doe'
61
+ * },
62
+ * presentationStyle: 'card',
63
+ * backdropDismiss: true
64
+ * });
65
+ * }
66
+ * ```
67
+ *
68
+ * @example Sheet presentation with breakpoints
69
+ * ```typescript
70
+ * async openSheet() {
71
+ * await this.modal.open({
72
+ * component: CommentsComponent,
73
+ * presentationStyle: 'sheet',
74
+ * initialBreakpoint: 0.5,
75
+ * breakpoints: [0, 0.5, 0.75, 1],
76
+ * swipeToClose: true
77
+ * });
78
+ * }
79
+ * ```
80
+ */
81
+ @Injectable({
82
+ providedIn: 'root',
83
+ })
84
+ export class DsMobileModalService {
85
+ constructor(private modalController: ModalController) {}
86
+
87
+ /**
88
+ * Open a component as a modal
89
+ *
90
+ * @param options Configuration options for the modal
91
+ * @returns Promise that resolves when the modal is presented
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * await this.modal.open({
96
+ * component: MyComponent,
97
+ * componentProps: { data: 'value' },
98
+ * presentationStyle: 'fullscreen'
99
+ * });
100
+ * ```
101
+ */
102
+ async open<T = any>(options: ModalOptions<T>): Promise<HTMLIonModalElement> {
103
+ // console.log('[Modal] Opening modal with options:', options);
104
+
105
+ const {
106
+ component,
107
+ componentProps,
108
+ cssClass,
109
+ presentationStyle = 'card',
110
+ backdropDismiss = true,
111
+ showBackdrop = true,
112
+ keyboardClose = true,
113
+ swipeToClose,
114
+ initialBreakpoint,
115
+ breakpoints,
116
+ animated = true,
117
+ mode = 'ios',
118
+ handleNavigationBack = true,
119
+ } = options;
120
+
121
+ // Build modal configuration
122
+ const modalConfig: any = {
123
+ component,
124
+ componentProps: componentProps || {},
125
+ cssClass: this.buildCssClasses(cssClass, presentationStyle),
126
+ mode,
127
+ backdropDismiss,
128
+ showBackdrop,
129
+ animated,
130
+ keyboardClose,
131
+ presentingElement:
132
+ document.querySelector('ion-router-outlet') || undefined,
133
+ handle: presentationStyle === 'sheet', // Show handle for sheet presentation
134
+ };
135
+
136
+ // Add swipe to close for sheet presentation
137
+ if (swipeToClose !== undefined) {
138
+ modalConfig.canDismiss = swipeToClose;
139
+ }
140
+
141
+ // Add breakpoints for sheet presentation
142
+ if (presentationStyle === 'sheet' && breakpoints) {
143
+ modalConfig.breakpoints = breakpoints;
144
+ if (initialBreakpoint !== undefined) {
145
+ modalConfig.initialBreakpoint = initialBreakpoint;
146
+ }
147
+ }
148
+
149
+ // Handle navigation back button
150
+ if (handleNavigationBack) {
151
+ modalConfig.canDismiss = async () => {
152
+ // You can add custom logic here if needed
153
+ return true;
154
+ };
155
+ }
156
+
157
+ const modal = await this.modalController.create(modalConfig);
158
+
159
+ // console.log('[Modal] Modal created, presenting...');
160
+ await modal.present();
161
+ // console.log('[Modal] Modal presented');
162
+
163
+ return modal;
164
+ }
165
+
166
+ /**
167
+ * Open a component as a fullscreen modal
168
+ *
169
+ * @param component Component to display
170
+ * @param componentProps Props to pass to the component
171
+ * @returns Promise that resolves when the modal is presented
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * await this.modal.openFullscreen(PostDetailPage, { postId: '123' });
176
+ * ```
177
+ */
178
+ async openFullscreen<T = any>(
179
+ component: Type<T>,
180
+ componentProps?: Record<string, any>
181
+ ): Promise<HTMLIonModalElement> {
182
+ return this.open({
183
+ component,
184
+ componentProps,
185
+ presentationStyle: 'fullscreen',
186
+ backdropDismiss: false,
187
+ showBackdrop: false,
188
+ });
189
+ }
190
+
191
+ /**
192
+ * Open a component as a card modal
193
+ *
194
+ * @param component Component to display
195
+ * @param componentProps Props to pass to the component
196
+ * @returns Promise that resolves when the modal is presented
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * await this.modal.openCard(DetailComponent, { itemId: '456' });
201
+ * ```
202
+ */
203
+ async openCard<T = any>(
204
+ component: Type<T>,
205
+ componentProps?: Record<string, any>
206
+ ): Promise<HTMLIonModalElement> {
207
+ return this.open({
208
+ component,
209
+ componentProps,
210
+ presentationStyle: 'card',
211
+ backdropDismiss: true,
212
+ showBackdrop: true,
213
+ });
214
+ }
215
+
216
+ /**
217
+ * Open a component as a bottom sheet
218
+ *
219
+ * @param component Component to display
220
+ * @param componentProps Props to pass to the component
221
+ * @param options Additional sheet options (breakpoints, etc.)
222
+ * @returns Promise that resolves when the modal is presented
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * await this.modal.openSheet(
227
+ * CommentsComponent,
228
+ * { postId: '789' },
229
+ * { initialBreakpoint: 0.5, breakpoints: [0, 0.5, 1] }
230
+ * );
231
+ * ```
232
+ */
233
+ async openSheet<T = any>(
234
+ component: Type<T>,
235
+ componentProps?: Record<string, any>,
236
+ options?: {
237
+ initialBreakpoint?: number;
238
+ breakpoints?: number[];
239
+ swipeToClose?: boolean;
240
+ }
241
+ ): Promise<HTMLIonModalElement> {
242
+ return this.open({
243
+ component,
244
+ componentProps,
245
+ presentationStyle: 'sheet',
246
+ backdropDismiss: true,
247
+ showBackdrop: true,
248
+ swipeToClose: options?.swipeToClose ?? true,
249
+ initialBreakpoint: options?.initialBreakpoint ?? 0.5,
250
+ breakpoints: options?.breakpoints ?? [0, 0.5, 0.75, 1],
251
+ });
252
+ }
253
+
254
+ /**
255
+ * Close the currently open modal
256
+ *
257
+ * @param data Optional data to pass back when dismissing
258
+ * @param role Optional role (e.g., 'cancel', 'confirm')
259
+ * @returns Promise that resolves when the modal is dismissed
260
+ *
261
+ * @example
262
+ * ```typescript
263
+ * await this.modal.dismiss({ saved: true }, 'confirm');
264
+ * ```
265
+ */
266
+ async dismiss(data?: any, role?: string): Promise<boolean> {
267
+ return this.modalController.dismiss(data, role);
268
+ }
269
+
270
+ /**
271
+ * Get the top-most modal if one exists
272
+ *
273
+ * @returns Promise that resolves to the modal element or undefined
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * const topModal = await this.modal.getTop();
278
+ * if (topModal) {
279
+ * await topModal.dismiss();
280
+ * }
281
+ * ```
282
+ */
283
+ async getTop(): Promise<HTMLIonModalElement | undefined> {
284
+ return this.modalController.getTop();
285
+ }
286
+
287
+ /**
288
+ * Get all currently open modals
289
+ *
290
+ * @returns Promise that resolves to an array of modal elements
291
+ */
292
+ async getAll(): Promise<HTMLIonModalElement[]> {
293
+ const modals: HTMLIonModalElement[] = [];
294
+ let modal = await this.modalController.getTop();
295
+
296
+ while (modal) {
297
+ modals.push(modal);
298
+ // Get the next modal in the stack
299
+ await modal.dismiss();
300
+ modal = await this.modalController.getTop();
301
+ }
302
+
303
+ return modals;
304
+ }
305
+
306
+ /**
307
+ * Build CSS classes for the modal
308
+ */
309
+ private buildCssClasses(
310
+ customClass?: string | string[],
311
+ presentationStyle?: string
312
+ ): string[] {
313
+ const classes: string[] = ['ds-mobile-modal'];
314
+
315
+ if (presentationStyle) {
316
+ classes.push(`ds-modal-${presentationStyle}`);
317
+ }
318
+
319
+ if (customClass) {
320
+ if (Array.isArray(customClass)) {
321
+ classes.push(...customClass);
322
+ } else {
323
+ classes.push(customClass);
324
+ }
325
+ }
326
+
327
+ return classes;
328
+ }
329
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Mobile Modal Module
3
+ *
4
+ * Generic service for opening any component as a modal
5
+ */
6
+
7
+ export * from './ds-mobile-modal.service';
8
+