@tekus/design-system 5.28.0 → 5.29.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.
Files changed (37) hide show
  1. package/fesm2022/tekus-design-system-components-button.mjs +11 -3
  2. package/fesm2022/tekus-design-system-components-button.mjs.map +1 -1
  3. package/fesm2022/tekus-design-system-components-card.mjs +1 -1
  4. package/fesm2022/tekus-design-system-components-card.mjs.map +1 -1
  5. package/fesm2022/tekus-design-system-components-drawer.mjs +17 -3
  6. package/fesm2022/tekus-design-system-components-drawer.mjs.map +1 -1
  7. package/fesm2022/tekus-design-system-components-dropdown.mjs +13 -3
  8. package/fesm2022/tekus-design-system-components-dropdown.mjs.map +1 -1
  9. package/fesm2022/tekus-design-system-components-fallback-view.mjs +1 -1
  10. package/fesm2022/tekus-design-system-components-fallback-view.mjs.map +1 -1
  11. package/fesm2022/tekus-design-system-components-icon.mjs +15 -1
  12. package/fesm2022/tekus-design-system-components-icon.mjs.map +1 -1
  13. package/fesm2022/tekus-design-system-components-menu.mjs +1 -0
  14. package/fesm2022/tekus-design-system-components-menu.mjs.map +1 -1
  15. package/fesm2022/tekus-design-system-components-message.mjs +2 -2
  16. package/fesm2022/tekus-design-system-components-message.mjs.map +1 -1
  17. package/fesm2022/tekus-design-system-components-modal.mjs +1 -1
  18. package/fesm2022/tekus-design-system-components-modal.mjs.map +1 -1
  19. package/fesm2022/tekus-design-system-components-panel-menu.mjs +1 -0
  20. package/fesm2022/tekus-design-system-components-panel-menu.mjs.map +1 -1
  21. package/fesm2022/tekus-design-system-components-select.mjs +335 -103
  22. package/fesm2022/tekus-design-system-components-select.mjs.map +1 -1
  23. package/fesm2022/tekus-design-system-components-sidebar-layout.mjs +1 -1
  24. package/fesm2022/tekus-design-system-components-sidebar-layout.mjs.map +1 -1
  25. package/fesm2022/tekus-design-system-components-table.mjs +1 -1
  26. package/fesm2022/tekus-design-system-components-table.mjs.map +1 -1
  27. package/fesm2022/tekus-design-system-components-toast.mjs +1 -1
  28. package/fesm2022/tekus-design-system-components-toast.mjs.map +1 -1
  29. package/fesm2022/tekus-design-system-components-toolbar.mjs +1 -1
  30. package/fesm2022/tekus-design-system-components-toolbar.mjs.map +1 -1
  31. package/fesm2022/tekus-design-system-components-topbar.mjs +1 -1
  32. package/fesm2022/tekus-design-system-components-topbar.mjs.map +1 -1
  33. package/package.json +1 -1
  34. package/types/tekus-design-system-components-button.d.ts +9 -1
  35. package/types/tekus-design-system-components-drawer.d.ts +10 -1
  36. package/types/tekus-design-system-components-dropdown.d.ts +11 -1
  37. package/types/tekus-design-system-components-select.d.ts +216 -79
@@ -1 +1 @@
1
- {"version":3,"file":"tekus-design-system-components-topbar.mjs","sources":["../../../projects/design-system/components/topbar/src/topbar.component.ts","../../../projects/design-system/components/topbar/src/topbar.component.html","../../../projects/design-system/components/topbar/tekus-design-system-components-topbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ButtonComponent } from '@tekus/design-system/components/button';\nimport { TagComponent } from '@tekus/design-system/components/tag';\nimport { BreadCrumpsComponent, BreadCrumpItem } from '@tekus/design-system/components/bread-crumps';\nimport { TopbarAction, TopbarTag } from './topbar.types';\n\n/**\n * @component TopbarComponent\n * @description\n * Layout component that renders a title with optional actions and metadata.\n * It composes `tk-button` and `tk-tag` and uses only design tokens for styles.\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'tk-topbar',\n imports: [ButtonComponent, TagComponent, BreadCrumpsComponent],\n templateUrl: './topbar.component.html',\n styleUrl: './topbar.component.scss',\n})\nexport class TopbarComponent {\n /** Main title text for the topbar. */\n title = input.required<string>();\n\n /** Optional list of actions displayed in the header. */\n actions = input<TopbarAction[] | null>(null);\n \n /** Whether to show breadcrumbs instead of a simple title. */\n showBreadcrumbs = input<boolean>(false);\n\n /** Manual breadcrumb items. If not provided and showBreadcrumbs is true, it uses automatic routing. */\n breadcrumbItems = input<BreadCrumpItem[] | null>(null);\n\n /** Size of the breadcrumbs. Can be 'small' or 'large'. Default is 'large' for topbar. */\n breadcrumbSize = input<'small' | 'large'>('large');\n\n /** Optional list of tags displayed in the meta section. */\n tags = input<TopbarTag[] | null>(null);\n\n /** Optional description displayed in the meta section. */\n description = input<string | null>(null);\n}\n","<div class=\"tk-topbar\">\n <div class=\"tk-topbar__header\">\n @if (showBreadcrumbs()) {\n <tk-bread-crumps [items]=\"breadcrumbItems()\" [size]=\"breadcrumbSize()\"></tk-bread-crumps>\n } @else {\n <h2 class=\"tk-topbar__title\">{{ title() }}</h2>\n }\n\n @if (actions()?.length) {\n <div class=\"tk-topbar__actions\">\n @for (action of actions(); track $index) {\n @if (action.type === 'primary') {\n <tk-button\n [label]=\"action.label\"\n severity=\"primary\"\n [tooltipText]=\"action.tooltipText\"\n (clicked)=\"action.onClick()\">\n </tk-button>\n } @else {\n <tk-button\n [icon]=\"action.icon\"\n severity=\"secondary\"\n [tooltipText]=\"action.tooltipText\"\n (clicked)=\"action.onClick()\">\n </tk-button>\n }\n }\n </div>\n }\n </div>\n\n @if (tags()?.length || description()) {\n <div class=\"tk-topbar__meta\">\n @if (tags()?.length) {\n <div class=\"tk-topbar__tags\">\n @for (tag of tags(); track $index) {\n <tk-tag\n [value]=\"tag.label\"\n [severity]=\"tag.variant ?? 'secondary'\"></tk-tag>\n }\n </div>\n }\n @if (description()) {\n <p class=\"tk-topbar__description\">{{ description() }}</p>\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAMA;;;;;AAKG;MAQU,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;;AAGhC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAwB,IAAI,8EAAC;;AAG5C,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,KAAK,sFAAC;;AAGvC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAA0B,IAAI,sFAAC;;AAGtD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAoB,OAAO,qFAAC;;AAGlD,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,2EAAC;;AAGtC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACzC,IAAA;8GArBY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,ogCCnB5B,+0CAgDA,EAAA,MAAA,EAAA,CAAA,+rCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjCY,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,qGAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAIlD,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;sCACS,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,WAAW,EAAA,OAAA,EACZ,CAAC,eAAe,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,+0CAAA,EAAA,MAAA,EAAA,CAAA,+rCAAA,CAAA,EAAA;;;AEfhE;;AAEG;;;;"}
1
+ {"version":3,"file":"tekus-design-system-components-topbar.mjs","sources":["../../../projects/design-system/components/topbar/src/topbar.component.ts","../../../projects/design-system/components/topbar/src/topbar.component.html","../../../projects/design-system/components/topbar/tekus-design-system-components-topbar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ButtonComponent } from '@tekus/design-system/components/button';\nimport { TagComponent } from '@tekus/design-system/components/tag';\nimport { BreadCrumpsComponent, BreadCrumpItem } from '@tekus/design-system/components/bread-crumps';\nimport { TopbarAction, TopbarTag } from './topbar.types';\n\n/**\n * @component TopbarComponent\n * @description\n * Layout component that renders a title with optional actions and metadata.\n * It composes `tk-button` and `tk-tag` and uses only design tokens for styles.\n */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'tk-topbar',\n imports: [ButtonComponent, TagComponent, BreadCrumpsComponent],\n templateUrl: './topbar.component.html',\n styleUrl: './topbar.component.scss',\n})\nexport class TopbarComponent {\n /** Main title text for the topbar. */\n title = input.required<string>();\n\n /** Optional list of actions displayed in the header. */\n actions = input<TopbarAction[] | null>(null);\n \n /** Whether to show breadcrumbs instead of a simple title. */\n showBreadcrumbs = input<boolean>(false);\n\n /** Manual breadcrumb items. If not provided and showBreadcrumbs is true, it uses automatic routing. */\n breadcrumbItems = input<BreadCrumpItem[] | null>(null);\n\n /** Size of the breadcrumbs. Can be 'small' or 'large'. Default is 'large' for topbar. */\n breadcrumbSize = input<'small' | 'large'>('large');\n\n /** Optional list of tags displayed in the meta section. */\n tags = input<TopbarTag[] | null>(null);\n\n /** Optional description displayed in the meta section. */\n description = input<string | null>(null);\n}\n","<div class=\"tk-topbar\">\n <div class=\"tk-topbar__header\">\n @if (showBreadcrumbs()) {\n <tk-bread-crumps [items]=\"breadcrumbItems()\" [size]=\"breadcrumbSize()\"></tk-bread-crumps>\n } @else {\n <h2 class=\"tk-topbar__title\">{{ title() }}</h2>\n }\n\n @if (actions()?.length) {\n <div class=\"tk-topbar__actions\">\n @for (action of actions(); track $index) {\n @if (action.type === 'primary') {\n <tk-button\n [label]=\"action.label\"\n severity=\"primary\"\n [tooltipText]=\"action.tooltipText\"\n (clicked)=\"action.onClick()\">\n </tk-button>\n } @else {\n <tk-button\n [icon]=\"action.icon\"\n severity=\"secondary\"\n [tooltipText]=\"action.tooltipText\"\n (clicked)=\"action.onClick()\">\n </tk-button>\n }\n }\n </div>\n }\n </div>\n\n @if (tags()?.length || description()) {\n <div class=\"tk-topbar__meta\">\n @if (tags()?.length) {\n <div class=\"tk-topbar__tags\">\n @for (tag of tags(); track $index) {\n <tk-tag\n [value]=\"tag.label\"\n [severity]=\"tag.variant ?? 'secondary'\"></tk-tag>\n }\n </div>\n }\n @if (description()) {\n <p class=\"tk-topbar__description\">{{ description() }}</p>\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAMA;;;;;AAKG;MAQU,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;;AAGhC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAwB,IAAI,8EAAC;;AAG5C,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,KAAK,sFAAC;;AAGvC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAA0B,IAAI,sFAAC;;AAGtD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAoB,OAAO,qFAAC;;AAGlD,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,2EAAC;;AAGtC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACzC,IAAA;8GArBY,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,ogCCnB5B,+0CAgDA,EAAA,MAAA,EAAA,CAAA,+rCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjCY,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,cAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,qGAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAIlD,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;sCACS,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,WAAW,EAAA,OAAA,EACZ,CAAC,eAAe,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,+0CAAA,EAAA,MAAA,EAAA,CAAA,+rCAAA,CAAA,EAAA;;;AEfhE;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tekus/design-system",
3
3
  "description": "Tekus design system library",
4
- "version": "5.28.0",
4
+ "version": "5.29.0",
5
5
  "license": "UNLICENSED",
6
6
  "peerDependencies": {
7
7
  "@angular/core": "^21.0.0",
@@ -95,6 +95,14 @@ declare class ButtonComponent {
95
95
  * @default `undefined`
96
96
  */
97
97
  icon: _angular_core.InputSignal<string | undefined>;
98
+ /**
99
+ * @property {'left' | 'right'} iconPosition
100
+ * @description
101
+ * Defines the position of the icon relative to the label.
102
+ *
103
+ * @default `'left'`
104
+ */
105
+ iconPosition: _angular_core.InputSignal<"left" | "right">;
98
106
  /**
99
107
  * @event clicked
100
108
  * @description
@@ -134,7 +142,7 @@ declare class ButtonComponent {
134
142
  */
135
143
  onButtonClick(): void;
136
144
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
137
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "tk-button", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "tooltipText": { "alias": "tooltipText"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
145
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "tk-button", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "tooltipText": { "alias": "tooltipText"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
138
146
  }
139
147
 
140
148
  export { ButtonComponent };
@@ -14,7 +14,10 @@ interface DrawerHeaderAction {
14
14
  }
15
15
  interface DrawerConfig<T = unknown> {
16
16
  title: string;
17
+ tag?: string;
18
+ subtle?: string;
17
19
  content?: string | Type<T>;
20
+ hasTabs?: boolean;
18
21
  headerAction?: DrawerHeaderAction;
19
22
  size?: DrawerSizeType;
20
23
  closable?: boolean;
@@ -70,6 +73,12 @@ declare class DrawerComponent<T = unknown> implements OnDestroy {
70
73
  content: _angular_core.InputSignal<string | Type<T> | null>;
71
74
  /** Optional header action button (displayed before close button) */
72
75
  headerAction: _angular_core.InputSignal<DrawerHeaderAction | null>;
76
+ /** Optional tag displayed below the title */
77
+ tag: _angular_core.InputSignal<string | null>;
78
+ /** Optional subtle text displayed next to the tag */
79
+ subtle: _angular_core.InputSignal<string | null>;
80
+ /** Whether the content includes tabs (affects scroll behavior) */
81
+ hasTabs: _angular_core.InputSignal<boolean>;
73
82
  /** Drawer size: 'small' (500px), 'large' (1024px) */
74
83
  size: _angular_core.InputSignal<DrawerSizeType>;
75
84
  /** Whether the drawer can be closed by the user via close button */
@@ -128,7 +137,7 @@ declare class DrawerComponent<T = unknown> implements OnDestroy {
128
137
  handleHeaderAction(action: (() => void) | undefined, returnValue: unknown): void;
129
138
  private resetClosureState;
130
139
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DrawerComponent<any>, never>;
131
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DrawerComponent<any>, "tk-drawer", never, { "dialogRef": { "alias": "dialogRef"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "content": { "alias": "content"; "required": false; "isSignal": true; }; "headerAction": { "alias": "headerAction"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "interceptor": { "alias": "interceptor"; "required": false; "isSignal": true; }; "isOpened": { "alias": "isOpened"; "required": false; "isSignal": true; }; }, { "isOpened": "isOpenedChange"; "closed": "closed"; }, never, never, true, never>;
140
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DrawerComponent<any>, "tk-drawer", never, { "dialogRef": { "alias": "dialogRef"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "content": { "alias": "content"; "required": false; "isSignal": true; }; "headerAction": { "alias": "headerAction"; "required": false; "isSignal": true; }; "tag": { "alias": "tag"; "required": false; "isSignal": true; }; "subtle": { "alias": "subtle"; "required": false; "isSignal": true; }; "hasTabs": { "alias": "hasTabs"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "interceptor": { "alias": "interceptor"; "required": false; "isSignal": true; }; "isOpened": { "alias": "isOpened"; "required": false; "isSignal": true; }; }, { "isOpened": "isOpenedChange"; "closed": "closed"; }, never, never, true, never>;
132
141
  }
133
142
 
134
143
  declare class DrawerService {
@@ -29,6 +29,16 @@ declare class DropdownComponent {
29
29
  * @default 'ellipsis-vertical'
30
30
  */
31
31
  icon: _angular_core.InputSignal<string>;
32
+ /**
33
+ * Text for the trigger button.
34
+ * If provided, it will be displayed alongside the icon (if any).
35
+ */
36
+ label: _angular_core.InputSignal<string | undefined>;
37
+ /**
38
+ * Position of the icon relative to the label.
39
+ * @default 'left'
40
+ */
41
+ iconPosition: _angular_core.InputSignal<"left" | "right">;
32
42
  /**
33
43
  * Size of the trigger button.
34
44
  * @default undefined
@@ -53,7 +63,7 @@ declare class DropdownComponent {
53
63
  */
54
64
  onItemClick(): void;
55
65
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownComponent, never>;
56
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "tk-dropdown", never, { "model": { "alias": "model"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
66
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "tk-dropdown", never, { "model": { "alias": "model"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
57
67
  }
58
68
 
59
69
  export { DropdownComponent };
@@ -1,155 +1,292 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { OnDestroy, OnInit } from '@angular/core';
2
3
  import { ControlValueAccessor, NgControl, FormControl } from '@angular/forms';
4
+ import { Select } from 'primeng/select';
5
+ import { Observable } from 'rxjs';
3
6
 
4
- declare class SelectComponent<T = unknown> implements ControlValueAccessor {
7
+ /**
8
+ * Standard request object for fetching data from an asynchronous source.
9
+ * Aligned with PrimeNG LazyLoadEvent patterns.
10
+ */
11
+ interface TkSelectRequest {
12
+ filter: string;
13
+ page: number;
14
+ pageSize: number;
15
+ sortField?: string;
16
+ sortOrder?: number;
17
+ params?: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Interface representing the data source for the Select manager.
21
+ */
22
+ interface SelectDataSource<T> {
23
+ fetch(request: TkSelectRequest): Observable<T[]>;
24
+ }
25
+ declare class TkSelectManager<T> {
26
+ /**
27
+ * Reactive signal for the current search query.
28
+ */
29
+ searchQuery: _angular_core.WritableSignal<string>;
30
+ /**
31
+ * Reactive signal for the current pagination page.
32
+ */
33
+ page: _angular_core.WritableSignal<number>;
34
+ /**
35
+ * Data source provider for fetching items.
36
+ */
37
+ dataSource: SelectDataSource<T> | undefined;
38
+ /**
39
+ * Additional parameters to send to the data source.
40
+ */
41
+ fetchParams: _angular_core.WritableSignal<Record<string, unknown>>;
42
+ /**
43
+ * Sorting field.
44
+ */
45
+ sortField: _angular_core.WritableSignal<string | undefined>;
46
+ /**
47
+ * Sorting order (1 for ASC, -1 for DESC).
48
+ */
49
+ sortOrder: _angular_core.WritableSignal<number | undefined>;
50
+ /**
51
+ * Reactive signal indicating if data is currently being fetched.
52
+ */
53
+ loading: _angular_core.WritableSignal<boolean>;
54
+ /**
55
+ * Reactive signal indicating if there are more items to fetch.
56
+ */
57
+ hasMore: _angular_core.WritableSignal<boolean>;
58
+ /**
59
+ * Number of items per page to detect the end of data.
60
+ */
61
+ pageSize: number;
62
+ /**
63
+ * Final accumulated list of items exposed as a Signal.
64
+ */
65
+ items: _angular_core.Signal<T[]>;
66
+ /**
67
+ * Updates the search query and resets pagination.
68
+ * @param query - The new search string.
69
+ */
70
+ updateSearch(query: string): void;
71
+ /**
72
+ * Increments the page to trigger the next data chunk.
73
+ */
74
+ loadNextPage(): void;
75
+ /**
76
+ * Configures the data provider for the manager.
77
+ * @param provider - Object implementing the SelectDataSource interface.
78
+ */
79
+ setDataSource(provider: SelectDataSource<T>): void;
80
+ /**
81
+ * Updates additional fetch parameters and resets pagination.
82
+ * @param params - The new parameters object.
83
+ */
84
+ updateParams(params: Record<string, unknown>): void;
85
+ /**
86
+ * Resets the manager state to its initial values.
87
+ */
88
+ reset(): void;
89
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TkSelectManager<any>, never>;
90
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TkSelectManager<any>>;
91
+ }
92
+
93
+ declare class SelectComponent<T = unknown> implements ControlValueAccessor, OnDestroy {
5
94
  readonly ngControl: NgControl | null;
95
+ readonly manager: TkSelectManager<any>;
96
+ /** PrimeNG Select instance */
97
+ readonly selectComponent: _angular_core.Signal<Select | undefined>;
98
+ /** Final reactive list of items */
6
99
  /**
7
- * @property {string} id
8
- * @description
9
- * HTML id attribute for the multiselect input.
10
- *
100
+ * HTML id attribute for the select input.
11
101
  * @default 'select'
12
102
  */
13
103
  id: _angular_core.InputSignal<string>;
14
104
  /**
15
- * @property {InputSignal<FormControl>} control
16
- * @description
17
105
  * External FormControl used to read/set the input value.
18
- * If not provided, an internal FormControl is created.
19
106
  */
20
107
  control: _angular_core.InputSignal<FormControl<any> | undefined>;
21
108
  /**
22
- * @property {T[]} options
23
- * @description
24
- * Array of available options displayed in the dropdown.
109
+ * Static options for synchronous mode.
110
+ * If provided, they take precedence over the manager's async stream.
25
111
  */
26
112
  options: _angular_core.InputSignal<T[]>;
27
113
  /**
28
- * @property {string} optionLabel
29
- * @description
114
+ * Data source for asynchronous infinite scroll mode.
115
+ */
116
+ dataSource: _angular_core.ModelSignal<SelectDataSource<T> | undefined>;
117
+ /**
30
118
  * Name of the property used to display the text of each option.
31
- *
32
119
  * @default 'label'
33
120
  */
34
121
  optionLabel: _angular_core.InputSignal<string>;
35
122
  /**
36
- * @property {string} label
37
- * @description
38
123
  * Floating label displayed above the select input.
39
124
  */
40
125
  label: _angular_core.InputSignal<string>;
41
126
  /**
42
- * @property {boolean} showClear
43
- * @description
44
127
  * Enables the clear button to remove the current selection.
45
- *
46
128
  * @default true
47
129
  */
48
130
  showClear: _angular_core.InputSignal<boolean>;
49
131
  /**
50
- * @property {T | null} value
51
- * @description
52
- * Internal selected value. Synced with Angular forms and the model signal.
53
- *
54
- * @internal
55
- */
56
- value: T | null;
57
- /**
58
- * @property {boolean} disabled
59
- * @description
60
132
  * Determines whether the select field is disabled.
61
- *
62
133
  * @default false
63
134
  */
64
135
  disabled: _angular_core.InputSignal<boolean>;
65
- internalDisabled: _angular_core.WritableSignal<boolean>;
66
136
  /**
67
- * @property {InputSignal<string>} errorMessage
68
- * @description
69
137
  * Message to display when the control is invalid and touched.
70
138
  */
71
139
  errorMessage: _angular_core.InputSignal<string>;
72
140
  /**
73
- * @property {InputSignal<string>} hint
74
- * @description
75
141
  * Hint text to display below the input.
76
142
  */
77
143
  hint: _angular_core.InputSignal<string>;
78
144
  /**
79
- * @property {Signal<T | null>} model
80
- * @description
145
+ * Enables filtering/search input.
146
+ * @default false
147
+ */
148
+ filter: _angular_core.InputSignal<boolean>;
149
+ /**
150
+ * Placeholder text displayed when no value is selected.
151
+ * @default 'Select an option'
152
+ */
153
+ placeholder: _angular_core.InputSignal<string>;
154
+ /**
155
+ * Loading state for the dropdown.
156
+ */
157
+ loading: _angular_core.InputSignal<boolean>;
158
+ /**
159
+ * Additional parameters for the async data source.
160
+ * Useful for sending context like categoryId, parentId, etc.
161
+ */
162
+ fetchParams: _angular_core.InputSignal<Record<string, unknown>>;
163
+ /**
164
+ * Field name to sort by in the async data source.
165
+ */
166
+ sortField: _angular_core.InputSignal<string | undefined>;
167
+ /**
168
+ * Order to sort by (1 for ASC, -1 for DESC).
169
+ */
170
+ sortOrder: _angular_core.InputSignal<number | undefined>;
171
+ /**
172
+ * Internal writable signal for the disabled state.
173
+ */
174
+ internalDisabled: _angular_core.WritableSignal<boolean>;
175
+ /**
81
176
  * Two-way binding model using Angular signals.
82
- * Allows usage with the syntax: `[(model)]="myValue"`.
177
+ * This is the single source of truth for the selected value.
178
+ */
179
+ model: _angular_core.ModelSignal<T | null>;
180
+ /**
181
+ * Text to display when there are no options.
83
182
  */
84
- model: _angular_core.ModelSignal<T | null | undefined>;
183
+ emptyMessage: _angular_core.InputSignal<string>;
184
+ /**
185
+ * Text to display when no results match the filter.
186
+ */
187
+ emptyFilterMessage: _angular_core.InputSignal<string>;
85
188
  /**
86
- * @event modelChange
87
- * @description
88
189
  * Emits whenever the value changes.
89
- * Payload: the selected item of type `T` or `null`.
90
- *
91
- * @example
92
- * <tk-select (modelChange)="onChange($event)"></tk-select>
93
190
  */
94
191
  modelChange: _angular_core.OutputEmitterRef<T | null>;
95
- private onChangeFn;
96
- private onTouchedFn;
97
- private readonly init;
98
192
  /**
99
- * @effect disabled → internalDisabled
100
- * @description
101
- * Synchronizes the disabled input signal with the internal disabled state.
193
+ * Emits the filter search term.
102
194
  */
103
- private readonly syncDisabled;
195
+ filterChange: _angular_core.OutputEmitterRef<{
196
+ filter: string | null;
197
+ }>;
198
+ private onChangeFn;
199
+ private onTouchedFn;
200
+ private scrollHandler;
201
+ private lastListContainer;
202
+ constructor();
104
203
  /**
105
- * @effect model → internal value
106
- * @description
107
- * Synchronizes changes coming from the Signal `model()` back into the internal value.
108
- * Ensures consistency between Angular Forms, PrimeNG UI events, and Signals.
204
+ * Displays the items from the manager if provided, otherwise the static options.
205
+ * Includes a "Ghost Option" logic to ensure the selected item is always visible
206
+ * even if it's not in the current loaded chunk of data.
109
207
  */
110
- private readonly syncModel;
208
+ get items(): T[];
111
209
  /**
112
- * @method writeValue
113
- * @description
114
- * Receives value updates from Angular Forms and writes them into the component.
115
- *
116
- * @param {T | null} value - New value from the forms API.
210
+ * Receives value updates from Angular Forms API.
211
+ * @param value - New value from the forms API.
117
212
  */
118
213
  writeValue(value: T | null): void;
119
214
  /**
120
- * @method registerOnChange
121
- * @description
122
215
  * Registers a callback that is invoked when the component's value changes.
216
+ * @param fn - The callback function.
123
217
  */
124
218
  registerOnChange(fn: (value: T | null) => void): void;
125
219
  /**
126
- * @method registerOnTouched
127
- * @description
128
220
  * Registers a callback invoked when the component is touched.
221
+ * @param fn - The callback function.
129
222
  */
130
223
  registerOnTouched(fn: () => void): void;
131
224
  /**
132
- * @method setDisabledState
133
- * @description
134
- * Updates the disabled state of the select control.
135
- *
136
- * @param {boolean} isDisabled - Whether the component should be disabled.
225
+ * Updates the disabled state of the control.
226
+ * @param isDisabled - Whether the component should be disabled.
137
227
  */
138
228
  setDisabledState(isDisabled: boolean): void;
139
229
  /**
140
- * @method handleChange
141
- * @description
142
- * Handles the selection event emitted by the PrimeNG Select component.
143
- * Updates Angular Forms, Signals, and emits the modelChange event.
144
- *
145
- * @param event - Event containing the `value` of the selected option.
230
+ * Handles UI changes from the PrimeNG Select.
231
+ * @param event - Event containing the selected value.
146
232
  */
147
233
  handleChange(event: {
148
234
  value: T | null;
149
235
  }): void;
236
+ /**
237
+ * Handles filter input changes and notifies the manager.
238
+ * @param event - Filter event containing the search term.
239
+ */
240
+ handleFilter(event: {
241
+ filter: string | null;
242
+ }): void;
243
+ /**
244
+ * Returns the underlying FormControl for validation state checking.
245
+ */
150
246
  get effectiveControl(): FormControl | null;
247
+ /**
248
+ * Adds a scroll listener to the PrimeNG select list container when the panel opens.
249
+ */
250
+ onPanelShow(): void;
251
+ /**
252
+ * Cleans up state, removes listeners and resets the manager when the panel closes.
253
+ */
254
+ onPanelHide(): void;
255
+ /**
256
+ * Cleans up listeners on component destruction.
257
+ */
258
+ ngOnDestroy(): void;
259
+ /**
260
+ * Safely removes the scroll event listener.
261
+ */
262
+ private removeScrollListener;
263
+ /**
264
+ * Detects if the user has reached the bottom of the list.
265
+ */
266
+ private handleScroll;
151
267
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent<any>, never>;
152
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tk-select", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "modelChange": "modelChange"; }, never, never, true, never>;
268
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tk-select", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fetchParams": { "alias": "fetchParams"; "required": false; "isSignal": true; }; "sortField": { "alias": "sortField"; "required": false; "isSignal": true; }; "sortOrder": { "alias": "sortOrder"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyFilterMessage": { "alias": "emptyFilterMessage"; "required": false; "isSignal": true; }; }, { "dataSource": "dataSourceChange"; "model": "modelChange"; "modelChange": "modelChange"; "filterChange": "filterChange"; }, never, never, true, never>;
269
+ }
270
+
271
+ declare class IntersectionDirective implements OnInit, OnDestroy {
272
+ /**
273
+ * Emits when the element enters the viewport.
274
+ */
275
+ intersect: _angular_core.OutputEmitterRef<void>;
276
+ private readonly element;
277
+ private observer?;
278
+ constructor();
279
+ /**
280
+ * Initializes the Intersection Observer on component mount.
281
+ */
282
+ ngOnInit(): void;
283
+ /**
284
+ * Cleans up the observer to prevent memory leaks.
285
+ */
286
+ ngOnDestroy(): void;
287
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IntersectionDirective, never>;
288
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<IntersectionDirective, "[tkIntersection]", never, {}, { "intersect": "intersect"; }, never, never, true, never>;
153
289
  }
154
290
 
155
- export { SelectComponent };
291
+ export { IntersectionDirective, SelectComponent, TkSelectManager };
292
+ export type { SelectDataSource, TkSelectRequest };