@life-cockpit/angular-ui-kit 1.4.0 → 1.6.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@life-cockpit/angular-ui-kit",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "Life Cockpit Design System - Angular UI component library",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -208,6 +208,26 @@ interface NavigationItem {
208
208
  * Children are displayed beneath it with the label as a group title.
209
209
  */
210
210
  isSection?: boolean;
211
+ /**
212
+ * Optional action button displayed on the right side of the item.
213
+ * Emits `itemAction` when clicked (e.g. to open a modal or context menu).
214
+ */
215
+ action?: {
216
+ /** Icon name from lc-icons library (e.g., 'plus', 'ellipsis-horizontal') */
217
+ icon: string;
218
+ /** Accessible label for the action button */
219
+ ariaLabel?: string;
220
+ };
221
+ /**
222
+ * Optional badge displayed on the right side of the item (e.g. count).
223
+ * Rendered as a small pill badge.
224
+ */
225
+ badge?: {
226
+ /** Text or number to display inside the badge */
227
+ value: string | number;
228
+ /** Badge color variant */
229
+ variant?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';
230
+ };
211
231
  }
212
232
 
213
233
  /**
@@ -310,7 +330,7 @@ declare class CardComponent {
310
330
  * Badge color variant.
311
331
  * @default 'default'
312
332
  */
313
- badgeVariant: _angular_core.InputSignal<"error" | "primary" | "warning" | "default" | "success">;
333
+ badgeVariant: _angular_core.InputSignal<"default" | "primary" | "success" | "warning" | "error">;
314
334
  /**
315
335
  * Visual variant of the card
316
336
  * - elevated: Box shadow (default)
@@ -902,7 +922,7 @@ declare class TypographyComponent {
902
922
  * Text color using semantic color tokens
903
923
  * @default 'primary'
904
924
  */
905
- color: _angular_core.InputSignal<"error" | "primary" | "secondary" | "warning" | "info" | "success" | "disabled">;
925
+ color: _angular_core.InputSignal<"primary" | "success" | "warning" | "error" | "info" | "secondary" | "disabled">;
906
926
  /**
907
927
  * Font weight
908
928
  * @default 'regular'
@@ -2833,6 +2853,12 @@ declare class HeaderComponent {
2833
2853
  * Logo image source URL
2834
2854
  */
2835
2855
  logo: string;
2856
+ /**
2857
+ * Whether to show the logo in the header.
2858
+ * Set to false when the sidenav owns the logo (sidebar-first layout).
2859
+ * @default true
2860
+ */
2861
+ showLogo: boolean;
2836
2862
  /**
2837
2863
  * Optional title to display next to logo
2838
2864
  */
@@ -2940,7 +2966,7 @@ declare class HeaderComponent {
2940
2966
  */
2941
2967
  onMenuItemClick(item: MenuItem): void;
2942
2968
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HeaderComponent, never>;
2943
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderComponent, "lc-header", never, { "theme": { "alias": "theme"; "required": false; }; "logo": { "alias": "logo"; "required": false; }; "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "userEmail": { "alias": "userEmail"; "required": false; }; "userName": { "alias": "userName"; "required": false; }; "showHamburger": { "alias": "showHamburger"; "required": false; }; "showThemeButton": { "alias": "showThemeButton"; "required": false; }; "contextName": { "alias": "contextName"; "required": false; }; "contextLabel": { "alias": "contextLabel"; "required": false; }; "menuSize": { "alias": "menuSize"; "required": false; }; "showProfileMenuItem": { "alias": "showProfileMenuItem"; "required": false; }; }, { "hamburgerClick": "hamburgerClick"; "themeToggleClick": "themeToggleClick"; "logoutClick": "logoutClick"; "profileClick": "profileClick"; "contextClick": "contextClick"; }, never, never, true, never>;
2969
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HeaderComponent, "lc-header", never, { "theme": { "alias": "theme"; "required": false; }; "logo": { "alias": "logo"; "required": false; }; "showLogo": { "alias": "showLogo"; "required": false; }; "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "userEmail": { "alias": "userEmail"; "required": false; }; "userName": { "alias": "userName"; "required": false; }; "showHamburger": { "alias": "showHamburger"; "required": false; }; "showThemeButton": { "alias": "showThemeButton"; "required": false; }; "contextName": { "alias": "contextName"; "required": false; }; "contextLabel": { "alias": "contextLabel"; "required": false; }; "menuSize": { "alias": "menuSize"; "required": false; }; "showProfileMenuItem": { "alias": "showProfileMenuItem"; "required": false; }; }, { "hamburgerClick": "hamburgerClick"; "themeToggleClick": "themeToggleClick"; "logoutClick": "logoutClick"; "profileClick": "profileClick"; "contextClick": "contextClick"; }, never, never, true, never>;
2944
2970
  }
2945
2971
 
2946
2972
  type PaginationSize = 'sm' | 'md' | 'lg';
@@ -3025,13 +3051,23 @@ type SidenavMode = 'drawer' | 'docked';
3025
3051
  * (closed)="isOpen = false" (itemClicked)="navigate($event)" />
3026
3052
  * ```
3027
3053
  */
3028
- declare class SidenavComponent {
3054
+ declare class SidenavComponent implements OnInit, OnDestroy {
3029
3055
  /** Whether the sidenav is collapsed to icon-only rail */
3030
3056
  collapsed: _angular_core.WritableSignal<boolean>;
3057
+ /** Whether to show the logo at the top of the sidenav */
3058
+ showLogo: _angular_core.WritableSignal<boolean>;
3031
3059
  /** Whether the sidenav is open */
3032
3060
  isOpen: _angular_core.WritableSignal<boolean>;
3033
3061
  /** Display mode: 'drawer' (overlay) or 'docked' (persistent sidebar) */
3034
3062
  mode: _angular_core.WritableSignal<SidenavMode>;
3063
+ /** Mobile breakpoint in pixels. Below this width, docked mode switches to drawer. */
3064
+ mobileBreakpoint: _angular_core.WritableSignal<number>;
3065
+ /** Whether the viewport is below the mobile breakpoint */
3066
+ isMobile: _angular_core.WritableSignal<boolean>;
3067
+ /** Effective mode: switches docked → drawer on mobile */
3068
+ effectiveMode: _angular_core.Signal<SidenavMode>;
3069
+ private mediaQuery;
3070
+ private mediaHandler;
3035
3071
  /** Position of the sidenav (left or right) */
3036
3072
  position: _angular_core.WritableSignal<SidenavPosition>;
3037
3073
  /** Width of the sidenav drawer */
@@ -3086,6 +3122,14 @@ declare class SidenavComponent {
3086
3122
  * Input setter for collapsed
3087
3123
  */
3088
3124
  set collapsedInput(value: boolean);
3125
+ /**
3126
+ * Input setter for showLogo
3127
+ */
3128
+ set showLogoInput(value: boolean);
3129
+ /**
3130
+ * Input setter for mobileBreakpoint
3131
+ */
3132
+ set mobileBreakpointInput(value: number);
3089
3133
  /** Theme variant for the sidenav */
3090
3134
  themeMode: _angular_core.WritableSignal<"light" | "dark" | "auto">;
3091
3135
  /**
@@ -3100,6 +3144,14 @@ declare class SidenavComponent {
3100
3144
  * Event emitted when a navigation item is clicked
3101
3145
  */
3102
3146
  readonly itemClicked: EventEmitter<NavigationItem>;
3147
+ /**
3148
+ * Event emitted when an item's action button is clicked
3149
+ */
3150
+ readonly itemAction: EventEmitter<NavigationItem>;
3151
+ ngOnInit(): void;
3152
+ ngOnDestroy(): void;
3153
+ private setupMediaQuery;
3154
+ private teardownMediaQuery;
3103
3155
  /**
3104
3156
  * Computed CSS classes for the sidenav
3105
3157
  */
@@ -3122,6 +3174,10 @@ declare class SidenavComponent {
3122
3174
  * Handle navigation item click
3123
3175
  */
3124
3176
  handleItemClick(item: NavigationItem): void;
3177
+ /**
3178
+ * Handle action button click on a navigation item
3179
+ */
3180
+ handleItemAction(event: Event, item: NavigationItem): void;
3125
3181
  /**
3126
3182
  * Check if an item is active
3127
3183
  */
@@ -3131,7 +3187,8 @@ declare class SidenavComponent {
3131
3187
  */
3132
3188
  hasActiveChild(item: NavigationItem): boolean;
3133
3189
  /**
3134
- * Toggle expansion of a parent item
3190
+ * Toggle expansion of a parent item.
3191
+ * If the sidenav is collapsed, expand it first.
3135
3192
  */
3136
3193
  toggleExpanded(item: NavigationItem): void;
3137
3194
  /**
@@ -3143,7 +3200,7 @@ declare class SidenavComponent {
3143
3200
  */
3144
3201
  handleKeydown(event: KeyboardEvent): void;
3145
3202
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidenavComponent, never>;
3146
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidenavComponent, "lc-sidenav", never, { "isOpenInput": { "alias": "isOpenInput"; "required": false; }; "modeInput": { "alias": "modeInput"; "required": false; }; "positionInput": { "alias": "positionInput"; "required": false; }; "widthInput": { "alias": "widthInput"; "required": false; }; "ariaLabelInput": { "alias": "ariaLabelInput"; "required": false; }; "hasOverlayInput": { "alias": "hasOverlayInput"; "required": false; }; "itemsInput": { "alias": "itemsInput"; "required": false; }; "activeRouteInput": { "alias": "activeRouteInput"; "required": false; }; "collapsedInput": { "alias": "collapsedInput"; "required": false; }; "themeInput": { "alias": "theme"; "required": false; }; }, { "closed": "closed"; "itemClicked": "itemClicked"; }, never, ["*"], true, never>;
3203
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidenavComponent, "lc-sidenav", never, { "isOpenInput": { "alias": "isOpenInput"; "required": false; }; "modeInput": { "alias": "modeInput"; "required": false; }; "positionInput": { "alias": "positionInput"; "required": false; }; "widthInput": { "alias": "widthInput"; "required": false; }; "ariaLabelInput": { "alias": "ariaLabelInput"; "required": false; }; "hasOverlayInput": { "alias": "hasOverlayInput"; "required": false; }; "itemsInput": { "alias": "itemsInput"; "required": false; }; "activeRouteInput": { "alias": "activeRouteInput"; "required": false; }; "collapsedInput": { "alias": "collapsedInput"; "required": false; }; "showLogoInput": { "alias": "showLogoInput"; "required": false; }; "mobileBreakpointInput": { "alias": "mobileBreakpointInput"; "required": false; }; "themeInput": { "alias": "theme"; "required": false; }; }, { "closed": "closed"; "itemClicked": "itemClicked"; "itemAction": "itemAction"; }, never, ["*"], true, never>;
3147
3204
  }
3148
3205
 
3149
3206
  type TabOrientation = 'horizontal' | 'vertical';
@@ -6272,7 +6329,7 @@ declare class ConfirmDialogComponent {
6272
6329
  /** Resolved icon color */
6273
6330
  protected iconColor: _angular_core.Signal<"var(--color-error-default, #ef4444)" | "var(--color-warning-default, #f59e0b)" | "var(--color-primary-600, #2563eb)">;
6274
6331
  /** Confirm button variant */
6275
- protected confirmButtonVariant: _angular_core.Signal<"primary" | "danger" | "warning">;
6332
+ protected confirmButtonVariant: _angular_core.Signal<"primary" | "warning" | "danger">;
6276
6333
  /** Whether confirm is allowed (text match check) */
6277
6334
  protected confirmAllowed: _angular_core.Signal<boolean>;
6278
6335
  constructor();