@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,1094 @@
1
+ import { Component, OnInit, inject, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { WhitelabelService } from '../services/whitelabel.service';
5
+ import { DsLogoComponent } from '../components/logo/ds-logo';
6
+ import { DsAvatarWithBadgeComponent } from '../components/avatar-with-badge/ds-avatar-with-badge';
7
+ import { DsAppIconComponent } from '../components/app-icon/ds-app-icon';
8
+ import { DsIconButtonComponent } from '@propbinder/design-system';
9
+ import { IonContent, ModalController } from '@ionic/angular/standalone';
10
+
11
+ /**
12
+ * Whitelabel Demo Modal Component
13
+ *
14
+ * Demonstrates the whitelabeling system with theme selection, brand colors, and logo previews.
15
+ * Opens as a full-screen modal similar to post details.
16
+ */
17
+ @Component({
18
+ selector: 'ds-whitelabel-demo-modal',
19
+ standalone: true,
20
+ imports: [
21
+ CommonModule,
22
+ FormsModule,
23
+ IonContent,
24
+ DsLogoComponent,
25
+ DsAvatarWithBadgeComponent,
26
+ DsAppIconComponent,
27
+ DsIconButtonComponent
28
+ ],
29
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
30
+ styles: [`
31
+ /* Host fills the modal with flex layout */
32
+ :host {
33
+ display: flex;
34
+ flex-direction: column;
35
+ height: 100%;
36
+ width: 100%;
37
+ background: var(--color-background-neutral-primary, #ffffff);
38
+ }
39
+
40
+ /* Fixed header at top */
41
+ .modal-header {
42
+ flex-shrink: 0;
43
+ background: var(--color-background-neutral-primary, #ffffff);
44
+ border-bottom: 1px solid var(--border-color-default, #e0e0e0);
45
+ padding: 0 16px;
46
+ }
47
+
48
+ /* ion-content fills remaining space and scrolls */
49
+ ion-content,
50
+ .modal-content {
51
+ --background: #ffffff;
52
+ flex: 1;
53
+ width: 100%;
54
+ }
55
+
56
+ .header-content {
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: space-between;
60
+ gap: 12px;
61
+ min-height: 56px;
62
+ }
63
+
64
+ .header-title {
65
+ font-family: 'Brockmann', sans-serif;
66
+ font-size: 17px;
67
+ font-weight: 600;
68
+ color: var(--color-text-primary, #1a1a1a);
69
+ flex: 1;
70
+ }
71
+
72
+ .close-button {
73
+ flex-shrink: 0;
74
+ border-radius: 50%;
75
+ }
76
+
77
+ .close-button::ng-deep button {
78
+ border-radius: 50% !important;
79
+ width: 36px !important;
80
+ height: 36px !important;
81
+ min-width: 36px !important;
82
+ min-height: 36px !important;
83
+ padding: 0 !important;
84
+ display: flex !important;
85
+ align-items: center !important;
86
+ justify-content: center !important;
87
+ background: var(--color-background-neutral-secondary, #f5f5f5) !important;
88
+ color: var(--color-text-primary, #1a1a1a) !important;
89
+ }
90
+
91
+ .demo-container {
92
+ padding: 20px;
93
+ max-width: 600px;
94
+ margin: 0 auto;
95
+ width: 100%;
96
+ }
97
+
98
+ .demo-section {
99
+ margin-bottom: 32px;
100
+ }
101
+
102
+ .demo-section h2 {
103
+ margin-bottom: 16px;
104
+ font-size: 18px;
105
+ font-weight: 600;
106
+ color: #333;
107
+ }
108
+
109
+ /* Theme Selection */
110
+ .theme-buttons {
111
+ display: flex;
112
+ gap: 12px;
113
+ flex-wrap: wrap;
114
+ }
115
+
116
+ .theme-btn {
117
+ padding: 8px 16px;
118
+ border-radius: 8px;
119
+ font-size: 14px;
120
+ font-weight: 500;
121
+ border: none;
122
+ cursor: pointer;
123
+ transition: all 0.2s ease;
124
+ background: #e0e0e0;
125
+ color: #333;
126
+ }
127
+
128
+ .theme-btn:active {
129
+ transform: scale(0.98);
130
+ }
131
+
132
+ .theme-btn.active {
133
+ background: var(--color-secondary-surface);
134
+ color: var(--color-secondary-content);
135
+ }
136
+
137
+ /* Logo Preview */
138
+ .logo-preview {
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: center;
142
+ padding: 24px;
143
+ background: var(--color-brand-secondary);
144
+ border-radius: 12px;
145
+ min-height: 80px;
146
+ }
147
+
148
+ .logomark-preview {
149
+ display: flex;
150
+ align-items: center;
151
+ justify-content: center;
152
+ padding: 24px;
153
+ background: white;
154
+ border: 1px solid #e0e0e0;
155
+ border-radius: 12px;
156
+ min-height: 80px;
157
+ }
158
+
159
+ .preview-grid {
160
+ display: grid;
161
+ grid-template-columns: 1fr 1fr;
162
+ gap: 16px;
163
+ }
164
+
165
+ .preview-tile {
166
+ background: white;
167
+ border-radius: 12px;
168
+ }
169
+
170
+ .preview-tile h3 {
171
+ font-size: 13px;
172
+ font-weight: 600;
173
+ color: #666;
174
+ margin-top: 0;
175
+ margin-bottom: 12px;
176
+ }
177
+
178
+ /* App Icon Sizes */
179
+ .app-icon-sizes {
180
+ display: flex;
181
+ gap: 24px;
182
+ align-items: flex-end;
183
+ justify-content: center;
184
+ padding: 24px;
185
+ background: white;
186
+ border-radius: 12px;
187
+ border: 1px solid var(--border-color-default, #e0e0e0);
188
+ flex-wrap: wrap;
189
+ }
190
+
191
+ .app-icon-demo {
192
+ display: flex;
193
+ flex-direction: column;
194
+ align-items: center;
195
+ gap: 12px;
196
+ /* Use app icon surface color as app icon background */
197
+ --app-icon-background: var(--color-app-icon-surface);
198
+ }
199
+
200
+ .app-icon-demo span {
201
+ font-size: 12px;
202
+ color: #666;
203
+ font-family: monospace;
204
+ }
205
+
206
+ /* Brand Colors */
207
+ .color-section {
208
+ background: white;
209
+ border-radius: 12px;
210
+ }
211
+
212
+ .color-swatches {
213
+ display: grid;
214
+ grid-template-columns: 1fr 1fr;
215
+ gap: 16px;
216
+ margin-bottom: 24px;
217
+ }
218
+
219
+ .swatch {
220
+ padding: 16px;
221
+ border-radius: 8px;
222
+ text-align: center;
223
+ }
224
+
225
+ .swatch-label {
226
+ font-size: 12px;
227
+ font-weight: 600;
228
+ margin-bottom: 4px;
229
+ }
230
+
231
+ .swatch-value {
232
+ font-size: 11px;
233
+ opacity: 0.8;
234
+ font-family: monospace;
235
+ }
236
+
237
+ .swatch--app-icon-surface {
238
+ background: var(--color-app-icon-surface);
239
+ color: var(--color-app-icon-content);
240
+ }
241
+
242
+ .swatch--app-icon-content {
243
+ background: var(--color-app-icon-content);
244
+ color: var(--color-app-icon-surface);
245
+ border: 1px solid #e0e0e0;
246
+ }
247
+
248
+ .swatch--accent {
249
+ background: var(--color-accent);
250
+ color: var(--color-on-accent);
251
+ }
252
+
253
+ .swatch--on-accent {
254
+ background: var(--color-on-accent);
255
+ color: var(--color-accent);
256
+ border: 1px solid #e0e0e0;
257
+ }
258
+
259
+ .swatch--header-surface {
260
+ background: var(--color-header-surface);
261
+ color: var(--color-header-content);
262
+ }
263
+
264
+ .swatch--header-content {
265
+ background: var(--color-header-content);
266
+ color: var(--color-header-surface);
267
+ border: 1px solid #e0e0e0;
268
+ }
269
+
270
+ /* Color Inputs */
271
+ .color-inputs {
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: 12px;
275
+ }
276
+
277
+ .color-group-label {
278
+ font-size: 13px;
279
+ font-weight: 600;
280
+ color: #333;
281
+ margin-top: 8px;
282
+ }
283
+
284
+ .color-row {
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 12px;
288
+ }
289
+
290
+ .color-row label {
291
+ min-width: 70px;
292
+ font-size: 13px;
293
+ color: #666;
294
+ }
295
+
296
+ .color-row input[type="color"] {
297
+ width: 40px;
298
+ height: 32px;
299
+ border: none;
300
+ border-radius: 6px;
301
+ cursor: pointer;
302
+ padding: 0;
303
+ }
304
+
305
+ .color-row input[type="text"] {
306
+ flex: 1;
307
+ padding: 8px 12px;
308
+ border: 1px solid #ddd;
309
+ border-radius: 6px;
310
+ font-family: monospace;
311
+ font-size: 13px;
312
+ }
313
+
314
+ /* Toggle switch styling */
315
+ .toggle-row {
316
+ display: flex;
317
+ align-items: center;
318
+ justify-content: space-between;
319
+ gap: 12px;
320
+ padding: 12px 0;
321
+ }
322
+
323
+ .toggle-row label {
324
+ font-size: 14px;
325
+ color: #333;
326
+ font-weight: 500;
327
+ }
328
+
329
+ .toggle-row input[type="checkbox"] {
330
+ width: 48px;
331
+ height: 28px;
332
+ -webkit-appearance: none;
333
+ appearance: none;
334
+ background: #ddd;
335
+ border-radius: 14px;
336
+ position: relative;
337
+ cursor: pointer;
338
+ transition: background 0.2s ease;
339
+ flex-shrink: 0;
340
+ }
341
+
342
+ .toggle-row input[type="checkbox"]:checked {
343
+ background: var(--color-accent);
344
+ }
345
+
346
+ .toggle-row input[type="checkbox"]::before {
347
+ content: '';
348
+ position: absolute;
349
+ width: 24px;
350
+ height: 24px;
351
+ border-radius: 50%;
352
+ background: white;
353
+ top: 2px;
354
+ left: 2px;
355
+ transition: transform 0.2s ease;
356
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
357
+ }
358
+
359
+ .toggle-row input[type="checkbox"]:checked::before {
360
+ transform: translateX(20px);
361
+ }
362
+
363
+ /* Radio button styling */
364
+ .radio-group {
365
+ display: flex;
366
+ gap: 16px;
367
+ margin-bottom: 16px;
368
+ }
369
+
370
+ .radio-option {
371
+ display: flex;
372
+ align-items: center;
373
+ gap: 8px;
374
+ cursor: pointer;
375
+ }
376
+
377
+ .radio-option input[type="radio"] {
378
+ width: 18px;
379
+ height: 18px;
380
+ cursor: pointer;
381
+ accent-color: var(--color-accent);
382
+ }
383
+
384
+ .radio-option label {
385
+ font-size: 14px;
386
+ color: #333;
387
+ cursor: pointer;
388
+ font-weight: 500;
389
+ }
390
+
391
+ /* Background preview */
392
+ .bg-preview {
393
+ height: 80px;
394
+ border-radius: 8px;
395
+ margin-bottom: 16px;
396
+ border: 1px solid #e0e0e0;
397
+ position: relative;
398
+ overflow: hidden;
399
+ }
400
+
401
+ .bg-preview::after {
402
+ content: 'Preview';
403
+ position: absolute;
404
+ top: 50%;
405
+ left: 50%;
406
+ transform: translate(-50%, -50%);
407
+ font-size: 12px;
408
+ font-weight: 600;
409
+ color: rgba(0, 0, 0, 0.3);
410
+ text-shadow: 0 1px 2px rgba(255, 255, 255, 0.5);
411
+ }
412
+
413
+ /* Safe area support */
414
+ @supports (padding: env(safe-area-inset-bottom)) {
415
+ .demo-container {
416
+ padding-bottom: calc(20px + env(safe-area-inset-bottom));
417
+ }
418
+ }
419
+ `],
420
+ template: `
421
+ <!-- Fixed Header -->
422
+ <div class="modal-header">
423
+ <div class="header-content">
424
+ <span class="header-title">Whitelabel</span>
425
+ <ds-icon-button
426
+ icon="remixCloseLine"
427
+ variant="secondary"
428
+ size="lg"
429
+ (click)="close()"
430
+ class="close-button"
431
+ aria-label="Close">
432
+ </ds-icon-button>
433
+ </div>
434
+ </div>
435
+
436
+ <!-- Scrollable Content -->
437
+ <ion-content [scrollY]="true" class="modal-content">
438
+ <div class="demo-container">
439
+ <!-- Theme Selection -->
440
+ <div class="demo-section">
441
+ <h2>Theme</h2>
442
+ <div class="theme-buttons">
443
+ <button class="theme-btn" (click)="applyDefaultTheme()" [class.active]="currentTheme === 'default'">
444
+ Propbinder
445
+ </button>
446
+ <button class="theme-btn" (click)="applyCejTheme()" [class.active]="currentTheme === 'cej'">
447
+ CEJ
448
+ </button>
449
+ <button class="theme-btn" (click)="applyPkaTheme()" [class.active]="currentTheme === 'pka'">
450
+ PKA
451
+ </button>
452
+ <button class="theme-btn" (click)="applyClaveTheme()" [class.active]="currentTheme === 'clave'">
453
+ Clave
454
+ </button>
455
+ <button class="theme-btn" (click)="applyFreedomTheme()" [class.active]="currentTheme === 'freedom'">
456
+ Freedom
457
+ </button>
458
+ <button class="theme-btn" (click)="applyCobblestoneTheme()" [class.active]="currentTheme === 'cobblestone'">
459
+ Cobblestone
460
+ </button>
461
+ </div>
462
+ </div>
463
+
464
+ <!-- Sign-in Page Options -->
465
+ <div class="demo-section">
466
+ <h2>Sign-in Page</h2>
467
+ <div class="color-section">
468
+ <div class="toggle-row">
469
+ <label>Show City Illustration</label>
470
+ <input
471
+ type="checkbox"
472
+ [checked]="whitelabelService.showCityIllustration()"
473
+ [disabled]="currentTheme !== 'default'"
474
+ (change)="toggleCityIllustration()"
475
+ [style.opacity]="currentTheme !== 'default' ? '0.5' : '1'"
476
+ [style.cursor]="currentTheme !== 'default' ? 'not-allowed' : 'pointer'"
477
+ />
478
+ </div>
479
+
480
+ <div style="margin-top: 24px;">
481
+ <h3 style="font-size: 14px; font-weight: 600; color: #333; margin: 0 0 12px 0;">Background</h3>
482
+
483
+ <!-- Background type selector -->
484
+ <div class="radio-group">
485
+ <div class="radio-option">
486
+ <input
487
+ type="radio"
488
+ id="bg-solid"
489
+ name="bgType"
490
+ value="solid"
491
+ [checked]="whitelabelService.signInBgType() === 'solid'"
492
+ (change)="updateSignInBgType('solid')"
493
+ />
494
+ <label for="bg-solid">Solid</label>
495
+ </div>
496
+ <div class="radio-option">
497
+ <input
498
+ type="radio"
499
+ id="bg-gradient"
500
+ name="bgType"
501
+ value="gradient"
502
+ [checked]="whitelabelService.signInBgType() === 'gradient'"
503
+ (change)="updateSignInBgType('gradient')"
504
+ />
505
+ <label for="bg-gradient">Gradient</label>
506
+ </div>
507
+ </div>
508
+
509
+ <!-- Background preview -->
510
+ <div class="bg-preview" [style.background]="whitelabelService.signInBgStyle()"></div>
511
+
512
+ <!-- Solid color input -->
513
+ @if (whitelabelService.signInBgType() === 'solid') {
514
+ <div class="color-row">
515
+ <label>Color</label>
516
+ <input
517
+ type="color"
518
+ [(ngModel)]="customSignInBgSolid"
519
+ (change)="applySignInBackground()"
520
+ />
521
+ <input
522
+ type="text"
523
+ [(ngModel)]="customSignInBgSolid"
524
+ (change)="applySignInBackground()"
525
+ />
526
+ </div>
527
+ }
528
+
529
+ <!-- Gradient color inputs -->
530
+ @if (whitelabelService.signInBgType() === 'gradient') {
531
+ <div class="color-row">
532
+ <label>Start</label>
533
+ <input
534
+ type="color"
535
+ [(ngModel)]="customSignInBgGradientStart"
536
+ (change)="applySignInBackground()"
537
+ />
538
+ <input
539
+ type="text"
540
+ [(ngModel)]="customSignInBgGradientStart"
541
+ (change)="applySignInBackground()"
542
+ />
543
+ </div>
544
+ <div class="color-row">
545
+ <label>End</label>
546
+ <input
547
+ type="color"
548
+ [(ngModel)]="customSignInBgGradientEnd"
549
+ (change)="applySignInBackground()"
550
+ />
551
+ <input
552
+ type="text"
553
+ [(ngModel)]="customSignInBgGradientEnd"
554
+ (change)="applySignInBackground()"
555
+ />
556
+ </div>
557
+ }
558
+
559
+ <!-- Sign-in content color -->
560
+ <div style="margin-top: 24px;">
561
+ <h3 style="font-size: 14px; font-weight: 600; color: #333; margin: 0 0 12px 0;">Content Color</h3>
562
+ <div class="color-row">
563
+ <label>Text</label>
564
+ <input
565
+ type="color"
566
+ [(ngModel)]="customSignInContentColor"
567
+ (change)="applySignInContentColor()"
568
+ />
569
+ <input
570
+ type="text"
571
+ [(ngModel)]="customSignInContentColor"
572
+ (change)="applySignInContentColor()"
573
+ />
574
+ </div>
575
+ </div>
576
+ </div>
577
+ </div>
578
+ </div>
579
+
580
+ <!-- Logo & Logomark Preview -->
581
+ <div class="demo-section">
582
+ <h2>Logo Preview</h2>
583
+
584
+ <!-- Logo Size Selector -->
585
+ <div style="margin-bottom: 16px;">
586
+ <h3 style="font-size: 14px; font-weight: 600; color: #333; margin: 0 0 12px 0;">Header Logo Size</h3>
587
+ <div class="theme-buttons">
588
+ <button
589
+ class="theme-btn"
590
+ (click)="updateLogoSize('sm')"
591
+ [class.active]="whitelabelService.logoSize() === 'sm'">
592
+ Small (24px)
593
+ </button>
594
+ <button
595
+ class="theme-btn"
596
+ (click)="updateLogoSize('md')"
597
+ [class.active]="whitelabelService.logoSize() === 'md'">
598
+ Medium (28px)
599
+ </button>
600
+ <button
601
+ class="theme-btn"
602
+ (click)="updateLogoSize('lg')"
603
+ [class.active]="whitelabelService.logoSize() === 'lg'">
604
+ Large (32px)
605
+ </button>
606
+ <button
607
+ class="theme-btn"
608
+ (click)="updateLogoSize('xl')"
609
+ [class.active]="whitelabelService.logoSize() === 'xl'">
610
+ XLarge (36px)
611
+ </button>
612
+ </div>
613
+ </div>
614
+
615
+ <div class="preview-grid">
616
+ <div class="preview-tile">
617
+ <h3>Logo</h3>
618
+ <div class="logo-preview">
619
+ <ds-logo variant="full" />
620
+ </div>
621
+ </div>
622
+ <div class="preview-tile">
623
+ <h3>Logomark</h3>
624
+ <div class="logomark-preview">
625
+ <ds-avatar-with-badge
626
+ [type]="'initials'"
627
+ [initials]="'KN'"
628
+ [size]="'md'"
629
+ [badgePosition]="'bottom-right'"
630
+ />
631
+ </div>
632
+ </div>
633
+ </div>
634
+ </div>
635
+
636
+ <!-- App Icon -->
637
+ <div class="demo-section">
638
+ <h2>App Icon</h2>
639
+ <div class="app-icon-sizes">
640
+ <div class="app-icon-demo">
641
+ <ds-app-icon size="xl" />
642
+ </div>
643
+ </div>
644
+ </div>
645
+
646
+ <!-- Brand Colors -->
647
+ <div class="demo-section">
648
+ <h2>Brand Colors</h2>
649
+ <div class="color-section">
650
+ <div class="color-swatches">
651
+ <div class="swatch swatch--app-icon-surface">
652
+ <div class="swatch-label">App Icon Surface</div>
653
+ <div class="swatch-value">{{ whitelabelService.appIconSurface() }}</div>
654
+ </div>
655
+ <div class="swatch swatch--app-icon-content">
656
+ <div class="swatch-label">App Icon Content</div>
657
+ <div class="swatch-value">{{ whitelabelService.appIconContent() }}</div>
658
+ </div>
659
+ <div class="swatch swatch--accent">
660
+ <div class="swatch-label">Accent</div>
661
+ <div class="swatch-value">{{ whitelabelService.accent() }}</div>
662
+ </div>
663
+ <div class="swatch swatch--on-accent">
664
+ <div class="swatch-label">On Accent</div>
665
+ <div class="swatch-value">{{ whitelabelService.onAccent() }}</div>
666
+ </div>
667
+ <div class="swatch swatch--header-surface">
668
+ <div class="swatch-label">Header Surface</div>
669
+ <div class="swatch-value">{{ whitelabelService.headerSurface() }}</div>
670
+ </div>
671
+ <div class="swatch swatch--header-content">
672
+ <div class="swatch-label">Header Content</div>
673
+ <div class="swatch-value">{{ whitelabelService.headerContent() }}</div>
674
+ </div>
675
+ </div>
676
+
677
+ <div class="color-inputs">
678
+ <div class="color-group-label">App Icon</div>
679
+ <div class="color-row">
680
+ <label>Surface</label>
681
+ <input
682
+ type="color"
683
+ [(ngModel)]="customAppIconSurface"
684
+ (change)="applyCustomColors()"
685
+ />
686
+ <input
687
+ type="text"
688
+ [(ngModel)]="customAppIconSurface"
689
+ (change)="applyCustomColors()"
690
+ />
691
+ </div>
692
+ <div class="color-row">
693
+ <label>Content</label>
694
+ <input
695
+ type="color"
696
+ [(ngModel)]="customAppIconContent"
697
+ (change)="applyCustomColors()"
698
+ />
699
+ <input
700
+ type="text"
701
+ [(ngModel)]="customAppIconContent"
702
+ (change)="applyCustomColors()"
703
+ />
704
+ </div>
705
+
706
+ <div class="color-group-label">Accent</div>
707
+ <div class="color-row">
708
+ <label>Base</label>
709
+ <input
710
+ type="color"
711
+ [(ngModel)]="customAccent"
712
+ (change)="applyCustomColors()"
713
+ />
714
+ <input
715
+ type="text"
716
+ [(ngModel)]="customAccent"
717
+ (change)="applyCustomColors()"
718
+ />
719
+ </div>
720
+ <div class="color-row">
721
+ <label>On Accent</label>
722
+ <input
723
+ type="color"
724
+ [(ngModel)]="customOnAccent"
725
+ (change)="applyCustomColors()"
726
+ />
727
+ <input
728
+ type="text"
729
+ [(ngModel)]="customOnAccent"
730
+ (change)="applyCustomColors()"
731
+ />
732
+ </div>
733
+
734
+ <div class="color-group-label">Header</div>
735
+ <div class="color-row">
736
+ <label>Surface</label>
737
+ <input
738
+ type="color"
739
+ [(ngModel)]="customHeaderSurface"
740
+ (change)="applyCustomColors()"
741
+ />
742
+ <input
743
+ type="text"
744
+ [(ngModel)]="customHeaderSurface"
745
+ (change)="applyCustomColors()"
746
+ />
747
+ </div>
748
+ <div class="color-row">
749
+ <label>Content</label>
750
+ <input
751
+ type="color"
752
+ [(ngModel)]="customHeaderContent"
753
+ (change)="applyCustomColors()"
754
+ />
755
+ <input
756
+ type="text"
757
+ [(ngModel)]="customHeaderContent"
758
+ (change)="applyCustomColors()"
759
+ />
760
+ </div>
761
+ <div class="color-row">
762
+ <label>Accent</label>
763
+ <input
764
+ type="color"
765
+ [(ngModel)]="customHeaderAccent"
766
+ (change)="applyCustomColors()"
767
+ />
768
+ <input
769
+ type="text"
770
+ [(ngModel)]="customHeaderAccent"
771
+ (change)="applyCustomColors()"
772
+ />
773
+ </div>
774
+ <div class="color-row">
775
+ <label>On Accent</label>
776
+ <input
777
+ type="color"
778
+ [(ngModel)]="customOnHeaderAccent"
779
+ (change)="applyCustomColors()"
780
+ />
781
+ <input
782
+ type="text"
783
+ [(ngModel)]="customOnHeaderAccent"
784
+ (change)="applyCustomColors()"
785
+ />
786
+ </div>
787
+ </div>
788
+ </div>
789
+ </div>
790
+ </div>
791
+ </ion-content>
792
+ `
793
+ })
794
+ export class WhitelabelDemoModalComponent implements OnInit {
795
+ whitelabelService = inject(WhitelabelService);
796
+
797
+ private modalController = inject(ModalController);
798
+
799
+ // Current active theme
800
+ currentTheme = 'default';
801
+
802
+ // Custom color inputs
803
+ customAppIconSurface = '#6B5FF5';
804
+ customAppIconContent = '#FFFFFF';
805
+ customAccent = '#6B5FF5';
806
+ customOnAccent = '#FFFFFF';
807
+ customHeaderSurface = '#221a4c';
808
+ customHeaderContent = '#FFFFFF';
809
+ customHeaderAccent = 'rgba(255, 255, 255, 0.15)';
810
+ customOnHeaderAccent = '#FFFFFF';
811
+
812
+ // Sign-in background inputs
813
+ customSignInBgSolid = '#D6C7FF';
814
+ customSignInBgGradientStart = '#D6C7FF';
815
+ customSignInBgGradientEnd = '#8A9BFF';
816
+ customSignInContentColor = '#1a1a1a';
817
+
818
+ ngOnInit() {
819
+ this.updateCustomColorInputs();
820
+ this.updateSignInBgInputs();
821
+ this.updateSignInContentColorInput();
822
+ this.detectCurrentTheme();
823
+ }
824
+
825
+ /**
826
+ * Detect the current active theme based on colors
827
+ */
828
+ private detectCurrentTheme() {
829
+ const headerSurface = this.whitelabelService.headerSurface().toUpperCase();
830
+
831
+ if (headerSurface === '#A70923') {
832
+ this.currentTheme = 'cej';
833
+ } else if (headerSurface === '#660036') {
834
+ this.currentTheme = 'pka';
835
+ } else if (headerSurface === '#262424') {
836
+ this.currentTheme = 'clave';
837
+ } else if (headerSurface === '#1D4A49') {
838
+ this.currentTheme = 'freedom';
839
+ } else if (headerSurface === '#2C3E50') {
840
+ this.currentTheme = 'cobblestone';
841
+ } else {
842
+ this.currentTheme = 'default';
843
+ }
844
+ }
845
+
846
+ /**
847
+ * Close the modal
848
+ */
849
+ close(): void {
850
+ this.modalController.dismiss();
851
+ }
852
+
853
+ applyDefaultTheme() {
854
+ this.currentTheme = 'default';
855
+ this.whitelabelService.updateConfig({
856
+ logoUrl: '/Assets/logos/propbinder-logomark.svg',
857
+ logoMarkUrl: '/Assets/logos/propbinder-logomark.svg',
858
+ logoAlt: 'Propbinder',
859
+ logoSize: 'md',
860
+ appIconSurface: '#6B5FF5',
861
+ appIconContent: '#FFFFFF',
862
+ accent: '#6B5FF5',
863
+ onAccent: '#FFFFFF',
864
+ headerSurface: '#221a4c',
865
+ headerContent: '#FFFFFF',
866
+ headerAccent: '#6B5FF5',
867
+ onHeaderAccent: '#FFFFFF',
868
+ showCityIllustration: true,
869
+ signInBgType: 'gradient',
870
+ signInBgSolid: '#D6C7FF',
871
+ signInBgGradientStart: '#D6C7FF',
872
+ signInBgGradientEnd: '#8A9BFF',
873
+ signInContentColor: '#1a1a1a',
874
+ organizationName: 'Propbinder',
875
+ organizationId: 'default'
876
+ });
877
+ this.updateCustomColorInputs();
878
+ this.updateSignInBgInputs();
879
+ this.updateSignInContentColorInput();
880
+ }
881
+
882
+ applyCejTheme() {
883
+ this.currentTheme = 'cej';
884
+ this.whitelabelService.updateConfig({
885
+ logoUrl: '/Assets/logos/cej-logo.png',
886
+ logoMarkUrl: '/Assets/logos/cej-logo.png',
887
+ logoAlt: 'CEJ',
888
+ logoSize: 'xl',
889
+ appIconSurface: '#A70923',
890
+ appIconContent: '#FFFFFF',
891
+ accent: '#dc092c',
892
+ onAccent: '#FFFFFF',
893
+ headerSurface: '#A70923',
894
+ headerContent: '#FFFFFF',
895
+ headerAccent: '#dc092c',
896
+ onHeaderAccent: '#FFFFFF',
897
+ showCityIllustration: false,
898
+ signInBgType: 'gradient',
899
+ signInBgSolid: '#FFE5E8',
900
+ signInBgGradientStart: '#FFE5E8',
901
+ signInBgGradientEnd: '#FFC7CE',
902
+ signInContentColor: '#1a1a1a',
903
+ organizationName: 'CEJ',
904
+ organizationId: 'cej'
905
+ });
906
+ this.updateCustomColorInputs();
907
+ this.updateSignInBgInputs();
908
+ this.updateSignInContentColorInput();
909
+ }
910
+
911
+ applyPkaTheme() {
912
+ this.currentTheme = 'pka';
913
+ this.whitelabelService.updateConfig({
914
+ logoUrl: '/Assets/logos/pka-logo.svg',
915
+ logoMarkUrl: '/Assets/logos/pka-logo.svg',
916
+ logoAlt: 'PKA',
917
+ logoSize: 'md',
918
+ appIconSurface: '#CC006C',
919
+ appIconContent: '#FFFFFF',
920
+ accent: '#CC006C',
921
+ onAccent: '#FFFFFF',
922
+ headerSurface: '#660036',
923
+ headerContent: '#FFFFFF',
924
+ headerAccent: '#CC006C',
925
+ onHeaderAccent: '#FFFFFF',
926
+ showCityIllustration: false,
927
+ signInBgType: 'gradient',
928
+ signInBgSolid: '#FFE0F0',
929
+ signInBgGradientStart: '#FFE0F0',
930
+ signInBgGradientEnd: '#FFB3D9',
931
+ signInContentColor: '#1a1a1a',
932
+ organizationName: 'PKA',
933
+ organizationId: 'pka'
934
+ });
935
+ this.updateCustomColorInputs();
936
+ this.updateSignInBgInputs();
937
+ this.updateSignInContentColorInput();
938
+ }
939
+
940
+ applyClaveTheme() {
941
+ this.currentTheme = 'clave';
942
+ this.whitelabelService.updateConfig({
943
+ logoUrl: '/Assets/logos/clave-logo.svg',
944
+ logoMarkUrl: '/Assets/logos/clave-logo.svg',
945
+ logoAlt: 'Clave',
946
+ logoSize: 'lg',
947
+ appIconSurface: '#262424',
948
+ appIconContent: '#FFFFFF',
949
+ accent: '#868764',
950
+ onAccent: '#FFFFFF',
951
+ headerSurface: '#262424',
952
+ headerContent: '#FFFFFF',
953
+ headerAccent: '#868764',
954
+ onHeaderAccent: '#FFFFFF',
955
+ showCityIllustration: false,
956
+ signInBgType: 'gradient',
957
+ signInBgSolid: '#E8E8E0',
958
+ signInBgGradientStart: '#E8E8E0',
959
+ signInBgGradientEnd: '#D4D4C3',
960
+ signInContentColor: '#1a1a1a',
961
+ organizationName: 'Clave',
962
+ organizationId: 'clave'
963
+ });
964
+ this.updateCustomColorInputs();
965
+ this.updateSignInBgInputs();
966
+ this.updateSignInContentColorInput();
967
+ }
968
+
969
+ applyFreedomTheme() {
970
+ this.currentTheme = 'freedom';
971
+ this.whitelabelService.updateConfig({
972
+ logoUrl: '/Assets/logos/freedom-logo.svg',
973
+ logoMarkUrl: '/Assets/logos/freedom-logomark.svg',
974
+ logoAlt: 'Freedom',
975
+ logoSize: 'md',
976
+ appIconSurface: '#1D4A49',
977
+ appIconContent: '#FFFFFF',
978
+ accent: '#1D4A49',
979
+ onAccent: '#FFFFFF',
980
+ headerSurface: '#1D4A49',
981
+ headerContent: '#FFFFFF',
982
+ headerAccent: '#AACFC3',
983
+ onHeaderAccent: '#1D4A49',
984
+ showCityIllustration: false,
985
+ signInBgType: 'gradient',
986
+ signInBgSolid: '#D5E8E6',
987
+ signInBgGradientStart: '#D5E8E6',
988
+ signInBgGradientEnd: '#AACFC3',
989
+ signInContentColor: '#FFFFFF',
990
+ organizationName: 'Freedom',
991
+ organizationId: 'freedom'
992
+ });
993
+ this.updateCustomColorInputs();
994
+ this.updateSignInBgInputs();
995
+ this.updateSignInContentColorInput();
996
+ }
997
+
998
+ applyCobblestoneTheme() {
999
+ this.currentTheme = 'cobblestone';
1000
+ this.whitelabelService.updateConfig({
1001
+ logoUrl: '/Assets/logos/cobblestone-logo.svg',
1002
+ logoMarkUrl: '/Assets/logos/cobblestone-logomark.svg',
1003
+ logoAlt: 'Cobblestone',
1004
+ logoSize: 'sm',
1005
+ appIconSurface: '#2C3E50',
1006
+ appIconContent: '#FFFFFF',
1007
+ accent: '#3498DB',
1008
+ onAccent: '#FFFFFF',
1009
+ headerSurface: '#2C3E50',
1010
+ headerContent: '#FFFFFF',
1011
+ headerAccent: '#3498DB',
1012
+ onHeaderAccent: '#FFFFFF',
1013
+ showCityIllustration: false,
1014
+ signInBgType: 'gradient',
1015
+ signInBgSolid: '#E8EEF2',
1016
+ signInBgGradientStart: '#E8EEF2',
1017
+ signInBgGradientEnd: '#BDC3C7',
1018
+ signInContentColor: '#1a1a1a',
1019
+ organizationName: 'Cobblestone',
1020
+ organizationId: 'cobblestone'
1021
+ });
1022
+ this.updateCustomColorInputs();
1023
+ this.updateSignInBgInputs();
1024
+ this.updateSignInContentColorInput();
1025
+ }
1026
+
1027
+ applyCustomColors() {
1028
+ this.whitelabelService.updateColors({
1029
+ appIconSurface: this.customAppIconSurface,
1030
+ appIconContent: this.customAppIconContent,
1031
+ accent: this.customAccent,
1032
+ onAccent: this.customOnAccent,
1033
+ headerSurface: this.customHeaderSurface,
1034
+ headerContent: this.customHeaderContent,
1035
+ headerAccent: this.customHeaderAccent,
1036
+ onHeaderAccent: this.customOnHeaderAccent
1037
+ });
1038
+ }
1039
+
1040
+ toggleCityIllustration() {
1041
+ this.whitelabelService.updateConfig({
1042
+ showCityIllustration: !this.whitelabelService.showCityIllustration()
1043
+ });
1044
+ }
1045
+
1046
+ updateSignInBgType(type: 'solid' | 'gradient') {
1047
+ this.whitelabelService.updateConfig({
1048
+ signInBgType: type
1049
+ });
1050
+ }
1051
+
1052
+ updateLogoSize(size: 'sm' | 'md' | 'lg' | 'xl') {
1053
+ this.whitelabelService.updateConfig({
1054
+ logoSize: size,
1055
+ logoHeight: undefined // Clear custom height to use size-based calculation
1056
+ });
1057
+ }
1058
+
1059
+ applySignInBackground() {
1060
+ this.whitelabelService.updateConfig({
1061
+ signInBgSolid: this.customSignInBgSolid,
1062
+ signInBgGradientStart: this.customSignInBgGradientStart,
1063
+ signInBgGradientEnd: this.customSignInBgGradientEnd
1064
+ });
1065
+ }
1066
+
1067
+ applySignInContentColor() {
1068
+ this.whitelabelService.updateConfig({
1069
+ signInContentColor: this.customSignInContentColor
1070
+ });
1071
+ }
1072
+
1073
+ private updateSignInBgInputs() {
1074
+ this.customSignInBgSolid = this.whitelabelService.signInBgSolid();
1075
+ this.customSignInBgGradientStart = this.whitelabelService.signInBgGradientStart();
1076
+ this.customSignInBgGradientEnd = this.whitelabelService.signInBgGradientEnd();
1077
+ }
1078
+
1079
+ private updateSignInContentColorInput() {
1080
+ this.customSignInContentColor = this.whitelabelService.signInContentColor();
1081
+ }
1082
+
1083
+ private updateCustomColorInputs() {
1084
+ this.customAppIconSurface = this.whitelabelService.appIconSurface();
1085
+ this.customAppIconContent = this.whitelabelService.appIconContent();
1086
+ this.customAccent = this.whitelabelService.accent();
1087
+ this.customOnAccent = this.whitelabelService.onAccent();
1088
+ this.customHeaderSurface = this.whitelabelService.headerSurface();
1089
+ this.customHeaderContent = this.whitelabelService.headerContent();
1090
+ this.customHeaderAccent = this.whitelabelService.headerAccent();
1091
+ this.customOnHeaderAccent = this.whitelabelService.onHeaderAccent();
1092
+ }
1093
+ }
1094
+