@propbinder/mobile-design 0.2.48 → 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 -26168
  206. package/fesm2022/propbinder-mobile-design.mjs.map +0 -1
  207. package/index.d.ts +0 -8169
  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,24 @@
1
+ {
2
+ "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
+ "dest": "../../dist/mobile-design-lib",
4
+ "lib": {
5
+ "entryFile": "src/public-api.ts"
6
+ },
7
+ "assets": [
8
+ {
9
+ "input": "src/styles",
10
+ "glob": "**/*.css",
11
+ "output": "styles"
12
+ },
13
+ {
14
+ "input": "src/components/shared",
15
+ "glob": "*.css",
16
+ "output": "styles"
17
+ },
18
+ {
19
+ "input": "src/assets",
20
+ "glob": "**/*",
21
+ "output": "assets"
22
+ }
23
+ ]
24
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@propbinder/mobile-design",
3
- "version": "0.2.48",
3
+ "version": "0.2.50",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0 || ^21.0.0",
6
6
  "@angular/core": "^20.3.0 || ^21.0.0"
@@ -8,41 +8,5 @@
8
8
  "dependencies": {
9
9
  "tslib": "^2.3.0"
10
10
  },
11
- "sideEffects": [
12
- "./styles/**/*.css",
13
- "./ui/**/*.css"
14
- ],
15
- "module": "fesm2022/propbinder-mobile-design.mjs",
16
- "typings": "index.d.ts",
17
- "exports": {
18
- "./package.json": {
19
- "default": "./package.json"
20
- },
21
- ".": {
22
- "types": "./index.d.ts",
23
- "default": "./fesm2022/propbinder-mobile-design.mjs"
24
- },
25
- "./styles/*": {
26
- "default": "./styles/*"
27
- },
28
- "./styles/globals.css": {
29
- "default": "./styles/globals.css"
30
- },
31
- "./styles/ionic.css": {
32
- "default": "./styles/ionic.css"
33
- },
34
- "./styles/mobile-common.css": {
35
- "default": "./styles/mobile-common.css"
36
- },
37
- "./styles/mobile-page-base.css": {
38
- "default": "./styles/mobile-page-base.css"
39
- },
40
- "./ui/*": {
41
- "default": "./ui/*"
42
- },
43
- "./assets/*": {
44
- "default": "./assets/*"
45
- }
46
- },
47
- "types": "./index.d.ts"
48
- }
11
+ "sideEffects": false
12
+ }
@@ -0,0 +1,165 @@
1
+ import { Animation } from '@ionic/angular';
2
+ import { createAnimation } from '@ionic/core';
3
+
4
+ /**
5
+ * Custom page transition - iOS-style push/pop with dark overlay
6
+ *
7
+ * FORWARD (navigating TO detail):
8
+ * - Entering page (detail): slides in from RIGHT, z-index 10 (on top)
9
+ * - Leaving page (list): slides LEFT slightly, z-index 9 (underneath)
10
+ * - Dark overlay: fades in on leaving page (opacity 0 to 0.70)
11
+ *
12
+ * REVERSE (swipe back FROM detail):
13
+ * - Entering page (list): slides in from LEFT, z-index 9 (underneath)
14
+ * - Leaving page (detail): slides out to RIGHT, z-index 10 (on top)
15
+ * - Dark overlay: fades out on entering page (main page underneath, opacity 0.70 to 0)
16
+ */
17
+ export const customPageTransition = (_: HTMLElement, opts: any): Animation => {
18
+ const DURATION = 600;
19
+ const isBackDirection = opts.direction === 'back';
20
+
21
+ const rootTransition = createAnimation()
22
+ .duration(opts.duration || DURATION)
23
+ .easing('cubic-bezier(0.32,0.72,0,1)');
24
+
25
+ // Create overlay element
26
+ // Forward: overlay on leaving page (main page underneath)
27
+ // Back: overlay on entering page (main page underneath)
28
+ const overlayEl = document.createElement('div');
29
+ overlayEl.style.position = 'absolute';
30
+ overlayEl.style.top = '0';
31
+ overlayEl.style.left = '0';
32
+ overlayEl.style.right = '0';
33
+ overlayEl.style.bottom = '0';
34
+ overlayEl.style.backgroundColor = '#000';
35
+ overlayEl.style.opacity = isBackDirection ? '0.70' : '0';
36
+ overlayEl.style.zIndex = '1';
37
+ overlayEl.style.pointerEvents = 'none';
38
+
39
+ // Add overlay to the page that should have it (main page underneath)
40
+ // Forward: leaving page is main page
41
+ // Back: entering page is main page
42
+ const targetPageEl = isBackDirection ? opts.enteringEl : opts.leavingEl;
43
+ if (targetPageEl) {
44
+ const currentPosition = window.getComputedStyle(targetPageEl).position;
45
+ if (currentPosition === 'static') {
46
+ targetPageEl.style.position = 'relative';
47
+ }
48
+ targetPageEl.appendChild(overlayEl);
49
+ }
50
+
51
+ // Entering page animation
52
+ const enteringPage = createAnimation()
53
+ .addElement(opts.enteringEl)
54
+ .beforeRemoveClass('ion-page-invisible')
55
+ .beforeStyles({
56
+ 'z-index': isBackDirection ? '9' : '10',
57
+ 'opacity': '1'
58
+ })
59
+ .fromTo('transform',
60
+ isBackDirection ? 'translateX(-20%)' : 'translateX(100%)',
61
+ 'translateX(0)'
62
+ );
63
+
64
+ // Leaving page animation
65
+ const leavingPage = createAnimation()
66
+ .addElement(opts.leavingEl)
67
+ .beforeStyles({
68
+ 'z-index': isBackDirection ? '10' : '9'
69
+ })
70
+ .fromTo('transform',
71
+ 'translateX(0)',
72
+ isBackDirection ? 'translateX(100%)' : 'translateX(-20%)'
73
+ );
74
+
75
+ // Overlay fade animation
76
+ const overlayAnimation = createAnimation()
77
+ .addElement(overlayEl)
78
+ .fromTo('opacity',
79
+ isBackDirection ? '0.70' : '0',
80
+ isBackDirection ? '0' : '0.70'
81
+ );
82
+
83
+ // Clean up overlay after animation completes
84
+ rootTransition.afterAddWrite(() => {
85
+ if (overlayEl && overlayEl.parentNode) {
86
+ overlayEl.parentNode.removeChild(overlayEl);
87
+ }
88
+ });
89
+
90
+ rootTransition.addAnimation([enteringPage, leavingPage, overlayAnimation]);
91
+
92
+ return rootTransition;
93
+ };
94
+
95
+ /**
96
+ * Custom back transition - iOS style where page slides out to reveal page underneath
97
+ * The entering page (inquiries) slides in from the LEFT underneath
98
+ * The leaving page (detail) slides out to the RIGHT on top
99
+ * Dark overlay: fades out on entering page (main page underneath, opacity 0.70 to 0)
100
+ */
101
+ export const customBackTransition = (_: HTMLElement, opts: any): Animation => {
102
+ const DURATION = 700;
103
+
104
+ const rootTransition = createAnimation()
105
+ .duration(opts.duration || DURATION)
106
+ .easing('cubic-bezier(0.32,0.72,0,1)');
107
+
108
+ // Create overlay element for the entering page (main page underneath)
109
+ // This page should already have an overlay from the forward transition, but we'll ensure it exists
110
+ const overlayEl = document.createElement('div');
111
+ overlayEl.style.position = 'absolute';
112
+ overlayEl.style.top = '0';
113
+ overlayEl.style.left = '0';
114
+ overlayEl.style.right = '0';
115
+ overlayEl.style.bottom = '0';
116
+ overlayEl.style.backgroundColor = '#000';
117
+ overlayEl.style.opacity = '0.70';
118
+ overlayEl.style.zIndex = '1';
119
+ overlayEl.style.pointerEvents = 'none';
120
+
121
+ // Ensure entering page has relative positioning for overlay
122
+ const enteringPageEl = opts.enteringEl as HTMLElement;
123
+ if (enteringPageEl) {
124
+ const currentPosition = window.getComputedStyle(enteringPageEl).position;
125
+ if (currentPosition === 'static') {
126
+ enteringPageEl.style.position = 'relative';
127
+ }
128
+ enteringPageEl.appendChild(overlayEl);
129
+ }
130
+
131
+ // Entering page: underneath, sliding in from LEFT (-20% to 0)
132
+ const enteringPage = createAnimation()
133
+ .addElement(opts.enteringEl)
134
+ .beforeRemoveClass('ion-page-invisible')
135
+ .beforeStyles({
136
+ 'z-index': '9',
137
+ 'opacity': '1'
138
+ })
139
+ .fromTo('transform', 'translateX(-20%)', 'translateX(0)');
140
+
141
+ // Leaving page: on top, sliding out to the RIGHT (0 to 100%)
142
+ const leavingPage = createAnimation()
143
+ .addElement(opts.leavingEl)
144
+ .beforeStyles({
145
+ 'z-index': '10',
146
+ })
147
+ .fromTo('transform', 'translateX(0)', 'translateX(100%)');
148
+
149
+ // Overlay fade out animation on the entering page (main page)
150
+ const overlayAnimation = createAnimation()
151
+ .addElement(overlayEl)
152
+ .fromTo('opacity', '0.70', '0');
153
+
154
+ // Clean up overlay after animation completes
155
+ rootTransition.afterAddWrite(() => {
156
+ if (overlayEl && overlayEl.parentNode) {
157
+ overlayEl.parentNode.removeChild(overlayEl);
158
+ }
159
+ });
160
+
161
+ rootTransition.addAnimation([enteringPage, leavingPage, overlayAnimation]);
162
+
163
+ return rootTransition;
164
+ };
165
+
@@ -0,0 +1,102 @@
1
+ import { Component, input, output } from '@angular/core';
2
+ import { DsMobileListItemComponent } from '../list-item/ds-mobile-list-item';
3
+
4
+ /**
5
+ * DsMobileActionListItemComponent
6
+ *
7
+ * Specialized list item for action sheets and menus.
8
+ * Wraps ds-mobile-list-item with action-specific styling:
9
+ * - Vertically centered content
10
+ * - Interactive by default
11
+ * - No dividers (controlled per-item)
12
+ *
13
+ * @example
14
+ * ```html
15
+ * <ds-mobile-action-list-item
16
+ * title="Edit"
17
+ * [showDivider]="true"
18
+ * (itemClick)="handleEdit()">
19
+ * <ds-icon content-leading name="remixEditLine" size="20px" />
20
+ * </ds-mobile-action-list-item>
21
+ * ```
22
+ */
23
+ @Component({
24
+ selector: 'ds-mobile-action-list-item',
25
+ standalone: true,
26
+ imports: [DsMobileListItemComponent],
27
+ template: `
28
+ <ds-mobile-list-item [title]="title()" [interactive]="true" [enableLongPress]="false" [showDivider]="showDivider()" [disabled]="disabled()" (itemClick)="itemClick.emit()">
29
+ <div class="action-icon-wrapper" content-leading>
30
+ <ng-content select="[action-icon]" />
31
+ </div>
32
+
33
+ <div content-trailing>
34
+ <ng-content select="[content-trailing]" />
35
+ </div>
36
+ </ds-mobile-list-item>
37
+ `,
38
+ styles: [
39
+ `
40
+ /* Center all content vertically for action items */
41
+ :host ::ng-deep ds-mobile-list-item .list-item-inner {
42
+ align-items: center;
43
+ }
44
+
45
+ /* Center icon within leading slot */
46
+ :host ::ng-deep ds-mobile-list-item .content-leading {
47
+ align-items: center;
48
+ justify-content: center;
49
+ }
50
+
51
+ /* Wrapper div must fill parent height and center icon */
52
+ :host ::ng-deep .action-icon-wrapper {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 100%;
57
+ height: 100%;
58
+ }
59
+
60
+ /* Remove gap from content-main for single-line actions */
61
+ :host ::ng-deep ds-mobile-list-item .content-main {
62
+ gap: 0;
63
+ justify-content: center;
64
+ }
65
+
66
+ /* Remove blue focus border/ring and set Ionic variables */
67
+ :host {
68
+ outline: none;
69
+ --background-focused: transparent;
70
+ --background-activated: transparent;
71
+ -webkit-tap-highlight-color: transparent;
72
+ }
73
+
74
+ :host ::ng-deep ds-mobile-list-item {
75
+ outline: none;
76
+ }
77
+ `,
78
+ ],
79
+ })
80
+ export class DsMobileActionListItemComponent {
81
+ /**
82
+ * Action title text
83
+ */
84
+ title = input.required<string>();
85
+
86
+ /**
87
+ * Whether to show divider below item
88
+ * @default false
89
+ */
90
+ showDivider = input<boolean>(false);
91
+
92
+ /**
93
+ * Whether the action is disabled
94
+ * @default false
95
+ */
96
+ disabled = input<boolean>(false);
97
+
98
+ /**
99
+ * Emits when the action item is clicked
100
+ */
101
+ itemClick = output<void>();
102
+ }
@@ -0,0 +1,2 @@
1
+ export * from './ds-mobile-action-list-item';
2
+
@@ -0,0 +1,133 @@
1
+ import { Component, Input, inject, computed } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { WhitelabelService } from '../../services/whitelabel.service';
4
+
5
+ export type AppIconSize = 'sm' | 'md' | 'lg' | 'xl';
6
+
7
+ /**
8
+ * DsAppIconComponent
9
+ *
10
+ * Displays the organization's logomark styled as an app icon with rounded corners
11
+ * and shadow. The logomark fill color adapts to the background.
12
+ * Perfect for sign-in pages, splash screens, etc.
13
+ *
14
+ * Uses percentage-based padding and border-radius for perfect proportional scaling.
15
+ *
16
+ * @example
17
+ * Sign-in page (large):
18
+ * ```html
19
+ * <ds-app-icon size="xl" />
20
+ * ```
21
+ *
22
+ * Settings preview (small):
23
+ * ```html
24
+ * <ds-app-icon size="sm" />
25
+ * ```
26
+ */
27
+ @Component({
28
+ selector: 'ds-app-icon',
29
+ standalone: true,
30
+ imports: [CommonModule],
31
+ host: {
32
+ '[class]': 'sizeClass()'
33
+ },
34
+ template: `
35
+ <div class="app-icon">
36
+ <img
37
+ [src]="whitelabelService.logoMarkUrl()"
38
+ [alt]="whitelabelService.logoAlt() + ' app icon'"
39
+ class="app-icon__logo"
40
+ />
41
+ </div>
42
+ `,
43
+ styles: [`
44
+ :host {
45
+ display: inline-block;
46
+ flex-shrink: 0;
47
+ vertical-align: top;
48
+ }
49
+
50
+ .app-icon {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ background: var(--app-icon-background, var(--color-app-icon-surface, #6B5FF5));
55
+ /* Rounded corners - scales with size */
56
+ border-radius: 20%;
57
+ /* Padding scales with size - logomark fills ~70% of container */
58
+ padding: 15%;
59
+ width: 100%;
60
+ height: 100%;
61
+ }
62
+
63
+ .app-icon__logo {
64
+ width: 100%;
65
+ height: 100%;
66
+ object-fit: contain;
67
+ display: block;
68
+ }
69
+
70
+ /* Size variants - applied to :host, everything inside scales automatically! */
71
+ :host(.app-icon--sm) {
72
+ width: 16px;
73
+ height: 16px;
74
+ }
75
+
76
+ :host(.app-icon--sm) .app-icon {
77
+ box-shadow:
78
+ inset 0 0 0.75px 0 rgba(255, 255, 255, 0.5),
79
+ inset 0 0 15px 0 rgba(255, 255, 255, 0.2);
80
+ }
81
+
82
+ :host(.app-icon--md) {
83
+ width: 24px;
84
+ height: 24px;
85
+ }
86
+
87
+ :host(.app-icon--md) .app-icon {
88
+ box-shadow:
89
+ inset 0 0 1.5px 0 rgba(255, 255, 255, 0.5),
90
+ inset 0 0 30px 0 rgba(255, 255, 255, 0.2);
91
+ }
92
+
93
+ :host(.app-icon--lg) {
94
+ width: 32px;
95
+ height: 32px;
96
+ }
97
+
98
+ :host(.app-icon--lg) .app-icon {
99
+ box-shadow:
100
+ inset 0 0 2.25px 0 rgba(255, 255, 255, 0.5),
101
+ inset 0 0 45px 0 rgba(255, 255, 255, 0.2);
102
+ }
103
+
104
+ :host(.app-icon--xl) {
105
+ width: 64px;
106
+ height: 64px;
107
+ }
108
+
109
+ :host(.app-icon--xl) .app-icon {
110
+ box-shadow:
111
+ inset 0 0 3px 0 rgba(255, 255, 255, 0.5),
112
+ inset 0 0 60px 0 rgba(255, 255, 255, 0.2);
113
+ }
114
+ `]
115
+ })
116
+ export class DsAppIconComponent {
117
+ whitelabelService = inject(WhitelabelService);
118
+
119
+ /**
120
+ * Size of the app icon
121
+ * - sm: 16x16px (padding: 2.4px, radius: 3.2px)
122
+ * - md: 32x32px (padding: 4.8px, radius: 6.4px)
123
+ * - lg: 48x48px (padding: 7.2px, radius: 9.6px)
124
+ * - xl: 64x64px (padding: 9.6px, radius: 12.8px)
125
+ */
126
+ @Input() size: AppIconSize = 'lg';
127
+
128
+ /**
129
+ * Computed CSS class for size variant
130
+ */
131
+ sizeClass = computed(() => `app-icon app-icon--${this.size}`);
132
+ }
133
+
@@ -0,0 +1,2 @@
1
+ export { DsAppIconComponent, type AppIconSize } from './ds-app-icon';
2
+
@@ -0,0 +1,139 @@
1
+ /* ============================================
2
+ ATTACHMENT PREVIEW COMPONENT
3
+ ============================================ */
4
+
5
+ :host {
6
+ display: block;
7
+ }
8
+
9
+ .attachment-preview {
10
+ position: relative;
11
+ width: 96px;
12
+ height: 96px;
13
+ border-radius: 12px;
14
+ overflow: visible;
15
+ }
16
+
17
+ .attachment-preview.loading {
18
+ opacity: 0.8;
19
+ }
20
+
21
+ /* ============================================
22
+ IMAGE PREVIEW
23
+ ============================================ */
24
+
25
+ .preview-image {
26
+ width: 100%;
27
+ height: 100%;
28
+ display: block;
29
+ border-radius: 12px;
30
+ border: 1px solid var(--border-color-default);
31
+ -o-object-fit: cover;
32
+ object-fit: cover;
33
+ }
34
+
35
+ /* ============================================
36
+ FILE PREVIEW
37
+ ============================================ */
38
+
39
+ .preview-file {
40
+ width: 100%;
41
+ height: 100%;
42
+ display: flex;
43
+ flex-direction: column;
44
+ align-items: center;
45
+ justify-content: flex-end;
46
+ gap: 10px;
47
+ background: var(--color-background-neutral-primary, #ffffff);
48
+ border: 1px solid var(--border-color-default);
49
+ border-radius: 12px;
50
+ padding: 8px;
51
+ padding-bottom: 10px;
52
+ }
53
+
54
+ .file-info {
55
+ display: flex;
56
+ flex-direction: column;
57
+ align-items: center;
58
+ gap: 2px;
59
+ width: 100%;
60
+ min-width: 0;
61
+ }
62
+
63
+ .file-name {
64
+ font-family: 'Brockmann', sans-serif;
65
+ font-size: var(--font-size-xs);
66
+ font-weight: 400;
67
+ color: var(--text-color-default-primary);
68
+ text-align: center;
69
+ width: 100%;
70
+ overflow: hidden;
71
+ text-overflow: ellipsis;
72
+ white-space: nowrap;
73
+ line-height: 1.2;
74
+ }
75
+
76
+ .file-type-label {
77
+ font-family: 'Brockmann', sans-serif;
78
+ font-size: var(--font-size-xs);
79
+ font-weight: 400;
80
+ color: var(--text-color-default-tertiary);
81
+ line-height: 1;
82
+ }
83
+
84
+ .file-avatar {
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ }
89
+
90
+ /* File type avatar colors */
91
+ .file-avatar ::ng-deep .file-pdf .avatar--icon {
92
+ background-color: #ff5757 !important;
93
+ }
94
+
95
+ .file-avatar ::ng-deep .file-doc .avatar--icon,
96
+ .file-avatar ::ng-deep .file-docx .avatar--icon {
97
+ background-color: var(--color-blue-base, #3B82F6) !important;
98
+ }
99
+
100
+ .file-avatar ::ng-deep .file-xls .avatar--icon,
101
+ .file-avatar ::ng-deep .file-xlsx .avatar--icon {
102
+ background-color: var(--color-green-base, #10B981) !important;
103
+ }
104
+
105
+ .file-avatar ::ng-deep .file-other .avatar--icon {
106
+ background-color: var(--text-color-default-tertiary, #999999) !important;
107
+ }
108
+
109
+ /* ============================================
110
+ REMOVE BUTTON
111
+ ============================================ */
112
+
113
+ .remove-btn {
114
+ position: absolute;
115
+ top: -8px;
116
+ right: -8px;
117
+ width: 24px;
118
+ height: 24px;
119
+ border-radius: 50%;
120
+ background: rgba(0, 0, 0, 0.6);
121
+ backdrop-filter: blur(8px);
122
+ border: 2px solid white;
123
+ color: white;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ cursor: pointer;
128
+ transition: all 0.2s ease;
129
+ padding: 0;
130
+ }
131
+
132
+ .remove-btn:hover {
133
+ background: rgba(0, 0, 0, 0.8);
134
+ transform: scale(1.05);
135
+ }
136
+
137
+ .remove-btn:active {
138
+ transform: scale(0.95);
139
+ }