@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,212 @@
1
+ import { Component, signal, computed, effect } from '@angular/core';
2
+ import { NavController } from '@ionic/angular/standalone';
3
+ import { DsMobilePageMainComponent } from '../components/page-main';
4
+ import { DsMobileContentComponent } from '../components/content';
5
+ import { DsMobileInteractiveListItemInquiryComponent } from '../components/interactive-list-item-inquiry';
6
+ import { DsIconComponent } from '@propbinder/design-system';
7
+ import { UserService } from '../services/user.service';
8
+ import { customPageTransition } from '../animations/page-transitions';
9
+ import { DsMobileTabBarComponent, type TabItem } from '../components/tab-bar';
10
+
11
+ interface Inquiry {
12
+ id: string;
13
+ title: string;
14
+ description: string;
15
+ status: 'open' | 'closed';
16
+ timestamp: string;
17
+ category: 'maintenance' | 'plumbing' | 'electrical' | 'heating' | 'security' | 'appliance' | 'other';
18
+ }
19
+
20
+ @Component({
21
+ selector: 'app-mobile-inquiries-page',
22
+ standalone: true,
23
+ imports: [
24
+ DsMobilePageMainComponent,
25
+ DsMobileContentComponent,
26
+ DsMobileInteractiveListItemInquiryComponent,
27
+ DsIconComponent,
28
+ DsMobileTabBarComponent
29
+ ],
30
+ host: {
31
+ class: 'ion-page'
32
+ },
33
+ styles: [`
34
+ .inquiries-container {
35
+ display: flex;
36
+ flex-direction: column;
37
+ max-width: 640px;
38
+ }
39
+
40
+ .inquiry-list-wrapper {
41
+ display: flex;
42
+ flex-direction: column;
43
+ }
44
+
45
+ /* Remove custom dividers - now handled by ds-mobile-list-item */
46
+
47
+ .empty-state {
48
+ display: flex;
49
+ flex-direction: column;
50
+ align-items: center;
51
+ justify-content: center;
52
+ padding: 60px 20px;
53
+ text-align: center;
54
+ }
55
+
56
+ .empty-state-title {
57
+ font-family: 'Brockmann', sans-serif;
58
+ font-size: var(--font-size-base);
59
+ font-weight: 600;
60
+ color: var(--color-text-primary);
61
+ margin: 16px 0 8px 0;
62
+ }
63
+
64
+ .empty-state-description {
65
+ font-family: 'Brockmann', sans-serif;
66
+ font-size: var(--font-size-sm);
67
+ color: var(--color-text-secondary);
68
+ margin: 0;
69
+ }
70
+
71
+
72
+ `],
73
+ template: `
74
+ <ds-mobile-page-main
75
+ title="Henvendelser"
76
+ [avatarInitials]="userService.avatarInitials()"
77
+ [avatarType]="userService.avatarType()">
78
+
79
+ <!-- Filter tabs in header -->
80
+ <div header-content>
81
+ <ds-mobile-tab-bar
82
+ [tabs]="tabItems"
83
+ [activeTab]="filterStatus()"
84
+ (tabChange)="setFilter($any($event))">
85
+ </ds-mobile-tab-bar>
86
+ </div>
87
+
88
+ <ds-mobile-content>
89
+ <div class="inquiries-container">
90
+ @if (filteredInquiries().length > 0) {
91
+ <div class="inquiry-list-wrapper">
92
+ @for (inquiry of filteredInquiries(); track inquiry.id; let idx = $index) {
93
+ <ds-mobile-interactive-list-item-inquiry
94
+ [title]="inquiry.title"
95
+ [description]="inquiry.description"
96
+ [status]="inquiry.status"
97
+ [timestamp]="inquiry.timestamp"
98
+ [iconName]="getInquiryIcon(inquiry.category)"
99
+ [clickable]="true"
100
+ [showChevron]="false"
101
+ (inquiryClick)="openInquiryDetail(inquiry.id)"
102
+ (longPress)="showInquiryActions(inquiry.id)">
103
+ </ds-mobile-interactive-list-item-inquiry>
104
+
105
+ }
106
+ </div>
107
+ } @else {
108
+ <!-- Empty state -->
109
+ <div class="empty-state">
110
+ <ds-icon name="remixInboxLine" size="48px" color="tertiary" />
111
+ <h3 class="empty-state-title">Ingen henvendelser endnu</h3>
112
+ <p class="empty-state-description">
113
+ @if (filterStatus() === 'open') {
114
+ Du har ingen åbne henvendelser
115
+ } @else if (filterStatus() === 'closed') {
116
+ Du har ingen lukkede henvendelser
117
+ } @else {
118
+ Du har ikke oprettet nogen henvendelser endnu
119
+ }
120
+ </p>
121
+ </div>
122
+ }
123
+ </div>
124
+ </ds-mobile-content>
125
+ </ds-mobile-page-main>
126
+ `
127
+ })
128
+ export class MobileInquiriesPageComponent {
129
+ constructor(
130
+ public userService: UserService,
131
+ private navCtrl: NavController
132
+ ) {}
133
+
134
+ filterStatus = signal<'all' | 'open' | 'closed'>('all');
135
+
136
+ tabItems: TabItem[] = [
137
+ { id: 'all', label: 'Alle' },
138
+ { id: 'open', label: 'Åben' },
139
+ { id: 'closed', label: 'Lukket' }
140
+ ];
141
+
142
+ inquiries = signal<Inquiry[]>([
143
+ {
144
+ id: '1',
145
+ title: 'Tørretumbler virker ikke',
146
+ description: 'I de sidste tre dage har jeg oplevet vedvarende problemer med tørretumbleren. Den starter, men stopper efter få minutter.',
147
+ status: 'open',
148
+ timestamp: '12 dage siden',
149
+ category: 'appliance'
150
+ },
151
+ {
152
+ id: '2',
153
+ title: 'Problem med vandtryk',
154
+ description: 'Lavt vandtryk i badeværelseshåndvasken. Det er blevet gradvist værre i løbet af den sidste uge.',
155
+ status: 'open',
156
+ timestamp: '5 dage siden',
157
+ category: 'plumbing'
158
+ },
159
+ {
160
+ id: '3',
161
+ title: 'Varme virker ikke ordentligt',
162
+ description: 'Varmesystemet holder ikke den indstillede temperatur. Lejligheden er meget koldere, end den burde være.',
163
+ status: 'closed',
164
+ timestamp: '2 måneder siden',
165
+ category: 'heating'
166
+ }
167
+ ]);
168
+
169
+ // Computed signals that automatically update when dependencies change
170
+ filteredInquiries = computed(() => {
171
+ const all = this.inquiries();
172
+ const status = this.filterStatus();
173
+
174
+ if (status === 'all') {
175
+ return all;
176
+ } else if (status === 'open') {
177
+ return all.filter(i => i.status === 'open');
178
+ } else {
179
+ return all.filter(i => i.status === 'closed');
180
+ }
181
+ });
182
+
183
+ openInquiries = computed(() => {
184
+ return this.inquiries().filter(i => i.status === 'open');
185
+ });
186
+
187
+ closedInquiries = computed(() => {
188
+ return this.inquiries().filter(i => i.status === 'closed');
189
+ });
190
+
191
+ setFilter(status: 'all' | 'open' | 'closed'): void {
192
+ this.filterStatus.set(status);
193
+ }
194
+
195
+ getInquiryIcon(category: string): string {
196
+ return 'remixTodoLine';
197
+ }
198
+
199
+ openInquiryDetail(inquiryId: string): void {
200
+ console.log('Opening inquiry:', inquiryId);
201
+ // Navigate to inquiry detail page with custom transition (absolute path outside tabs for animations)
202
+ this.navCtrl.navigateForward([`/inquiry-detail/${inquiryId}`], {
203
+ animation: customPageTransition
204
+ });
205
+ }
206
+
207
+ showInquiryActions(inquiryId: string): void {
208
+ console.log('Showing actions for inquiry:', inquiryId);
209
+ // Show bottom sheet with actions (edit, delete, etc.)
210
+ }
211
+ }
212
+
@@ -0,0 +1,434 @@
1
+ /* ============================================
2
+ FIXED HEADER
3
+ ============================================ */
4
+
5
+ ion-header {
6
+ --background: var(--color-brand-secondary, #5d5fef);
7
+ height: 72px;
8
+ min-height: 72px;
9
+ }
10
+
11
+ ion-toolbar {
12
+ --background: var(--color-brand-secondary, #5d5fef);
13
+ --color: white;
14
+ --padding-top: 0;
15
+ --padding-bottom: 0;
16
+ --padding-start: 0;
17
+ --padding-end: 0;
18
+ --min-height: 72px;
19
+ height: 100%;
20
+ min-height: 72px;
21
+ }
22
+
23
+ ion-toolbar ion-title {
24
+ transition: transform 0.2s ease, opacity 0.2s ease !important;
25
+ }
26
+
27
+ .header-detail {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 12px;
31
+ padding: 0 20px;
32
+ height: 100%;
33
+ }
34
+
35
+ .back-button {
36
+ width: 36px;
37
+ height: 36px;
38
+ border-radius: 50%;
39
+ background: rgba(255, 255, 255, 0.1);
40
+ border: none;
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ cursor: pointer;
45
+ transition: background 0.2s ease;
46
+ color: white;
47
+ padding: 0;
48
+ flex-shrink: 0;
49
+ }
50
+
51
+ .back-button:hover {
52
+ background: rgba(255, 255, 255, 0.15);
53
+ }
54
+
55
+ .back-button:active {
56
+ background: rgba(255, 255, 255, 0.15);
57
+ }
58
+
59
+ .header-detail__title {
60
+ position: absolute;
61
+ left: 64px;
62
+ transform: translateY(-100%);
63
+ font-size: var(--font-size-base);
64
+ font-weight: 600;
65
+ color: white;
66
+ opacity: 0 !important;
67
+ pointer-events: none;
68
+ transition: transform 0.2s ease, opacity 0.2s ease !important;
69
+ margin: 0;
70
+ padding: 0;
71
+ --color: white;
72
+ text-align: left !important;
73
+ }
74
+
75
+ /* Show title when scrolled */
76
+ .header-scrolled .header-detail__title {
77
+ opacity: 1 !important;
78
+ pointer-events: auto;
79
+ transform: translateY(0);
80
+ }
81
+
82
+ @media (min-width: 768px) {
83
+ .header-detail {
84
+ padding: 16px 24px;
85
+ }
86
+ }
87
+
88
+ /* ============================================
89
+ ION-CONTENT
90
+ ============================================ */
91
+
92
+ ion-content {
93
+ --background: var(--color-brand-secondary);
94
+ --padding-top: 0;
95
+ --padding-start: 0;
96
+ --padding-end: 0;
97
+ --padding-bottom: 0;
98
+ border-radius: 24px 24px 0 0;
99
+ overflow: hidden;
100
+ }
101
+
102
+ /* iOS-specific: White background for bottom overshoot */
103
+ .plt-ios ion-content {
104
+ --background: var(--color-background-neutral-primary);
105
+ }
106
+
107
+ /* Desktop only: remove bottom radius */
108
+ @media (min-width: 768px) {
109
+ ion-content {
110
+ border-radius: 24px 24px 0 0;
111
+ }
112
+ }
113
+
114
+ ion-content::part(scroll) {
115
+ -webkit-overflow-scrolling: touch;
116
+ /* Flex container for content to expand properly */
117
+ display: flex;
118
+ flex-direction: column;
119
+ }
120
+
121
+ /* ============================================
122
+ REFRESHER
123
+ ============================================ */
124
+
125
+ ion-refresher {
126
+ z-index: 0;
127
+ }
128
+
129
+ ion-refresher-content {
130
+ --color: white;
131
+ }
132
+
133
+ /* ============================================
134
+ HEADER EXPANDABLE - Purple Header Section
135
+ ============================================ */
136
+
137
+ .header-expandable {
138
+ background: var(--color-brand-secondary);
139
+ padding: 32px 20px 24px 20px;
140
+ color: white;
141
+ position: sticky;
142
+ top: 0;
143
+ z-index: 5;
144
+ transition: opacity 0.1s ease-out, transform 0.1s ease-out;
145
+ }
146
+
147
+ .header-expandable-inner {
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: 20px;
151
+ max-width: 640px;
152
+ }
153
+
154
+ .header-expandable__text {
155
+ margin-bottom: 0;
156
+ }
157
+
158
+ .header-expandable__title {
159
+ font-family: 'Brockmann', sans-serif;
160
+ font-size: var(--font-size-2xl);
161
+ font-weight: 600;
162
+ line-height: 1.2;
163
+ letter-spacing: -0.5px;
164
+ margin: 0;
165
+ color: white;
166
+ }
167
+
168
+ /* Desktop */
169
+ @media (min-width: 768px) {
170
+ .header-expandable {
171
+ padding: 40px var(--content-padding-md) 32px var(--content-padding-md);
172
+ }
173
+
174
+ .header-expandable__title {
175
+ font-size: var(--font-size-3xl);
176
+ }
177
+ }
178
+
179
+ @media (min-width: 992px) {
180
+ .header-expandable {
181
+ padding-left: var(--content-padding-lg);
182
+ padding-right: var(--content-padding-lg);
183
+ }
184
+ }
185
+
186
+ @media (min-width: 1440px) {
187
+ .header-expandable {
188
+ padding-left: var(--content-padding-xl);
189
+ padding-right: var(--content-padding-xl);
190
+ }
191
+ }
192
+
193
+ @media (min-width: 1768px) {
194
+ .header-expandable {
195
+ padding-left: var(--content-padding-2xl);
196
+ padding-right: var(--content-padding-2xl);
197
+ }
198
+ }
199
+
200
+ @media (min-width: 1920px) {
201
+ .header-expandable {
202
+ padding-left: var(--content-padding-3xl);
203
+ padding-right: var(--content-padding-3xl);
204
+ }
205
+ }
206
+
207
+ /* ============================================
208
+ CONTENT WRAPPER - White Rounded Area
209
+ ============================================ */
210
+
211
+ .content-wrapper {
212
+ background: var(--color-background-neutral-primary, white);
213
+ border-radius: 24px 24px 0 0;
214
+ /* Ensure content fills available space and extends to bottom */
215
+ flex: 1 1 auto;
216
+ min-height: 100%;
217
+ position: relative;
218
+ z-index: 10;
219
+ /* Extend white background below for iOS overshoot using box-shadow */
220
+ box-shadow: 0 200vh 0 0 var(--color-background-neutral-primary);
221
+ }
222
+
223
+ .content-inner {
224
+ padding: 24px 20px 40px 20px;
225
+ }
226
+
227
+ @media (min-width: 768px) {
228
+ .content-inner {
229
+ padding: 32px;
230
+ }
231
+ }
232
+
233
+ /* ============================================
234
+ TAB CONTENT
235
+ ============================================ */
236
+
237
+ .activity-list {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 32px;
241
+ }
242
+
243
+ .activity-item {
244
+ display: flex;
245
+ gap: 12px;
246
+ position: relative;
247
+ }
248
+
249
+ .activity-item::after {
250
+ content: '';
251
+ position: absolute;
252
+ bottom: -16px;
253
+ left: 44px;
254
+ right: 8px;
255
+ height: 1px;
256
+ background: var(--border-color-default, #e5e5e5);
257
+ }
258
+
259
+ .activity-item:last-child::after {
260
+ display: none;
261
+ }
262
+
263
+ .activity-icon-wrapper {
264
+ width: 32px;
265
+ height: 32px;
266
+ border-radius: 8px;
267
+ background: var(--color-background-neutral-secondary, #f5f5f5);
268
+ display: flex;
269
+ align-items: center;
270
+ justify-content: center;
271
+ flex-shrink: 0;
272
+ }
273
+
274
+ .avatar-wrapper {
275
+ position: relative;
276
+ display: flex;
277
+ align-items: start;
278
+ justify-content: center;
279
+ flex-shrink: 0;
280
+ width: 32px;
281
+ height: 32px;
282
+ }
283
+
284
+ .avatar-badge {
285
+ position: absolute;
286
+ bottom: -6px;
287
+ right: -6px;
288
+ width: 20px;
289
+ height: 20px;
290
+ border-radius: 8px;
291
+ background: var(--color-brand-secondary, #5d5fef);
292
+ display: flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ border: 2px solid var(--color-background-primary, #ffffff);
296
+ }
297
+
298
+ .avatar-badge svg {
299
+ width: 10px;
300
+ position: relative;
301
+ top: 1px;
302
+ fill: white;
303
+ }
304
+
305
+ .activity-content {
306
+ display: flex;
307
+ flex-direction: column;
308
+ gap: 4px;
309
+ flex: 1;
310
+ min-width: 0;
311
+ }
312
+
313
+ .activity-title {
314
+ font-family: 'Brockmann', sans-serif;
315
+ font-size: var(--font-size-sm);
316
+ font-weight: 500;
317
+ line-height: 20px;
318
+ letter-spacing: -0.3px;
319
+ color: var(--text-color-default-primary, #202227);
320
+ margin: 0;
321
+ }
322
+
323
+ .activity-title .actor-name {
324
+ font-weight: 600;
325
+ color: var(--text-color-default-primary, #202227);
326
+ }
327
+
328
+ .activity-title .activity-text {
329
+ color: var(--text-color-default-secondary, #545B66);
330
+ font-weight: 400;
331
+ }
332
+
333
+ .activity-description {
334
+ font-family: 'Brockmann', sans-serif;
335
+ font-size: var(--font-size-sm);
336
+ font-weight: 400;
337
+ line-height: 20px;
338
+ letter-spacing: -0.3px;
339
+ color: var(--text-color-default-secondary, #545B66);
340
+ margin: 0;
341
+ }
342
+
343
+ .activity-timestamp {
344
+ font-family: 'Brockmann', sans-serif;
345
+ font-size: var(--font-size-xs);
346
+ font-weight: 400;
347
+ line-height: 1.2;
348
+ letter-spacing: -0.26px;
349
+ color: var(--text-color-default-tertiary, #737373);
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 4px;
353
+ margin-top: 2px;
354
+ }
355
+
356
+ .messages-list {
357
+ display: flex;
358
+ flex-direction: column;
359
+ gap: 8px;
360
+ margin: -8px;
361
+ }
362
+
363
+ .details-list {
364
+ display: flex;
365
+ flex-direction: column;
366
+ gap: 20px;
367
+ }
368
+
369
+ .detail-label {
370
+ font-family: 'Brockmann', sans-serif;
371
+ font-size: var(--font-size-sm);
372
+ font-weight: 500;
373
+ line-height: 20px;
374
+ letter-spacing: -0.3px;
375
+ color: var(--text-color-default-tertiary, #737373);
376
+ }
377
+
378
+ .detail-value {
379
+ font-family: 'Brockmann', sans-serif;
380
+ font-size: var(--font-size-sm);
381
+ font-weight: 400;
382
+ line-height: 24px;
383
+ letter-spacing: -0.3px;
384
+ color: var(--text-color-default-primary, #202227);
385
+ }
386
+
387
+ .detail-value.description-text {
388
+ padding: 8px 0;
389
+ }
390
+
391
+ .detail-tag {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ padding: 4px 12px;
395
+ border-radius: 12px;
396
+ background: var(--color-background-neutral-secondary, #f5f5f5);
397
+ font-family: 'Brockmann', sans-serif;
398
+ font-size: var(--font-size-sm);
399
+ font-weight: 500;
400
+ color: var(--text-color-default-secondary, #525866);
401
+ margin-top: 4px;
402
+ margin-bottom: 10px;
403
+ width: -moz-fit-content;
404
+ width: fit-content;
405
+ }
406
+
407
+ .photo-grid {
408
+ display: flex;
409
+ gap: 8px;
410
+ margin-top: 8px;
411
+ overflow-x: auto;
412
+ }
413
+
414
+ .photo-add {
415
+ width: 80px;
416
+ height: 80px;
417
+ border-radius: 12px;
418
+ border: 1px dashed var(--border-color-default, #e5e5e5);
419
+ background: var(--color-background-neutral-secondary, #f5f5f5);
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: center;
423
+ cursor: pointer;
424
+ flex-shrink: 0;
425
+ }
426
+
427
+ .photo-item {
428
+ width: 80px;
429
+ height: 80px;
430
+ border-radius: 12px;
431
+ background: var(--color-background-neutral-secondary, #e5e5e5);
432
+ flex-shrink: 0;
433
+ }
434
+