@ngbase/adk 0.1.16 → 0.1.18

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 (203) hide show
  1. package/fesm2022/ngbase-adk-a11y.mjs +42 -42
  2. package/fesm2022/ngbase-adk-a11y.mjs.map +1 -1
  3. package/fesm2022/ngbase-adk-accordion.mjs +20 -26
  4. package/fesm2022/ngbase-adk-accordion.mjs.map +1 -1
  5. package/fesm2022/ngbase-adk-autocomplete.mjs +11 -11
  6. package/fesm2022/ngbase-adk-autocomplete.mjs.map +1 -1
  7. package/fesm2022/ngbase-adk-avatar.mjs +13 -13
  8. package/fesm2022/ngbase-adk-avatar.mjs.map +1 -1
  9. package/fesm2022/ngbase-adk-bidi.mjs +3 -3
  10. package/fesm2022/ngbase-adk-bidi.mjs.map +1 -1
  11. package/fesm2022/ngbase-adk-breadcrumb.mjs +14 -14
  12. package/fesm2022/ngbase-adk-breadcrumb.mjs.map +1 -1
  13. package/fesm2022/ngbase-adk-cache.mjs +3 -3
  14. package/fesm2022/ngbase-adk-cache.mjs.map +1 -1
  15. package/fesm2022/ngbase-adk-carousel.mjs +18 -18
  16. package/fesm2022/ngbase-adk-carousel.mjs.map +1 -1
  17. package/fesm2022/ngbase-adk-checkbox.mjs +15 -21
  18. package/fesm2022/ngbase-adk-checkbox.mjs.map +1 -1
  19. package/fesm2022/ngbase-adk-chip.mjs +12 -12
  20. package/fesm2022/ngbase-adk-chip.mjs.map +1 -1
  21. package/fesm2022/ngbase-adk-clipboard.mjs +7 -5
  22. package/fesm2022/ngbase-adk-clipboard.mjs.map +1 -1
  23. package/fesm2022/ngbase-adk-collections.mjs.map +1 -1
  24. package/fesm2022/ngbase-adk-color-picker.mjs +44 -53
  25. package/fesm2022/ngbase-adk-color-picker.mjs.map +1 -1
  26. package/fesm2022/ngbase-adk-cookies.mjs +3 -3
  27. package/fesm2022/ngbase-adk-cookies.mjs.map +1 -1
  28. package/fesm2022/ngbase-adk-datepicker.mjs +70 -89
  29. package/fesm2022/ngbase-adk-datepicker.mjs.map +1 -1
  30. package/fesm2022/ngbase-adk-dialog.mjs +17 -39
  31. package/fesm2022/ngbase-adk-dialog.mjs.map +1 -1
  32. package/fesm2022/ngbase-adk-drag.mjs +20 -20
  33. package/fesm2022/ngbase-adk-drag.mjs.map +1 -1
  34. package/fesm2022/ngbase-adk-form-field.mjs +65 -118
  35. package/fesm2022/ngbase-adk-form-field.mjs.map +1 -1
  36. package/fesm2022/ngbase-adk-hover-card.mjs +5 -5
  37. package/fesm2022/ngbase-adk-hover-card.mjs.map +1 -1
  38. package/fesm2022/ngbase-adk-icon.mjs +9 -11
  39. package/fesm2022/ngbase-adk-icon.mjs.map +1 -1
  40. package/fesm2022/ngbase-adk-inline-edit.mjs +27 -35
  41. package/fesm2022/ngbase-adk-inline-edit.mjs.map +1 -1
  42. package/fesm2022/ngbase-adk-jwt.mjs +319 -41
  43. package/fesm2022/ngbase-adk-jwt.mjs.map +1 -1
  44. package/fesm2022/ngbase-adk-keys.mjs +6 -6
  45. package/fesm2022/ngbase-adk-keys.mjs.map +1 -1
  46. package/fesm2022/ngbase-adk-layout.mjs.map +1 -1
  47. package/fesm2022/ngbase-adk-list.mjs +10 -10
  48. package/fesm2022/ngbase-adk-list.mjs.map +1 -1
  49. package/fesm2022/ngbase-adk-mask.mjs +8 -8
  50. package/fesm2022/ngbase-adk-mask.mjs.map +1 -1
  51. package/fesm2022/ngbase-adk-menu.mjs +69 -79
  52. package/fesm2022/ngbase-adk-menu.mjs.map +1 -1
  53. package/fesm2022/ngbase-adk-network.mjs +3 -3
  54. package/fesm2022/ngbase-adk-network.mjs.map +1 -1
  55. package/fesm2022/ngbase-adk-otp.mjs +24 -45
  56. package/fesm2022/ngbase-adk-otp.mjs.map +1 -1
  57. package/fesm2022/ngbase-adk-pagination.mjs +9 -9
  58. package/fesm2022/ngbase-adk-pagination.mjs.map +1 -1
  59. package/fesm2022/ngbase-adk-popover.mjs +120 -89
  60. package/fesm2022/ngbase-adk-popover.mjs.map +1 -1
  61. package/fesm2022/ngbase-adk-portal.mjs +134 -47
  62. package/fesm2022/ngbase-adk-portal.mjs.map +1 -1
  63. package/fesm2022/ngbase-adk-progress.mjs +7 -7
  64. package/fesm2022/ngbase-adk-progress.mjs.map +1 -1
  65. package/fesm2022/ngbase-adk-radio.mjs +20 -27
  66. package/fesm2022/ngbase-adk-radio.mjs.map +1 -1
  67. package/fesm2022/ngbase-adk-resizable.mjs +138 -48
  68. package/fesm2022/ngbase-adk-resizable.mjs.map +1 -1
  69. package/fesm2022/ngbase-adk-scroll-area.mjs +28 -20
  70. package/fesm2022/ngbase-adk-scroll-area.mjs.map +1 -1
  71. package/fesm2022/ngbase-adk-select.mjs +58 -80
  72. package/fesm2022/ngbase-adk-select.mjs.map +1 -1
  73. package/fesm2022/ngbase-adk-selectable.mjs +19 -30
  74. package/fesm2022/ngbase-adk-selectable.mjs.map +1 -1
  75. package/fesm2022/ngbase-adk-sheet.mjs +6 -20
  76. package/fesm2022/ngbase-adk-sheet.mjs.map +1 -1
  77. package/fesm2022/ngbase-adk-sidenav.mjs +65 -46
  78. package/fesm2022/ngbase-adk-sidenav.mjs.map +1 -1
  79. package/fesm2022/ngbase-adk-slider.mjs +40 -53
  80. package/fesm2022/ngbase-adk-slider.mjs.map +1 -1
  81. package/fesm2022/ngbase-adk-sonner.mjs +12 -19
  82. package/fesm2022/ngbase-adk-sonner.mjs.map +1 -1
  83. package/fesm2022/ngbase-adk-stepper.mjs +17 -25
  84. package/fesm2022/ngbase-adk-stepper.mjs.map +1 -1
  85. package/fesm2022/ngbase-adk-switch.mjs +25 -32
  86. package/fesm2022/ngbase-adk-switch.mjs.map +1 -1
  87. package/fesm2022/ngbase-adk-table.mjs +581 -83
  88. package/fesm2022/ngbase-adk-table.mjs.map +1 -1
  89. package/fesm2022/ngbase-adk-tabs.mjs +37 -35
  90. package/fesm2022/ngbase-adk-tabs.mjs.map +1 -1
  91. package/fesm2022/ngbase-adk-test.mjs.map +1 -1
  92. package/fesm2022/ngbase-adk-toggle-group.mjs +20 -34
  93. package/fesm2022/ngbase-adk-toggle-group.mjs.map +1 -1
  94. package/fesm2022/ngbase-adk-toggle.mjs +14 -19
  95. package/fesm2022/ngbase-adk-toggle.mjs.map +1 -1
  96. package/fesm2022/ngbase-adk-tooltip.mjs +12 -19
  97. package/fesm2022/ngbase-adk-tooltip.mjs.map +1 -1
  98. package/fesm2022/ngbase-adk-tour.mjs +52 -52
  99. package/fesm2022/ngbase-adk-tour.mjs.map +1 -1
  100. package/fesm2022/ngbase-adk-translate.mjs +8 -10
  101. package/fesm2022/ngbase-adk-translate.mjs.map +1 -1
  102. package/fesm2022/ngbase-adk-tree.mjs +20 -20
  103. package/fesm2022/ngbase-adk-tree.mjs.map +1 -1
  104. package/fesm2022/ngbase-adk-utils.mjs +30 -43
  105. package/fesm2022/ngbase-adk-utils.mjs.map +1 -1
  106. package/fesm2022/ngbase-adk-virtualizer.mjs +9 -9
  107. package/fesm2022/ngbase-adk-virtualizer.mjs.map +1 -1
  108. package/package.json +91 -91
  109. package/schematics/components/files/accordion/accordion.ts.template +9 -6
  110. package/schematics/components/files/audio/AudioPlayer.ts.template +245 -0
  111. package/schematics/components/files/audio/AudioRecorder.ts.template +377 -0
  112. package/schematics/components/files/audio/AudioVisualizer.ts.template +175 -0
  113. package/schematics/components/files/audio/index.ts.template +3 -0
  114. package/schematics/components/files/button/button-llm.md.template +3 -2
  115. package/schematics/components/files/charts/area-chart.component.ts.template +278 -0
  116. package/schematics/components/files/charts/bar-chart.component.ts.template +262 -0
  117. package/schematics/components/files/charts/chart-tooltip.component.ts.template +168 -0
  118. package/schematics/components/files/charts/index.ts.template +4 -0
  119. package/schematics/components/files/charts/line-chart.component.ts.template +238 -0
  120. package/schematics/components/files/charts/pie-chart.component.ts.template +283 -0
  121. package/schematics/components/files/checkbox/checkbox.ts.template +2 -2
  122. package/schematics/components/files/color-picker/color-picker.ts.template +2 -2
  123. package/schematics/components/files/dialog/dialog.ts.template +18 -14
  124. package/schematics/components/files/drawer/drawer.ts.template +30 -27
  125. package/schematics/components/files/form-field/form-field.ts.template +51 -23
  126. package/schematics/components/files/pagination/pagination.ts.template +4 -4
  127. package/schematics/components/files/picasa/picasa-base.component.ts.template +15 -30
  128. package/schematics/components/files/popover/popover.ts.template +15 -4
  129. package/schematics/components/files/select/list-selection.ts.template +0 -2
  130. package/schematics/components/files/select/option.ts.template +1 -1
  131. package/schematics/components/files/selectable/selectable.ts.template +2 -2
  132. package/schematics/components/files/sheet/sheet.ts.template +26 -14
  133. package/schematics/components/files/sidenav/sidenav.ts.template +7 -5
  134. package/schematics/components/files/sonner/sonner.ts.template +1 -2
  135. package/schematics/components/files/stepper/stepper.ts.template +2 -4
  136. package/schematics/components/files/switch/switch.ts.template +2 -2
  137. package/schematics/components/files/table/table.ts.template +43 -3
  138. package/schematics/components/files/tabs/tab.ts.template +3 -3
  139. package/schematics/components/files/theme/theme.service.ts.template +3 -3
  140. package/schematics/components/files/toggle/toggle.ts.template +1 -1
  141. package/schematics/components/files/toggle-group/toggle-group.ts.template +1 -1
  142. package/schematics/components/files/tooltip/tooltip.ts.template +2 -3
  143. package/schematics/components/schema.json +2 -0
  144. package/{accordion/index.d.ts → types/ngbase-adk-accordion.d.ts} +1 -3
  145. package/{autocomplete/index.d.ts → types/ngbase-adk-autocomplete.d.ts} +2 -7
  146. package/{checkbox/index.d.ts → types/ngbase-adk-checkbox.d.ts} +8 -14
  147. package/types/ngbase-adk-clipboard.d.ts +12 -0
  148. package/{color-picker/index.d.ts → types/ngbase-adk-color-picker.d.ts} +14 -26
  149. package/{datepicker/index.d.ts → types/ngbase-adk-datepicker.d.ts} +9 -18
  150. package/{dialog/index.d.ts → types/ngbase-adk-dialog.d.ts} +3 -8
  151. package/types/ngbase-adk-form-field.d.ts +88 -0
  152. package/{inline-edit/index.d.ts → types/ngbase-adk-inline-edit.d.ts} +8 -16
  153. package/types/ngbase-adk-jwt.d.ts +64 -0
  154. package/{menu/index.d.ts → types/ngbase-adk-menu.d.ts} +6 -5
  155. package/{otp/index.d.ts → types/ngbase-adk-otp.d.ts} +8 -16
  156. package/{popover/index.d.ts → types/ngbase-adk-popover.d.ts} +14 -2
  157. package/{portal/index.d.ts → types/ngbase-adk-portal.d.ts} +29 -8
  158. package/{radio/index.d.ts → types/ngbase-adk-radio.d.ts} +9 -12
  159. package/{resizable/index.d.ts → types/ngbase-adk-resizable.d.ts} +4 -4
  160. package/{scroll-area/index.d.ts → types/ngbase-adk-scroll-area.d.ts} +2 -1
  161. package/{select/index.d.ts → types/ngbase-adk-select.d.ts} +8 -22
  162. package/{selectable/index.d.ts → types/ngbase-adk-selectable.d.ts} +6 -10
  163. package/{sheet/index.d.ts → types/ngbase-adk-sheet.d.ts} +4 -3
  164. package/{sidenav/index.d.ts → types/ngbase-adk-sidenav.d.ts} +6 -6
  165. package/{slider/index.d.ts → types/ngbase-adk-slider.d.ts} +8 -17
  166. package/{sonner/index.d.ts → types/ngbase-adk-sonner.d.ts} +1 -3
  167. package/{stepper/index.d.ts → types/ngbase-adk-stepper.d.ts} +1 -4
  168. package/{switch/index.d.ts → types/ngbase-adk-switch.d.ts} +7 -14
  169. package/{table/index.d.ts → types/ngbase-adk-table.d.ts} +126 -3
  170. package/{test/index.d.ts → types/ngbase-adk-test.d.ts} +1 -1
  171. package/{toggle-group/index.d.ts → types/ngbase-adk-toggle-group.d.ts} +5 -10
  172. package/types/ngbase-adk-toggle.d.ts +14 -0
  173. package/{tooltip/index.d.ts → types/ngbase-adk-tooltip.d.ts} +9 -11
  174. package/{tour/index.d.ts → types/ngbase-adk-tour.d.ts} +4 -6
  175. package/{utils/index.d.ts → types/ngbase-adk-utils.d.ts} +15 -11
  176. package/clipboard/index.d.ts +0 -11
  177. package/form-field/index.d.ts +0 -97
  178. package/jwt/index.d.ts +0 -20
  179. package/toggle/index.d.ts +0 -16
  180. /package/{a11y/index.d.ts → types/ngbase-adk-a11y.d.ts} +0 -0
  181. /package/{avatar/index.d.ts → types/ngbase-adk-avatar.d.ts} +0 -0
  182. /package/{bidi/index.d.ts → types/ngbase-adk-bidi.d.ts} +0 -0
  183. /package/{breadcrumb/index.d.ts → types/ngbase-adk-breadcrumb.d.ts} +0 -0
  184. /package/{cache/index.d.ts → types/ngbase-adk-cache.d.ts} +0 -0
  185. /package/{carousel/index.d.ts → types/ngbase-adk-carousel.d.ts} +0 -0
  186. /package/{chip/index.d.ts → types/ngbase-adk-chip.d.ts} +0 -0
  187. /package/{collections/index.d.ts → types/ngbase-adk-collections.d.ts} +0 -0
  188. /package/{cookies/index.d.ts → types/ngbase-adk-cookies.d.ts} +0 -0
  189. /package/{drag/index.d.ts → types/ngbase-adk-drag.d.ts} +0 -0
  190. /package/{hover-card/index.d.ts → types/ngbase-adk-hover-card.d.ts} +0 -0
  191. /package/{icon/index.d.ts → types/ngbase-adk-icon.d.ts} +0 -0
  192. /package/{keys/index.d.ts → types/ngbase-adk-keys.d.ts} +0 -0
  193. /package/{layout/index.d.ts → types/ngbase-adk-layout.d.ts} +0 -0
  194. /package/{list/index.d.ts → types/ngbase-adk-list.d.ts} +0 -0
  195. /package/{mask/index.d.ts → types/ngbase-adk-mask.d.ts} +0 -0
  196. /package/{network/index.d.ts → types/ngbase-adk-network.d.ts} +0 -0
  197. /package/{pagination/index.d.ts → types/ngbase-adk-pagination.d.ts} +0 -0
  198. /package/{progress/index.d.ts → types/ngbase-adk-progress.d.ts} +0 -0
  199. /package/{tabs/index.d.ts → types/ngbase-adk-tabs.d.ts} +0 -0
  200. /package/{translate/index.d.ts → types/ngbase-adk-translate.d.ts} +0 -0
  201. /package/{tree/index.d.ts → types/ngbase-adk-tree.d.ts} +0 -0
  202. /package/{virtualizer/index.d.ts → types/ngbase-adk-virtualizer.d.ts} +0 -0
  203. /package/{index.d.ts → types/ngbase-adk.d.ts} +0 -0
@@ -11,7 +11,7 @@ class NgbList {
11
11
  this.el = inject(ElementRef);
12
12
  // Inputs
13
13
  this.ayId = input(...(ngDevMode ? [undefined, { debugName: "ayId" }] : []));
14
- this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
14
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
15
15
  this.allyItem._ayId = linkedSignal(this.ayId);
16
16
  }
17
17
  setAyId(id) {
@@ -27,10 +27,10 @@ class NgbList {
27
27
  unselect() {
28
28
  this.el.nativeElement.classList.remove('bg-muted');
29
29
  }
30
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbList, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
31
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbList, isStandalone: true, selector: "[ngbList]", inputs: { ayId: { classPropertyName: "ayId", publicName: "ayId", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "list" } }, hostDirectives: [{ directive: i1.AccessibleItem, inputs: ["role", "role", "disabled", "disabled"] }], ngImport: i0 }); }
30
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbList, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
31
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgbList, isStandalone: true, selector: "[ngbList]", inputs: { ayId: { classPropertyName: "ayId", publicName: "ayId", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "list" } }, hostDirectives: [{ directive: i1.AccessibleItem, inputs: ["role", "role", "disabled", "disabled"] }], ngImport: i0 }); }
32
32
  }
33
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbList, decorators: [{
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbList, decorators: [{
34
34
  type: Directive,
35
35
  args: [{
36
36
  selector: '[ngbList]',
@@ -39,7 +39,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
39
39
  role: 'list',
40
40
  },
41
41
  }]
42
- }], ctorParameters: () => [] });
42
+ }], ctorParameters: () => [], propDecorators: { ayId: [{ type: i0.Input, args: [{ isSignal: true, alias: "ayId", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
43
43
  function provideList(list) {
44
44
  return {
45
45
  provide: NgbList,
@@ -49,7 +49,7 @@ function provideList(list) {
49
49
 
50
50
  class NgbListActionGroup {
51
51
  constructor() {
52
- this.options = contentChildren(NgbList, ...(ngDevMode ? [{ debugName: "options", descendants: true }] : [{ descendants: true }]));
52
+ this.options = contentChildren(NgbList, { ...(ngDevMode ? { debugName: "options" } : {}), descendants: true });
53
53
  this.activeIndex = signal(undefined, ...(ngDevMode ? [{ debugName: "activeIndex" }] : []));
54
54
  this.optionsMap = new WeakMap();
55
55
  this.handleKeyDown = (event) => {
@@ -87,15 +87,15 @@ class NgbListActionGroup {
87
87
  lastIndex?.unselect();
88
88
  option?.focus();
89
89
  }
90
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbListActionGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
91
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.2.0", type: NgbListActionGroup, isStandalone: true, selector: "[ngbActionGroup]", queries: [{ propertyName: "options", predicate: NgbList, descendants: true, isSignal: true }], ngImport: i0 }); }
90
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbListActionGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
91
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: NgbListActionGroup, isStandalone: true, selector: "[ngbActionGroup]", queries: [{ propertyName: "options", predicate: NgbList, descendants: true, isSignal: true }], ngImport: i0 }); }
92
92
  }
93
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbListActionGroup, decorators: [{
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbListActionGroup, decorators: [{
94
94
  type: Directive,
95
95
  args: [{
96
96
  selector: '[ngbActionGroup]',
97
97
  }]
98
- }], ctorParameters: () => [] });
98
+ }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgbList), { ...{ descendants: true }, isSignal: true }] }] } });
99
99
 
100
100
  /*
101
101
  * Public API Surface of list
@@ -1 +1 @@
1
- {"version":3,"file":"ngbase-adk-list.mjs","sources":["../../../projects/adk/list/list.ts","../../../projects/adk/list/list.directive.ts","../../../projects/adk/list/public-api.ts","../../../projects/adk/list/ngbase-adk-list.ts"],"sourcesContent":["import {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n input,\n linkedSignal,\n WritableSignal,\n} from '@angular/core';\nimport { AccessibleItem } from '@ngbase/adk/a11y';\n\n@Directive({\n selector: '[ngbList]',\n hostDirectives: [{ directive: AccessibleItem, inputs: ['role', 'disabled'] }],\n host: {\n role: 'list',\n },\n})\nexport class NgbList {\n // Dependencies\n private readonly allyItem = inject(AccessibleItem);\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Inputs\n readonly ayId = input<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n\n constructor() {\n this.allyItem._ayId = linkedSignal(this.ayId) as WritableSignal<string>;\n }\n\n setAyId(id: string) {\n this.allyItem._ayId.set(id);\n }\n\n select() {\n this.el.nativeElement.click();\n }\n\n focus() {\n this.el.nativeElement.scrollIntoView({ block: 'nearest' });\n this.el.nativeElement.classList.add('bg-muted');\n }\n\n unselect() {\n this.el.nativeElement.classList.remove('bg-muted');\n }\n}\n\nexport function provideList(list: typeof NgbList) {\n return {\n provide: NgbList,\n useExisting: list,\n };\n}\n","import {\n Directive,\n afterNextRender,\n contentChildren,\n effect,\n signal,\n untracked,\n} from '@angular/core';\nimport { documentListener } from '@ngbase/adk/utils';\nimport { NgbList } from './list';\n\n@Directive({\n selector: '[ngbActionGroup]',\n})\nexport class NgbListActionGroup {\n readonly options = contentChildren(NgbList, { descendants: true });\n\n private readonly activeIndex = signal<NgbList | undefined>(undefined);\n private readonly optionsMap = new WeakMap<NgbList, number>();\n\n constructor() {\n documentListener('keydown', this.handleKeyDown);\n afterNextRender(() => this.afterAction());\n\n effect(() => {\n const options = this.options();\n options.forEach((x, i) => this.optionsMap.set(x, i));\n untracked(() => {\n const lastIndex = this.activeIndex();\n this.activeIndex.set(options[0]);\n this.afterAction(lastIndex);\n });\n });\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n const options = this.options();\n const lastIndex = this.activeIndex();\n const i = this.optionsMap.get(this.activeIndex() || options[0])!;\n if (event.key === 'ArrowDown') {\n this.activeIndex.set(options[Math.min(i + 1, options.length - 1)]);\n } else if (event.key === 'ArrowUp') {\n this.activeIndex.set(options[Math.max(i - 1, 0)]);\n } else if (event.key === 'Enter') {\n lastIndex?.select();\n }\n if (lastIndex !== this.activeIndex()) {\n event.preventDefault();\n this.afterAction(lastIndex);\n }\n };\n\n private afterAction(lastIndex?: NgbList) {\n const option = this.activeIndex();\n lastIndex?.unselect();\n option?.focus();\n }\n}\n","/*\n * Public API Surface of list\n */\n\nexport * from './list';\nexport * from './list.directive';\n// export * from './list-selection.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;MAkBa,OAAO,CAAA;AASlB,IAAA,WAAA,GAAA;;AAPiB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACzC,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAA0B,UAAU,CAAC;;QAGhD,IAAI,CAAA,IAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;QAG/D,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAA2B;;AAGzE,IAAA,OAAO,CAAC,EAAU,EAAA;QAChB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;;IAG7B,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;;IAG/B,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;IAGjD,QAAQ,GAAA;QACN,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;;8GA3BzC,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAP,OAAO,EAAA,UAAA,EAAA,CAAA;kBAPnB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;AAC7E,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,MAAM;AACb,qBAAA;AACF,iBAAA;;AAgCK,SAAU,WAAW,CAAC,IAAoB,EAAA;IAC9C,OAAO;AACL,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,WAAW,EAAE,IAAI;KAClB;AACH;;MCxCa,kBAAkB,CAAA;AAM7B,IAAA,WAAA,GAAA;AALS,QAAA,IAAA,CAAA,OAAO,GAAG,eAAe,CAAC,OAAO,2CAAI,WAAW,EAAE,IAAI,EAAA,CAAA,GAAA,CAAnB,EAAE,WAAW,EAAE,IAAI,EAAE,GAAC;AAEjD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAsB,SAAS,uDAAC;AACpD,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,OAAO,EAAmB;AAiBpD,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAoB,KAAI;AAC/C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;AACpC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,CAAE;AAChE,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;gBAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;AAC7D,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;AAClC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;AAC5C,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBAChC,SAAS,EAAE,MAAM,EAAE;;AAErB,YAAA,IAAI,SAAS,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;gBACpC,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;;AAE/B,SAAC;AA7BC,QAAA,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;QAC/C,eAAe,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpD,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;gBACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAChC,gBAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAC7B,aAAC,CAAC;AACJ,SAAC,CAAC;;AAoBI,IAAA,WAAW,CAAC,SAAmB,EAAA;AACrC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;QACjC,SAAS,EAAE,QAAQ,EAAE;QACrB,MAAM,EAAE,KAAK,EAAE;;8GAzCN,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,oGACM,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAD/B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA;;;ACbD;;AAEG;AAIH;;ACNA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngbase-adk-list.mjs","sources":["../../../projects/adk/list/list.ts","../../../projects/adk/list/list.directive.ts","../../../projects/adk/list/public-api.ts","../../../projects/adk/list/ngbase-adk-list.ts"],"sourcesContent":["import {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n input,\n linkedSignal,\n WritableSignal,\n} from '@angular/core';\nimport { AccessibleItem } from '@ngbase/adk/a11y';\n\n@Directive({\n selector: '[ngbList]',\n hostDirectives: [{ directive: AccessibleItem, inputs: ['role', 'disabled'] }],\n host: {\n role: 'list',\n },\n})\nexport class NgbList {\n // Dependencies\n private readonly allyItem = inject(AccessibleItem);\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Inputs\n readonly ayId = input<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n\n constructor() {\n this.allyItem._ayId = linkedSignal(this.ayId) as WritableSignal<string>;\n }\n\n setAyId(id: string) {\n this.allyItem._ayId.set(id);\n }\n\n select() {\n this.el.nativeElement.click();\n }\n\n focus() {\n this.el.nativeElement.scrollIntoView({ block: 'nearest' });\n this.el.nativeElement.classList.add('bg-muted');\n }\n\n unselect() {\n this.el.nativeElement.classList.remove('bg-muted');\n }\n}\n\nexport function provideList(list: typeof NgbList) {\n return {\n provide: NgbList,\n useExisting: list,\n };\n}\n","import {\n Directive,\n afterNextRender,\n contentChildren,\n effect,\n signal,\n untracked,\n} from '@angular/core';\nimport { documentListener } from '@ngbase/adk/utils';\nimport { NgbList } from './list';\n\n@Directive({\n selector: '[ngbActionGroup]',\n})\nexport class NgbListActionGroup {\n readonly options = contentChildren(NgbList, { descendants: true });\n\n private readonly activeIndex = signal<NgbList | undefined>(undefined);\n private readonly optionsMap = new WeakMap<NgbList, number>();\n\n constructor() {\n documentListener('keydown', this.handleKeyDown);\n afterNextRender(() => this.afterAction());\n\n effect(() => {\n const options = this.options();\n options.forEach((x, i) => this.optionsMap.set(x, i));\n untracked(() => {\n const lastIndex = this.activeIndex();\n this.activeIndex.set(options[0]);\n this.afterAction(lastIndex);\n });\n });\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n const options = this.options();\n const lastIndex = this.activeIndex();\n const i = this.optionsMap.get(this.activeIndex() || options[0])!;\n if (event.key === 'ArrowDown') {\n this.activeIndex.set(options[Math.min(i + 1, options.length - 1)]);\n } else if (event.key === 'ArrowUp') {\n this.activeIndex.set(options[Math.max(i - 1, 0)]);\n } else if (event.key === 'Enter') {\n lastIndex?.select();\n }\n if (lastIndex !== this.activeIndex()) {\n event.preventDefault();\n this.afterAction(lastIndex);\n }\n };\n\n private afterAction(lastIndex?: NgbList) {\n const option = this.activeIndex();\n lastIndex?.unselect();\n option?.focus();\n }\n}\n","/*\n * Public API Surface of list\n */\n\nexport * from './list';\nexport * from './list.directive';\n// export * from './list-selection.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ class Mask {
16
16
  // Inputs
17
17
  this.ngbMask = input('', ...(ngDevMode ? [{ debugName: "ngbMask" }] : []));
18
18
  this.showMaskType = input(false, ...(ngDevMode ? [{ debugName: "showMaskType" }] : []));
19
- this.localValue = linkedSignal(() => this.inputC.value() ?? '');
19
+ this.localValue = linkedSignal(() => this.inputC.value() ?? '', ...(ngDevMode ? [{ debugName: "localValue" }] : []));
20
20
  afterRenderEffect(() => {
21
21
  const mask = this.ngbMask();
22
22
  const value = this.localValue();
@@ -148,10 +148,10 @@ class Mask {
148
148
  }
149
149
  return unmaskedValue;
150
150
  }
151
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: Mask, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
152
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: Mask, isStandalone: true, selector: "[ngbMask]", inputs: { ngbMask: { classPropertyName: "ngbMask", publicName: "ngbMask", isSignal: true, isRequired: false, transformFunction: null }, showMaskType: { classPropertyName: "showMaskType", publicName: "showMaskType", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "onKeyDown($event)", "paste": "onPaste($event)" } }, ngImport: i0 }); }
151
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: Mask, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
152
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: Mask, isStandalone: true, selector: "[ngbMask]", inputs: { ngbMask: { classPropertyName: "ngbMask", publicName: "ngbMask", isSignal: true, isRequired: false, transformFunction: null }, showMaskType: { classPropertyName: "showMaskType", publicName: "showMaskType", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "onKeyDown($event)", "paste": "onPaste($event)" } }, ngImport: i0 }); }
153
153
  }
154
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: Mask, decorators: [{
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: Mask, decorators: [{
155
155
  type: Directive,
156
156
  args: [{
157
157
  selector: '[ngbMask]',
@@ -160,7 +160,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
160
160
  '(paste)': 'onPaste($event)',
161
161
  },
162
162
  }]
163
- }], ctorParameters: () => [] });
163
+ }], ctorParameters: () => [], propDecorators: { ngbMask: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngbMask", required: false }] }], showMaskType: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMaskType", required: false }] }] } });
164
164
  function maskTransform(value, mask, showMaskType = false) {
165
165
  let result = '';
166
166
  let valueIndex = 0;
@@ -218,10 +218,10 @@ class MaskPipe {
218
218
  transform(value, mask) {
219
219
  return maskTransform(value, mask);
220
220
  }
221
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: MaskPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
222
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.2.0", ngImport: i0, type: MaskPipe, isStandalone: true, name: "mask" }); }
221
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MaskPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
222
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.1.0", ngImport: i0, type: MaskPipe, isStandalone: true, name: "mask" }); }
223
223
  }
224
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: MaskPipe, decorators: [{
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MaskPipe, decorators: [{
225
225
  type: Pipe,
226
226
  args: [{
227
227
  name: 'mask',
@@ -1 +1 @@
1
- {"version":3,"file":"ngbase-adk-mask.mjs","sources":["../../../projects/adk/mask/mask.ts","../../../projects/adk/mask/mask-pipe.ts","../../../projects/adk/mask/ngbase-adk-mask.ts"],"sourcesContent":["import {\n afterRenderEffect,\n Directive,\n ElementRef,\n inject,\n input,\n linkedSignal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { InputBase } from '@ngbase/adk/form-field';\n\n@Directive({\n selector: '[ngbMask]',\n host: {\n '(keydown)': 'onKeyDown($event)',\n '(paste)': 'onPaste($event)',\n },\n})\nexport class Mask {\n // Dependencies\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly control = inject(NgControl, { optional: true });\n private readonly inputC = inject(InputBase);\n\n // Inputs\n readonly ngbMask = input<string>('');\n readonly showMaskType = input(false);\n\n readonly localValue = linkedSignal(() => (this.inputC.value() as string) ?? '');\n // private lastValue = '';\n\n constructor() {\n // this.control?.valueChanges?.subscribe(value => {\n // if (value !== this.lastValue) this.handleValue(value);\n // });\n\n afterRenderEffect(() => {\n const mask = this.ngbMask();\n const value = this.localValue();\n this.el.nativeElement.value = this.updateView(value, mask);\n });\n }\n\n onKeyDown(event: KeyboardEvent): void {\n // console.log('onKeyDown', event);\n const input = event.target as HTMLInputElement;\n const keyCode = event.key;\n\n // Allow navigation keys\n if (\n [\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n 'Tab',\n 'Backspace',\n 'Delete',\n 'Shift',\n 'Meta',\n 'Control',\n 'Alt',\n 'Escape',\n 'CapsLock',\n ].includes(keyCode)\n ) {\n return;\n }\n\n // allow selecting all text\n if (keyCode === 'a' && (event.metaKey || event.ctrlKey)) {\n return;\n }\n\n event.preventDefault();\n const cursorPos = input.selectionStart || 0;\n const key = event.key;\n\n // Get the current value and mask\n const currentValue = input.value;\n const mask = this.ngbMask();\n\n // Check if the key matches the mask at current position\n if (this.isValidChar(key, this.getCurrentMaskChar(mask, cursorPos))) {\n // Insert the character at cursor position\n const newValue =\n currentValue.substring(0, cursorPos) + key + currentValue.substring(cursorPos);\n\n this.handleValue(newValue, cursorPos);\n }\n }\n\n getCurrentMaskChar(mask: string, cursorPos: number): string {\n // we only have to check cursor position and have to skip non-mask characters\n for (let i = cursorPos; i < mask.length; i++) {\n if (mask[i] !== '#' && mask[i] !== 'a' && mask[i] !== '*') {\n continue;\n }\n return mask[i];\n }\n return '';\n }\n\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const input = event.target as HTMLInputElement;\n const cursorPos = input.selectionStart || 0;\n const pastedText = event.clipboardData?.getData('text') || '';\n\n const currentValue = input.value;\n const beforeCursor = currentValue.substring(0, cursorPos);\n const afterCursor = currentValue.substring(cursorPos);\n\n const newValue = beforeCursor + pastedText + afterCursor;\n this.handleValue(newValue, cursorPos);\n }\n\n private isValidChar(char: string, maskChar: string): boolean {\n switch (maskChar) {\n case '#':\n return /\\d/.test(char);\n case 'a':\n return /[a-zA-Z]/.test(char);\n case '*':\n return /[a-zA-Z0-9]/.test(char);\n default:\n return char === maskChar;\n }\n }\n\n handleValue(value: string, cursorPos?: number) {\n // Apply mask and update view\n const maskedValue = this.updateView(value);\n // Update actualValue\n const actualValue = this.unmask(maskedValue);\n\n this.updateLocalValue(actualValue, actualValue !== value);\n\n // Set cursor position after update\n // if (cursorPos !== undefined) {\n // setTimeout(() => {\n // const newPos = this.calculateCursorPosition(maskedValue, cursorPos);\n // this.el.nativeElement.setSelectionRange(newPos, newPos);\n // });\n // }\n }\n\n private calculateCursorPosition(maskedValue: string, oldPos: number): number {\n const mask = this.ngbMask();\n let newPos = oldPos;\n\n // Move cursor past any fixed mask characters\n while (newPos < mask.length && !'#a*'.includes(mask[newPos])) {\n newPos++;\n }\n\n return Math.min(newPos, maskedValue.length);\n }\n\n private updateLocalValue(value: string, emit = true) {\n this.inputC.setValue(value);\n // this.lastValue = value;\n this.localValue.set(value);\n if (emit) this.control?.control?.setValue(value);\n }\n\n writeValue(value: string): void {\n this.handleValue(value);\n }\n\n private updateView(value: string, mask = this.ngbMask()): string {\n return maskTransform(value, mask);\n }\n\n private unmask(value: string): string {\n const mask = this.ngbMask();\n let unmaskedValue = '';\n let valueIndex = 0;\n\n for (let maskIndex = 0; maskIndex < mask.length && valueIndex < value.length; maskIndex++) {\n const maskChar = mask[maskIndex];\n const valueChar = value[valueIndex];\n\n if ('#a*'.includes(maskChar)) {\n unmaskedValue += valueChar;\n valueIndex++;\n } else if (maskChar === valueChar) {\n valueIndex++;\n }\n }\n\n return unmaskedValue;\n }\n}\n\nexport function maskTransform(value: string, mask: string, showMaskType = false): string {\n let result = '';\n let valueIndex = 0;\n\n for (let maskIndex = 0; maskIndex < mask.length && valueIndex < value.length; maskIndex++) {\n const maskChar = mask[maskIndex];\n const valueChar = value[valueIndex];\n\n switch (maskChar) {\n case '#':\n if (/\\d/.test(valueChar)) {\n result += valueChar;\n valueIndex++;\n } else if (showMaskType) {\n result += '_';\n } else {\n return result;\n }\n break;\n case 'a':\n if (/[a-zA-Z]/.test(valueChar)) {\n result += valueChar;\n valueIndex++;\n } else if (showMaskType) {\n result += '_';\n } else {\n return result;\n }\n break;\n case '*':\n if (/[a-zA-Z0-9]/.test(valueChar)) {\n result += valueChar;\n valueIndex++;\n } else if (showMaskType) {\n result += '_';\n } else {\n return result;\n }\n break;\n default:\n result += maskChar;\n if (maskChar === valueChar && valueIndex === maskIndex) {\n valueIndex++;\n }\n }\n }\n\n return result;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { maskTransform } from './mask';\n\n@Pipe({\n name: 'mask',\n})\nexport class MaskPipe implements PipeTransform {\n transform(value: string, mask: string): string {\n return maskTransform(value, mask);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngbase-adk-mask.mjs","sources":["../../../projects/adk/mask/mask.ts","../../../projects/adk/mask/mask-pipe.ts","../../../projects/adk/mask/ngbase-adk-mask.ts"],"sourcesContent":["import {\n afterRenderEffect,\n Directive,\n ElementRef,\n inject,\n input,\n linkedSignal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { InputBase } from '@ngbase/adk/form-field';\n\n@Directive({\n selector: '[ngbMask]',\n host: {\n '(keydown)': 'onKeyDown($event)',\n '(paste)': 'onPaste($event)',\n },\n})\nexport class Mask {\n // Dependencies\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef);\n readonly control = inject(NgControl, { optional: true });\n private readonly inputC = inject(InputBase);\n\n // Inputs\n readonly ngbMask = input<string>('');\n readonly showMaskType = input(false);\n\n readonly localValue = linkedSignal(() => (this.inputC.value() as string) ?? '');\n // private lastValue = '';\n\n constructor() {\n // this.control?.valueChanges?.subscribe(value => {\n // if (value !== this.lastValue) this.handleValue(value);\n // });\n\n afterRenderEffect(() => {\n const mask = this.ngbMask();\n const value = this.localValue();\n this.el.nativeElement.value = this.updateView(value, mask);\n });\n }\n\n onKeyDown(event: KeyboardEvent): void {\n // console.log('onKeyDown', event);\n const input = event.target as HTMLInputElement;\n const keyCode = event.key;\n\n // Allow navigation keys\n if (\n [\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n 'Tab',\n 'Backspace',\n 'Delete',\n 'Shift',\n 'Meta',\n 'Control',\n 'Alt',\n 'Escape',\n 'CapsLock',\n ].includes(keyCode)\n ) {\n return;\n }\n\n // allow selecting all text\n if (keyCode === 'a' && (event.metaKey || event.ctrlKey)) {\n return;\n }\n\n event.preventDefault();\n const cursorPos = input.selectionStart || 0;\n const key = event.key;\n\n // Get the current value and mask\n const currentValue = input.value;\n const mask = this.ngbMask();\n\n // Check if the key matches the mask at current position\n if (this.isValidChar(key, this.getCurrentMaskChar(mask, cursorPos))) {\n // Insert the character at cursor position\n const newValue =\n currentValue.substring(0, cursorPos) + key + currentValue.substring(cursorPos);\n\n this.handleValue(newValue, cursorPos);\n }\n }\n\n getCurrentMaskChar(mask: string, cursorPos: number): string {\n // we only have to check cursor position and have to skip non-mask characters\n for (let i = cursorPos; i < mask.length; i++) {\n if (mask[i] !== '#' && mask[i] !== 'a' && mask[i] !== '*') {\n continue;\n }\n return mask[i];\n }\n return '';\n }\n\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const input = event.target as HTMLInputElement;\n const cursorPos = input.selectionStart || 0;\n const pastedText = event.clipboardData?.getData('text') || '';\n\n const currentValue = input.value;\n const beforeCursor = currentValue.substring(0, cursorPos);\n const afterCursor = currentValue.substring(cursorPos);\n\n const newValue = beforeCursor + pastedText + afterCursor;\n this.handleValue(newValue, cursorPos);\n }\n\n private isValidChar(char: string, maskChar: string): boolean {\n switch (maskChar) {\n case '#':\n return /\\d/.test(char);\n case 'a':\n return /[a-zA-Z]/.test(char);\n case '*':\n return /[a-zA-Z0-9]/.test(char);\n default:\n return char === maskChar;\n }\n }\n\n handleValue(value: string, cursorPos?: number) {\n // Apply mask and update view\n const maskedValue = this.updateView(value);\n // Update actualValue\n const actualValue = this.unmask(maskedValue);\n\n this.updateLocalValue(actualValue, actualValue !== value);\n\n // Set cursor position after update\n // if (cursorPos !== undefined) {\n // setTimeout(() => {\n // const newPos = this.calculateCursorPosition(maskedValue, cursorPos);\n // this.el.nativeElement.setSelectionRange(newPos, newPos);\n // });\n // }\n }\n\n private calculateCursorPosition(maskedValue: string, oldPos: number): number {\n const mask = this.ngbMask();\n let newPos = oldPos;\n\n // Move cursor past any fixed mask characters\n while (newPos < mask.length && !'#a*'.includes(mask[newPos])) {\n newPos++;\n }\n\n return Math.min(newPos, maskedValue.length);\n }\n\n private updateLocalValue(value: string, emit = true) {\n this.inputC.setValue(value);\n // this.lastValue = value;\n this.localValue.set(value);\n if (emit) this.control?.control?.setValue(value);\n }\n\n writeValue(value: string): void {\n this.handleValue(value);\n }\n\n private updateView(value: string, mask = this.ngbMask()): string {\n return maskTransform(value, mask);\n }\n\n private unmask(value: string): string {\n const mask = this.ngbMask();\n let unmaskedValue = '';\n let valueIndex = 0;\n\n for (let maskIndex = 0; maskIndex < mask.length && valueIndex < value.length; maskIndex++) {\n const maskChar = mask[maskIndex];\n const valueChar = value[valueIndex];\n\n if ('#a*'.includes(maskChar)) {\n unmaskedValue += valueChar;\n valueIndex++;\n } else if (maskChar === valueChar) {\n valueIndex++;\n }\n }\n\n return unmaskedValue;\n }\n}\n\nexport function maskTransform(value: string, mask: string, showMaskType = false): string {\n let result = '';\n let valueIndex = 0;\n\n for (let maskIndex = 0; maskIndex < mask.length && valueIndex < value.length; maskIndex++) {\n const maskChar = mask[maskIndex];\n const valueChar = value[valueIndex];\n\n switch (maskChar) {\n case '#':\n if (/\\d/.test(valueChar)) {\n result += valueChar;\n valueIndex++;\n } else if (showMaskType) {\n result += '_';\n } else {\n return result;\n }\n break;\n case 'a':\n if (/[a-zA-Z]/.test(valueChar)) {\n result += valueChar;\n valueIndex++;\n } else if (showMaskType) {\n result += '_';\n } else {\n return result;\n }\n break;\n case '*':\n if (/[a-zA-Z0-9]/.test(valueChar)) {\n result += valueChar;\n valueIndex++;\n } else if (showMaskType) {\n result += '_';\n } else {\n return result;\n }\n break;\n default:\n result += maskChar;\n if (maskChar === valueChar && valueIndex === maskIndex) {\n valueIndex++;\n }\n }\n }\n\n return result;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { maskTransform } from './mask';\n\n@Pipe({\n name: 'mask',\n})\nexport class MaskPipe implements PipeTransform {\n transform(value: string, mask: string): string {\n return maskTransform(value, mask);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -22,10 +22,10 @@ class MenuService {
22
22
  this.close();
23
23
  this.currentRef = ref;
24
24
  }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: MenuService, providedIn: 'root' }); }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuService, providedIn: 'root' }); }
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: MenuService, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuService, decorators: [{
29
29
  type: Injectable,
30
30
  args: [{ providedIn: 'root' }]
31
31
  }] });
@@ -59,10 +59,10 @@ class NgbContextMenu {
59
59
  });
60
60
  this.listeners.on();
61
61
  }
62
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbContextMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
63
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbContextMenu, isStandalone: true, selector: "[ngbContextMenu]", inputs: { ngbContextMenu: { classPropertyName: "ngbContextMenu", publicName: "ngbContextMenu", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { ctxOpen: "ctxOpen", ctxClose: "ctxClose" }, host: { listeners: { "contextmenu": "open($event)" } }, ngImport: i0 }); }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbContextMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
63
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgbContextMenu, isStandalone: true, selector: "[ngbContextMenu]", inputs: { ngbContextMenu: { classPropertyName: "ngbContextMenu", publicName: "ngbContextMenu", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { ctxOpen: "ctxOpen", ctxClose: "ctxClose" }, host: { listeners: { "contextmenu": "open($event)" } }, ngImport: i0 }); }
64
64
  }
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbContextMenu, decorators: [{
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbContextMenu, decorators: [{
66
66
  type: Directive,
67
67
  args: [{
68
68
  selector: '[ngbContextMenu]',
@@ -70,7 +70,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
70
70
  '(contextmenu)': 'open($event)',
71
71
  },
72
72
  }]
73
- }] });
73
+ }], propDecorators: { ngbContextMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngbContextMenu", required: true }] }], ctxOpen: [{ type: i0.Output, args: ["ctxOpen"] }], ctxClose: [{ type: i0.Output, args: ["ctxClose"] }] } });
74
74
 
75
75
  class NgbMentionTrigger {
76
76
  constructor() {
@@ -160,10 +160,10 @@ class NgbMentionTrigger {
160
160
  w: rect.width,
161
161
  };
162
162
  }
163
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbMentionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
164
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbMentionTrigger, isStandalone: true, selector: "[ngbMentionTrigger]", inputs: { ngbMentionTrigger: { classPropertyName: "ngbMentionTrigger", publicName: "ngbMentionTrigger", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { search: "search" }, host: { listeners: { "input": "open()" } }, ngImport: i0 }); }
163
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbMentionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
164
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgbMentionTrigger, isStandalone: true, selector: "[ngbMentionTrigger]", inputs: { ngbMentionTrigger: { classPropertyName: "ngbMentionTrigger", publicName: "ngbMentionTrigger", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { search: "search" }, host: { listeners: { "input": "open()" } }, ngImport: i0 }); }
165
165
  }
166
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbMentionTrigger, decorators: [{
166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbMentionTrigger, decorators: [{
167
167
  type: Directive,
168
168
  args: [{
169
169
  selector: '[ngbMentionTrigger]',
@@ -171,7 +171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
171
171
  '(input)': 'open()',
172
172
  },
173
173
  }]
174
- }] });
174
+ }], propDecorators: { ngbMentionTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngbMentionTrigger", required: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], search: [{ type: i0.Output, args: ["search"] }] } });
175
175
 
176
176
  class NgpMenuGroup {
177
177
  constructor() {
@@ -184,24 +184,30 @@ class NgpMenuGroup {
184
184
  this.allyGroup._isPopup.set(true);
185
185
  });
186
186
  }
187
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgpMenuGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
188
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.0", type: NgpMenuGroup, isStandalone: true, selector: "[ngbMenuGroup]", host: { listeners: { "click": "menu.noAutoClose() ? null : menu.close()" } }, hostDirectives: [{ directive: i1.AccessibleGroup }], ngImport: i0 }); }
187
+ onClick() {
188
+ if (!this.menu.noAutoClose()) {
189
+ // Close with closeParent: true to cascade close to root menu
190
+ this.menu.closeWithParent();
191
+ }
192
+ }
193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgpMenuGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
194
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: NgpMenuGroup, isStandalone: true, selector: "[ngbMenuGroup]", host: { listeners: { "click": "onClick()" } }, hostDirectives: [{ directive: i1.AccessibleGroup }], ngImport: i0 }); }
189
195
  }
190
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgpMenuGroup, decorators: [{
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgpMenuGroup, decorators: [{
191
197
  type: Directive,
192
198
  args: [{
193
199
  selector: '[ngbMenuGroup]',
194
200
  hostDirectives: [AccessibleGroup],
195
201
  host: {
196
- '(click)': 'menu.noAutoClose() ? null : menu.close()',
202
+ '(click)': 'onClick()',
197
203
  },
198
204
  }]
199
205
  }], ctorParameters: () => [] });
200
206
  class NgpMenuContent {
201
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgpMenuContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
202
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.0", type: NgpMenuContent, isStandalone: true, selector: "ng-template[ngbMenuContent]", ngImport: i0 }); }
207
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgpMenuContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
208
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: NgpMenuContent, isStandalone: true, selector: "ng-template[ngbMenuContent]", ngImport: i0 }); }
203
209
  }
204
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgpMenuContent, decorators: [{
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgpMenuContent, decorators: [{
205
211
  type: Directive,
206
212
  args: [{
207
213
  selector: 'ng-template[ngbMenuContent]',
@@ -211,13 +217,11 @@ class NgbMenu {
211
217
  constructor() {
212
218
  this.dir = injectDirectionality();
213
219
  this.popover = ngbPopoverPortal();
214
- this.menuEl = viewChild(NgpMenuGroup, ...(ngDevMode ? [{ debugName: "menuEl", read: ElementRef }] : [{
215
- read: ElementRef,
216
- }]));
220
+ this.menuEl = viewChild(NgpMenuGroup, { ...(ngDevMode ? { debugName: "menuEl" } : {}), read: ElementRef });
217
221
  this.container = viewChild.required('container', { read: TemplateRef });
218
- this.content = contentChildren(NgpMenuContent, ...(ngDevMode ? [{ debugName: "content", read: TemplateRef, descendants: true }] : [{ read: TemplateRef, descendants: true }]));
219
- this.options = contentChildren(NgbOption, ...(ngDevMode ? [{ debugName: "options", descendants: true }] : [{ descendants: true }]));
220
- this.lists = contentChildren(NgbList, ...(ngDevMode ? [{ debugName: "lists", descendants: true }] : [{ descendants: true }]));
222
+ this.content = contentChildren(NgpMenuContent, { ...(ngDevMode ? { debugName: "content" } : {}), read: TemplateRef, descendants: true });
223
+ this.options = contentChildren(NgbOption, { ...(ngDevMode ? { debugName: "options" } : {}), descendants: true });
224
+ this.lists = contentChildren(NgbList, { ...(ngDevMode ? { debugName: "lists" } : {}), descendants: true });
221
225
  this.manager = new Keys();
222
226
  this.selected = output();
223
227
  this.ayId = uniqueId();
@@ -225,13 +229,15 @@ class NgbMenu {
225
229
  this.events = new Subject();
226
230
  this.activeOption = new BehaviorSubject(null);
227
231
  this.isOpen = false;
228
- this.close = (data) => {
232
+ this.close = (data, options) => {
229
233
  if (!this.isOpen)
230
234
  return;
231
- this.diaRef?.close(data);
232
- this.activeOption.next(null);
233
- this.isOpen = false;
235
+ // Don't set isOpen = false here - let afterClosed do it
236
+ // This prevents reopening while close animation is in progress
237
+ this.diaRef?.close(data, options);
234
238
  };
239
+ // Close this menu and cascade close to all parent menus
240
+ this.closeWithParent = (data) => this.close(data, { closeParent: true });
235
241
  effect(cleanup => {
236
242
  const options = this.options().length ? this.options() : this.lists();
237
243
  options.forEach(option => {
@@ -260,7 +266,11 @@ class NgbMenu {
260
266
  });
261
267
  });
262
268
  }
263
- open(options, subMenu = false) {
269
+ open(options, subMenu = false, parentDiaRef) {
270
+ // Don't open if already open or if close animation is in progress
271
+ if (this.isOpen || this.diaRef?.isClosing) {
272
+ return;
273
+ }
264
274
  const rtl = this.dir.isRtl();
265
275
  const content = this.content()[0];
266
276
  const template = content || this.container();
@@ -272,9 +282,19 @@ class NgbMenu {
272
282
  ayId: this.ayId,
273
283
  data: options.data,
274
284
  ...options,
285
+ // Pass parent for proper parent-child tracking
286
+ parent: parentDiaRef,
275
287
  });
276
288
  this.diaRef = diaRef;
277
289
  this.opened();
290
+ // Subscribe to afterClosed to sync isOpen state when dialog is closed
291
+ // This handles cases where the dialog is closed externally (e.g., via parent cascade)
292
+ diaRef.afterClosed.subscribe(() => {
293
+ this.activeOption.next(null);
294
+ this.isOpen = false;
295
+ // Clear diaRef so isClosing check doesn't block future opens
296
+ this.diaRef = null;
297
+ });
278
298
  }
279
299
  opened() {
280
300
  this.isOpen = true;
@@ -291,16 +311,18 @@ class NgbMenu {
291
311
  ngOnDestroy() {
292
312
  this.close();
293
313
  }
294
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
295
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.2.0", type: NgbMenu, isStandalone: true, selector: "[ngbMenu]", inputs: { noAutoClose: { classPropertyName: "noAutoClose", publicName: "noAutoClose", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected" }, queries: [{ propertyName: "content", predicate: NgpMenuContent, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "options", predicate: NgbOption, descendants: true, isSignal: true }, { propertyName: "lists", predicate: NgbList, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "menuEl", first: true, predicate: NgpMenuGroup, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: TemplateRef, isSignal: true }], exportAs: ["ngbMenu"], ngImport: i0 }); }
314
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
315
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: NgbMenu, isStandalone: true, selector: "[ngbMenu]", inputs: { noAutoClose: { classPropertyName: "noAutoClose", publicName: "noAutoClose", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected" }, queries: [{ propertyName: "content", predicate: NgpMenuContent, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "options", predicate: NgbOption, descendants: true, isSignal: true }, { propertyName: "lists", predicate: NgbList, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "menuEl", first: true, predicate: NgpMenuGroup, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: TemplateRef, isSignal: true }], exportAs: ["ngbMenu"], ngImport: i0 }); }
296
316
  }
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbMenu, decorators: [{
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbMenu, decorators: [{
298
318
  type: Directive,
299
319
  args: [{
300
320
  selector: '[ngbMenu]',
301
321
  exportAs: 'ngbMenu',
302
322
  }]
303
- }], ctorParameters: () => [] });
323
+ }], ctorParameters: () => [], propDecorators: { menuEl: [{ type: i0.ViewChild, args: [i0.forwardRef(() => NgpMenuGroup), { ...{
324
+ read: ElementRef,
325
+ }, isSignal: true }] }], container: [{ type: i0.ViewChild, args: ['container', { ...{ read: TemplateRef }, isSignal: true }] }], content: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgpMenuContent), { ...{ read: TemplateRef, descendants: true }, isSignal: true }] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgbOption), { ...{ descendants: true }, isSignal: true }] }], lists: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgbList), { ...{ descendants: true }, isSignal: true }] }], selected: [{ type: i0.Output, args: ["selected"] }], noAutoClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "noAutoClose", required: false }] }] } });
304
326
  const aliasMenu = (menu) => ({
305
327
  provide: NgbMenu,
306
328
  useExisting: menu,
@@ -310,7 +332,7 @@ class NgbNavigationMenu {
310
332
  constructor() {
311
333
  this.popover = ngbPopoverPortal();
312
334
  this.dir = injectDirectionality();
313
- this.menus = contentChildren(NgbMenuTrigger, ...(ngDevMode ? [{ debugName: "menus", descendants: true }] : [{ descendants: true }]));
335
+ this.menus = contentChildren(NgbMenuTrigger, { ...(ngDevMode ? { debugName: "menus" } : {}), descendants: true });
314
336
  this.hover = input(false, ...(ngDevMode ? [{ debugName: "hover" }] : []));
315
337
  this.ayId = uniqueId();
316
338
  this.timerId = 0;
@@ -388,15 +410,15 @@ class NgbNavigationMenu {
388
410
  this.close?.();
389
411
  }, 200);
390
412
  }
391
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbNavigationMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
392
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.2.0", type: NgbNavigationMenu, isStandalone: true, selector: "[ngbNavigationMenu]", inputs: { hover: { classPropertyName: "hover", publicName: "hover", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "menus", predicate: NgbMenuTrigger, descendants: true, isSignal: true }], ngImport: i0 }); }
413
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbNavigationMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
414
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: NgbNavigationMenu, isStandalone: true, selector: "[ngbNavigationMenu]", inputs: { hover: { classPropertyName: "hover", publicName: "hover", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "menus", predicate: NgbMenuTrigger, descendants: true, isSignal: true }], ngImport: i0 }); }
393
415
  }
394
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbNavigationMenu, decorators: [{
416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbNavigationMenu, decorators: [{
395
417
  type: Directive,
396
418
  args: [{
397
419
  selector: '[ngbNavigationMenu]',
398
420
  }]
399
- }], ctorParameters: () => [] });
421
+ }], ctorParameters: () => [], propDecorators: { menus: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgbMenuTrigger), { ...{ descendants: true }, isSignal: true }] }], hover: [{ type: i0.Input, args: [{ isSignal: true, alias: "hover", required: false }] }] } });
400
422
 
401
423
  class NgbMenuTrigger {
402
424
  constructor() {
@@ -410,16 +432,13 @@ class NgbMenuTrigger {
410
432
  this._menuOpen = signal(false, ...(ngDevMode ? [{ debugName: "_menuOpen" }] : []));
411
433
  this.menuOpen = this._menuOpen.asReadonly();
412
434
  this.events = new Subject();
413
- this.closeParent = true;
414
- this.delayTimer = 0;
415
- this.isMouseOverTrigger = false;
416
435
  // if a11y is provided, then we should open on keyleft and keyright
417
436
  this.a11y?.events.subscribe(ev => {
418
437
  if (!this.menu.isOpen && ev.type === 'keyRight') {
419
438
  this.open();
420
439
  }
421
440
  else if (this.menu.isOpen && ev.type === 'keyLeft') {
422
- this.closeParent = false;
441
+ // Close without cascading to parent (navigation close)
423
442
  this.closeMenu();
424
443
  }
425
444
  });
@@ -429,7 +448,7 @@ class NgbMenuTrigger {
429
448
  this.open();
430
449
  }
431
450
  else if (this.menu.isOpen) {
432
- this.closeParent = false;
451
+ // Close without cascading to parent (navigation close)
433
452
  this.closeMenu();
434
453
  }
435
454
  });
@@ -437,20 +456,13 @@ class NgbMenuTrigger {
437
456
  if (this.parent || this.nav) {
438
457
  this.el.nativeElement.addEventListener('mouseenter', ev => {
439
458
  this.events.next({ event: ev, type: 'enter', menu: this });
440
- this.isMouseOverTrigger = true;
441
459
  if (this.nav) {
442
460
  return;
443
461
  }
444
- clearTimeout(this.delayTimer);
445
- // console.log('mouseenter', this.debugId());
446
462
  this.open(ev);
447
463
  });
448
464
  this.el.nativeElement.addEventListener('mouseleave', ev => {
449
465
  this.events.next({ event: ev, type: 'leave', menu: this });
450
- this.isMouseOverTrigger = false;
451
- if (this.nav) {
452
- return;
453
- }
454
466
  });
455
467
  }
456
468
  });
@@ -485,42 +497,20 @@ class NgbMenuTrigger {
485
497
  if (menu.isOpen) {
486
498
  return;
487
499
  }
488
- // console.log('open menu', this.parent);
489
- // const { diaRef, events } = this.popover.open(menu.container()!, {
490
- // ...this.options(),
491
- // data: this.ngbMenuTriggerData(),
492
- // backdrop: !this.parent,
493
- // target: this.el.nativeElement,
494
- // position: this.parent ? 'right' : 'bl',
495
- // offset: 4,
496
- // ayId: this.ayId(),
497
- // });
498
- menu.open({ ...this.options(), target: this.el.nativeElement, data: this.ngbMenuTriggerData() }, !!this.parent);
500
+ // Pass parent's diaRef for proper parent-child tracking
501
+ const parentDiaRef = this.parent?.diaRef;
502
+ menu.open({ ...this.options(), target: this.el.nativeElement, data: this.ngbMenuTriggerData() }, !!this.parent, parentDiaRef);
499
503
  this._menuOpen.set(true);
500
504
  menu.parentMenuTrigger = this;
501
- // if (this.nav) {
502
- // events.subscribe(ev => {
503
- // if (ev.type === 'mouseleave') {
504
- // this.delayTimer = setTimeout(() => {
505
- // this.closeMenu();
506
- // }, 300);
507
- // } else {
508
- // clearTimeout(this.delayTimer);
509
- // }
510
- // });
511
- // }
512
505
  menu.diaRef?.afterClosed.subscribe(() => {
513
- if (this.closeParent)
514
- this.rootParent?.close();
515
- this.closeParent = true;
516
506
  menu.close();
517
507
  this._menuOpen.set(false);
518
508
  });
519
509
  }
520
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
521
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0", type: NgbMenuTrigger, isStandalone: true, selector: "[ngbMenuTrigger]", inputs: { ngbMenuTrigger: { classPropertyName: "ngbMenuTrigger", publicName: "ngbMenuTrigger", isSignal: true, isRequired: true, transformFunction: null }, ngbMenuTriggerData: { classPropertyName: "ngbMenuTriggerData", publicName: "ngbMenuTriggerData", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0" }, listeners: { "click": "clickOpen($event)" }, properties: { "attr.aria-expanded": "menuOpen()", "attr.aria-haspopup": "true" } }, exportAs: ["ngbMenuTrigger"], ngImport: i0 }); }
510
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
511
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgbMenuTrigger, isStandalone: true, selector: "[ngbMenuTrigger]", inputs: { ngbMenuTrigger: { classPropertyName: "ngbMenuTrigger", publicName: "ngbMenuTrigger", isSignal: true, isRequired: true, transformFunction: null }, ngbMenuTriggerData: { classPropertyName: "ngbMenuTriggerData", publicName: "ngbMenuTriggerData", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "0" }, listeners: { "click": "clickOpen($event)" }, properties: { "attr.aria-expanded": "menuOpen()", "attr.aria-haspopup": "true" } }, exportAs: ["ngbMenuTrigger"], ngImport: i0 }); }
522
512
  }
523
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: NgbMenuTrigger, decorators: [{
513
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgbMenuTrigger, decorators: [{
524
514
  type: Directive,
525
515
  args: [{
526
516
  selector: '[ngbMenuTrigger]',
@@ -532,7 +522,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
532
522
  tabindex: '0',
533
523
  },
534
524
  }]
535
- }], ctorParameters: () => [] });
525
+ }], ctorParameters: () => [], propDecorators: { ngbMenuTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngbMenuTrigger", required: true }] }], ngbMenuTriggerData: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngbMenuTriggerData", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
536
526
 
537
527
  /*
538
528
  * Public API Surface of menu