@propbinder/mobile-design 0.2.48 → 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 -26168
  206. package/fesm2022/propbinder-mobile-design.mjs.map +0 -1
  207. package/index.d.ts +0 -8169
  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,533 @@
1
+ /* ============================================
2
+ HOST - ds-mobile-tab-bar
3
+ ============================================ */
4
+
5
+ /* Expose tab bar height as CSS custom property for FAB positioning */
6
+ :host {
7
+ --ds-tab-bar-height: 64px; /* Mobile tab bar height */
8
+ }
9
+
10
+ /* On desktop, we need to participate in layout to use order property */
11
+ /* On mobile, we can use display: contents to avoid wrapper */
12
+ @media (min-width: 768px) {
13
+ :host {
14
+ display: block; /* Participate in flexbox layout on desktop */
15
+ --ds-tab-bar-height: 64px; /* Desktop header height (but at top, not bottom) */
16
+ }
17
+ }
18
+
19
+ @media (max-width: 767px) {
20
+ :host {
21
+ display: contents; /* Don't add wrapper element to DOM flow on mobile */
22
+ }
23
+ }
24
+
25
+ /* ============================================
26
+ ION-TABS STYLING (for parent element)
27
+ ============================================ */
28
+ /*
29
+ * When using ds-mobile-tab-bar inside ion-tabs, you need to apply these styles
30
+ * to your ion-tabs element. You can either:
31
+ * 1. Add the class "ds-tabs-wrapper" to your ion-tabs
32
+ * 2. Or add these styles manually to your component's CSS
33
+ *
34
+ * Example:
35
+ * <ion-tabs class="ds-tabs-wrapper">
36
+ * <ds-mobile-tab-bar [tabs]="tabs" />
37
+ * </ion-tabs>
38
+ */
39
+
40
+ /* Apply styles when ds-mobile-tab-bar is inside ion-tabs */
41
+ /* Note: We can't style the parent, but we can use CSS variables */
42
+
43
+ /* Alternative: Users can add this class to their ion-tabs */
44
+ ion-tabs.ds-tabs-wrapper {
45
+ height: 100%;
46
+ background: var(--color-header-surface);
47
+ }
48
+
49
+ /* Completely disable tooltips on tab buttons */
50
+ ion-tab-button::before,
51
+ ion-tab-button::after {
52
+ content: none !important;
53
+ display: none !important;
54
+ }
55
+
56
+ ion-tab-button[title]::before,
57
+ ion-tab-button[title]::after {
58
+ display: none !important;
59
+ }
60
+
61
+ /* Disable tooltips through shadow DOM */
62
+ ion-tab-button::part(native)::before,
63
+ ion-tab-button::part(native)::after {
64
+ display: none !important;
65
+ }
66
+
67
+ /* ============================================
68
+ TAB BAR - MOBILE (BOTTOM)
69
+ ============================================ */
70
+
71
+ .ds-tab-bar {
72
+ --background: var(--color-background-neutral-primary);
73
+ /* No delay when appearing - start immediately */
74
+ transition: transform 0.20s ease-in-out;
75
+ }
76
+
77
+ /* Mobile: Fixed position for slide transitions */
78
+ ion-tab-bar[slot="bottom"] {
79
+ border-top: 1px solid var(--border-color-default);
80
+ padding-top: 8px;
81
+ /* Web browser: 8px minimum, iOS/Android native: safe area calculation */
82
+ /* calc(34px - 24px) = 10px on iPhone with notch, 0 on web → max ensures 8px minimum */
83
+ padding-bottom: max(8px, calc(var(--app-safe-bottom, 0px) - 16px));
84
+ padding-left: 12px;
85
+ padding-right: 12px;
86
+ }
87
+
88
+ @media (max-width: 767px) {
89
+ ion-tab-bar[slot="bottom"] {
90
+ position: fixed;
91
+ bottom: 0;
92
+ left: 0;
93
+ right: 0;
94
+ z-index: 100;
95
+ }
96
+ }
97
+
98
+ /* Android gesture navigation needs extra breathing room for labels */
99
+ @media (max-width: 767px) {
100
+ :host-context(.plt-android) ion-tab-bar[slot="bottom"] {
101
+ padding-bottom: max(8px, var(--app-safe-bottom, 0px)) !important;
102
+ }
103
+ }
104
+
105
+ /* Hide tab bar when detail page is active with slide-out animation (Mobile only) */
106
+ @media (max-width: 767px) {
107
+ :host-context(ion-tabs:has(ds-mobile-page-details)) .ds-tab-bar {
108
+ transform: translateY(100%);
109
+ /* Add delay when hiding - wait 650ms so it starts hiding 50ms before page transition ends */
110
+ transition: transform 0.3s ease;
111
+ }
112
+ }
113
+
114
+ /* Mobile: hide logo and avatar, show tab buttons in a row */
115
+ .ds-tab-bar__logo,
116
+ .ds-tab-bar__actions {
117
+ display: none;
118
+ }
119
+
120
+ .ds-tab-bar__tabs {
121
+ display: flex;
122
+ width: 100%;
123
+ justify-content: space-around;
124
+ align-items: center;
125
+ }
126
+
127
+ /* On larger screens or PWA mode, remove the extra Safari toolbar padding */
128
+ @media (min-width: 769px) {
129
+ ion-tab-bar[slot="bottom"] {
130
+ padding-bottom: var(--app-safe-bottom, 0px);
131
+ }
132
+ }
133
+
134
+ @media (display-mode: standalone) {
135
+ ion-tab-bar[slot="bottom"] {
136
+ padding-bottom: var(--app-safe-bottom, 0px) !important;
137
+ }
138
+ }
139
+
140
+ /* ============================================
141
+ TAB BAR - DESKTOP (TOP)
142
+ ============================================ */
143
+
144
+ @media (min-width: 768px) {
145
+ /* CRITICAL: Force the host element to appear first in flexbox column layout */
146
+ :host[slot="top"] {
147
+ order: -1 !important; /* Move to top of flex column */
148
+ }
149
+
150
+ /* Force position on desktop regardless of slot attribute */
151
+ :host ion-tab-bar {
152
+ position: relative !important;
153
+ bottom: auto !important;
154
+ top: 0 !important;
155
+ }
156
+
157
+ ion-tab-bar[slot="top"] {
158
+ --background: var(--color-header-surface);
159
+ position: relative !important; /* NOT absolute - part of layout flow */
160
+ display: flex !important;
161
+ align-items: center;
162
+ padding: 12px 24px;
163
+ height: 64px;
164
+ max-width: none;
165
+ bottom: auto !important;
166
+ top: 0 !important;
167
+ }
168
+
169
+ /* Ensure bottom slot is not fixed on desktop */
170
+ @media (min-width: 768px) {
171
+ ion-tab-bar[slot="bottom"] {
172
+ position: relative !important;
173
+ bottom: auto !important;
174
+ }
175
+ }
176
+
177
+ /* Also ensure router outlet (DIV) comes after tab bar */
178
+ ion-tabs > div:not([slot]) {
179
+ order: 1 !important;
180
+ }
181
+
182
+ /* Show logo and avatar on desktop */
183
+ .ds-tab-bar__logo {
184
+ display: flex;
185
+ position: absolute;
186
+ left: 24px;
187
+ align-items: center;
188
+ color: var(--header-content-color, white);
189
+ }
190
+
191
+ .ds-tab-bar__actions {
192
+ display: flex;
193
+ position: absolute;
194
+ right: 24px;
195
+ align-items: center;
196
+ gap: 12px;
197
+ }
198
+
199
+ .ds-tab-bar__tabs {
200
+ display: flex;
201
+ gap: 8px;
202
+ align-items: center;
203
+ max-width: 640px;
204
+ width: 100%;
205
+ margin: 0 auto;
206
+ justify-content: center;
207
+ padding-left: var(--content-padding-md);
208
+ padding-right: var(--content-padding-md);
209
+ }
210
+
211
+ .logomark {
212
+ height: 28px;
213
+ width: auto;
214
+ flex-shrink: 0;
215
+ }
216
+ }
217
+
218
+ @media (min-width: 992px) {
219
+ .ds-tab-bar__tabs {
220
+ max-width: 640px;
221
+ padding-left: var(--content-padding-lg);
222
+ padding-right: var(--content-padding-lg);
223
+ justify-content: center;
224
+ }
225
+ }
226
+
227
+ @media (min-width: 1440px) {
228
+ .ds-tab-bar__tabs {
229
+ max-width: 640px;
230
+ padding-left: var(--content-padding-xl);
231
+ padding-right: var(--content-padding-xl);
232
+ }
233
+ }
234
+
235
+ @media (min-width: 1768px) {
236
+ .ds-tab-bar__tabs {
237
+ max-width: 640px;
238
+ padding-left: var(--content-padding-2xl);
239
+ padding-right: var(--content-padding-2xl);
240
+ }
241
+ }
242
+
243
+ @media (min-width: 1920px) {
244
+ .ds-tab-bar__tabs {
245
+ max-width: 640px;
246
+ padding-left: var(--content-padding-3xl);
247
+ padding-right: var(--content-padding-3xl);
248
+ }
249
+ }
250
+
251
+ /* ============================================
252
+ TAB BUTTONS - MOBILE
253
+ ============================================ */
254
+
255
+ ion-tab-button {
256
+ --color: var(--text-color-default-tertiary);
257
+ --color-selected: var(--color-accent);
258
+ display: flex;
259
+ flex-direction: column;
260
+ align-items: center;
261
+ justify-content: center;
262
+ position: relative;
263
+ overflow: visible;
264
+ /* Disable native tooltips */
265
+ pointer-events: auto;
266
+ }
267
+
268
+ /* Remove title attribute to prevent tooltips */
269
+ ion-tab-button::part(native) {
270
+ overflow: visible;
271
+ /* Prevent native tooltips */
272
+ }
273
+
274
+ ion-tab-button[title]::before {
275
+ content: attr(title);
276
+ position: absolute;
277
+ opacity: 0;
278
+ pointer-events: none;
279
+ }
280
+
281
+ /* Custom ripple effect - positioned in center of tab button */
282
+ .tab-icon-ripple {
283
+ position: absolute;
284
+ left: 50%;
285
+ top: 50%;
286
+ width: 40px;
287
+ height: 40px;
288
+ border-radius: 50%;
289
+ background: var(--color-accent);
290
+ transform: translate(-50%, -50%) scale(0);
291
+ opacity: 0;
292
+ pointer-events: none;
293
+ transition: all 0.6s cubic-bezier(0.36, 1.2, 0.04, 1.4);
294
+ z-index: 0;
295
+ }
296
+
297
+ /* Trigger ripple on tab selection */
298
+ .tab-selected .tab-icon-ripple {
299
+ transform: translate(-50%, -50%) scale(2);
300
+ opacity: 0.05;
301
+ animation: ripple-fade 0.6s cubic-bezier(0.36, 0.5, 0.04, 1.8) forwards;
302
+ }
303
+
304
+ @keyframes ripple-fade {
305
+ 0% {
306
+ opacity: 0;
307
+ transform: translate(-50%, -50%) scale(0);
308
+ }
309
+ 30% {
310
+ opacity: 0.1;
311
+ }
312
+ 100% {
313
+ opacity: 0;
314
+ transform: translate(-50%, -50%) scale(2);
315
+ }
316
+ }
317
+
318
+ /* Allow ripple to expand beyond button */
319
+ ion-tab-button::part(native) {
320
+ overflow: visible;
321
+ }
322
+
323
+ ion-tab-button ion-ripple-effect {
324
+ color: var(--color-accent);
325
+ border-radius: 1000px;
326
+ }
327
+
328
+ ion-tab-button ion-label {
329
+ font-size: 11px;
330
+ font-weight: 500;
331
+ letter-spacing: -0.5px;
332
+ margin-top: 0;
333
+ }
334
+
335
+
336
+ /* ============================================
337
+ TAB ICON ANIMATION
338
+ ============================================ */
339
+
340
+ /* Icon wrapper - relative positioning context */
341
+ .tab-icon-wrapper {
342
+ position: relative;
343
+ width: 24px;
344
+ height: 24px;
345
+ display: flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+ z-index: 1; /* Above ripple */
349
+ margin-bottom: 4px;
350
+ }
351
+
352
+ /* Both icons positioned absolutely and centered */
353
+ .tab-icon-inactive,
354
+ .tab-icon-active {
355
+ position: absolute;
356
+ left: 50%;
357
+ top: 50%;
358
+ transform: translate(-50%, -50%);
359
+ transition: all 0.8s cubic-bezier(0.36, 1, 0.04, 1);
360
+ }
361
+
362
+ /* Start state (inactive tab) */
363
+ .tab-icon-inactive {
364
+ opacity: 1;
365
+ transform: translate(-50%, -50%) scale(1);
366
+ }
367
+
368
+ .tab-icon-active {
369
+ opacity: 0;
370
+ transform: translate(-50%, calc(-50% - 12px)) scale(0.5);
371
+ }
372
+
373
+ /* End state (active tab) */
374
+ .tab-selected .tab-icon-inactive {
375
+ opacity: 0;
376
+ transform: translate(-50%, -50%) scale(0.5);
377
+ }
378
+
379
+ .tab-selected .tab-icon-active {
380
+ opacity: 1;
381
+ transform: translate(-50%, -50%) scale(1);
382
+ }
383
+
384
+ /* ============================================
385
+ TAB BUTTONS - DESKTOP
386
+ ============================================ */
387
+
388
+ @media (min-width: 768px) {
389
+ .ds-tab-button {
390
+ flex-direction: row;
391
+ height: 40px;
392
+ padding: 0px 16px !important;
393
+ border-radius: 40px;
394
+ transition: all 0.2s ease;
395
+ width: -moz-fit-content;
396
+ width: fit-content;
397
+ min-width: -moz-fit-content;
398
+ min-width: fit-content;
399
+ flex: 0 0 auto;
400
+ --color: rgba(var(--color-header-content-rgb, 255, 255, 255), 0.7);
401
+ --color-selected: var(--color-header-content, white);
402
+ color: rgba(var(--color-header-content-rgb, 255, 255, 255), 0.7);
403
+ background: transparent;
404
+ position: relative;
405
+ overflow: hidden;
406
+ }
407
+
408
+ /* Desktop: smaller icon wrapper */
409
+ .tab-icon-wrapper {
410
+ width: 20px;
411
+ height: 20px;
412
+ }
413
+
414
+ /* Desktop: smaller ripple */
415
+ .tab-icon-ripple {
416
+ width: 20px;
417
+ height: 20px;
418
+ }
419
+
420
+ /* Ensure native button respects the rounded shape */
421
+ .ds-tab-button::part(native) {
422
+ border-radius: 40px;
423
+ }
424
+
425
+ .ds-tab-button:hover:not(.tab-selected) {
426
+ --color: var(--color-header-content, white);
427
+ --color-selected: var(--color-header-content, white);
428
+ color: var(--color-header-content, white);
429
+ background: rgba(var(--color-header-content-rgb, 255, 255, 255), 0.1);
430
+ }
431
+
432
+ .ds-tab-button:hover:not(.tab-selected) ion-label {
433
+ color: var(--color-header-content, white);
434
+ }
435
+
436
+ .ds-tab-button:hover:not(.tab-selected) ds-icon {
437
+ --icon-color: var(--color-header-content, white);
438
+ color: var(--color-header-content, white);
439
+ }
440
+
441
+ .ds-tab-button:hover:not(.tab-selected) ds-icon svg {
442
+ fill: var(--color-header-content, white);
443
+ }
444
+
445
+ .ds-tab-button.tab-selected {
446
+ background: var(--color-header-accent);
447
+ --color-selected: var(--color-on-header-accent, white);
448
+ --color: var(--color-on-header-accent, white);
449
+ color: var(--color-on-header-accent, white);
450
+ }
451
+
452
+ .ds-tab-button.tab-selected:hover {
453
+ background: var(--color-header-accent);
454
+ --color-selected: var(--color-on-header-accent, white);
455
+ --color: var(--color-on-header-accent, white);
456
+ color: var(--color-on-header-accent, white);
457
+ }
458
+
459
+ .ds-tab-button.tab-selected:hover ion-label {
460
+ color: var(--color-on-header-accent, white);
461
+ }
462
+
463
+ .ds-tab-button.tab-selected:hover ds-icon {
464
+ --icon-color: var(--color-on-header-accent, white);
465
+ color: var(--color-on-header-accent, white);
466
+ }
467
+
468
+ .ds-tab-button.tab-selected:hover ds-icon svg {
469
+ fill: var(--color-on-header-accent, white);
470
+ }
471
+
472
+ /* Ensure active icon remains visible on hover */
473
+ .ds-tab-button.tab-selected:hover .tab-icon-active {
474
+ opacity: 1 !important;
475
+ visibility: visible !important;
476
+ }
477
+
478
+ .ds-tab-button.tab-selected:hover .tab-icon-inactive {
479
+ opacity: 0 !important;
480
+ }
481
+
482
+ .ds-tab-button.tab-selected ion-label {
483
+ color: var(--color-on-header-accent, white);
484
+ }
485
+
486
+ .ds-tab-button.tab-selected ds-icon {
487
+ --icon-color: var(--color-on-header-accent, white);
488
+ color: var(--color-on-header-accent, white);
489
+ }
490
+
491
+ .ds-tab-button.tab-selected ds-icon svg {
492
+ fill: var(--color-on-header-accent, white);
493
+ }
494
+
495
+ .ds-tab-button .button-native {
496
+ width: auto;
497
+ padding: 0;
498
+ }
499
+
500
+ .ds-tab-button ion-label {
501
+ font-size: var(--font-size-sm);
502
+ font-weight: 500;
503
+ margin: 0;
504
+ color: inherit;
505
+ }
506
+
507
+ .ds-tab-button .tab-icon-wrapper {
508
+ margin-right: 4px;
509
+ margin-bottom: 0px;
510
+ }
511
+
512
+ .ds-tab-button ion-ripple-effect {
513
+ color: rgba(var(--header-content-color-rgb, 255, 255, 255), 0.3);
514
+ border-radius: 1000px;
515
+ transform: scale(1.5);
516
+ }
517
+ }
518
+
519
+ /* ============================================
520
+ AVATAR STYLING
521
+ ============================================ */
522
+
523
+ @media (min-width: 768px) {
524
+ .ds-tab-bar__actions ds-avatar {
525
+ cursor: pointer;
526
+ transition: transform 0.2s ease;
527
+ }
528
+
529
+ .ds-tab-bar__actions ds-avatar:hover {
530
+ transform: scale(1.05);
531
+ }
532
+ }
533
+