@propbinder/mobile-design 0.0.28 → 0.1.0

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.
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Mobile Common Styles
3
+ * Shared CSS classes used across multiple mobile components
4
+ *
5
+ * USAGE IN DOWNSTREAM APPS:
6
+ * Import via styleUrls in your component:
7
+ *
8
+ * @Component({
9
+ * styleUrls: [
10
+ * '@propbinder/mobile-design/styles/mobile-common.css',
11
+ * './your-component.scss'
12
+ * ],
13
+ * })
14
+ *
15
+ * Or import in angular.json styles array for global availability:
16
+ *
17
+ * "styles": [
18
+ * "@propbinder/mobile-design/styles/mobile-common.css",
19
+ * "src/styles.scss"
20
+ * ]
21
+ */
22
+
23
+ /* Author Details Container */
24
+ .author-details {
25
+ display: flex;
26
+ flex-direction: column;
27
+ gap: 2px;
28
+ min-width: 0;
29
+ flex: 1;
30
+ }
31
+
32
+ /* Author Name */
33
+ .author-name {
34
+ font-family: 'Brockmann', sans-serif;
35
+ font-size: var(--font-size-sm);
36
+ font-weight: 600;
37
+ line-height: 20px;
38
+ letter-spacing: -0.3px;
39
+ color: var(--color-text-primary, #1a1a1a);
40
+ white-space: nowrap;
41
+ overflow: hidden;
42
+ text-overflow: ellipsis;
43
+ }
44
+
45
+ /* Author Meta (role, timestamp, etc.) */
46
+ .author-meta {
47
+ font-family: 'Brockmann', sans-serif;
48
+ font-size: var(--font-size-xs);
49
+ font-weight: 400;
50
+ line-height: 1.2;
51
+ letter-spacing: -0.26px;
52
+ color: var(--color-text-tertiary, #737373);
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 6px;
56
+ }
57
+
58
+ .author-meta .separator {
59
+ color: var(--color-text-tertiary, #a0a0a0);
60
+ }
61
+
62
+ /* Variants for lightbox/overlay contexts (white text on dark bg) */
63
+ .lightbox-context .author-name,
64
+ .overlay-context .author-name {
65
+ color: rgba(255, 255, 255, 0.95);
66
+ }
67
+
68
+ .lightbox-context .author-meta,
69
+ .overlay-context .author-meta {
70
+ color: rgba(255, 255, 255, 0.7);
71
+ }
72
+
73
+ .lightbox-context .author-meta .separator,
74
+ .overlay-context .author-meta .separator {
75
+ color: rgba(255, 255, 255, 0.5);
76
+ }
77
+
78
+ /* Section Headlines */
79
+ .section-headline {
80
+ font-size: var(--font-size-sm);
81
+ font-weight: 600;
82
+ color: var(--text-color-default-primary);
83
+ padding: 16px 0;
84
+ margin: 0;
85
+ letter-spacing: -0.2px;
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 6px;
89
+ }
90
+
91
+ /* Empty State Text */
92
+ .empty-state-title {
93
+ font-family: 'Brockmann', sans-serif;
94
+ font-size: var(--font-size-base);
95
+ font-weight: 600;
96
+ line-height: 1.3;
97
+ color: var(--text-color-default-primary, #202227);
98
+ margin: 0 0 8px 0;
99
+ }
100
+
101
+ .empty-state-description {
102
+ font-family: 'Brockmann', sans-serif;
103
+ font-size: var(--font-size-sm);
104
+ font-weight: 400;
105
+ line-height: 1.4;
106
+ color: var(--text-color-default-secondary, #545B66);
107
+ margin: 0;
108
+ }
109
+
@@ -0,0 +1,282 @@
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
+ ION-CONTENT
9
+ ============================================ */
10
+
11
+ ion-content {
12
+ --background: transparent;
13
+ --padding-top: 0;
14
+ --padding-start: 0;
15
+ --padding-end: 0;
16
+ --padding-bottom: 0;
17
+ border-radius: 24px 24px 0 0;
18
+ overflow: hidden;
19
+ }
20
+
21
+ ion-content::part(scroll) {
22
+ -webkit-overflow-scrolling: touch;
23
+ overscroll-behavior-y: none;
24
+ }
25
+
26
+ /* Desktop/Tablet adjustments */
27
+ @media (min-width: 768px) {
28
+ ion-content {
29
+ border-radius: 16px 16px 0 0;
30
+ }
31
+ }
32
+
33
+ /* ============================================
34
+ ION-HEADER
35
+ ============================================ */
36
+
37
+ ion-header {
38
+ background: transparent;
39
+ box-shadow: none;
40
+ height: 72px;
41
+ min-height: 72px;
42
+ }
43
+
44
+ ion-header ion-toolbar {
45
+ --background: transparent;
46
+ --border-width: 0;
47
+ --box-shadow: none;
48
+ --padding-top: 0;
49
+ --padding-bottom: 0;
50
+ --padding-start: 0;
51
+ --padding-end: 0;
52
+ --min-height: 72px;
53
+ height: 72px;
54
+ min-height: 72px;
55
+ padding: 0;
56
+ }
57
+
58
+ /* Hide header on desktop when using ds-mobile-tabs top bar */
59
+ @media (min-width: 768px) {
60
+ ion-header {
61
+ display: none;
62
+ height: auto;
63
+ }
64
+ }
65
+
66
+ /* ============================================
67
+ REFRESHER
68
+ ============================================ */
69
+
70
+ ion-refresher {
71
+ z-index: 0;
72
+ }
73
+
74
+ ion-refresher-content {
75
+ --color: white;
76
+ }
77
+
78
+ /* ============================================
79
+ HEADER VARIANTS
80
+ ============================================ */
81
+
82
+ .header-home {
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: space-between;
86
+ padding: 0 20px;
87
+ background: var(--color-brand-secondary);
88
+ height: 72px;
89
+ }
90
+
91
+ .header-home__title {
92
+ position: absolute;
93
+ left: 50%;
94
+ transform: translateX(-50%) translateY(-100%);
95
+ font-size: var(--font-size-base);
96
+ font-weight: 600;
97
+ color: white;
98
+ opacity: 0;
99
+ transition: transform 0.6s ease, opacity 0.6s ease;
100
+ margin: 0;
101
+ padding: 0;
102
+ --color: white;
103
+ }
104
+
105
+ .header-home__actions {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 8px;
109
+ }
110
+
111
+ .logomark {
112
+ height: 28px;
113
+ width: auto;
114
+ flex-shrink: 0;
115
+ }
116
+
117
+ /* Condensed header - hidden by default on mobile */
118
+ ion-header[collapse="condense"] {
119
+ display: none;
120
+ }
121
+
122
+ /* Show title in top header when scrolled past condensed header */
123
+ .header-scrolled .header-home__title {
124
+ opacity: 1;
125
+ transform: translateX(-50%) translateY(0);
126
+ }
127
+
128
+ @media (min-width: 768px) {
129
+ .header-home {
130
+ padding: 16px 24px;
131
+ }
132
+
133
+ .logomark {
134
+ height: 32px;
135
+ }
136
+
137
+ /* Hide title on desktop - not needed */
138
+ .header-home__title {
139
+ display: none;
140
+ }
141
+
142
+ /* Hide condensed header on desktop */
143
+ ion-header[collapse="condense"] {
144
+ display: none;
145
+ }
146
+ }
147
+
148
+ /* ============================================
149
+ EXPANDABLE HEADER
150
+ ============================================ */
151
+
152
+ .header-expandable {
153
+ background: var(--color-brand-secondary);
154
+ padding: 24px 16px;
155
+ color: var(--header-content-color, white);
156
+ position: sticky;
157
+ top: 0;
158
+ z-index: 10;
159
+ }
160
+
161
+ .header-expandable-inner {
162
+ display: flex;
163
+ flex-direction: column;
164
+ gap: 16px;
165
+ max-width: 640px;
166
+ margin: 0 auto;
167
+ }
168
+
169
+ @media (min-width: 768px) {
170
+ .header-expandable {
171
+ padding: 32px var(--content-padding-md);
172
+ }
173
+ }
174
+
175
+ @media (min-width: 992px) {
176
+ .header-expandable {
177
+ padding-left: var(--content-padding-lg);
178
+ padding-right: var(--content-padding-lg);
179
+ }
180
+ }
181
+
182
+ @media (min-width: 1440px) {
183
+ .header-expandable {
184
+ padding-left: var(--content-padding-xl);
185
+ padding-right: var(--content-padding-xl);
186
+ }
187
+ }
188
+
189
+ @media (min-width: 1768px) {
190
+ .header-expandable {
191
+ padding-left: var(--content-padding-2xl);
192
+ padding-right: var(--content-padding-2xl);
193
+ }
194
+ }
195
+
196
+ @media (min-width: 1920px) {
197
+ .header-expandable {
198
+ padding-left: var(--content-padding-3xl);
199
+ padding-right: var(--content-padding-3xl);
200
+ }
201
+ }
202
+
203
+ .header-expandable__text {
204
+ display: flex;
205
+ flex-direction: column;
206
+ gap: 4px;
207
+ }
208
+
209
+ .header-expandable__subtitle {
210
+ font-size: var(--font-size-sm);
211
+ font-weight: 400;
212
+ color: var(--header-content-color, white);
213
+ opacity: 0.85;
214
+ margin: 0;
215
+ }
216
+
217
+ @media (min-width: 768px) {
218
+ .header-expandable__subtitle {
219
+ font-size: var(--font-size-base);
220
+ }
221
+ }
222
+
223
+ /* ============================================
224
+ CONTENT WRAPPER
225
+ ============================================ */
226
+
227
+ .content-wrapper {
228
+ position: relative;
229
+ z-index: 10;
230
+ background: var(--color-background-neutral-primary);
231
+ border-radius: 24px 24px 0 0;
232
+ padding: 0;
233
+ }
234
+
235
+ @media (min-width: 768px) {
236
+ .content-wrapper {
237
+ border-radius: 16px 16px 0 0;
238
+ width: 100%;
239
+ }
240
+ }
241
+
242
+ .content-inner {
243
+ padding: 20px 16px;
244
+ }
245
+
246
+ @media (min-width: 768px) {
247
+ .content-inner {
248
+ padding: 32px var(--content-padding-md);
249
+ max-width: calc(var(--content-max-width-md) + (var(--content-padding-md) * 2));
250
+ margin: 0 auto;
251
+ width: 100%;
252
+ }
253
+ }
254
+
255
+ @media (min-width: 992px) {
256
+ .content-inner {
257
+ padding: 32px var(--content-padding-lg);
258
+ max-width: calc(var(--content-max-width-md) + (var(--content-padding-md) * 2));
259
+ }
260
+ }
261
+
262
+ @media (min-width: 1440px) {
263
+ .content-inner {
264
+ padding: 32px var(--content-padding-lg);
265
+ max-width: calc(var(--content-max-width-lg) + (var(--content-padding-lg) * 2));
266
+ }
267
+ }
268
+
269
+ @media (min-width: 1768px) {
270
+ .content-inner {
271
+ /* Keep xl max-width, only increase padding */
272
+ padding: 32px var(--content-padding-2xl);
273
+ }
274
+ }
275
+
276
+ @media (min-width: 1920px) {
277
+ .content-inner {
278
+ /* Keep xl max-width, only increase padding */
279
+ padding: 32px var(--content-padding-3xl);
280
+ }
281
+ }
282
+