@propbinder/mobile-design 0.0.1 → 0.0.2

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 (123) hide show
  1. package/ng-package.json +7 -0
  2. package/package.json +12 -39
  3. package/src/animations/page-transitions.ts +86 -0
  4. package/src/assets/fonts/Brockmann-Bold.otf +0 -0
  5. package/src/assets/fonts/Brockmann-BoldItalic.otf +0 -0
  6. package/src/assets/fonts/Brockmann-Medium.otf +0 -0
  7. package/src/assets/fonts/Brockmann-MediumItalic.otf +0 -0
  8. package/src/assets/fonts/Brockmann-Regular.otf +0 -0
  9. package/src/assets/fonts/Brockmann-RegularItalic.otf +0 -0
  10. package/src/assets/fonts/Brockmann-SemiBold.otf +0 -0
  11. package/src/assets/fonts/Brockmann-SemiBoldItalic.otf +0 -0
  12. package/src/assets/fonts/Brockmann_desktop_license.pdf +0 -0
  13. package/src/assets/fonts/brockmann-medium-webfont.woff2 +0 -0
  14. package/src/assets/fonts/brockmann-regular-webfont.woff2 +0 -0
  15. package/src/assets/fonts/brockmann-semibold-webfont.woff2 +0 -0
  16. package/src/components/action-list-item/ds-mobile-action-list-item.ts +83 -0
  17. package/src/components/action-list-item/index.ts +2 -0
  18. package/src/components/app-layout/ds-mobile-app-layout.css +343 -0
  19. package/src/components/app-layout/ds-mobile-app-layout.ts +271 -0
  20. package/src/components/app-layout/index.ts +2 -0
  21. package/src/components/avatar-with-badge/ds-avatar-with-badge.ts +130 -0
  22. package/src/components/avatar-with-badge/index.ts +2 -0
  23. package/src/components/bottom-sheet/ds-mobile-actions-bottom-sheet.ts +273 -0
  24. package/src/components/bottom-sheet/ds-mobile-bottom-sheet.css +110 -0
  25. package/src/components/bottom-sheet/ds-mobile-bottom-sheet.service.ts +167 -0
  26. package/src/components/bottom-sheet/ds-mobile-post-create-bottom-sheet.ts +656 -0
  27. package/src/components/bottom-sheet/index.ts +3 -0
  28. package/src/components/comment/ds-mobile-comment.ts +516 -0
  29. package/src/components/comment/index.ts +2 -0
  30. package/src/components/contact-list-item/ds-mobile-contact-list-item.ts +182 -0
  31. package/src/components/contact-list-item/index.ts +2 -0
  32. package/src/components/content/ds-mobile-content.ts +158 -0
  33. package/src/components/content/index.ts +2 -0
  34. package/src/components/ds-mobile-tabs.css +372 -0
  35. package/src/components/ds-mobile-tabs.ts +217 -0
  36. package/src/components/file-attachment/ds-mobile-file-attachment.ts +164 -0
  37. package/src/components/file-attachment/index.ts +2 -0
  38. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.service.ts +98 -0
  39. package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.ts +514 -0
  40. package/src/components/handbook-detail-modal/index.ts +3 -0
  41. package/src/components/handbook-folder/ds-mobile-handbook-folder-mini.ts +130 -0
  42. package/src/components/handbook-folder/ds-mobile-handbook-folder.ts +444 -0
  43. package/src/components/handbook-folder/index.ts +4 -0
  44. package/src/components/header-content/ds-mobile-header-content.ts +211 -0
  45. package/src/components/header-content/index.ts +2 -0
  46. package/src/components/index.ts +45 -0
  47. package/src/components/inline-photo/ds-mobile-inline-photo.ts +269 -0
  48. package/src/components/inline-photo/index.ts +1 -0
  49. package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.css +60 -0
  50. package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.ts +280 -0
  51. package/src/components/interactive-list-item-inquiry/index.ts +2 -0
  52. package/src/components/interactive-list-item-message/ds-mobile-interactive-list-item-message.ts +197 -0
  53. package/src/components/interactive-list-item-message/index.ts +2 -0
  54. package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.css +70 -0
  55. package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.ts +594 -0
  56. package/src/components/interactive-list-item-post/ds-mobile-post-pdf-attachment.ts +124 -0
  57. package/src/components/interactive-list-item-post/index.ts +13 -0
  58. package/src/components/lightbox/ds-mobile-lightbox-footer.ts +331 -0
  59. package/src/components/lightbox/ds-mobile-lightbox-header.ts +173 -0
  60. package/src/components/lightbox/ds-mobile-lightbox-image.ts +464 -0
  61. package/src/components/lightbox/ds-mobile-lightbox-pdf.css +375 -0
  62. package/src/components/lightbox/ds-mobile-lightbox-pdf.ts +374 -0
  63. package/src/components/lightbox/ds-mobile-lightbox.css +587 -0
  64. package/src/components/lightbox/ds-mobile-lightbox.service.ts +293 -0
  65. package/src/components/lightbox/ds-mobile-lightbox.ts +529 -0
  66. package/src/components/lightbox/index.ts +22 -0
  67. package/src/components/list-item/ds-mobile-list-item.ts +499 -0
  68. package/src/components/list-item/index.ts +2 -0
  69. package/src/components/list-item-static/ds-mobile-list-item-static.ts +133 -0
  70. package/src/components/list-item-static/index.ts +2 -0
  71. package/src/components/logo/ds-logo.ts +85 -0
  72. package/src/components/logo/index.ts +2 -0
  73. package/src/components/modal/ds-mobile-modal.css +163 -0
  74. package/src/components/modal/ds-mobile-modal.service.ts +329 -0
  75. package/src/components/modal/index.ts +8 -0
  76. package/src/components/page-details/ds-mobile-page-details.css +285 -0
  77. package/src/components/page-details/ds-mobile-page-details.ts +128 -0
  78. package/src/components/page-details/index.ts +2 -0
  79. package/src/components/page-main/ds-mobile-page-main.css +346 -0
  80. package/src/components/page-main/ds-mobile-page-main.ts +331 -0
  81. package/src/components/page-main/index.ts +2 -0
  82. package/src/components/post-card/ds-mobile-post-card.ts +685 -0
  83. package/src/components/post-card/ds-mobile-post-pdf-attachment.ts +124 -0
  84. package/src/components/post-card/index.ts +11 -0
  85. package/src/components/post-composer/ds-mobile-post-composer.ts +140 -0
  86. package/src/components/post-composer/index.ts +2 -0
  87. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.service.ts +104 -0
  88. package/src/components/post-detail-modal/ds-mobile-post-detail-modal.ts +1273 -0
  89. package/src/components/post-detail-modal/index.ts +9 -0
  90. package/src/components/shared/directives/index.ts +2 -0
  91. package/src/components/shared/directives/long-press.directive.ts +208 -0
  92. package/src/components/shared/index.ts +3 -0
  93. package/src/components/shared/mobile-common.css +94 -0
  94. package/src/components/shared/mobile-page-base.css +315 -0
  95. package/src/components/shared/mobile-page-base.ts +70 -0
  96. package/src/components/swiper/ds-mobile-swiper.ts +123 -0
  97. package/src/components/swiper/index.ts +2 -0
  98. package/src/components/tab-bar/ds-mobile-tab-bar.ts +132 -0
  99. package/src/components/tab-bar/index.ts +2 -0
  100. package/src/components/tabs/ds-mobile-tabs.css +405 -0
  101. package/src/components/tabs/ds-mobile-tabs.ts +204 -0
  102. package/src/components/tabs/index.ts +2 -0
  103. package/src/pages/community.page.ts +768 -0
  104. package/src/pages/handbook.page.ts +298 -0
  105. package/src/pages/home.page.ts +192 -0
  106. package/src/pages/index.ts +9 -0
  107. package/src/pages/inquiries.example.ts +212 -0
  108. package/src/pages/inquiry-detail.example.css +434 -0
  109. package/src/pages/inquiry-detail.example.ts +416 -0
  110. package/src/pages/mobile-tabs-example.component.ts +146 -0
  111. package/src/pages/post-create.page.ts +311 -0
  112. package/src/pages/post-detail.page.ts +295 -0
  113. package/src/pages/whitelabel-demo.page.ts +548 -0
  114. package/src/public-api.ts +5 -0
  115. package/src/services/user.service.ts +35 -0
  116. package/src/services/whitelabel.service.ts +171 -0
  117. package/src/styles/ionic.css +673 -0
  118. package/tsconfig.lib.json +17 -0
  119. package/tsconfig.lib.prod.json +9 -0
  120. package/tsconfig.spec.json +13 -0
  121. package/fesm2022/propbinder-mobile-design.mjs +0 -8294
  122. package/fesm2022/propbinder-mobile-design.mjs.map +0 -1
  123. package/index.d.ts +0 -2860
@@ -0,0 +1,158 @@
1
+ import { Component, input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+
4
+ /**
5
+ * DsMobileContentComponent
6
+ *
7
+ * Main content container for mobile pages with flexible layout options.
8
+ * Provides consistent spacing and layout patterns.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <!-- Default: stacked layout -->
13
+ * <ds-mobile-content>
14
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
15
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
16
+ * </ds-mobile-content>
17
+ *
18
+ * <!-- Grid layout -->
19
+ * <ds-mobile-content layout="grid-2">
20
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
21
+ * <ds-mobile-content-section>...</ds-mobile-content-section>
22
+ * </ds-mobile-content>
23
+ * ```
24
+ */
25
+ @Component({
26
+ selector: 'ds-mobile-content',
27
+ standalone: true,
28
+ imports: [CommonModule],
29
+ host: {
30
+ '[class.layout-stacked]': 'layout() === "stacked"',
31
+ '[class.layout-grid-2]': 'layout() === "grid-2"',
32
+ '[class.layout-grid-3]': 'layout() === "grid-3"'
33
+ },
34
+ styles: [`
35
+ :host {
36
+ display: flex;
37
+ flex-direction: column;
38
+ gap: 32px;
39
+ max-width: 640px;
40
+ margin: 0 auto;
41
+ }
42
+
43
+ /* Grid layouts */
44
+ :host.layout-grid-2 {
45
+ display: grid;
46
+ grid-template-columns: repeat(2, 1fr);
47
+ gap: 16px;
48
+ }
49
+
50
+ :host.layout-grid-3 {
51
+ display: grid;
52
+ grid-template-columns: repeat(3, 1fr);
53
+ gap: 16px;
54
+ }
55
+
56
+ @media (max-width: 768px) {
57
+ :host.layout-grid-2,
58
+ :host.layout-grid-3 {
59
+ grid-template-columns: 1fr;
60
+ }
61
+ }
62
+ `],
63
+ template: `<ng-content />`
64
+ })
65
+ export class DsMobileContentComponent {
66
+ /**
67
+ * Layout mode for content sections
68
+ * - 'stacked' - Vertical stack with 32px gap (default)
69
+ * - 'grid-2' - 2 column grid
70
+ * - 'grid-3' - 3 column grid (stacks on mobile)
71
+ */
72
+ layout = input<'stacked' | 'grid-2' | 'grid-3'>('stacked');
73
+ }
74
+
75
+ /**
76
+ * DsMobileContentSectionComponent
77
+ *
78
+ * Section within mobile content with optional header.
79
+ *
80
+ * @example
81
+ * ```html
82
+ * <ds-mobile-content-section>
83
+ * <section-header width="half"></section-header>
84
+ * <content-row>
85
+ * <div class="grey-box"></div>
86
+ * </content-row>
87
+ * </ds-mobile-content-section>
88
+ * ```
89
+ */
90
+ @Component({
91
+ selector: 'ds-mobile-content-section',
92
+ standalone: true,
93
+ imports: [CommonModule],
94
+ styles: [`
95
+ :host {
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: 16px;
99
+ }
100
+ `],
101
+ template: `
102
+ <ng-content select="section-header" />
103
+ <ng-content />
104
+ `
105
+ })
106
+ export class DsMobileContentSectionComponent {}
107
+
108
+ /**
109
+ * SectionHeaderComponent
110
+ *
111
+ * Semantic placeholder header for content sections.
112
+ * Used for prototyping/placeholders.
113
+ */
114
+ @Component({
115
+ selector: 'section-header',
116
+ standalone: true,
117
+ host: {
118
+ '[class.w-half]': 'width() === "half"',
119
+ '[class.w-third]': 'width() === "third"',
120
+ '[class.w-full]': 'width() === "full"'
121
+ },
122
+ styles: [`
123
+ :host {
124
+ height: 20px;
125
+ border-radius: 8px;
126
+ background: var(--color-background-neutral-tertiary);
127
+ display: block;
128
+ }
129
+
130
+ :host.w-half { width: 50%; }
131
+ :host.w-third { width: 33%; }
132
+ :host.w-full { width: 100%; }
133
+ `],
134
+ template: `<ng-content />`
135
+ })
136
+ export class SectionHeaderComponent {
137
+ /** Width of the header placeholder */
138
+ width = input<'half' | 'third' | 'full'>('half');
139
+ }
140
+
141
+ /**
142
+ * ContentRowComponent
143
+ *
144
+ * Horizontal row container for content items.
145
+ */
146
+ @Component({
147
+ selector: 'content-row',
148
+ standalone: true,
149
+ styles: [`
150
+ :host {
151
+ display: flex;
152
+ gap: 12px;
153
+ }
154
+ `],
155
+ template: `<ng-content />`
156
+ })
157
+ export class ContentRowComponent {}
158
+
@@ -0,0 +1,2 @@
1
+ export * from './ds-mobile-content';
2
+
@@ -0,0 +1,372 @@
1
+ /* ============================================
2
+ HOST
3
+ ============================================ */
4
+
5
+ :host {
6
+ display: block;
7
+ height: 100vh;
8
+ height: 100dvh; /* Use dynamic viewport height instead of small viewport height */
9
+ }
10
+
11
+ /* ============================================
12
+ ION-TABS BASE
13
+ ============================================ */
14
+
15
+ ion-tabs {
16
+ height: 100%;
17
+ background: var(--color-brand-secondary);
18
+ }
19
+
20
+ /* ============================================
21
+ TAB BAR - MOBILE (BOTTOM)
22
+ ============================================ */
23
+
24
+ .ds-tab-bar {
25
+ --background: var(--color-background-neutral-primary);
26
+ /* No delay when appearing - start immediately */
27
+ transition: transform 0.20s ease-in-out;
28
+ }
29
+
30
+ /* Mobile: Fixed position for slide transitions */
31
+ ion-tab-bar[slot="bottom"] {
32
+ border-top: 1px solid var(--border-color-default);
33
+ padding-top: 8px;
34
+ /* iPhone home indicator safe area is 34px total */
35
+ /* Fallback to 34px for simulator when env variable isn't available */
36
+ padding-bottom: calc(var(--ion-safe-area-bottom, 34px) - 4px);
37
+ }
38
+
39
+ @media (max-width: 767px) {
40
+ ion-tab-bar[slot="bottom"] {
41
+ position: fixed;
42
+ bottom: 0;
43
+ left: 0;
44
+ right: 0;
45
+ z-index: 100;
46
+ }
47
+ }
48
+
49
+ /* Hide tab bar when detail page is active with slide-out animation (Mobile only) */
50
+ @media (max-width: 767px) {
51
+ ion-tabs:has(ds-mobile-page-details) .ds-tab-bar {
52
+ transform: translateY(100%);
53
+ /* Add delay when hiding - wait 650ms so it starts hiding 50ms before page transition ends */
54
+ transition: transform 0.3s ease;
55
+ }
56
+ }
57
+
58
+ /* Mobile: hide logo and avatar, show tab buttons in a row */
59
+ .ds-tab-bar__logo,
60
+ .ds-tab-bar__actions {
61
+ display: none;
62
+ }
63
+
64
+ .ds-tab-bar__tabs {
65
+ display: flex;
66
+ width: 100%;
67
+ justify-content: space-around;
68
+ align-items: center;
69
+ }
70
+
71
+ /* On larger screens or PWA mode, remove the extra Safari toolbar padding */
72
+ @media (min-width: 769px) {
73
+ ion-tab-bar[slot="bottom"] {
74
+ padding-bottom: env(safe-area-inset-bottom, 0px);
75
+ }
76
+ }
77
+
78
+ @media (display-mode: standalone) {
79
+ ion-tab-bar[slot="bottom"] {
80
+ padding-bottom: env(safe-area-inset-bottom, 0px) !important;
81
+ }
82
+ }
83
+
84
+ /* ============================================
85
+ TAB BAR - DESKTOP (TOP)
86
+ ============================================ */
87
+
88
+ @media (min-width: 768px) {
89
+ ion-tab-bar[slot="top"] {
90
+ --background: var(--color-brand-secondary);
91
+ position: relative; /* NOT absolute - part of layout flow */
92
+ display: flex;
93
+ align-items: center;
94
+ padding: 12px 24px;
95
+ height: 64px;
96
+ max-width: none;
97
+ }
98
+
99
+ /* Show logo and avatar on desktop */
100
+ .ds-tab-bar__logo {
101
+ display: flex;
102
+ position: absolute;
103
+ left: 24px;
104
+ align-items: center;
105
+ }
106
+
107
+ .ds-tab-bar__actions {
108
+ display: flex;
109
+ position: absolute;
110
+ right: 24px;
111
+ align-items: center;
112
+ gap: 12px;
113
+ }
114
+
115
+ .ds-tab-bar__tabs {
116
+ display: flex;
117
+ gap: 8px;
118
+ align-items: center;
119
+ max-width: 640px;
120
+ width: 100%;
121
+ margin: 0 auto;
122
+ justify-content: center;
123
+ padding-left: var(--content-padding-md);
124
+ padding-right: var(--content-padding-md);
125
+ }
126
+
127
+ .logomark {
128
+ height: 28px;
129
+ width: auto;
130
+ flex-shrink: 0;
131
+ }
132
+ }
133
+
134
+ @media (min-width: 992px) {
135
+ .ds-tab-bar__tabs {
136
+ max-width: 640px;
137
+ padding-left: var(--content-padding-lg);
138
+ padding-right: var(--content-padding-lg);
139
+ justify-content: center;
140
+ }
141
+ }
142
+
143
+ @media (min-width: 1440px) {
144
+ .ds-tab-bar__tabs {
145
+ max-width: 640px;
146
+ padding-left: var(--content-padding-xl);
147
+ padding-right: var(--content-padding-xl);
148
+ }
149
+ }
150
+
151
+ @media (min-width: 1768px) {
152
+ .ds-tab-bar__tabs {
153
+ max-width: 640px;
154
+ padding-left: var(--content-padding-2xl);
155
+ padding-right: var(--content-padding-2xl);
156
+ }
157
+ }
158
+
159
+ @media (min-width: 1920px) {
160
+ .ds-tab-bar__tabs {
161
+ max-width: 640px;
162
+ padding-left: var(--content-padding-3xl);
163
+ padding-right: var(--content-padding-3xl);
164
+ }
165
+ }
166
+
167
+ /* ============================================
168
+ TAB BUTTONS - MOBILE
169
+ ============================================ */
170
+
171
+ ion-tab-button {
172
+ --color: var(--text-color-default-tertiary);
173
+ --color-selected: var(--color-brand-base);
174
+ display: flex;
175
+ flex-direction: column;
176
+ align-items: center;
177
+ justify-content: center;
178
+ position: relative;
179
+ overflow: visible;
180
+ }
181
+
182
+ /* Custom ripple effect - positioned in center of tab button */
183
+ .tab-icon-ripple {
184
+ position: absolute;
185
+ left: 50%;
186
+ top: 50%;
187
+ width: 40px;
188
+ height: 40px;
189
+ border-radius: 50%;
190
+ background: var(--color-brand-base);
191
+ transform: translate(-50%, -50%) scale(0);
192
+ opacity: 0;
193
+ pointer-events: none;
194
+ transition: all 0.6s cubic-bezier(0.36, 1.2, 0.04, 1.4);
195
+ z-index: 0;
196
+ }
197
+
198
+ /* Trigger ripple on tab selection */
199
+ .tab-selected .tab-icon-ripple {
200
+ transform: translate(-50%, -50%) scale(2);
201
+ opacity: 0.05;
202
+ animation: ripple-fade 0.6s cubic-bezier(0.36, 0.5, 0.04, 1.8) forwards;
203
+ }
204
+
205
+ @keyframes ripple-fade {
206
+ 0% {
207
+ opacity: 0;
208
+ transform: translate(-50%, -50%) scale(0);
209
+ }
210
+ 30% {
211
+ opacity: 0.1;
212
+ }
213
+ 100% {
214
+ opacity: 0;
215
+ transform: translate(-50%, -50%) scale(2);
216
+ }
217
+ }
218
+
219
+ /* Allow ripple to expand beyond button */
220
+ ion-tab-button::part(native) {
221
+ overflow: visible;
222
+ }
223
+
224
+ ion-tab-button ion-ripple-effect {
225
+ color: var(--color-brand-base);
226
+ border-radius: 1000px;
227
+ }
228
+
229
+ ion-tab-button ion-label {
230
+ font-size: var(--font-size-xs);
231
+ font-weight: 400;
232
+ letter-spacing: -0.3px;
233
+ margin-top: 0;
234
+ }
235
+
236
+
237
+ /* ============================================
238
+ TAB ICON ANIMATION
239
+ ============================================ */
240
+
241
+ /* Icon wrapper - relative positioning context */
242
+ .tab-icon-wrapper {
243
+ position: relative;
244
+ width: 24px;
245
+ height: 24px;
246
+ display: flex;
247
+ align-items: center;
248
+ justify-content: center;
249
+ z-index: 1; /* Above ripple */
250
+ margin-bottom: 4px;
251
+ }
252
+
253
+ /* Both icons positioned absolutely and centered */
254
+ .tab-icon-inactive,
255
+ .tab-icon-active {
256
+ position: absolute;
257
+ left: 50%;
258
+ top: 50%;
259
+ transform: translate(-50%, -50%);
260
+ transition: all 0.8s cubic-bezier(0.36, 1, 0.04, 1);
261
+ }
262
+
263
+ /* Start state (inactive tab) */
264
+ .tab-icon-inactive {
265
+ opacity: 1;
266
+ transform: translate(-50%, -50%) scale(1);
267
+ }
268
+
269
+ .tab-icon-active {
270
+ opacity: 0;
271
+ transform: translate(-50%, calc(-50% - 12px)) scale(0.5);
272
+ }
273
+
274
+ /* End state (active tab) */
275
+ .tab-selected .tab-icon-inactive {
276
+ opacity: 0;
277
+ transform: translate(-50%, -50%) scale(0.5);
278
+ }
279
+
280
+ .tab-selected .tab-icon-active {
281
+ opacity: 1;
282
+ transform: translate(-50%, -50%) scale(1);
283
+ }
284
+
285
+ /* ============================================
286
+ TAB BUTTONS - DESKTOP
287
+ ============================================ */
288
+
289
+ @media (min-width: 768px) {
290
+ .ds-tab-button {
291
+ flex-direction: row;
292
+ height: 40px;
293
+ padding: 0px 16px !important;
294
+ border-radius: 40px;
295
+ transition: all 0.2s ease;
296
+ width: -moz-fit-content;
297
+ width: fit-content;
298
+ min-width: auto;
299
+ flex: 0 0 auto;
300
+ --color: rgba(255, 255, 255, 0.7);
301
+ --color-selected: white;
302
+ background: rgba(255, 255, 255, 0.1);
303
+ position: relative;
304
+ overflow: hidden;
305
+ }
306
+
307
+ /* Desktop: smaller icon wrapper */
308
+ .tab-icon-wrapper {
309
+ width: 20px;
310
+ height: 20px;
311
+ }
312
+
313
+ /* Desktop: smaller ripple */
314
+ .tab-icon-ripple {
315
+ width: 20px;
316
+ height: 20px;
317
+ }
318
+
319
+ /* Ensure native button respects the rounded shape */
320
+ .ds-tab-button::part(native) {
321
+ border-radius: 40px;
322
+ }
323
+
324
+ .ds-tab-button:hover {
325
+ --color: white;
326
+ --color-selected: white;
327
+ }
328
+
329
+ .ds-tab-button.tab-selected {
330
+ background: var(--color-background-brand);
331
+ --color-selected: white;
332
+ }
333
+
334
+ .ds-tab-button .button-native {
335
+ width: auto;
336
+ padding: 0;
337
+ }
338
+
339
+ .ds-tab-button ion-label {
340
+ font-size: var(--font-size-sm);
341
+ font-weight: 500;
342
+ margin: 0;
343
+ color: inherit;
344
+ }
345
+
346
+ .ds-tab-button .tab-icon-wrapper {
347
+ margin-right: 4px;
348
+ margin-bottom: 0px;
349
+ }
350
+
351
+ .ds-tab-button ion-ripple-effect {
352
+ color: rgba(255, 255, 255, 0.3);
353
+ border-radius: 1000px;
354
+ transform: scale(1.5);
355
+ }
356
+ }
357
+
358
+ /* ============================================
359
+ AVATAR STYLING
360
+ ============================================ */
361
+
362
+ @media (min-width: 768px) {
363
+ .ds-tab-bar__actions ds-avatar {
364
+ cursor: pointer;
365
+ transition: transform 0.2s ease;
366
+ }
367
+
368
+ .ds-tab-bar__actions ds-avatar:hover {
369
+ transform: scale(1.05);
370
+ }
371
+ }
372
+