@propbinder/mobile-design 0.2.50 → 0.2.53
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.
- package/fesm2022/propbinder-mobile-design.mjs +26206 -0
- package/fesm2022/propbinder-mobile-design.mjs.map +1 -0
- package/index.d.ts +8193 -0
- package/package.json +39 -3
- package/ng-package.json +0 -24
- package/src/animations/page-transitions.ts +0 -165
- package/src/components/action-list-item/ds-mobile-action-list-item.ts +0 -102
- package/src/components/action-list-item/index.ts +0 -2
- package/src/components/app-icon/ds-app-icon.ts +0 -133
- package/src/components/app-icon/index.ts +0 -2
- package/src/components/attachment-preview/ds-mobile-attachment-preview.css +0 -139
- package/src/components/attachment-preview/ds-mobile-attachment-preview.ts +0 -164
- package/src/components/attachment-preview/index.ts +0 -1
- package/src/components/avatar-with-badge/ds-avatar-with-badge.ts +0 -142
- package/src/components/avatar-with-badge/index.ts +0 -2
- package/src/components/booking-modal/ds-mobile-booking-confirmation-wrapper.ts +0 -71
- package/src/components/booking-modal/ds-mobile-booking-modal.service.ts +0 -121
- package/src/components/booking-modal/ds-mobile-booking-modal.ts +0 -598
- package/src/components/booking-modal/ds-mobile-booking-summary.ts +0 -161
- package/src/components/booking-modal/index.ts +0 -4
- package/src/components/bottom-sheet/ds-mobile-actions-bottom-sheet.ts +0 -266
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet-header.ts +0 -146
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet-wrapper.ts +0 -156
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet.css +0 -101
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet.service.ts +0 -169
- package/src/components/bottom-sheet/ds-mobile-confirmation-sheet.ts +0 -211
- package/src/components/bottom-sheet/ds-mobile-post-create-bottom-sheet.ts +0 -578
- package/src/components/bottom-sheet/ds-mobile-profile-actions-sheet.ts +0 -614
- package/src/components/bottom-sheet/index.ts +0 -8
- package/src/components/bottom-sheet/modal-shadow-fix.ts +0 -42
- package/src/components/card-inline/ds-mobile-card-inline.ts +0 -301
- package/src/components/card-inline/index.ts +0 -2
- package/src/components/card-inline-banner/ds-mobile-card-inline-banner.ts +0 -118
- package/src/components/card-inline-banner/index.ts +0 -1
- package/src/components/card-inline-contact/ds-mobile-card-inline-contact.ts +0 -120
- package/src/components/card-inline-contact/index.ts +0 -1
- package/src/components/card-inline-file/ds-mobile-card-inline-file.ts +0 -141
- package/src/components/card-inline-file/index.ts +0 -1
- package/src/components/chat-modal/ds-mobile-chat-modal.css +0 -159
- package/src/components/chat-modal/ds-mobile-chat-modal.service.ts +0 -105
- package/src/components/chat-modal/ds-mobile-chat-modal.ts +0 -918
- package/src/components/chat-modal/index.ts +0 -8
- package/src/components/comment/ds-mobile-comment.ts +0 -568
- package/src/components/comment/index.ts +0 -2
- package/src/components/contact-list-item/ds-mobile-contact-list-item.ts +0 -182
- package/src/components/contact-list-item/index.ts +0 -2
- package/src/components/content/ds-mobile-content.ts +0 -139
- package/src/components/content/index.ts +0 -2
- package/src/components/dropdown/ds-mobile-dropdown.css +0 -199
- package/src/components/dropdown/ds-mobile-dropdown.ts +0 -340
- package/src/components/dropdown/index.ts +0 -2
- package/src/components/ds-mobile-tabs.css +0 -407
- package/src/components/ds-mobile-tabs.ts +0 -216
- package/src/components/empty-state/ds-mobile-empty-state.ts +0 -120
- package/src/components/empty-state/index.ts +0 -2
- package/src/components/fab/ds-mobile-fab.ts +0 -315
- package/src/components/fab/index.ts +0 -1
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-confirmation-wrapper.ts +0 -121
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.css +0 -189
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.service.ts +0 -135
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.ts +0 -656
- package/src/components/facility-creation-modal/index.ts +0 -9
- package/src/components/facility-creation-modal/sheets/ds-mobile-access-sheet.ts +0 -105
- package/src/components/facility-creation-modal/sheets/ds-mobile-price-sheet.ts +0 -188
- package/src/components/facility-creation-modal/sheets/ds-mobile-when-can-book-sheet.ts +0 -460
- package/src/components/facility-creation-modal/sheets/ds-mobile-who-can-book-sheet.ts +0 -134
- package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.service.ts +0 -69
- package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.ts +0 -379
- package/src/components/facility-detail-modal/index.ts +0 -2
- package/src/components/file-attachment/ds-mobile-file-attachment.ts +0 -164
- package/src/components/file-attachment/index.ts +0 -2
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.css +0 -214
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.service.ts +0 -84
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.ts +0 -424
- package/src/components/handbook-detail-modal/index.ts +0 -3
- package/src/components/handbook-folder/ds-mobile-handbook-folder-mini.ts +0 -175
- package/src/components/handbook-folder/ds-mobile-handbook-folder.ts +0 -533
- package/src/components/handbook-folder/index.ts +0 -4
- package/src/components/header-content/ds-mobile-header-content.ts +0 -222
- package/src/components/header-content/index.ts +0 -2
- package/src/components/illustration/ds-mobile-illustration.ts +0 -124
- package/src/components/illustration/index.ts +0 -2
- package/src/components/index.ts +0 -124
- package/src/components/inline-photo/ds-mobile-inline-photo.ts +0 -361
- package/src/components/inline-photo/index.ts +0 -1
- package/src/components/inline-tabs/ds-mobile-inline-tabs.ts +0 -132
- package/src/components/inline-tabs/index.ts +0 -2
- package/src/components/interactive-list-item-booking/ds-mobile-interactive-list-item-booking.ts +0 -350
- package/src/components/interactive-list-item-booking/index.ts +0 -1
- package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.ts +0 -321
- package/src/components/interactive-list-item-inquiry/index.ts +0 -2
- package/src/components/interactive-list-item-message/ds-mobile-interactive-list-item-message.ts +0 -237
- package/src/components/interactive-list-item-message/index.ts +0 -2
- package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.ts +0 -549
- package/src/components/interactive-list-item-post/ds-mobile-post-pdf-attachment.ts +0 -124
- package/src/components/interactive-list-item-post/index.ts +0 -13
- package/src/components/lightbox/ds-mobile-lightbox-footer.ts +0 -315
- package/src/components/lightbox/ds-mobile-lightbox-header.ts +0 -202
- package/src/components/lightbox/ds-mobile-lightbox-image.ts +0 -484
- package/src/components/lightbox/ds-mobile-lightbox-pdf.css +0 -377
- package/src/components/lightbox/ds-mobile-lightbox-pdf.ts +0 -374
- package/src/components/lightbox/ds-mobile-lightbox.css +0 -587
- package/src/components/lightbox/ds-mobile-lightbox.service.ts +0 -296
- package/src/components/lightbox/ds-mobile-lightbox.ts +0 -529
- package/src/components/lightbox/index.ts +0 -22
- package/src/components/list-item/ds-mobile-list-item.ts +0 -603
- package/src/components/list-item/index.ts +0 -2
- package/src/components/list-item-static/ds-mobile-list-item-static.ts +0 -133
- package/src/components/list-item-static/index.ts +0 -2
- package/src/components/loader-overlay/ds-mobile-loader-overlay.css +0 -49
- package/src/components/loader-overlay/ds-mobile-loader-overlay.ts +0 -77
- package/src/components/loader-overlay/index.ts +0 -1
- package/src/components/logo/ds-logo.ts +0 -95
- package/src/components/logo/index.ts +0 -2
- package/src/components/message-bubble/ds-mobile-message-bubble.ts +0 -633
- package/src/components/message-bubble/index.ts +0 -7
- package/src/components/message-composer/ds-mobile-message-composer.ts +0 -1146
- package/src/components/message-composer/index.ts +0 -7
- package/src/components/modal/ds-mobile-modal.css +0 -163
- package/src/components/modal/ds-mobile-modal.service.ts +0 -329
- package/src/components/modal/index.ts +0 -8
- package/src/components/modal-base/ds-mobile-modal-base.css +0 -378
- package/src/components/modal-base/ds-mobile-modal-base.ts +0 -261
- package/src/components/modal-base/index.ts +0 -2
- package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.css +0 -112
- package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.service.ts +0 -93
- package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.ts +0 -442
- package/src/components/new-inquiry-modal/index.ts +0 -4
- package/src/components/offline-banner/ds-mobile-offline-banner.ts +0 -135
- package/src/components/offline-banner/index.ts +0 -1
- package/src/components/page-details/ds-mobile-page-details.css +0 -83
- package/src/components/page-details/ds-mobile-page-details.ts +0 -282
- package/src/components/page-details/index.ts +0 -2
- package/src/components/page-main/ds-mobile-page-main.css +0 -68
- package/src/components/page-main/ds-mobile-page-main.ts +0 -421
- package/src/components/page-main/index.ts +0 -2
- package/src/components/post-composer/ds-mobile-post-composer.ts +0 -140
- package/src/components/post-composer/index.ts +0 -2
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.css +0 -390
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.service.ts +0 -108
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.ts +0 -722
- package/src/components/post-detail-modal/index.ts +0 -9
- package/src/components/property-banner/ds-mobile-property-banner.ts +0 -95
- package/src/components/property-banner/index.ts +0 -2
- package/src/components/section/ds-mobile-section.ts +0 -263
- package/src/components/section/index.ts +0 -2
- package/src/components/shared/directives/index.ts +0 -2
- package/src/components/shared/directives/long-press.directive.ts +0 -212
- package/src/components/shared/index.ts +0 -3
- package/src/components/shared/mobile-modal-base.ts +0 -457
- package/src/components/shared/mobile-page-base.ts +0 -204
- package/src/components/swiper/ds-mobile-swiper-with-nav.ts +0 -160
- package/src/components/swiper/ds-mobile-swiper.ts +0 -327
- package/src/components/swiper/index.ts +0 -3
- package/src/components/system-message-banner/ds-mobile-system-message-banner.ts +0 -129
- package/src/components/system-message-banner/index.ts +0 -2
- package/src/components/tab-bar/ds-mobile-tab-bar.css +0 -533
- package/src/components/tab-bar/ds-mobile-tab-bar.ts +0 -735
- package/src/components/tab-bar/index.ts +0 -2
- package/src/components/tabs/ds-mobile-tabs.css +0 -25
- package/src/components/tabs/ds-mobile-tabs.ts +0 -89
- package/src/components/tabs/index.ts +0 -2
- package/src/components/text-input/ds-text-input.ts +0 -287
- package/src/components/text-input/index.ts +0 -2
- package/src/examples/booking.page.ts +0 -434
- package/src/examples/community.page.ts +0 -776
- package/src/examples/handbook.page.ts +0 -324
- package/src/examples/home.page.ts +0 -347
- package/src/examples/index.ts +0 -12
- package/src/examples/inquiries.example.ts +0 -273
- package/src/examples/inquiry-detail.example.css +0 -189
- package/src/examples/inquiry-detail.example.ts +0 -415
- package/src/examples/mobile-tabs-example.component.ts +0 -208
- package/src/examples/post-create.page.ts +0 -311
- package/src/examples/post-detail.page.ts +0 -296
- package/src/examples/sign-in.page.ts +0 -291
- package/src/examples/whitelabel-demo-modal.component.ts +0 -1094
- package/src/examples/whitelabel-demo-modal.service.ts +0 -77
- package/src/models/index.ts +0 -7
- package/src/models/post.model.ts +0 -41
- package/src/pages/community.page.ts +0 -769
- package/src/pages/handbook.page.ts +0 -388
- package/src/pages/home.page.ts +0 -303
- package/src/pages/index.ts +0 -11
- package/src/pages/inquiries.example.ts +0 -273
- package/src/pages/inquiry-detail.example.css +0 -189
- package/src/pages/inquiry-detail.example.ts +0 -415
- package/src/pages/mobile-tabs-example.component.ts +0 -179
- package/src/pages/post-create.page.ts +0 -311
- package/src/pages/post-detail.page.ts +0 -296
- package/src/pages/sign-in.page.ts +0 -291
- package/src/pages/whitelabel-demo-modal.component.ts +0 -1094
- package/src/pages/whitelabel-demo-modal.service.ts +0 -77
- package/src/public-api.ts +0 -6
- package/src/services/base-modal.service.ts +0 -101
- package/src/services/index.ts +0 -11
- package/src/services/posts.service.ts +0 -542
- package/src/services/tracking-permission.service.ts +0 -88
- package/src/services/user.service.ts +0 -60
- package/src/services/whitelabel.service.ts +0 -675
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -13
- /package/{src/assets → assets}/fonts/Brockmann-Bold.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-BoldItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-Medium.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-MediumItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-Regular.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-RegularItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-SemiBold.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-SemiBoldItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann_desktop_license.pdf +0 -0
- /package/{src/assets → assets}/fonts/brockmann-medium-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-mediumitalic-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-regular-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-regularitalic-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-semibold-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-semibolditalic-webfont.woff2 +0 -0
- /package/{src/styles → styles}/ionic.css +0 -0
- /package/{src/components/shared → styles}/mobile-common.css +0 -0
- /package/{src/components/shared → styles}/mobile-page-base.css +0 -0
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
import { Component, input, output } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* DsMobileCardInlineComponent
|
|
6
|
-
*
|
|
7
|
-
* A versatile, always-interactive inline card component for standalone or small-group usage.
|
|
8
|
-
* Designed for tappable card-like elements such as file attachments, contact cards, etc.
|
|
9
|
-
* Not intended for long scrolling lists - use ds-mobile-list-item for that purpose.
|
|
10
|
-
*
|
|
11
|
-
* Features:
|
|
12
|
-
* - Always interactive/tappable (unless disabled)
|
|
13
|
-
* - Two layout variants: default (column) and compact (row)
|
|
14
|
-
* - Flexible content projection with leading/main/trailing slots
|
|
15
|
-
* - Consistent styling with rounded corners and neutral background
|
|
16
|
-
* - Built-in hover and active states
|
|
17
|
-
* - Accessibility features (role, tabindex, aria attributes)
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```html
|
|
21
|
-
* <!-- Default variant (column layout) -->
|
|
22
|
-
* <ds-mobile-card-inline
|
|
23
|
-
* [variant]="'default'"
|
|
24
|
-
* (cardClick)="handleClick()">
|
|
25
|
-
*
|
|
26
|
-
* <div content-leading>
|
|
27
|
-
* <ds-avatar initials="JD" />
|
|
28
|
-
* </div>
|
|
29
|
-
*
|
|
30
|
-
* <div content-main>
|
|
31
|
-
* <div class="title">Document Title</div>
|
|
32
|
-
* <div class="subtitle">PDF · 1.2 MB</div>
|
|
33
|
-
* </div>
|
|
34
|
-
*
|
|
35
|
-
* <ds-icon content-trailing name="remixArrowRightSLine" />
|
|
36
|
-
* </ds-mobile-card-inline>
|
|
37
|
-
*
|
|
38
|
-
* <!-- Compact variant (row layout) -->
|
|
39
|
-
* <ds-mobile-card-inline
|
|
40
|
-
* [variant]="'compact'"
|
|
41
|
-
* (cardClick)="handleClick()">
|
|
42
|
-
*
|
|
43
|
-
* <ds-avatar content-leading size="sm" />
|
|
44
|
-
*
|
|
45
|
-
* <div content-main>
|
|
46
|
-
* <span class="name">File.pdf</span>
|
|
47
|
-
* <span class="size">245 KB</span>
|
|
48
|
-
* </div>
|
|
49
|
-
*
|
|
50
|
-
* <ds-icon content-trailing name="remixArrowRightSLine" />
|
|
51
|
-
* </ds-mobile-card-inline>
|
|
52
|
-
*
|
|
53
|
-
* <!-- Disabled state -->
|
|
54
|
-
* <ds-mobile-card-inline [disabled]="true">
|
|
55
|
-
* <div content-main>Disabled card</div>
|
|
56
|
-
* </ds-mobile-card-inline>
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
@Component({
|
|
60
|
-
selector: 'ds-mobile-card-inline',
|
|
61
|
-
standalone: true,
|
|
62
|
-
imports: [CommonModule],
|
|
63
|
-
host: {
|
|
64
|
-
'[class.disabled]': 'disabled()',
|
|
65
|
-
'[class.variant-compact]': 'variant() === "compact"',
|
|
66
|
-
'[class.variant-default]': 'variant() === "default"',
|
|
67
|
-
'[attr.role]': '"button"',
|
|
68
|
-
'[attr.tabindex]': 'disabled() ? null : "0"',
|
|
69
|
-
'[attr.aria-disabled]': 'disabled() ? "true" : null',
|
|
70
|
-
'(click)': 'handleClick($event)',
|
|
71
|
-
'(keydown.enter)': 'handleKeyDown($event)',
|
|
72
|
-
'(keydown.space)': 'handleKeyDown($event)'
|
|
73
|
-
},
|
|
74
|
-
styles: [`
|
|
75
|
-
:host {
|
|
76
|
-
display: flex;
|
|
77
|
-
align-items: center;
|
|
78
|
-
background: var(--color-background-neutral-secondary, #f5f5f5);
|
|
79
|
-
border-radius: 16px;
|
|
80
|
-
cursor: pointer;
|
|
81
|
-
transition: all 0.2s ease;
|
|
82
|
-
box-sizing: border-box;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/* Default variant - column layout with more padding */
|
|
86
|
-
:host(.variant-default) {
|
|
87
|
-
gap: 12px;
|
|
88
|
-
padding: 10px 12px;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/* Compact variant - row layout with less padding */
|
|
92
|
-
:host(.variant-compact) {
|
|
93
|
-
gap: 8px;
|
|
94
|
-
padding: 10px;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/* Hover state (desktop only) */
|
|
98
|
-
@media (hover: hover) and (pointer: fine) {
|
|
99
|
-
:host(:hover):not(.disabled) {
|
|
100
|
-
background: var(--color-background-neutral-secondary-hover, #ebebeb);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/* Active state */
|
|
105
|
-
:host(:active):not(.disabled) {
|
|
106
|
-
transform: scale(0.98);
|
|
107
|
-
background: var(--color-background-neutral-secondary-hover, #ebebeb);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* Focus visible for keyboard navigation */
|
|
111
|
-
:host(:focus-visible):not(.disabled) {
|
|
112
|
-
outline: 2px solid var(--color-brand-primary, #5d5fef);
|
|
113
|
-
outline-offset: 2px;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/* Disabled state */
|
|
117
|
-
:host(.disabled) {
|
|
118
|
-
opacity: 0.5;
|
|
119
|
-
pointer-events: none;
|
|
120
|
-
cursor: not-allowed;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/* Inner container */
|
|
124
|
-
.card-inline-inner {
|
|
125
|
-
display: flex;
|
|
126
|
-
align-items: center;
|
|
127
|
-
gap: inherit;
|
|
128
|
-
width: 100%;
|
|
129
|
-
min-width: 0;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/* Content slots */
|
|
133
|
-
.content-leading {
|
|
134
|
-
flex-shrink: 0;
|
|
135
|
-
display: flex;
|
|
136
|
-
align-items: center;
|
|
137
|
-
justify-content: center;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
.content-main {
|
|
141
|
-
flex: 1;
|
|
142
|
-
min-width: 0;
|
|
143
|
-
display: flex;
|
|
144
|
-
align-items: center;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/* Compact variant - main content flows inline */
|
|
148
|
-
:host(.variant-compact) .content-main {
|
|
149
|
-
flex-direction: row;
|
|
150
|
-
gap: 8px;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/* Default variant - main content flows column */
|
|
154
|
-
:host(.variant-default) .content-main {
|
|
155
|
-
flex-direction: column;
|
|
156
|
-
align-items: flex-start;
|
|
157
|
-
gap: 2px;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.content-trailing {
|
|
161
|
-
flex-shrink: 0;
|
|
162
|
-
display: flex;
|
|
163
|
-
align-items: center;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/* ============================================
|
|
167
|
-
Shared item styles for child components
|
|
168
|
-
============================================ */
|
|
169
|
-
|
|
170
|
-
/* Item avatar container */
|
|
171
|
-
::ng-deep .item-avatar {
|
|
172
|
-
flex-shrink: 0;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/* Item content wrapper - default stacks vertically */
|
|
176
|
-
::ng-deep .item-content {
|
|
177
|
-
flex: 1;
|
|
178
|
-
min-width: 0;
|
|
179
|
-
display: flex;
|
|
180
|
-
flex-direction: column;
|
|
181
|
-
justify-content: center;
|
|
182
|
-
gap: 2px;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/* Compact layout - content flows inline */
|
|
186
|
-
:host(.variant-compact) ::ng-deep .item-content {
|
|
187
|
-
flex-direction: row;
|
|
188
|
-
align-items: center;
|
|
189
|
-
justify-content: flex-start;
|
|
190
|
-
gap: 8px;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/* Item name - primary text with truncation */
|
|
194
|
-
::ng-deep .item-name {
|
|
195
|
-
font-family: 'Brockmann', sans-serif;
|
|
196
|
-
font-size: var(--font-size-sm);
|
|
197
|
-
font-weight: 600;
|
|
198
|
-
line-height: 20px;
|
|
199
|
-
letter-spacing: -0.3px;
|
|
200
|
-
color: var(--color-text-primary, #1a1a1a);
|
|
201
|
-
margin: 0;
|
|
202
|
-
white-space: nowrap;
|
|
203
|
-
overflow: hidden;
|
|
204
|
-
text-overflow: ellipsis;
|
|
205
|
-
text-align: left;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/* Item meta - secondary text */
|
|
209
|
-
::ng-deep .item-meta {
|
|
210
|
-
font-family: 'Brockmann', sans-serif;
|
|
211
|
-
font-size: var(--font-size-xs);
|
|
212
|
-
font-weight: 400;
|
|
213
|
-
line-height: 1.2;
|
|
214
|
-
letter-spacing: -0.26px;
|
|
215
|
-
color: var(--color-text-tertiary, #737373);
|
|
216
|
-
margin: 0;
|
|
217
|
-
display: flex;
|
|
218
|
-
align-items: center;
|
|
219
|
-
justify-content: flex-start;
|
|
220
|
-
gap: 4px;
|
|
221
|
-
white-space: nowrap;
|
|
222
|
-
flex-shrink: 0;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/* Item trailing icon */
|
|
226
|
-
::ng-deep .item-trailing {
|
|
227
|
-
display: flex;
|
|
228
|
-
align-items: center;
|
|
229
|
-
color: var(--color-text-tertiary, #a3a3a3);
|
|
230
|
-
flex-shrink: 0;
|
|
231
|
-
}
|
|
232
|
-
`],
|
|
233
|
-
template: `
|
|
234
|
-
<div class="card-inline-inner">
|
|
235
|
-
<div class="content-leading">
|
|
236
|
-
<ng-content select="[content-leading]" />
|
|
237
|
-
</div>
|
|
238
|
-
|
|
239
|
-
<div class="content-main">
|
|
240
|
-
<ng-content select="[content-main]" />
|
|
241
|
-
<ng-content />
|
|
242
|
-
</div>
|
|
243
|
-
|
|
244
|
-
<div class="content-trailing">
|
|
245
|
-
<ng-content select="[content-trailing]" />
|
|
246
|
-
</div>
|
|
247
|
-
</div>
|
|
248
|
-
`
|
|
249
|
-
})
|
|
250
|
-
export class DsMobileCardInlineComponent {
|
|
251
|
-
/**
|
|
252
|
-
* Display variant
|
|
253
|
-
* - 'default' - Column layout with standard padding (gap: 12px, padding: 10px 12px)
|
|
254
|
-
* - 'compact' - Row layout with reduced padding (gap: 8px, padding: 10px)
|
|
255
|
-
*/
|
|
256
|
-
variant = input<'default' | 'compact'>('default');
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Whether the card is disabled
|
|
260
|
-
* Disables all interactions and reduces opacity
|
|
261
|
-
*/
|
|
262
|
-
disabled = input<boolean>(false);
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Emits when the card is clicked (if not disabled)
|
|
266
|
-
*/
|
|
267
|
-
cardClick = output<void>();
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Handle click events
|
|
271
|
-
*/
|
|
272
|
-
handleClick(event: Event): void {
|
|
273
|
-
if (this.disabled()) {
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Don't emit click if it came from an interactive child element
|
|
278
|
-
const target = event.target as HTMLElement;
|
|
279
|
-
const closestInteractive = target.closest('button, a, input, select, textarea, [role="button"]');
|
|
280
|
-
|
|
281
|
-
// Check if the interactive element is a child, not the host itself
|
|
282
|
-
if (closestInteractive && closestInteractive !== event.currentTarget) {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
this.cardClick.emit();
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* Handle keyboard events (Enter/Space)
|
|
291
|
-
*/
|
|
292
|
-
handleKeyDown(event: KeyboardEvent): void {
|
|
293
|
-
if (this.disabled()) {
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
event.preventDefault();
|
|
298
|
-
this.cardClick.emit();
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { Component, input, output } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { DsIconComponent } from '@propbinder/design-system';
|
|
4
|
-
import { DsAvatarComponent } from '@propbinder/design-system';
|
|
5
|
-
import { DsMobileCardInlineComponent } from '../card-inline';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* DsMobileCardInlineBannerComponent
|
|
9
|
-
*
|
|
10
|
-
* Specialized interactive component for displaying notification banners.
|
|
11
|
-
* Used to show unread message notifications above inquiry details.
|
|
12
|
-
*
|
|
13
|
-
* Features:
|
|
14
|
-
* - Neutral background matching file/contact cards
|
|
15
|
-
* - Avatar icon with message symbol
|
|
16
|
-
* - Title and timestamp
|
|
17
|
-
* - Unread count badge
|
|
18
|
-
* - Chevron for navigation indication
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```html
|
|
22
|
-
* <ds-mobile-card-inline-banner
|
|
23
|
-
* [title]="'New messages'"
|
|
24
|
-
* [timestamp]="'2 min ago'"
|
|
25
|
-
* [unreadCount]="3"
|
|
26
|
-
* (bannerClick)="navigateToMessages()">
|
|
27
|
-
* </ds-mobile-card-inline-banner>
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
@Component({
|
|
31
|
-
selector: 'ds-mobile-card-inline-banner',
|
|
32
|
-
standalone: true,
|
|
33
|
-
imports: [CommonModule, DsIconComponent, DsAvatarComponent, DsMobileCardInlineComponent],
|
|
34
|
-
styles: [`
|
|
35
|
-
/* Component-specific styles only - shared styles come from base component */
|
|
36
|
-
|
|
37
|
-
/* Badge for unread count - using whitelabel brand colors */
|
|
38
|
-
.unread-badge {
|
|
39
|
-
min-width: 24px;
|
|
40
|
-
height: 16px;
|
|
41
|
-
padding: 0 6px;
|
|
42
|
-
border-radius: 10px;
|
|
43
|
-
background: var(--color-accent, #6B5FF5);
|
|
44
|
-
color: var(--color-on-accent, #ffffff);
|
|
45
|
-
font-family: 'Brockmann', sans-serif;
|
|
46
|
-
font-size: var(--font-size-xs);
|
|
47
|
-
font-weight: 600;
|
|
48
|
-
display: flex;
|
|
49
|
-
align-items: center;
|
|
50
|
-
justify-content: center;
|
|
51
|
-
line-height: 1;
|
|
52
|
-
margin-right: 8px;
|
|
53
|
-
}
|
|
54
|
-
`],
|
|
55
|
-
template: `
|
|
56
|
-
<ds-mobile-card-inline
|
|
57
|
-
[variant]="layout()"
|
|
58
|
-
(cardClick)="handleBannerClick()">
|
|
59
|
-
|
|
60
|
-
<div content-leading class="item-avatar">
|
|
61
|
-
<ds-avatar
|
|
62
|
-
type="icon"
|
|
63
|
-
[iconName]="'remixNotificationLine'"
|
|
64
|
-
[size]="layout() === 'compact' ? 'sm' : 'md'"
|
|
65
|
-
/>
|
|
66
|
-
</div>
|
|
67
|
-
|
|
68
|
-
<div content-main class="item-content">
|
|
69
|
-
<div class="item-name">{{ title() }}</div>
|
|
70
|
-
|
|
71
|
-
@if (timestamp()) {
|
|
72
|
-
<div class="item-meta">
|
|
73
|
-
<span>{{ timestamp() }}</span>
|
|
74
|
-
</div>
|
|
75
|
-
}
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
<div content-trailing class="item-trailing">
|
|
79
|
-
@if (unreadCount() && unreadCount()! > 0) {
|
|
80
|
-
<span class="unread-badge">{{ unreadCount() }}</span>
|
|
81
|
-
}
|
|
82
|
-
<ds-icon name="remixArrowRightSLine" size="20px" />
|
|
83
|
-
</div>
|
|
84
|
-
</ds-mobile-card-inline>
|
|
85
|
-
`
|
|
86
|
-
})
|
|
87
|
-
export class DsMobileCardInlineBannerComponent {
|
|
88
|
-
/**
|
|
89
|
-
* Banner title (e.g., "New messages", "Unread messages")
|
|
90
|
-
*/
|
|
91
|
-
title = input.required<string>();
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Timestamp text (e.g., "2 min ago", "Just now")
|
|
95
|
-
*/
|
|
96
|
-
timestamp = input<string>('');
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Number of unread items (optional, shows badge if > 0)
|
|
100
|
-
*/
|
|
101
|
-
unreadCount = input<number>(0);
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Layout variant
|
|
105
|
-
* - 'default' - Standard padding and column layout
|
|
106
|
-
* - 'compact' - Reduced padding and row layout
|
|
107
|
-
*/
|
|
108
|
-
layout = input<'default' | 'compact'>('default');
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Emits when the banner is clicked
|
|
112
|
-
*/
|
|
113
|
-
bannerClick = output<void>();
|
|
114
|
-
|
|
115
|
-
handleBannerClick(): void {
|
|
116
|
-
this.bannerClick.emit();
|
|
117
|
-
}
|
|
118
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './ds-mobile-card-inline-banner';
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { Component, input, output } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { DsIconComponent } from '@propbinder/design-system';
|
|
4
|
-
import { DsAvatarComponent } from '@propbinder/design-system';
|
|
5
|
-
import { DsMobileCardInlineComponent } from '../card-inline';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* DsMobileCardInlineContactComponent
|
|
9
|
-
*
|
|
10
|
-
* Specialized interactive component for displaying contacts.
|
|
11
|
-
* Displays contact name with avatar initials and metadata (person name + phone number).
|
|
12
|
-
* Similar styling to file attachments with rounded corners and hover states.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```html
|
|
16
|
-
* <ds-mobile-card-inline-contact
|
|
17
|
-
* [name]="'Mortensen & Søn ApS'"
|
|
18
|
-
* [initials]="'M'"
|
|
19
|
-
* [contactPerson]="'John Mortensen'"
|
|
20
|
-
* [phoneNumber]="'+45 12 34 56 78'"
|
|
21
|
-
* [clickable]="true"
|
|
22
|
-
* (contactClick)="openContact()">
|
|
23
|
-
* </ds-mobile-card-inline-contact>
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
@Component({
|
|
27
|
-
selector: 'ds-mobile-card-inline-contact',
|
|
28
|
-
standalone: true,
|
|
29
|
-
imports: [CommonModule, DsIconComponent, DsAvatarComponent, DsMobileCardInlineComponent],
|
|
30
|
-
styles: [`
|
|
31
|
-
/* Component-specific styles only - shared styles come from base component */
|
|
32
|
-
`],
|
|
33
|
-
template: `
|
|
34
|
-
<ds-mobile-card-inline
|
|
35
|
-
[variant]="layout()"
|
|
36
|
-
[disabled]="!clickable()"
|
|
37
|
-
(cardClick)="handleContactClick()">
|
|
38
|
-
|
|
39
|
-
<div content-leading class="item-avatar">
|
|
40
|
-
<ds-avatar
|
|
41
|
-
[initials]="initials()"
|
|
42
|
-
type="initials"
|
|
43
|
-
[size]="layout() === 'compact' ? 'sm' : 'md'"
|
|
44
|
-
/>
|
|
45
|
-
</div>
|
|
46
|
-
|
|
47
|
-
<div content-main class="item-content">
|
|
48
|
-
<div class="item-name">{{ name() }}</div>
|
|
49
|
-
|
|
50
|
-
@if (contactPerson() || phoneNumber()) {
|
|
51
|
-
<div class="item-meta">
|
|
52
|
-
@if (contactPerson()) {
|
|
53
|
-
<span>{{ contactPerson() }}</span>
|
|
54
|
-
}
|
|
55
|
-
@if (contactPerson() && phoneNumber()) {
|
|
56
|
-
<span>·</span>
|
|
57
|
-
}
|
|
58
|
-
@if (phoneNumber()) {
|
|
59
|
-
<span>{{ phoneNumber() }}</span>
|
|
60
|
-
}
|
|
61
|
-
</div>
|
|
62
|
-
}
|
|
63
|
-
</div>
|
|
64
|
-
|
|
65
|
-
@if (showChevron()) {
|
|
66
|
-
<div content-trailing class="item-trailing">
|
|
67
|
-
<ds-icon name="remixArrowRightSLine" size="20px" />
|
|
68
|
-
</div>
|
|
69
|
-
}
|
|
70
|
-
</ds-mobile-card-inline>
|
|
71
|
-
`
|
|
72
|
-
})
|
|
73
|
-
export class DsMobileCardInlineContactComponent {
|
|
74
|
-
/**
|
|
75
|
-
* Contact/company name
|
|
76
|
-
*/
|
|
77
|
-
name = input.required<string>();
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Avatar initials (usually 1-2 letters)
|
|
81
|
-
*/
|
|
82
|
-
initials = input.required<string>();
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Contact person name (optional)
|
|
86
|
-
*/
|
|
87
|
-
contactPerson = input<string>('');
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Phone number (optional)
|
|
91
|
-
*/
|
|
92
|
-
phoneNumber = input<string>('');
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Layout variant
|
|
96
|
-
* - 'default' - Standard padding and column layout
|
|
97
|
-
* - 'compact' - Reduced padding and row layout
|
|
98
|
-
*/
|
|
99
|
-
layout = input<'default' | 'compact'>('default');
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Whether the contact item is clickable
|
|
103
|
-
*/
|
|
104
|
-
clickable = input<boolean>(true);
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Whether to show chevron icon
|
|
108
|
-
*/
|
|
109
|
-
showChevron = input<boolean>(true);
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Emits when the contact item is clicked (if clickable)
|
|
113
|
-
*/
|
|
114
|
-
contactClick = output<void>();
|
|
115
|
-
|
|
116
|
-
handleContactClick(): void {
|
|
117
|
-
this.contactClick.emit();
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { DsMobileCardInlineContactComponent } from './ds-mobile-card-inline-contact';
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { Component, input, output } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { DsAvatarComponent } from '@propbinder/design-system';
|
|
4
|
-
import { DsIconComponent } from '@propbinder/design-system';
|
|
5
|
-
import { DsMobileCardInlineComponent } from '../card-inline';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* DsMobileCardInlineFileComponent
|
|
9
|
-
*
|
|
10
|
-
* File attachment display for various document types.
|
|
11
|
-
* Shows file info card with icon, filename, and file size.
|
|
12
|
-
* Supports PDF and generic document formats.
|
|
13
|
-
* Emits click event to open file in viewer.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```html
|
|
17
|
-
* <ds-mobile-card-inline-file
|
|
18
|
-
* [fileName]="'Document.pdf'"
|
|
19
|
-
* [fileSize]="'1.2 MB'"
|
|
20
|
-
* [variant]="'pdf'"
|
|
21
|
-
* [layout]="'compact'"
|
|
22
|
-
* (fileClick)="openFile()">
|
|
23
|
-
* </ds-mobile-card-inline-file>
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
@Component({
|
|
27
|
-
selector: 'ds-mobile-card-inline-file',
|
|
28
|
-
standalone: true,
|
|
29
|
-
imports: [
|
|
30
|
-
CommonModule,
|
|
31
|
-
DsAvatarComponent,
|
|
32
|
-
DsIconComponent,
|
|
33
|
-
DsMobileCardInlineComponent,
|
|
34
|
-
],
|
|
35
|
-
styles: [
|
|
36
|
-
`
|
|
37
|
-
/* PDF variant - red icon background */
|
|
38
|
-
.item-avatar.pdf ::ng-deep .avatar--icon {
|
|
39
|
-
background-color: #ff5757 !important;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/* Doc variant - blue icon background */
|
|
43
|
-
.item-avatar.doc ::ng-deep .avatar--icon {
|
|
44
|
-
background-color: var(--color-blue-base, #3b82f6) !important;
|
|
45
|
-
}
|
|
46
|
-
`,
|
|
47
|
-
],
|
|
48
|
-
template: `
|
|
49
|
-
<ds-mobile-card-inline [variant]="layout()" (cardClick)="handleClick()">
|
|
50
|
-
<div
|
|
51
|
-
content-leading
|
|
52
|
-
class="item-avatar"
|
|
53
|
-
[class.pdf]="variant() === 'pdf'"
|
|
54
|
-
[class.doc]="variant() === 'doc'"
|
|
55
|
-
>
|
|
56
|
-
<ds-avatar
|
|
57
|
-
type="icon"
|
|
58
|
-
[iconName]="getIconName()"
|
|
59
|
-
[size]="layout() === 'compact' ? 'sm' : 'md'"
|
|
60
|
-
/>
|
|
61
|
-
</div>
|
|
62
|
-
|
|
63
|
-
<div content-main class="item-content">
|
|
64
|
-
<div class="item-name">{{ fileName() }}</div>
|
|
65
|
-
@if (fileSize()) {
|
|
66
|
-
<div class="item-meta">{{ getFileTypeLabel() }} · {{ fileSize() }}</div>
|
|
67
|
-
} @else {
|
|
68
|
-
<div class="item-meta">{{ getFileTypeLabel() }}</div>
|
|
69
|
-
}
|
|
70
|
-
</div>
|
|
71
|
-
|
|
72
|
-
<ds-icon
|
|
73
|
-
content-trailing
|
|
74
|
-
name="remixArrowRightSLine"
|
|
75
|
-
size="20px"
|
|
76
|
-
class="item-trailing"
|
|
77
|
-
/>
|
|
78
|
-
</ds-mobile-card-inline>
|
|
79
|
-
`,
|
|
80
|
-
})
|
|
81
|
-
export class DsMobileCardInlineFileComponent {
|
|
82
|
-
/**
|
|
83
|
-
* File name
|
|
84
|
-
*/
|
|
85
|
-
fileName = input<string>('Document');
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* File size display (e.g., '1.2 MB')
|
|
89
|
-
*/
|
|
90
|
-
fileSize = input<string>('');
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* File type variant
|
|
94
|
-
* - 'pdf' - PDF document (red icon)
|
|
95
|
-
* - 'doc' - Generic document (blue icon)
|
|
96
|
-
*/
|
|
97
|
-
variant = input<'pdf' | 'doc'>('doc');
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Layout variant
|
|
101
|
-
* - 'default' - Standard padding and column layout
|
|
102
|
-
* - 'compact' - Reduced padding and row layout
|
|
103
|
-
*/
|
|
104
|
-
layout = input<'default' | 'compact'>('default');
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Optional URL to open when clicked
|
|
108
|
-
* If provided, clicking the card will open this URL in a new tab
|
|
109
|
-
*/
|
|
110
|
-
fileUrl = input<string | undefined>(undefined);
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Emits when the file attachment is clicked
|
|
114
|
-
*/
|
|
115
|
-
fileClick = output<void>();
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Get the appropriate icon name based on variant
|
|
119
|
-
*/
|
|
120
|
-
getIconName(): string {
|
|
121
|
-
return this.variant() === 'pdf'
|
|
122
|
-
? 'remixFileTextLine'
|
|
123
|
-
: 'remixAttachmentLine';
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Get the file type label based on variant
|
|
128
|
-
*/
|
|
129
|
-
getFileTypeLabel(): string {
|
|
130
|
-
return this.variant() === 'pdf' ? 'PDF' : 'DOC';
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
handleClick(): void {
|
|
134
|
-
const url = this.fileUrl();
|
|
135
|
-
console.log(url);
|
|
136
|
-
if (url) {
|
|
137
|
-
window.open(url, '_blank', 'noopener,noreferrer');
|
|
138
|
-
}
|
|
139
|
-
this.fileClick.emit();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { DsMobileCardInlineFileComponent } from './ds-mobile-card-inline-file';
|