@propbinder/mobile-design 0.2.11 → 0.2.12

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/index.d.ts CHANGED
@@ -5,6 +5,8 @@ import { ImpactStyle } from '@capacitor/haptics';
5
5
  import { DsTextareaComponent } from '@propbinder/design-system';
6
6
  import { ControlValueAccessor } from '@angular/forms';
7
7
  import { Router, ActivatedRoute } from '@angular/router';
8
+ import * as rxjs from 'rxjs';
9
+ import * as _propbinder_mobile_design from '@propbinder/mobile-design';
8
10
  import { Animation } from '@ionic/angular';
9
11
 
10
12
  /**
@@ -1872,7 +1874,7 @@ declare class DsMobileListItemComponent {
1872
1874
  * - 'center' - Align to center
1873
1875
  * - 'bottom' - Align to bottom
1874
1876
  */
1875
- align: _angular_core.InputSignal<"top" | "bottom" | "center">;
1877
+ align: _angular_core.InputSignal<"center" | "top" | "bottom">;
1876
1878
  /**
1877
1879
  * Whether the list item is interactive (clickable and long-pressable)
1878
1880
  * When true, adds interactive background, cursor pointer, and touch handlers
@@ -2041,6 +2043,7 @@ declare class DsMobileListItemStaticComponent {
2041
2043
  * [timestamp]="'2h ago'"
2042
2044
  * [avatarInitials]="'JD'"
2043
2045
  * [clickable]="true"
2046
+ * [enableLongPress]="true"
2044
2047
  * (postClick)="openPost()">
2045
2048
  *
2046
2049
  * <post-content>
@@ -2097,6 +2100,13 @@ declare class DsMobileInteractiveListItemPostComponent {
2097
2100
  * Whether the post card is clickable
2098
2101
  */
2099
2102
  clickable: _angular_core.InputSignal<boolean>;
2103
+ /**
2104
+ * Enable long-press interaction when clickable is true
2105
+ * Set to false to disable long-press but keep click
2106
+ * Also controls visibility of desktop "more" button
2107
+ * @default true
2108
+ */
2109
+ enableLongPress: _angular_core.InputSignal<boolean>;
2100
2110
  /**
2101
2111
  * Emits when the post card is clicked (if clickable)
2102
2112
  */
@@ -2114,7 +2124,7 @@ declare class DsMobileInteractiveListItemPostComponent {
2114
2124
  handleLongPress(): void;
2115
2125
  handleMoreButtonClick(event: Event): void;
2116
2126
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemPostComponent, never>;
2117
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemPostComponent, "ds-mobile-interactive-list-item-post", never, { "authorName": { "alias": "authorName"; "required": true; "isSignal": true; }; "authorRole": { "alias": "authorRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "showBadge": { "alias": "showBadge"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "postClick": "postClick"; "commentClick": "commentClick"; "longPress": "longPress"; }, never, ["post-menu", "post-content", "post-actions"], true, never>;
2127
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemPostComponent, "ds-mobile-interactive-list-item-post", never, { "authorName": { "alias": "authorName"; "required": true; "isSignal": true; }; "authorRole": { "alias": "authorRole"; "required": true; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "avatarType": { "alias": "avatarType"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarIconName": { "alias": "avatarIconName"; "required": false; "isSignal": true; }; "showBadge": { "alias": "showBadge"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "enableLongPress": { "alias": "enableLongPress"; "required": false; "isSignal": true; }; }, { "postClick": "postClick"; "commentClick": "commentClick"; "longPress": "longPress"; }, never, ["post-menu", "post-content", "post-actions"], true, never>;
2118
2128
  }
2119
2129
  /**
2120
2130
  * PostContentComponent
@@ -2262,6 +2272,7 @@ declare class PostPdfAttachmentComponent {
2262
2272
  * [timestamp]="'12 days ago'"
2263
2273
  * [iconName]="'remixCalendarLine'"
2264
2274
  * [clickable]="true"
2275
+ * [enableLongPress]="true"
2265
2276
  * (inquiryClick)="openInquiry()">
2266
2277
  * </ds-mobile-interactive-list-item-inquiry>
2267
2278
  * ```
@@ -2309,6 +2320,13 @@ declare class DsMobileInteractiveListItemInquiryComponent {
2309
2320
  * Whether to show chevron icon
2310
2321
  */
2311
2322
  showChevron: _angular_core.InputSignal<boolean>;
2323
+ /**
2324
+ * Enable long-press interaction when clickable is true
2325
+ * Set to false to disable long-press but keep click
2326
+ * Also controls visibility of desktop "more" button
2327
+ * @default true
2328
+ */
2329
+ enableLongPress: _angular_core.InputSignal<boolean>;
2312
2330
  /**
2313
2331
  * Emits when the inquiry item is clicked (if clickable)
2314
2332
  */
@@ -2325,7 +2343,7 @@ declare class DsMobileInteractiveListItemInquiryComponent {
2325
2343
  handleLongPress(): void;
2326
2344
  handleMoreButtonClick(event: Event): void;
2327
2345
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsMobileInteractiveListItemInquiryComponent, never>;
2328
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemInquiryComponent, "ds-mobile-interactive-list-item-inquiry", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "statusLabel": { "alias": "statusLabel"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; }, { "inquiryClick": "inquiryClick"; "longPress": "longPress"; }, never, never, true, never>;
2346
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsMobileInteractiveListItemInquiryComponent, "ds-mobile-interactive-list-item-inquiry", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "statusLabel": { "alias": "statusLabel"; "required": false; "isSignal": true; }; "timestamp": { "alias": "timestamp"; "required": true; "isSignal": true; }; "iconName": { "alias": "iconName"; "required": false; "isSignal": true; }; "iconColor": { "alias": "iconColor"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; "enableLongPress": { "alias": "enableLongPress"; "required": false; "isSignal": true; }; }, { "inquiryClick": "inquiryClick"; "longPress": "longPress"; }, never, never, true, never>;
2329
2347
  }
2330
2348
 
2331
2349
  /**
@@ -3991,7 +4009,7 @@ declare class DsMobileCardInlineComponent {
3991
4009
  * - 'default' - Column layout with standard padding (gap: 12px, padding: 10px 12px)
3992
4010
  * - 'compact' - Row layout with reduced padding (gap: 8px, padding: 10px)
3993
4011
  */
3994
- variant: _angular_core.InputSignal<"default" | "compact">;
4012
+ variant: _angular_core.InputSignal<"compact" | "default">;
3995
4013
  /**
3996
4014
  * Whether the card is disabled
3997
4015
  * Disables all interactions and reduces opacity
@@ -4054,7 +4072,7 @@ declare class DsMobileCardInlineBannerComponent {
4054
4072
  * - 'default' - Standard padding and column layout
4055
4073
  * - 'compact' - Reduced padding and row layout
4056
4074
  */
4057
- layout: _angular_core.InputSignal<"default" | "compact">;
4075
+ layout: _angular_core.InputSignal<"compact" | "default">;
4058
4076
  /**
4059
4077
  * Emits when the banner is clicked
4060
4078
  */
@@ -4105,7 +4123,7 @@ declare class DsMobileCardInlineContactComponent {
4105
4123
  * - 'default' - Standard padding and column layout
4106
4124
  * - 'compact' - Reduced padding and row layout
4107
4125
  */
4108
- layout: _angular_core.InputSignal<"default" | "compact">;
4126
+ layout: _angular_core.InputSignal<"compact" | "default">;
4109
4127
  /**
4110
4128
  * Whether the contact item is clickable
4111
4129
  */
@@ -4162,7 +4180,7 @@ declare class DsMobileCardInlineFileComponent {
4162
4180
  * - 'default' - Standard padding and column layout
4163
4181
  * - 'compact' - Reduced padding and row layout
4164
4182
  */
4165
- layout: _angular_core.InputSignal<"default" | "compact">;
4183
+ layout: _angular_core.InputSignal<"compact" | "default">;
4166
4184
  /**
4167
4185
  * Optional URL to open when clicked
4168
4186
  * If provided, clicking the card will open this URL in a new tab
@@ -5467,6 +5485,8 @@ declare class UserService {
5467
5485
  readonly avatarType: _angular_core.Signal<"initials" | "photo" | "icon">;
5468
5486
  readonly avatarSrc: _angular_core.Signal<string>;
5469
5487
  readonly profileMenuItems: _angular_core.Signal<ActionGroup[] | undefined>;
5488
+ private profileActionSelectedSubject;
5489
+ readonly profileActionSelected$: rxjs.Observable<ActionResult>;
5470
5490
  /**
5471
5491
  * Update avatar configuration
5472
5492
  */
@@ -5479,6 +5499,10 @@ declare class UserService {
5479
5499
  * if they don't receive profileMenuItems as an input.
5480
5500
  */
5481
5501
  setProfileMenuItems(items: ActionGroup[]): void;
5502
+ /**
5503
+ * Notify subscribers that a profile action was selected
5504
+ */
5505
+ notifyProfileAction(result: ActionResult): void;
5482
5506
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserService, never>;
5483
5507
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<UserService>;
5484
5508
  }
@@ -5592,6 +5616,7 @@ declare class MobileCommunityPageComponent {
5592
5616
  userService: UserService;
5593
5617
  private postsService;
5594
5618
  allPosts: _angular_core.Signal<Post[]>;
5619
+ pinnedPosts: _angular_core.Signal<Post[]>;
5595
5620
  hasAnyPosts: _angular_core.Signal<boolean>;
5596
5621
  hasMorePosts: _angular_core.Signal<boolean>;
5597
5622
  constructor(router: Router, route: ActivatedRoute, bottomSheet: DsMobileBottomSheetService, lightbox: DsMobileLightboxService, postModal: DsMobilePostDetailModalService, userService: UserService, postsService: PostsService);
@@ -5634,13 +5659,25 @@ declare class MobileHandbookPageComponent {
5634
5659
  }
5635
5660
 
5636
5661
  declare class MobileHomePageComponent {
5637
- private navCtrl;
5662
+ private router;
5638
5663
  userService: UserService;
5639
- constructor(navCtrl: NavController, userService: UserService);
5664
+ private postsService;
5665
+ private postModal;
5666
+ recentPosts: _angular_core.Signal<_propbinder_mobile_design.Post[]>;
5667
+ private allInquiries;
5668
+ openInquiries: _angular_core.Signal<{
5669
+ id: string;
5670
+ title: string;
5671
+ description: string;
5672
+ status: "open";
5673
+ timestamp: string;
5674
+ }[]>;
5675
+ constructor(router: Router, userService: UserService, postsService: PostsService, postModal: DsMobilePostDetailModalService);
5640
5676
  handleRefresh(event: any): void;
5641
- handlePostClick(): void;
5642
- handleContactClick(contactType: string): void;
5643
- handleFileClick(fileType: string): void;
5677
+ openPost(postId: string, focusComment?: boolean): Promise<void>;
5678
+ openInquiryDetail(inquiryId: string): void;
5679
+ navigateToCommunity(): void;
5680
+ navigateToInquiries(): void;
5644
5681
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MobileHomePageComponent, never>;
5645
5682
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MobileHomePageComponent, "app-home-page", never, {}, {}, never, never, true, never>;
5646
5683
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@propbinder/mobile-design",
3
- "version": "0.2.11",
3
+ "version": "0.2.12",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.0 || ^21.0.0",
6
6
  "@angular/core": "^20.3.0 || ^21.0.0"
package/styles/ionic.css CHANGED
@@ -834,3 +834,18 @@ ion-app ion-router-outlet.ion-page-hidden {
834
834
 
835
835
  /* Dark mode support removed - modals should not change based on system dark mode */
836
836
 
837
+ /* ============================================
838
+ GLOBAL BUTTON INTERACTIVE STATES
839
+ Consistent button behavior across all ds-button instances
840
+ ============================================ */
841
+
842
+ /* Base transition */
843
+ ds-button .btn {
844
+ transition: all 0.2s ease !important;
845
+ }
846
+
847
+ /* Active/pressed/click state - scale down slightly */
848
+ ds-button .btn:active:not(:disabled) {
849
+ transform: scale(0.98) !important;
850
+ }
851
+
@@ -77,7 +77,7 @@
77
77
 
78
78
  /* Section Headlines */
79
79
  .section-headline {
80
- font-size: var(--font-size-sm);
80
+ font-size: var(--font-size-base);
81
81
  font-weight: 600;
82
82
  color: var(--text-color-default-primary);
83
83
  padding: 16px 0;