@propbinder/mobile-design 0.4.0 → 0.4.4

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 (23) hide show
  1. package/README.md +63 -63
  2. package/assets/fonts/brockmann-medium-webfont.woff2 +0 -0
  3. package/assets/fonts/brockmann-mediumitalic-webfont.woff2 +0 -0
  4. package/assets/fonts/brockmann-regular-webfont.woff2 +0 -0
  5. package/assets/fonts/brockmann-regularitalic-webfont.woff2 +0 -0
  6. package/assets/fonts/brockmann-semibold-webfont.woff2 +0 -0
  7. package/assets/fonts/brockmann-semibolditalic-webfont.woff2 +0 -0
  8. package/fesm2022/{propbinder-mobile-design-ds-mobile-days-sheet-BsahIVaB.mjs → propbinder-mobile-design-ds-mobile-days-sheet-Bf7hxhB6.mjs} +51 -51
  9. package/fesm2022/propbinder-mobile-design-ds-mobile-days-sheet-Bf7hxhB6.mjs.map +1 -0
  10. package/fesm2022/{propbinder-mobile-design-ds-mobile-duration-sheet-Dun-o-dR.mjs → propbinder-mobile-design-ds-mobile-duration-sheet-BHTlCfU7.mjs} +173 -173
  11. package/fesm2022/propbinder-mobile-design-ds-mobile-duration-sheet-BHTlCfU7.mjs.map +1 -0
  12. package/fesm2022/{propbinder-mobile-design-ds-mobile-time-sheet-B9Ny4wM7.mjs → propbinder-mobile-design-ds-mobile-time-sheet-CrUB7zl-.mjs} +69 -69
  13. package/fesm2022/propbinder-mobile-design-ds-mobile-time-sheet-CrUB7zl-.mjs.map +1 -0
  14. package/fesm2022/propbinder-mobile-design.mjs +14770 -14770
  15. package/fesm2022/propbinder-mobile-design.mjs.map +1 -1
  16. package/index.d.ts +1 -1
  17. package/package.json +1 -1
  18. package/styles/ionic.css +989 -989
  19. package/styles/mobile-common.css +155 -155
  20. package/styles/mobile-page-base.css +338 -338
  21. package/fesm2022/propbinder-mobile-design-ds-mobile-days-sheet-BsahIVaB.mjs.map +0 -1
  22. package/fesm2022/propbinder-mobile-design-ds-mobile-duration-sheet-Dun-o-dR.mjs.map +0 -1
  23. package/fesm2022/propbinder-mobile-design-ds-mobile-time-sheet-B9Ny4wM7.mjs.map +0 -1
@@ -1,338 +1,338 @@
1
- /* ============================================
2
- MOBILE PAGE BASE STYLES
3
- Shared styles for mobile pages
4
- Import this in your page component's styleUrls
5
- ============================================ */
6
-
7
- /* ============================================
8
- HOST
9
- ============================================ */
10
-
11
- :host {
12
- display: flex;
13
- flex-direction: column;
14
- align-items: center;
15
- height: 100%;
16
- /* Solid background to cover overlay from page underneath during transitions */
17
- background: var(--color-header-surface);
18
- width: 100%;
19
- }
20
-
21
- /* ============================================
22
- SHARED ION-HEADER STYLES
23
- ============================================ */
24
-
25
- :host ion-header {
26
- background: var(--color-header-surface);
27
- box-shadow: none;
28
- height: 72px;
29
- min-height: 72px;
30
- margin-top: var(--app-header-top-offset);
31
- }
32
-
33
- :host ion-header ion-toolbar {
34
- --background: var(--color-header-surface);
35
- --border-width: 0;
36
- --box-shadow: none;
37
- --padding-top: 0;
38
- --padding-bottom: 0;
39
- --padding-start: 0;
40
- --padding-end: 0;
41
- --min-height: 72px;
42
- height: 72px;
43
- min-height: 72px;
44
- padding: 0;
45
- }
46
-
47
- @media (min-width: 768px) {
48
- :host ion-header {
49
- height: 88px;
50
- min-height: 88px;
51
- }
52
-
53
- :host ion-header ion-toolbar {
54
- --min-height: 88px;
55
- height: 88px;
56
- min-height: 88px;
57
- }
58
- }
59
-
60
- /* Hide header on desktop when using ds-mobile-tabs top bar */
61
- /* Note: This only applies to components using ds-mobile-page-main/ds-mobile-page-details */
62
- /* Pages that need the header visible on desktop should override this */
63
- @media (min-width: 768px) {
64
- :host ion-header {
65
- display: none;
66
- height: auto;
67
- }
68
- }
69
-
70
- /* ============================================
71
- SHARED HEADER CONTAINER PATTERNS
72
- ============================================ */
73
-
74
- /* Common flex container pattern for header content */
75
- :host .header-main,
76
- :host .header-details,
77
- .header-details {
78
- display: flex;
79
- align-items: center;
80
- justify-content: space-between;
81
- background: var(--color-header-surface);
82
- position: relative;
83
- }
84
-
85
- /* Common centered title pattern */
86
- :host .header-main__title,
87
- :host .header-details .header-title,
88
- .header-details .header-title {
89
- position: absolute;
90
- left: 50%;
91
- transform: translateX(-50%);
92
- font-size: var(--font-size-base);
93
- font-weight: 600;
94
- color: var(--color-header-content);
95
- margin: 0;
96
- padding: 0;
97
- --color: var(--color-header-content);
98
- }
99
-
100
- /* Scroll behavior for header-details title (hidden initially, shows on scroll) */
101
- .header-details .header-title {
102
- transform: translateX(-50%) translateY(-100%);
103
- opacity: 0 !important;
104
- pointer-events: none;
105
- transition: transform 0.2s ease, opacity 0.2s ease !important;
106
- }
107
-
108
- /* Show title when scrolled */
109
- .header-scrolled .header-details .header-title {
110
- opacity: 1 !important;
111
- pointer-events: auto;
112
- transform: translateX(-50%) translateY(0);
113
- }
114
-
115
- /* Back button styles for detail pages */
116
- :host .header-details .back-button,
117
- .header-details .back-button {
118
- background: none;
119
- border: none;
120
- padding: 0;
121
- display: flex;
122
- align-items: center;
123
- justify-content: center;
124
- cursor: pointer;
125
- color: var(--color-header-content);
126
- transition: opacity var(--transition-duration-fast, 0.2s) var(--ease-smooth, ease);
127
- z-index: 10;
128
- position: relative;
129
- }
130
-
131
- :host .header-details .back-button:hover,
132
- .header-details .back-button:hover {
133
- opacity: 0.8;
134
- }
135
-
136
- :host .header-details .back-button:active,
137
- .header-details .back-button:active {
138
- opacity: 0.6;
139
- }
140
-
141
- /* ============================================
142
- SHARED ION-CONTENT STYLES
143
- ============================================ */
144
-
145
- :host ion-content {
146
- --background: var(--color-header-surface);
147
- --padding-top: 0;
148
- --padding-start: 0;
149
- --padding-end: 0;
150
- --padding-bottom: 0;
151
- border-radius: 24px 24px 0 0;
152
- overflow: hidden;
153
- }
154
-
155
- /* Make ion-content scroll area a flex container */
156
- :host ion-content::part(scroll) {
157
- display: flex;
158
- flex-direction: column;
159
- min-height: 100%;
160
- -webkit-overflow-scrolling: touch;
161
- /* Note: Do NOT set overscroll-behavior-y here as it prevents ion-refresher from working */
162
- /* overscroll-behavior on ion-app is sufficient to block native browser pull-to-refresh */
163
- }
164
-
165
- /* iOS-specific: White background for bottom overshoot */
166
- .plt-ios :host ion-content {
167
- --background: var(--color-background-neutral-primary);
168
- }
169
-
170
- /* Desktop only: remove bottom radius */
171
- @media (min-width: 768px) {
172
- :host ion-content {
173
- border-radius: 24px 24px 0 0;
174
- }
175
- }
176
-
177
- /* ============================================
178
- CONDENSED HEADER
179
- ============================================ */
180
-
181
- :host ion-header[collapse="condense"] {
182
- display: none;
183
- }
184
-
185
- @media (min-width: 768px) {
186
- :host ion-header[collapse="condense"] {
187
- display: none;
188
- }
189
- }
190
-
191
- /* ============================================
192
- REFRESHER
193
- ============================================ */
194
-
195
- :host ion-refresher {
196
- z-index: 0;
197
- }
198
-
199
- :host ion-refresher-content {
200
- --color: var(--color-header-content);
201
- }
202
-
203
- /* ============================================
204
- SHARED CONTENT WRAPPER STYLES
205
- ============================================ */
206
-
207
- :host .content-wrapper {
208
- width: 100%;
209
- position: relative;
210
- z-index: 20;
211
- /* Fill remaining viewport height while keeping ion-content as scroller */
212
- flex: 1;
213
- display: flex;
214
- flex-direction: column;
215
- background: var(--color-background-neutral-primary);
216
- border-radius: 24px 24px 0 0;
217
- overflow: visible;
218
-
219
- /* Visual styling for iOS overshoot - extend background below using box-shadow */
220
- transform: translateZ(0);
221
- will-change: transform;
222
- isolation: isolate;
223
- box-shadow: 0 300px 0 0 var(--color-background-neutral-primary);
224
-
225
- /* No top padding - ds-mobile-section provides its own */
226
- padding-top: 0;
227
- padding-left: var(--content-wrapper-padding, 20px);
228
- padding-right: var(--content-wrapper-padding, 20px);
229
- /* Bottom padding ALWAYS preserved for safe area and tab bar */
230
- padding-bottom: calc(var(--mobile-content-spacing) + var(--mobile-tab-bar-height) + var(--app-safe-bottom, 0px));
231
- }
232
-
233
- :host .content-inner {
234
- /* Mobile-first: max-width 640px, centered */
235
- max-width: 640px;
236
- margin: 0 auto;
237
- width: 100%;
238
- }
239
-
240
- @media (min-width: 768px) {
241
- :host .content-wrapper {
242
- /* Remove top padding since ds-mobile-section provides its own */
243
- padding-top: 0;
244
- padding-left: var(--content-wrapper-padding, 20px);
245
- padding-right: var(--content-wrapper-padding, 20px);
246
- }
247
- }
248
-
249
- /* ============================================
250
- EXPANDABLE HEADER (for main pages only)
251
- ============================================ */
252
-
253
- :host .header-expandable {
254
- background: var(--color-header-surface);
255
- padding: 32px 20px 24px 20px;
256
- color: var(--header-content-color, white);
257
- position: sticky;
258
- top: 0;
259
- z-index: 5;
260
- transition: opacity 0.1s ease-out, transform 0.1s ease-out;
261
- /* ion-content::part(scroll) is a flex column + .content-wrapper has flex:1 — sticky flex items
262
- can otherwise shrink to a single line (~56px) and padding looks “gone” */
263
- flex: 0 0 auto;
264
- min-height: -moz-min-content;
265
- min-height: min-content;
266
- }
267
-
268
- :host .header-expandable-inner {
269
- display: flex;
270
- flex-direction: column;
271
- gap: 20px;
272
- max-width: 640px;
273
- margin: 0 auto;
274
- }
275
-
276
- :host .header-expandable__text {
277
- margin-bottom: 0;
278
- gap: 4px;
279
- display: flex;
280
- flex-direction: column;
281
- }
282
-
283
- :host .header-expandable__title {
284
- font-size: var(--font-size-2xl);
285
- font-weight: 600;
286
- color: var(--header-content-color, white);
287
- margin: 0;
288
- }
289
-
290
- :host .header-expandable__subtitle {
291
- font-size: var(--font-size-sm);
292
- font-weight: 400;
293
- color: var(--header-content-color, white);
294
- opacity: 0.85;
295
- margin: 0;
296
- }
297
-
298
- @media (min-width: 768px) {
299
- :host .header-expandable {
300
- padding: 48px 20px 32px 20px;
301
- }
302
-
303
- :host .header-expandable__title {
304
- font-size: var(--font-size-3xl);
305
- }
306
-
307
- :host .header-expandable__subtitle {
308
- font-size: var(--font-size-base);
309
- }
310
- }
311
-
312
- @media (min-width: 992px) {
313
- :host .header-expandable {
314
- padding-left: var(--content-padding-lg);
315
- padding-right: var(--content-padding-lg);
316
- }
317
- }
318
-
319
- @media (min-width: 1440px) {
320
- :host .header-expandable {
321
- padding-left: var(--content-padding-xl);
322
- padding-right: var(--content-padding-xl);
323
- }
324
- }
325
-
326
- @media (min-width: 1768px) {
327
- :host .header-expandable {
328
- padding-left: var(--content-padding-2xl);
329
- padding-right: var(--content-padding-2xl);
330
- }
331
- }
332
-
333
- @media (min-width: 1920px) {
334
- :host .header-expandable {
335
- padding-left: var(--content-padding-3xl);
336
- padding-right: var(--content-padding-3xl);
337
- }
338
- }
1
+ /* ============================================
2
+ MOBILE PAGE BASE STYLES
3
+ Shared styles for mobile pages
4
+ Import this in your page component's styleUrls
5
+ ============================================ */
6
+
7
+ /* ============================================
8
+ HOST
9
+ ============================================ */
10
+
11
+ :host {
12
+ display: flex;
13
+ flex-direction: column;
14
+ align-items: center;
15
+ height: 100%;
16
+ /* Solid background to cover overlay from page underneath during transitions */
17
+ background: var(--color-header-surface);
18
+ width: 100%;
19
+ }
20
+
21
+ /* ============================================
22
+ SHARED ION-HEADER STYLES
23
+ ============================================ */
24
+
25
+ :host ion-header {
26
+ background: var(--color-header-surface);
27
+ box-shadow: none;
28
+ height: 72px;
29
+ min-height: 72px;
30
+ margin-top: var(--app-header-top-offset);
31
+ }
32
+
33
+ :host ion-header ion-toolbar {
34
+ --background: var(--color-header-surface);
35
+ --border-width: 0;
36
+ --box-shadow: none;
37
+ --padding-top: 0;
38
+ --padding-bottom: 0;
39
+ --padding-start: 0;
40
+ --padding-end: 0;
41
+ --min-height: 72px;
42
+ height: 72px;
43
+ min-height: 72px;
44
+ padding: 0;
45
+ }
46
+
47
+ @media (min-width: 768px) {
48
+ :host ion-header {
49
+ height: 88px;
50
+ min-height: 88px;
51
+ }
52
+
53
+ :host ion-header ion-toolbar {
54
+ --min-height: 88px;
55
+ height: 88px;
56
+ min-height: 88px;
57
+ }
58
+ }
59
+
60
+ /* Hide header on desktop when using ds-mobile-tabs top bar */
61
+ /* Note: This only applies to components using ds-mobile-page-main/ds-mobile-page-details */
62
+ /* Pages that need the header visible on desktop should override this */
63
+ @media (min-width: 768px) {
64
+ :host ion-header {
65
+ display: none;
66
+ height: auto;
67
+ }
68
+ }
69
+
70
+ /* ============================================
71
+ SHARED HEADER CONTAINER PATTERNS
72
+ ============================================ */
73
+
74
+ /* Common flex container pattern for header content */
75
+ :host .header-main,
76
+ :host .header-details,
77
+ .header-details {
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: space-between;
81
+ background: var(--color-header-surface);
82
+ position: relative;
83
+ }
84
+
85
+ /* Common centered title pattern */
86
+ :host .header-main__title,
87
+ :host .header-details .header-title,
88
+ .header-details .header-title {
89
+ position: absolute;
90
+ left: 50%;
91
+ transform: translateX(-50%);
92
+ font-size: var(--font-size-base);
93
+ font-weight: 600;
94
+ color: var(--color-header-content);
95
+ margin: 0;
96
+ padding: 0;
97
+ --color: var(--color-header-content);
98
+ }
99
+
100
+ /* Scroll behavior for header-details title (hidden initially, shows on scroll) */
101
+ .header-details .header-title {
102
+ transform: translateX(-50%) translateY(-100%);
103
+ opacity: 0 !important;
104
+ pointer-events: none;
105
+ transition: transform 0.2s ease, opacity 0.2s ease !important;
106
+ }
107
+
108
+ /* Show title when scrolled */
109
+ .header-scrolled .header-details .header-title {
110
+ opacity: 1 !important;
111
+ pointer-events: auto;
112
+ transform: translateX(-50%) translateY(0);
113
+ }
114
+
115
+ /* Back button styles for detail pages */
116
+ :host .header-details .back-button,
117
+ .header-details .back-button {
118
+ background: none;
119
+ border: none;
120
+ padding: 0;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ cursor: pointer;
125
+ color: var(--color-header-content);
126
+ transition: opacity var(--transition-duration-fast, 0.2s) var(--ease-smooth, ease);
127
+ z-index: 10;
128
+ position: relative;
129
+ }
130
+
131
+ :host .header-details .back-button:hover,
132
+ .header-details .back-button:hover {
133
+ opacity: 0.8;
134
+ }
135
+
136
+ :host .header-details .back-button:active,
137
+ .header-details .back-button:active {
138
+ opacity: 0.6;
139
+ }
140
+
141
+ /* ============================================
142
+ SHARED ION-CONTENT STYLES
143
+ ============================================ */
144
+
145
+ :host ion-content {
146
+ --background: var(--color-header-surface);
147
+ --padding-top: 0;
148
+ --padding-start: 0;
149
+ --padding-end: 0;
150
+ --padding-bottom: 0;
151
+ border-radius: 24px 24px 0 0;
152
+ overflow: hidden;
153
+ }
154
+
155
+ /* Make ion-content scroll area a flex container */
156
+ :host ion-content::part(scroll) {
157
+ display: flex;
158
+ flex-direction: column;
159
+ min-height: 100%;
160
+ -webkit-overflow-scrolling: touch;
161
+ /* Note: Do NOT set overscroll-behavior-y here as it prevents ion-refresher from working */
162
+ /* overscroll-behavior on ion-app is sufficient to block native browser pull-to-refresh */
163
+ }
164
+
165
+ /* iOS-specific: White background for bottom overshoot */
166
+ .plt-ios :host ion-content {
167
+ --background: var(--color-background-neutral-primary);
168
+ }
169
+
170
+ /* Desktop only: remove bottom radius */
171
+ @media (min-width: 768px) {
172
+ :host ion-content {
173
+ border-radius: 24px 24px 0 0;
174
+ }
175
+ }
176
+
177
+ /* ============================================
178
+ CONDENSED HEADER
179
+ ============================================ */
180
+
181
+ :host ion-header[collapse="condense"] {
182
+ display: none;
183
+ }
184
+
185
+ @media (min-width: 768px) {
186
+ :host ion-header[collapse="condense"] {
187
+ display: none;
188
+ }
189
+ }
190
+
191
+ /* ============================================
192
+ REFRESHER
193
+ ============================================ */
194
+
195
+ :host ion-refresher {
196
+ z-index: 0;
197
+ }
198
+
199
+ :host ion-refresher-content {
200
+ --color: var(--color-header-content);
201
+ }
202
+
203
+ /* ============================================
204
+ SHARED CONTENT WRAPPER STYLES
205
+ ============================================ */
206
+
207
+ :host .content-wrapper {
208
+ width: 100%;
209
+ position: relative;
210
+ z-index: 20;
211
+ /* Fill remaining viewport height while keeping ion-content as scroller */
212
+ flex: 1;
213
+ display: flex;
214
+ flex-direction: column;
215
+ background: var(--color-background-neutral-primary);
216
+ border-radius: 24px 24px 0 0;
217
+ overflow: visible;
218
+
219
+ /* Visual styling for iOS overshoot - extend background below using box-shadow */
220
+ transform: translateZ(0);
221
+ will-change: transform;
222
+ isolation: isolate;
223
+ box-shadow: 0 300px 0 0 var(--color-background-neutral-primary);
224
+
225
+ /* No top padding - ds-mobile-section provides its own */
226
+ padding-top: 0;
227
+ padding-left: var(--content-wrapper-padding, 20px);
228
+ padding-right: var(--content-wrapper-padding, 20px);
229
+ /* Bottom padding ALWAYS preserved for safe area and tab bar */
230
+ padding-bottom: calc(var(--mobile-content-spacing) + var(--mobile-tab-bar-height) + var(--app-safe-bottom, 0px));
231
+ }
232
+
233
+ :host .content-inner {
234
+ /* Mobile-first: max-width 640px, centered */
235
+ max-width: 640px;
236
+ margin: 0 auto;
237
+ width: 100%;
238
+ }
239
+
240
+ @media (min-width: 768px) {
241
+ :host .content-wrapper {
242
+ /* Remove top padding since ds-mobile-section provides its own */
243
+ padding-top: 0;
244
+ padding-left: var(--content-wrapper-padding, 20px);
245
+ padding-right: var(--content-wrapper-padding, 20px);
246
+ }
247
+ }
248
+
249
+ /* ============================================
250
+ EXPANDABLE HEADER (for main pages only)
251
+ ============================================ */
252
+
253
+ :host .header-expandable {
254
+ background: var(--color-header-surface);
255
+ padding: 32px 20px 24px 20px;
256
+ color: var(--header-content-color, white);
257
+ position: sticky;
258
+ top: 0;
259
+ z-index: 5;
260
+ transition: opacity 0.1s ease-out, transform 0.1s ease-out;
261
+ /* ion-content::part(scroll) is a flex column + .content-wrapper has flex:1 — sticky flex items
262
+ can otherwise shrink to a single line (~56px) and padding looks “gone” */
263
+ flex: 0 0 auto;
264
+ min-height: -moz-min-content;
265
+ min-height: min-content;
266
+ }
267
+
268
+ :host .header-expandable-inner {
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 20px;
272
+ max-width: 640px;
273
+ margin: 0 auto;
274
+ }
275
+
276
+ :host .header-expandable__text {
277
+ margin-bottom: 0;
278
+ gap: 4px;
279
+ display: flex;
280
+ flex-direction: column;
281
+ }
282
+
283
+ :host .header-expandable__title {
284
+ font-size: var(--font-size-2xl);
285
+ font-weight: 600;
286
+ color: var(--header-content-color, white);
287
+ margin: 0;
288
+ }
289
+
290
+ :host .header-expandable__subtitle {
291
+ font-size: var(--font-size-sm);
292
+ font-weight: 400;
293
+ color: var(--header-content-color, white);
294
+ opacity: 0.85;
295
+ margin: 0;
296
+ }
297
+
298
+ @media (min-width: 768px) {
299
+ :host .header-expandable {
300
+ padding: 48px 20px 32px 20px;
301
+ }
302
+
303
+ :host .header-expandable__title {
304
+ font-size: var(--font-size-3xl);
305
+ }
306
+
307
+ :host .header-expandable__subtitle {
308
+ font-size: var(--font-size-base);
309
+ }
310
+ }
311
+
312
+ @media (min-width: 992px) {
313
+ :host .header-expandable {
314
+ padding-left: var(--content-padding-lg);
315
+ padding-right: var(--content-padding-lg);
316
+ }
317
+ }
318
+
319
+ @media (min-width: 1440px) {
320
+ :host .header-expandable {
321
+ padding-left: var(--content-padding-xl);
322
+ padding-right: var(--content-padding-xl);
323
+ }
324
+ }
325
+
326
+ @media (min-width: 1768px) {
327
+ :host .header-expandable {
328
+ padding-left: var(--content-padding-2xl);
329
+ padding-right: var(--content-padding-2xl);
330
+ }
331
+ }
332
+
333
+ @media (min-width: 1920px) {
334
+ :host .header-expandable {
335
+ padding-left: var(--content-padding-3xl);
336
+ padding-right: var(--content-padding-3xl);
337
+ }
338
+ }