@propbinder/mobile-design 0.0.2 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/propbinder-mobile-design.mjs +12604 -0
- package/fesm2022/propbinder-mobile-design.mjs.map +1 -0
- package/index.d.ts +3214 -0
- package/package.json +39 -12
- package/ng-package.json +0 -7
- package/src/animations/page-transitions.ts +0 -86
- package/src/assets/fonts/Brockmann-Bold.otf +0 -0
- package/src/assets/fonts/Brockmann-BoldItalic.otf +0 -0
- package/src/assets/fonts/Brockmann-Medium.otf +0 -0
- package/src/assets/fonts/Brockmann-MediumItalic.otf +0 -0
- package/src/assets/fonts/Brockmann-Regular.otf +0 -0
- package/src/assets/fonts/Brockmann-RegularItalic.otf +0 -0
- package/src/assets/fonts/Brockmann-SemiBold.otf +0 -0
- package/src/assets/fonts/Brockmann-SemiBoldItalic.otf +0 -0
- package/src/assets/fonts/Brockmann_desktop_license.pdf +0 -0
- package/src/assets/fonts/brockmann-medium-webfont.woff2 +0 -0
- package/src/assets/fonts/brockmann-regular-webfont.woff2 +0 -0
- package/src/assets/fonts/brockmann-semibold-webfont.woff2 +0 -0
- package/src/components/action-list-item/ds-mobile-action-list-item.ts +0 -83
- package/src/components/action-list-item/index.ts +0 -2
- package/src/components/app-layout/ds-mobile-app-layout.css +0 -343
- package/src/components/app-layout/ds-mobile-app-layout.ts +0 -271
- package/src/components/app-layout/index.ts +0 -2
- package/src/components/avatar-with-badge/ds-avatar-with-badge.ts +0 -130
- package/src/components/avatar-with-badge/index.ts +0 -2
- package/src/components/bottom-sheet/ds-mobile-actions-bottom-sheet.ts +0 -273
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet.css +0 -110
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet.service.ts +0 -167
- package/src/components/bottom-sheet/ds-mobile-post-create-bottom-sheet.ts +0 -656
- package/src/components/bottom-sheet/index.ts +0 -3
- package/src/components/comment/ds-mobile-comment.ts +0 -516
- package/src/components/comment/index.ts +0 -2
- package/src/components/contact-list-item/ds-mobile-contact-list-item.ts +0 -182
- package/src/components/contact-list-item/index.ts +0 -2
- package/src/components/content/ds-mobile-content.ts +0 -158
- package/src/components/content/index.ts +0 -2
- package/src/components/ds-mobile-tabs.css +0 -372
- package/src/components/ds-mobile-tabs.ts +0 -217
- package/src/components/file-attachment/ds-mobile-file-attachment.ts +0 -164
- package/src/components/file-attachment/index.ts +0 -2
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.service.ts +0 -98
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.ts +0 -514
- package/src/components/handbook-detail-modal/index.ts +0 -3
- package/src/components/handbook-folder/ds-mobile-handbook-folder-mini.ts +0 -130
- package/src/components/handbook-folder/ds-mobile-handbook-folder.ts +0 -444
- package/src/components/handbook-folder/index.ts +0 -4
- package/src/components/header-content/ds-mobile-header-content.ts +0 -211
- package/src/components/header-content/index.ts +0 -2
- package/src/components/index.ts +0 -45
- package/src/components/inline-photo/ds-mobile-inline-photo.ts +0 -269
- package/src/components/inline-photo/index.ts +0 -1
- package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.css +0 -60
- package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.ts +0 -280
- package/src/components/interactive-list-item-inquiry/index.ts +0 -2
- package/src/components/interactive-list-item-message/ds-mobile-interactive-list-item-message.ts +0 -197
- package/src/components/interactive-list-item-message/index.ts +0 -2
- package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.css +0 -70
- package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.ts +0 -594
- package/src/components/interactive-list-item-post/ds-mobile-post-pdf-attachment.ts +0 -124
- package/src/components/interactive-list-item-post/index.ts +0 -13
- package/src/components/lightbox/ds-mobile-lightbox-footer.ts +0 -331
- package/src/components/lightbox/ds-mobile-lightbox-header.ts +0 -173
- package/src/components/lightbox/ds-mobile-lightbox-image.ts +0 -464
- package/src/components/lightbox/ds-mobile-lightbox-pdf.css +0 -375
- package/src/components/lightbox/ds-mobile-lightbox-pdf.ts +0 -374
- package/src/components/lightbox/ds-mobile-lightbox.css +0 -587
- package/src/components/lightbox/ds-mobile-lightbox.service.ts +0 -293
- package/src/components/lightbox/ds-mobile-lightbox.ts +0 -529
- package/src/components/lightbox/index.ts +0 -22
- package/src/components/list-item/ds-mobile-list-item.ts +0 -499
- package/src/components/list-item/index.ts +0 -2
- package/src/components/list-item-static/ds-mobile-list-item-static.ts +0 -133
- package/src/components/list-item-static/index.ts +0 -2
- package/src/components/logo/ds-logo.ts +0 -85
- package/src/components/logo/index.ts +0 -2
- package/src/components/modal/ds-mobile-modal.css +0 -163
- package/src/components/modal/ds-mobile-modal.service.ts +0 -329
- package/src/components/modal/index.ts +0 -8
- package/src/components/page-details/ds-mobile-page-details.css +0 -285
- package/src/components/page-details/ds-mobile-page-details.ts +0 -128
- package/src/components/page-details/index.ts +0 -2
- package/src/components/page-main/ds-mobile-page-main.css +0 -346
- package/src/components/page-main/ds-mobile-page-main.ts +0 -331
- package/src/components/page-main/index.ts +0 -2
- package/src/components/post-card/ds-mobile-post-card.ts +0 -685
- package/src/components/post-card/ds-mobile-post-pdf-attachment.ts +0 -124
- package/src/components/post-card/index.ts +0 -11
- package/src/components/post-composer/ds-mobile-post-composer.ts +0 -140
- package/src/components/post-composer/index.ts +0 -2
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.service.ts +0 -104
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.ts +0 -1273
- package/src/components/post-detail-modal/index.ts +0 -9
- package/src/components/shared/directives/index.ts +0 -2
- package/src/components/shared/directives/long-press.directive.ts +0 -208
- package/src/components/shared/index.ts +0 -3
- package/src/components/shared/mobile-common.css +0 -94
- package/src/components/shared/mobile-page-base.css +0 -315
- package/src/components/shared/mobile-page-base.ts +0 -70
- package/src/components/swiper/ds-mobile-swiper.ts +0 -123
- package/src/components/swiper/index.ts +0 -2
- package/src/components/tab-bar/ds-mobile-tab-bar.ts +0 -132
- package/src/components/tab-bar/index.ts +0 -2
- package/src/components/tabs/ds-mobile-tabs.css +0 -405
- package/src/components/tabs/ds-mobile-tabs.ts +0 -204
- package/src/components/tabs/index.ts +0 -2
- package/src/pages/community.page.ts +0 -768
- package/src/pages/handbook.page.ts +0 -298
- package/src/pages/home.page.ts +0 -192
- package/src/pages/index.ts +0 -9
- package/src/pages/inquiries.example.ts +0 -212
- package/src/pages/inquiry-detail.example.css +0 -434
- package/src/pages/inquiry-detail.example.ts +0 -416
- package/src/pages/mobile-tabs-example.component.ts +0 -146
- package/src/pages/post-create.page.ts +0 -311
- package/src/pages/post-detail.page.ts +0 -295
- package/src/pages/whitelabel-demo.page.ts +0 -548
- package/src/public-api.ts +0 -5
- package/src/services/user.service.ts +0 -35
- package/src/services/whitelabel.service.ts +0 -171
- package/src/styles/ionic.css +0 -673
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -13
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
/* ============================================
|
|
2
|
-
DS MOBILE PAGE DETAILS
|
|
3
|
-
Reusable mobile page component for detail/drill-down pages
|
|
4
|
-
============================================ */
|
|
5
|
-
|
|
6
|
-
/* ============================================
|
|
7
|
-
HOST
|
|
8
|
-
============================================ */
|
|
9
|
-
|
|
10
|
-
:host {
|
|
11
|
-
display: flex;
|
|
12
|
-
flex-direction: column;
|
|
13
|
-
height: 100%;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/* ============================================
|
|
17
|
-
ION-HEADER - Back Button Header (Mobile)
|
|
18
|
-
============================================ */
|
|
19
|
-
|
|
20
|
-
ion-header {
|
|
21
|
-
background: var(--color-brand-secondary);
|
|
22
|
-
box-shadow: none;
|
|
23
|
-
height: 64px;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
ion-header ion-toolbar {
|
|
27
|
-
--background: var(--color-brand-secondary);
|
|
28
|
-
--border-width: 0;
|
|
29
|
-
--box-shadow: none;
|
|
30
|
-
--padding-top: 0;
|
|
31
|
-
--padding-bottom: 0;
|
|
32
|
-
--padding-start: 0;
|
|
33
|
-
--padding-end: 0;
|
|
34
|
-
--min-height: 64px;
|
|
35
|
-
height: 100%;
|
|
36
|
-
min-height: 64px;
|
|
37
|
-
padding: 0;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
ion-header ion-toolbar::part(native) {
|
|
41
|
-
height: 100%;
|
|
42
|
-
min-height: 64px;
|
|
43
|
-
padding: 0;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/* Hide mobile header on desktop */
|
|
47
|
-
@media (min-width: 768px) {
|
|
48
|
-
ion-header {
|
|
49
|
-
display: none;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/* ============================================
|
|
54
|
-
HEADER BACK (Mobile)
|
|
55
|
-
============================================ */
|
|
56
|
-
|
|
57
|
-
.header-back {
|
|
58
|
-
display: flex;
|
|
59
|
-
align-items: center;
|
|
60
|
-
justify-content: space-between;
|
|
61
|
-
padding: 12px 16px;
|
|
62
|
-
background: var(--color-brand-secondary);
|
|
63
|
-
position: relative;
|
|
64
|
-
height: 100%;
|
|
65
|
-
min-height: 64px;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.header-back .back-button {
|
|
69
|
-
background: none;
|
|
70
|
-
border: none;
|
|
71
|
-
padding: 0;
|
|
72
|
-
display: flex;
|
|
73
|
-
align-items: center;
|
|
74
|
-
justify-content: center;
|
|
75
|
-
cursor: pointer;
|
|
76
|
-
color: white;
|
|
77
|
-
transition: opacity var(--transition-duration-fast) var(--ease-smooth);
|
|
78
|
-
z-index: 10;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.header-back .back-button:hover {
|
|
82
|
-
opacity: 0.8;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.header-back .back-button:active {
|
|
86
|
-
opacity: 0.6;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
.header-back .header-title {
|
|
90
|
-
position: absolute;
|
|
91
|
-
left: 50%;
|
|
92
|
-
transform: translateX(-50%);
|
|
93
|
-
font-size: var(--font-size-base);
|
|
94
|
-
font-weight: 600;
|
|
95
|
-
color: white;
|
|
96
|
-
margin: 0;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/* ============================================
|
|
100
|
-
DESKTOP HEADER (Above Content)
|
|
101
|
-
============================================ */
|
|
102
|
-
|
|
103
|
-
.desktop-header {
|
|
104
|
-
display: none;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
@media (min-width: 768px) {
|
|
108
|
-
.desktop-header {
|
|
109
|
-
display: flex;
|
|
110
|
-
align-items: center;
|
|
111
|
-
gap: 16px;
|
|
112
|
-
padding: 32px var(--content-padding-md) 24px var(--content-padding-md);
|
|
113
|
-
max-width: calc(var(--content-max-width-md) + (var(--content-padding-md) * 2));
|
|
114
|
-
margin: 0 auto;
|
|
115
|
-
width: 100%;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.desktop-header .back-button {
|
|
119
|
-
background: none;
|
|
120
|
-
border: none;
|
|
121
|
-
padding: 0;
|
|
122
|
-
display: flex;
|
|
123
|
-
align-items: center;
|
|
124
|
-
justify-content: center;
|
|
125
|
-
cursor: pointer;
|
|
126
|
-
color: var(--text-color-default-primary);
|
|
127
|
-
transition: opacity var(--transition-duration-fast) var(--ease-smooth);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
.desktop-header .back-button:hover {
|
|
131
|
-
opacity: 0.8;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
.desktop-header .back-button:active {
|
|
135
|
-
opacity: 0.6;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
.desktop-header h1 {
|
|
139
|
-
font-size: var(--font-size-2xl);
|
|
140
|
-
font-weight: 600;
|
|
141
|
-
margin: 0;
|
|
142
|
-
color: var(--text-color-default-primary);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
@media (min-width: 992px) {
|
|
147
|
-
.desktop-header {
|
|
148
|
-
max-width: calc(var(--content-max-width-md) + (var(--content-padding-md) * 2));
|
|
149
|
-
padding-left: var(--content-padding-lg);
|
|
150
|
-
padding-right: var(--content-padding-lg);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
@media (min-width: 1440px) {
|
|
155
|
-
.desktop-header {
|
|
156
|
-
max-width: calc(var(--content-max-width-lg) + (var(--content-padding-lg) * 2));
|
|
157
|
-
padding-left: var(--content-padding-xl);
|
|
158
|
-
padding-right: var(--content-padding-xl);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
@media (min-width: 1768px) {
|
|
163
|
-
.desktop-header {
|
|
164
|
-
padding-left: var(--content-padding-2xl);
|
|
165
|
-
padding-right: var(--content-padding-2xl);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
@media (min-width: 1920px) {
|
|
170
|
-
.desktop-header {
|
|
171
|
-
padding-left: var(--content-padding-3xl);
|
|
172
|
-
padding-right: var(--content-padding-3xl);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/* ============================================
|
|
177
|
-
ION-CONTENT
|
|
178
|
-
============================================ */
|
|
179
|
-
|
|
180
|
-
ion-content {
|
|
181
|
-
--background: var(--color-background-neutral-primary);
|
|
182
|
-
--padding-top: 0;
|
|
183
|
-
--padding-start: 0;
|
|
184
|
-
--padding-end: 0;
|
|
185
|
-
--padding-bottom: 0;
|
|
186
|
-
overflow: hidden;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/* Mobile: Start with full radius, then animate to flat bottom */
|
|
190
|
-
@media (max-width: 767px) {
|
|
191
|
-
ion-content {
|
|
192
|
-
/* Start with fully rounded corners - 36px bottom radius for more prominent effect */
|
|
193
|
-
border-radius: 24px 24px 36px 36px;
|
|
194
|
-
/* Animate to flat bottom after a delay (matches page transition) */
|
|
195
|
-
animation: bottomRadiusOut 0.6s ease 0.3s forwards;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/* Reverse animation when navigating back */
|
|
199
|
-
:host(.navigating-back) ion-content {
|
|
200
|
-
/* Start from flat bottom (the end state after forward animation) */
|
|
201
|
-
/* Don't use !important here as it would block the animation from working */
|
|
202
|
-
border-radius: 24px 24px 0 0;
|
|
203
|
-
/* Animate back to fully rounded during the page transition */
|
|
204
|
-
/* Duration and easing match the page transition for smooth visual effect */
|
|
205
|
-
animation: bottomRadiusIn 0.8s cubic-bezier(0.36, 0.66, 0.04, 1) forwards !important;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/* Animate bottom corners from rounded to flat (forward) */
|
|
210
|
-
@keyframes bottomRadiusOut {
|
|
211
|
-
from {
|
|
212
|
-
border-radius: 24px 24px 36px 36px;
|
|
213
|
-
}
|
|
214
|
-
to {
|
|
215
|
-
border-radius: 24px 24px 0 0;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/* Animate bottom corners from flat to rounded (reverse) */
|
|
220
|
-
@keyframes bottomRadiusIn {
|
|
221
|
-
from {
|
|
222
|
-
border-radius: 24px 24px 0 0;
|
|
223
|
-
}
|
|
224
|
-
to {
|
|
225
|
-
border-radius: 24px 24px 36px 36px;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/* Desktop: always flat bottom, no animation */
|
|
230
|
-
@media (min-width: 768px) {
|
|
231
|
-
ion-content {
|
|
232
|
-
border-radius: 24px 24px 0 0;
|
|
233
|
-
animation: none;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
ion-content::part(scroll) {
|
|
238
|
-
-webkit-overflow-scrolling: touch;
|
|
239
|
-
overscroll-behavior-y: none;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/* ============================================
|
|
243
|
-
DETAIL CONTENT
|
|
244
|
-
============================================ */
|
|
245
|
-
|
|
246
|
-
.detail-content {
|
|
247
|
-
/* Fixed 20px horizontal padding globally */
|
|
248
|
-
padding: 24px 20px 32px 20px;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
@media (min-width: 768px) {
|
|
252
|
-
.detail-content {
|
|
253
|
-
padding: 32px var(--content-padding-md) !important; /* Override inline styles on desktop */
|
|
254
|
-
max-width: calc(var(--content-max-width-md) + (var(--content-padding-md) * 2));
|
|
255
|
-
margin: 0 auto;
|
|
256
|
-
width: 100%;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
@media (min-width: 992px) {
|
|
261
|
-
.detail-content {
|
|
262
|
-
padding: 32px var(--content-padding-lg) !important;
|
|
263
|
-
max-width: calc(var(--content-max-width-md) + (var(--content-padding-md) * 2));
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
@media (min-width: 1440px) {
|
|
268
|
-
.detail-content {
|
|
269
|
-
padding: 32px var(--content-padding-xl) !important;
|
|
270
|
-
max-width: calc(var(--content-max-width-lg) + (var(--content-padding-lg) * 2));
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
@media (min-width: 1768px) {
|
|
275
|
-
.detail-content {
|
|
276
|
-
padding: 32px var(--content-padding-2xl) !important;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
@media (min-width: 1920px) {
|
|
281
|
-
.detail-content {
|
|
282
|
-
padding: 32px var(--content-padding-3xl) !important;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { Component, input, output, ElementRef } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { NavController } from '@ionic/angular/standalone';
|
|
4
|
-
import { IonHeader, IonToolbar, IonContent } from '@ionic/angular/standalone';
|
|
5
|
-
import { DsIconComponent } from '@propbinder/design-system';
|
|
6
|
-
import { MobilePageBase } from '../shared/mobile-page-base';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* DsMobilePageDetailsComponent
|
|
10
|
-
*
|
|
11
|
-
* A mobile page layout for detail/drill-down pages with:
|
|
12
|
-
* - Back button header (mobile + desktop variants)
|
|
13
|
-
* - White background content area
|
|
14
|
-
* - Responsive padding
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```html
|
|
18
|
-
* <!-- Simple detail page -->
|
|
19
|
-
* <ds-mobile-page-details
|
|
20
|
-
* title="Property Details"
|
|
21
|
-
* (back)="goBack()">
|
|
22
|
-
* <div class="page-content">
|
|
23
|
-
* <!-- Your content -->
|
|
24
|
-
* </div>
|
|
25
|
-
* </ds-mobile-page-details>
|
|
26
|
-
*
|
|
27
|
-
* <!-- With default back route -->
|
|
28
|
-
* <ds-mobile-page-details
|
|
29
|
-
* title="Invoice Details"
|
|
30
|
-
* backRoute="/invoices">
|
|
31
|
-
* <div class="page-content">
|
|
32
|
-
* <!-- Your content -->
|
|
33
|
-
* </div>
|
|
34
|
-
* </ds-mobile-page-details>
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
@Component({
|
|
38
|
-
selector: 'ds-mobile-page-details',
|
|
39
|
-
standalone: true,
|
|
40
|
-
imports: [
|
|
41
|
-
CommonModule,
|
|
42
|
-
IonHeader,
|
|
43
|
-
IonToolbar,
|
|
44
|
-
IonContent,
|
|
45
|
-
DsIconComponent
|
|
46
|
-
],
|
|
47
|
-
styleUrls: ['./ds-mobile-page-details.css'],
|
|
48
|
-
template: `
|
|
49
|
-
<!-- Mobile header - hidden on desktop -->
|
|
50
|
-
<ion-header>
|
|
51
|
-
<ion-toolbar>
|
|
52
|
-
<div class="header-back">
|
|
53
|
-
<button class="back-button" (click)="handleBack()" [attr.aria-label]="'Go back'">
|
|
54
|
-
<ds-icon name="remixArrowLeftLine" size="24px" />
|
|
55
|
-
</button>
|
|
56
|
-
<h1 class="header-title">{{ title() }}</h1>
|
|
57
|
-
</div>
|
|
58
|
-
</ion-toolbar>
|
|
59
|
-
</ion-header>
|
|
60
|
-
|
|
61
|
-
<ion-content>
|
|
62
|
-
<!-- Desktop header above content -->
|
|
63
|
-
<div class="desktop-header">
|
|
64
|
-
<button class="back-button" (click)="handleBack()" [attr.aria-label]="'Go back'">
|
|
65
|
-
<ds-icon name="remixArrowLeftLine" size="24px" />
|
|
66
|
-
</button>
|
|
67
|
-
<h1>{{ title() }}</h1>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
<!-- Content area -->
|
|
71
|
-
<div class="detail-content">
|
|
72
|
-
<ng-content></ng-content>
|
|
73
|
-
</div>
|
|
74
|
-
</ion-content>
|
|
75
|
-
`
|
|
76
|
-
})
|
|
77
|
-
export class DsMobilePageDetailsComponent extends MobilePageBase {
|
|
78
|
-
// Inputs
|
|
79
|
-
title = input.required<string>();
|
|
80
|
-
backRoute = input<string>(''); // Optional default back route
|
|
81
|
-
|
|
82
|
-
// Outputs
|
|
83
|
-
back = output<void>();
|
|
84
|
-
|
|
85
|
-
constructor(
|
|
86
|
-
private navCtrl: NavController,
|
|
87
|
-
private elementRef: ElementRef
|
|
88
|
-
) {
|
|
89
|
-
super();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Handle back navigation
|
|
94
|
-
*
|
|
95
|
-
* By default, navigates using the provided backRoute or browser back.
|
|
96
|
-
* Parent components can listen to the (back) event to override this behavior.
|
|
97
|
-
*
|
|
98
|
-
* @example
|
|
99
|
-
* ```html
|
|
100
|
-
* <!-- Default behavior: uses backRoute or browser back -->
|
|
101
|
-
* <ds-mobile-page-details
|
|
102
|
-
* title="Details"
|
|
103
|
-
* backRoute="/home">
|
|
104
|
-
* </ds-mobile-page-details>
|
|
105
|
-
*
|
|
106
|
-
* <!-- Custom behavior: parent handles navigation -->
|
|
107
|
-
* <ds-mobile-page-details
|
|
108
|
-
* title="Details"
|
|
109
|
-
* (back)="customBackHandler()">
|
|
110
|
-
* </ds-mobile-page-details>
|
|
111
|
-
* ```
|
|
112
|
-
*/
|
|
113
|
-
handleBack(): void {
|
|
114
|
-
// Add class to trigger reverse animation
|
|
115
|
-
this.elementRef.nativeElement.classList.add('navigating-back');
|
|
116
|
-
|
|
117
|
-
// Emit event for parent to optionally handle
|
|
118
|
-
this.back.emit();
|
|
119
|
-
|
|
120
|
-
// Default behavior: navigate using backRoute or browser back
|
|
121
|
-
if (this.backRoute()) {
|
|
122
|
-
this.navCtrl.navigateBack(this.backRoute());
|
|
123
|
-
} else {
|
|
124
|
-
this.navCtrl.back();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|