@ngneers/controls 0.0.1-pre1 → 0.0.1-pre2

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/ngneers-controls-accordion.mjs +194 -0
  3. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
  4. package/fesm2022/ngneers-controls-api-ng.mjs +668 -0
  5. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
  6. package/fesm2022/ngneers-controls-api.mjs +256 -227
  7. package/fesm2022/ngneers-controls-api.mjs.map +1 -1
  8. package/fesm2022/ngneers-controls-avatar.mjs +70 -0
  9. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
  10. package/fesm2022/ngneers-controls-base.mjs +397 -0
  11. package/fesm2022/ngneers-controls-base.mjs.map +1 -0
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs +74 -0
  13. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
  14. package/fesm2022/ngneers-controls-button-group.mjs +51 -0
  15. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
  16. package/fesm2022/ngneers-controls-button.mjs +62 -0
  17. package/fesm2022/ngneers-controls-button.mjs.map +1 -0
  18. package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs +63 -0
  19. package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs.map +1 -0
  20. package/fesm2022/ngneers-controls-calendar.mjs +468 -0
  21. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
  22. package/fesm2022/ngneers-controls-checkbox.mjs +58 -0
  23. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
  24. package/fesm2022/ngneers-controls-chip.mjs +52 -0
  25. package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
  26. package/fesm2022/ngneers-controls-defer.mjs +43 -0
  27. package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
  28. package/fesm2022/ngneers-controls-dialog.mjs +329 -33
  29. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  30. package/fesm2022/ngneers-controls-directives.mjs +443 -0
  31. package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
  32. package/fesm2022/ngneers-controls-drawer.mjs +232 -0
  33. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs +120 -0
  35. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
  36. package/fesm2022/ngneers-controls-filter.mjs +516 -0
  37. package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
  38. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs +87 -0
  39. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +1 -0
  40. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs +87 -0
  41. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +1 -0
  42. package/fesm2022/ngneers-controls-i18n.mjs +57 -0
  43. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
  44. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +4 -0
  45. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +1 -0
  46. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +4 -0
  47. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +1 -0
  48. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +4 -0
  49. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +1 -0
  50. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +4 -0
  51. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +1 -0
  52. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +4 -0
  53. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +1 -0
  54. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +4 -0
  55. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +1 -0
  56. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +4 -0
  57. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +1 -0
  58. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +4 -0
  59. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +1 -0
  60. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +4 -0
  61. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +1 -0
  62. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +4 -0
  63. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +1 -0
  64. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +4 -0
  65. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +1 -0
  66. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +4 -0
  67. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +1 -0
  68. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +4 -0
  69. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +1 -0
  70. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +4 -0
  71. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +1 -0
  72. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +4 -0
  73. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +1 -0
  74. package/fesm2022/ngneers-controls-icon.mjs +60 -18
  75. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  76. package/fesm2022/ngneers-controls-inplace.mjs +107 -0
  77. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
  78. package/fesm2022/ngneers-controls-input-field.mjs +141 -0
  79. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
  80. package/fesm2022/ngneers-controls-input-mask.mjs +282 -0
  81. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -0
  82. package/fesm2022/ngneers-controls-input.mjs +69 -0
  83. package/fesm2022/ngneers-controls-input.mjs.map +1 -0
  84. package/fesm2022/ngneers-controls-item-view.mjs +441 -0
  85. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
  86. package/fesm2022/ngneers-controls-list-box.mjs +157 -53
  87. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  88. package/fesm2022/ngneers-controls-menu.mjs +332 -0
  89. package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
  90. package/fesm2022/ngneers-controls-message.mjs +29 -0
  91. package/fesm2022/ngneers-controls-message.mjs.map +1 -0
  92. package/fesm2022/ngneers-controls-paginator.mjs +111 -0
  93. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
  94. package/fesm2022/ngneers-controls-popover.mjs +129 -40
  95. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  96. package/fesm2022/ngneers-controls-progress.mjs +82 -0
  97. package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
  98. package/fesm2022/ngneers-controls-scroller.mjs +155 -78
  99. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  100. package/fesm2022/ngneers-controls-select-button.mjs +55 -0
  101. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
  102. package/fesm2022/ngneers-controls-select.mjs +313 -103
  103. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  104. package/fesm2022/ngneers-controls-slider.mjs +155 -0
  105. package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
  106. package/fesm2022/ngneers-controls-spinner.mjs +169 -0
  107. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
  108. package/fesm2022/ngneers-controls-splitter.mjs +717 -0
  109. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
  110. package/fesm2022/ngneers-controls-switch.mjs +39 -0
  111. package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
  112. package/fesm2022/ngneers-controls-table.mjs +379 -0
  113. package/fesm2022/ngneers-controls-table.mjs.map +1 -0
  114. package/fesm2022/ngneers-controls-tabs.mjs +287 -0
  115. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
  116. package/fesm2022/ngneers-controls-tag.mjs +29 -0
  117. package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
  118. package/fesm2022/ngneers-controls-toast.mjs +184 -0
  119. package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
  120. package/fesm2022/ngneers-controls-toggle-button.mjs +65 -0
  121. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
  122. package/fesm2022/ngneers-controls-tooltip.mjs +454 -0
  123. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
  124. package/fesm2022/ngneers-controls-utils-ng.mjs +227 -0
  125. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
  126. package/fesm2022/ngneers-controls-utils.mjs +217 -60
  127. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  128. package/fesm2022/ngneers-controls.mjs.map +1 -1
  129. package/package.json +167 -32
  130. package/types/ngneers-controls-accordion.d.ts +114 -0
  131. package/types/ngneers-controls-api-ng.d.ts +291 -0
  132. package/types/ngneers-controls-api.d.ts +99 -0
  133. package/types/ngneers-controls-avatar.d.ts +50 -0
  134. package/types/ngneers-controls-base.d.ts +166 -0
  135. package/types/ngneers-controls-breadcrumb.d.ts +86 -0
  136. package/types/ngneers-controls-button-group.d.ts +30 -0
  137. package/types/ngneers-controls-button.d.ts +34 -0
  138. package/types/ngneers-controls-calendar.d.ts +275 -0
  139. package/types/ngneers-controls-checkbox.d.ts +38 -0
  140. package/types/ngneers-controls-chip.d.ts +37 -0
  141. package/types/ngneers-controls-defer.d.ts +22 -0
  142. package/types/ngneers-controls-dialog.d.ts +218 -0
  143. package/types/ngneers-controls-directives.d.ts +146 -0
  144. package/types/ngneers-controls-drawer.d.ts +220 -0
  145. package/types/ngneers-controls-edit-inplace.d.ts +182 -0
  146. package/types/ngneers-controls-filter.d.ts +304 -0
  147. package/types/ngneers-controls-i18n.d.ts +108 -0
  148. package/types/ngneers-controls-icon.d.ts +74 -0
  149. package/types/ngneers-controls-inplace.d.ts +95 -0
  150. package/types/ngneers-controls-input-field.d.ts +159 -0
  151. package/types/ngneers-controls-input-mask.d.ts +83 -0
  152. package/types/ngneers-controls-input.d.ts +27 -0
  153. package/types/ngneers-controls-item-view.d.ts +211 -0
  154. package/types/ngneers-controls-list-box.d.ts +216 -0
  155. package/types/ngneers-controls-menu.d.ts +178 -0
  156. package/types/ngneers-controls-message.d.ts +19 -0
  157. package/types/ngneers-controls-paginator.d.ts +162 -0
  158. package/types/ngneers-controls-popover.d.ts +101 -0
  159. package/types/ngneers-controls-progress.d.ts +44 -0
  160. package/types/ngneers-controls-scroller.d.ts +137 -0
  161. package/types/ngneers-controls-select-button.d.ts +37 -0
  162. package/types/ngneers-controls-select.d.ts +314 -0
  163. package/types/ngneers-controls-slider.d.ts +53 -0
  164. package/types/ngneers-controls-spinner.d.ts +105 -0
  165. package/types/ngneers-controls-splitter.d.ts +391 -0
  166. package/types/ngneers-controls-switch.d.ts +18 -0
  167. package/types/ngneers-controls-table.d.ts +157 -0
  168. package/types/ngneers-controls-tabs.d.ts +106 -0
  169. package/types/ngneers-controls-tag.d.ts +19 -0
  170. package/types/ngneers-controls-toast.d.ts +70 -0
  171. package/types/ngneers-controls-toggle-button.d.ts +46 -0
  172. package/types/ngneers-controls-tooltip.d.ts +188 -0
  173. package/types/ngneers-controls-utils-ng.d.ts +57 -0
  174. package/types/ngneers-controls-utils.d.ts +130 -0
  175. package/api/index.d.ts +0 -134
  176. package/custom-types/index.d.ts +0 -7
  177. package/dialog/index.d.ts +0 -43
  178. package/fesm2022/ngneers-controls-custom-types.mjs +0 -4
  179. package/fesm2022/ngneers-controls-custom-types.mjs.map +0 -1
  180. package/fesm2022/ngneers-controls-form-field.mjs +0 -33
  181. package/fesm2022/ngneers-controls-form-field.mjs.map +0 -1
  182. package/fesm2022/ngneers-controls-lazy-cacher.mjs +0 -30
  183. package/fesm2022/ngneers-controls-lazy-cacher.mjs.map +0 -1
  184. package/fesm2022/ngneers-controls-text-field.mjs +0 -23
  185. package/fesm2022/ngneers-controls-text-field.mjs.map +0 -1
  186. package/form-field/index.d.ts +0 -19
  187. package/icon/index.d.ts +0 -30
  188. package/lazy-cacher/index.d.ts +0 -14
  189. package/list-box/index.d.ts +0 -58
  190. package/popover/index.d.ts +0 -41
  191. package/scroller/index.d.ts +0 -95
  192. package/select/index.d.ts +0 -86
  193. package/text-field/index.d.ts +0 -10
  194. package/utils/index.d.ts +0 -36
  195. /package/{index.d.ts → types/ngneers-controls.d.ts} +0 -0
@@ -0,0 +1,443 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, signal, input, booleanAttribute, effect, Directive, DOCUMENT, output, afterRenderEffect, computed, untracked } from '@angular/core';
3
+ import { Platform, domEventObservable, domEventHandler, domEventSignal, injectThemeTemplate, elementSizeSignal } from '@ngneers/controls/api/ng';
4
+ import { NgnBase } from '@ngneers/controls/base';
5
+ import { signalWithPrevious } from '@ngneers/controls/utils-ng';
6
+ import { movableDirectiveTemplate, resizableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';
7
+ import { map } from 'rxjs';
8
+
9
+ class NgnAutofocus {
10
+ _el = inject((ElementRef));
11
+ _focused = signal(false, ...(ngDevMode ? [{ debugName: "_focused" }] : []));
12
+ _isInitialized = signal(false, ...(ngDevMode ? [{ debugName: "_isInitialized" }] : []));
13
+ ngnAutofocus = input(true, { ...(ngDevMode ? { debugName: "ngnAutofocus" } : {}), transform: booleanAttribute });
14
+ constructor() {
15
+ effect(() => {
16
+ if (!this.ngnAutofocus()) {
17
+ this._focused.set(false);
18
+ }
19
+ });
20
+ effect(() => {
21
+ this.autoFocus();
22
+ });
23
+ }
24
+ ngAfterViewInit() {
25
+ /**
26
+ * The additional microtask ensures that the control is rendered and the
27
+ * ngn-control-initializing class is removed before trying to focus the element.
28
+ */
29
+ if (this._el.nativeElement.getClientRects().length === 0) {
30
+ queueMicrotask(() => {
31
+ this._isInitialized.set(true);
32
+ });
33
+ }
34
+ else {
35
+ this._isInitialized.set(true);
36
+ }
37
+ }
38
+ autoFocus() {
39
+ if (!this._isInitialized()) {
40
+ return;
41
+ }
42
+ if (!this.ngnAutofocus()) {
43
+ return;
44
+ }
45
+ if (this._focused()) {
46
+ return;
47
+ }
48
+ this._el.nativeElement.focus();
49
+ this._focused.set(true);
50
+ }
51
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnAutofocus, deps: [], target: i0.ɵɵFactoryTarget.Directive });
52
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgnAutofocus, isStandalone: true, selector: "[ngnAutofocus]", inputs: { ngnAutofocus: { classPropertyName: "ngnAutofocus", publicName: "ngnAutofocus", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
53
+ }
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnAutofocus, decorators: [{
55
+ type: Directive,
56
+ args: [{ selector: '[ngnAutofocus]' }]
57
+ }], ctorParameters: () => [], propDecorators: { ngnAutofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnAutofocus", required: false }] }] } });
58
+
59
+ class NgnDragBase {
60
+ el = inject(ElementRef);
61
+ _document = inject(DOCUMENT);
62
+ _isBrowser = inject(Platform).isBrowser;
63
+ _pointerDown = false;
64
+ _startX = undefined;
65
+ _startY = undefined;
66
+ isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : []));
67
+ dragStart = output();
68
+ dragEnd = output();
69
+ dragged = output();
70
+ _pointerDownEvent = domEventObservable(this.el.nativeElement, 'pointerdown');
71
+ _pointerMoveEvent = domEventObservable(this._document, 'pointermove');
72
+ _pointerUpEvent = domEventObservable(this._document, 'pointerup');
73
+ constructor() {
74
+ if (!this._isBrowser) {
75
+ return;
76
+ }
77
+ domEventHandler(this.el.nativeElement, 'touchmove', e => {
78
+ if (e.cancelable) {
79
+ e.preventDefault();
80
+ }
81
+ });
82
+ afterRenderEffect(() => {
83
+ this._pointerDownEvent.subscribe(event => {
84
+ this._pointerDown = true;
85
+ this._startX = event.clientX;
86
+ this._startY = event.clientY;
87
+ });
88
+ this._pointerUpEvent.subscribe(() => {
89
+ if (!this._pointerDown) {
90
+ return;
91
+ }
92
+ this._pointerDown = false;
93
+ this._startX = undefined;
94
+ this._startY = undefined;
95
+ this.isDragging.set(false);
96
+ this.dragEnd.emit();
97
+ });
98
+ this._pointerMoveEvent.subscribe(event => {
99
+ if (!this._pointerDown) {
100
+ return;
101
+ }
102
+ this.handleDrag(event);
103
+ });
104
+ });
105
+ }
106
+ onDraggedInt(delta) {
107
+ this.dragged.emit(delta);
108
+ this.onDragged(delta);
109
+ }
110
+ handleDrag(event) {
111
+ const { clientX, clientY } = event;
112
+ if (this._startX === undefined || this._startY === undefined) {
113
+ throw new Error('Start positions are undefined');
114
+ }
115
+ const deltaX = clientX - this._startX;
116
+ const deltaY = clientY - this._startY;
117
+ if (!this.isDragging()) {
118
+ const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);
119
+ if (distance < 5) {
120
+ return;
121
+ }
122
+ this.isDragging.set(true);
123
+ this.dragStart.emit();
124
+ }
125
+ if (!this.isDragging()) {
126
+ return;
127
+ }
128
+ this._startX = clientX;
129
+ this._startY = clientY;
130
+ this.onDraggedInt({ deltaX: deltaX, deltaY: deltaY, absoluteX: clientX, absoluteY: clientY });
131
+ }
132
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDragBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
133
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: NgnDragBase, isStandalone: true, outputs: { dragStart: "dragStart", dragEnd: "dragEnd", dragged: "dragged" }, ngImport: i0 });
134
+ }
135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDragBase, decorators: [{
136
+ type: Directive
137
+ }], ctorParameters: () => [], propDecorators: { dragStart: [{ type: i0.Output, args: ["dragStart"] }], dragEnd: [{ type: i0.Output, args: ["dragEnd"] }], dragged: [{ type: i0.Output, args: ["dragged"] }] } });
138
+
139
+ class NgnDragScroll extends NgnDragBase {
140
+ onDragged(delta) {
141
+ this.el.nativeElement.scrollBy({
142
+ left: -delta.deltaX,
143
+ top: -delta.deltaY,
144
+ behavior: 'auto',
145
+ });
146
+ }
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDragScroll, deps: null, target: i0.ɵɵFactoryTarget.Directive });
148
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: NgnDragScroll, isStandalone: true, selector: "[ngnDragScroll]", usesInheritance: true, ngImport: i0 });
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDragScroll, decorators: [{
151
+ type: Directive,
152
+ args: [{
153
+ selector: '[ngnDragScroll]',
154
+ }]
155
+ }] });
156
+
157
+ class NgnDrag extends NgnDragBase {
158
+ onDragged(delta) {
159
+ // do nothing
160
+ }
161
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDrag, deps: null, target: i0.ɵɵFactoryTarget.Directive });
162
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: NgnDrag, isStandalone: true, selector: "[ngnDrag]", usesInheritance: true, ngImport: i0 });
163
+ }
164
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDrag, decorators: [{
165
+ type: Directive,
166
+ args: [{
167
+ selector: '[ngnDrag]',
168
+ }]
169
+ }] });
170
+
171
+ class NgnMovable extends NgnBase {
172
+ theme = this.injectThemeTemplate(movableDirectiveTemplate, {
173
+ movable: () => this.ngnMovable(),
174
+ moved: () => this.dragged(),
175
+ });
176
+ _el = inject((ElementRef));
177
+ _document = inject(DOCUMENT);
178
+ /**
179
+ * Whether the element is movable.
180
+ * @default true
181
+ */
182
+ ngnMovable = input(true, { ...(ngDevMode ? { debugName: "ngnMovable" } : {}), transform: booleanAttribute });
183
+ /**
184
+ * The handle element used to drag the element. If omitted, the entire element will be used as the drag handle.
185
+ * @default null
186
+ */
187
+ ngnMovableDragHandle = input(null, ...(ngDevMode ? [{ debugName: "ngnMovableDragHandle" }] : []));
188
+ /**
189
+ * When `true`, the cursor will change to indicate that the element / drag handle is movable.
190
+ * @default true
191
+ */
192
+ ngnMovableChangeCursor = input(true, { ...(ngDevMode ? { debugName: "ngnMovableChangeCursor" } : {}), transform: booleanAttribute });
193
+ /**
194
+ * When `true`, the movement will be limited to the viewport.
195
+ * @default true
196
+ */
197
+ ngnMovableLimitToViewport = input(true, { ...(ngDevMode ? { debugName: "ngnMovableLimitToViewport" } : {}), transform: booleanAttribute });
198
+ _ngnMovableDragHandleWithPrevious = signalWithPrevious(this.ngnMovableDragHandle, null);
199
+ _eventElement = computed(() => {
200
+ const handle = this.ngnMovableDragHandle();
201
+ return handle ?? this._el.nativeElement;
202
+ }, ...(ngDevMode ? [{ debugName: "_eventElement" }] : []));
203
+ dragged = signal(false, ...(ngDevMode ? [{ debugName: "dragged" }] : []));
204
+ _pointerDownSignal = domEventSignal(this._eventElement, 'pointerdown');
205
+ _pointerMoveSignal = domEventSignal(this._document, 'pointermove');
206
+ _pointerUpSignal = domEventSignal(this._document, 'pointerup');
207
+ _isDragging = signal(false, ...(ngDevMode ? [{ debugName: "_isDragging" }] : []));
208
+ _startX = 0;
209
+ _startY = 0;
210
+ constructor() {
211
+ super();
212
+ domEventHandler(this._el.nativeElement, 'touchmove', e => {
213
+ if (!this.ngnMovable()) {
214
+ return;
215
+ }
216
+ if (e.cancelable) {
217
+ e.preventDefault();
218
+ }
219
+ });
220
+ effect(() => {
221
+ if (!this.ngnMovable()) {
222
+ return;
223
+ }
224
+ const pointerDown = this._pointerDownSignal();
225
+ // check if primary button or touch
226
+ if (pointerDown && (pointerDown.button === 0 || pointerDown.pointerType === 'touch')) {
227
+ this._isDragging.set(true);
228
+ this._startX = pointerDown.clientX - this._el.nativeElement.offsetLeft;
229
+ this._startY = pointerDown.clientY - this._el.nativeElement.offsetTop;
230
+ }
231
+ });
232
+ effect(() => {
233
+ if (!this.ngnMovable()) {
234
+ return;
235
+ }
236
+ const pointerMove = this._pointerMoveSignal();
237
+ if (pointerMove && untracked(this._isDragging)) {
238
+ this.dragged.set(true);
239
+ const newLeft = pointerMove.clientX - this._startX;
240
+ const newTop = pointerMove.clientY - this._startY;
241
+ if (this.ngnMovableLimitToViewport()) {
242
+ const documentRect = this._document.documentElement.getBoundingClientRect();
243
+ const elRect = this._el.nativeElement.getBoundingClientRect();
244
+ const clampedLeft = Math.min(Math.max(newLeft, 0), documentRect.width - elRect.width);
245
+ const clampedTop = Math.min(Math.max(newTop, 0), documentRect.height - elRect.height);
246
+ this._el.nativeElement.style.left = `${clampedLeft}px`;
247
+ this._el.nativeElement.style.top = `${clampedTop}px`;
248
+ }
249
+ else {
250
+ this._el.nativeElement.style.left = `${pointerMove.clientX - this._startX}px`;
251
+ this._el.nativeElement.style.top = `${pointerMove.clientY - this._startY}px`;
252
+ }
253
+ this._el.nativeElement.style.width = `${this._el.nativeElement.offsetWidth}px`;
254
+ this._el.nativeElement.style.height = `${this._el.nativeElement.offsetHeight}px`;
255
+ if (!['fixed', 'absolute', 'static'].includes(getComputedStyle(this._el.nativeElement).position)) {
256
+ this._el.nativeElement.style.position = 'fixed';
257
+ }
258
+ }
259
+ });
260
+ effect(() => {
261
+ if (!this.ngnMovable()) {
262
+ return;
263
+ }
264
+ const pointerUp = this._pointerUpSignal();
265
+ if (pointerUp && untracked(this._isDragging)) {
266
+ this._isDragging.set(false);
267
+ }
268
+ });
269
+ effect(() => {
270
+ if (!this.ngnMovable()) {
271
+ this._isDragging.set(false);
272
+ }
273
+ });
274
+ effect(() => {
275
+ this.refreshCursor();
276
+ });
277
+ }
278
+ bakePosition() {
279
+ this._el.nativeElement.style.left = `${this._el.nativeElement.offsetLeft}px`;
280
+ this._el.nativeElement.style.top = `${this._el.nativeElement.offsetTop}px`;
281
+ if (!['fixed', 'absolute', 'static'].includes(getComputedStyle(this._el.nativeElement).position)) {
282
+ this._el.nativeElement.style.position = 'fixed';
283
+ }
284
+ this.dragged.set(true);
285
+ }
286
+ refreshCursor() {
287
+ const handle = this._ngnMovableDragHandleWithPrevious();
288
+ if (handle.previous && handle.previous !== handle.current) {
289
+ handle.previous.classList.remove(this.theme.class('drag-handle-grab'), this.theme.class('drag-handle-grabbing'));
290
+ }
291
+ if (!this.ngnMovable() || !this.ngnMovableChangeCursor()) {
292
+ handle.current?.classList.remove(this.theme.class('drag-handle-grab'), this.theme.class('drag-handle-grabbing'));
293
+ return;
294
+ }
295
+ if (this._isDragging()) {
296
+ handle.current?.classList.add(this.theme.class('drag-handle-grabbing'));
297
+ handle.current?.classList.remove(this.theme.class('drag-handle-grab'));
298
+ }
299
+ else {
300
+ handle.current?.classList.add(this.theme.class('drag-handle-grab'));
301
+ handle.current?.classList.remove(this.theme.class('drag-handle-grabbing'));
302
+ }
303
+ }
304
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnMovable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
305
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgnMovable, isStandalone: true, selector: "[ngnMovable]", inputs: { ngnMovable: { classPropertyName: "ngnMovable", publicName: "ngnMovable", isSignal: true, isRequired: false, transformFunction: null }, ngnMovableDragHandle: { classPropertyName: "ngnMovableDragHandle", publicName: "ngnMovableDragHandle", isSignal: true, isRequired: false, transformFunction: null }, ngnMovableChangeCursor: { classPropertyName: "ngnMovableChangeCursor", publicName: "ngnMovableChangeCursor", isSignal: true, isRequired: false, transformFunction: null }, ngnMovableLimitToViewport: { classPropertyName: "ngnMovableLimitToViewport", publicName: "ngnMovableLimitToViewport", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0 });
306
+ }
307
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnMovable, decorators: [{
308
+ type: Directive,
309
+ args: [{
310
+ selector: '[ngnMovable]',
311
+ }]
312
+ }], ctorParameters: () => [], propDecorators: { ngnMovable: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnMovable", required: false }] }], ngnMovableDragHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnMovableDragHandle", required: false }] }], ngnMovableChangeCursor: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnMovableChangeCursor", required: false }] }], ngnMovableLimitToViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnMovableLimitToViewport", required: false }] }] } });
313
+
314
+ class NgnResizable {
315
+ theme = injectThemeTemplate(resizableDirectiveTemplate);
316
+ _el = inject((ElementRef));
317
+ _isBrowser = inject(Platform).isBrowser;
318
+ _document = inject(DOCUMENT);
319
+ _ngnMovable = inject(NgnMovable, { optional: true });
320
+ _isPointerDown = false;
321
+ /**
322
+ * Whether the element is resizable.
323
+ */
324
+ ngnResizable = input(true, ...(ngDevMode ? [{ debugName: "ngnResizable" }] : []));
325
+ /**
326
+ * The maximum size of the resizable element.
327
+ */
328
+ ngnResizableSizeLimits = input(...(ngDevMode ? [undefined, { debugName: "ngnResizableSizeLimits" }] : []));
329
+ resized = signal(false, ...(ngDevMode ? [{ debugName: "resized" }] : []));
330
+ _pointerDownSignal = domEventSignal(this._el, 'pointerdown');
331
+ _pointerUpSignal = domEventSignal(this._document, 'pointerup');
332
+ _resizeEvent = elementSizeSignal(this._el);
333
+ /**
334
+ * Formats a size value from string | number | null | undefined to a CSS string.
335
+ * @param value The size value to format
336
+ * @returns The formatted CSS string or null if the value is null/undefined
337
+ */
338
+ formatSizeValue(value) {
339
+ if (value === null || value === undefined) {
340
+ return null;
341
+ }
342
+ return typeof value === 'number' ? `${value}px` : value;
343
+ }
344
+ constructor() {
345
+ effect(() => {
346
+ if (this._pointerDownSignal()) {
347
+ this._isPointerDown = true;
348
+ }
349
+ });
350
+ effect(() => {
351
+ if (this._pointerUpSignal()) {
352
+ this._isPointerDown = false;
353
+ }
354
+ });
355
+ effect(() => {
356
+ if (!this._isBrowser) {
357
+ return;
358
+ }
359
+ const _size = this._resizeEvent(); // just as the trigger
360
+ if (!this._isPointerDown) {
361
+ // only react to resize events when the pointer is down (user is resizing)
362
+ return;
363
+ }
364
+ // If the element is also movable, bake its position to avoid misplacement after resizing
365
+ this._ngnMovable?.bakePosition();
366
+ // calculate the max width & height of the element based on the size, position & body
367
+ const bodyWidth = this._document.body.clientWidth;
368
+ const bodyHeight = this._document.body.clientHeight;
369
+ const elRect = this._el.nativeElement.getBoundingClientRect();
370
+ const maxWidth = bodyWidth - elRect.left;
371
+ const maxHeight = bodyHeight - elRect.top;
372
+ const inputMaxWidth = this.ngnResizableSizeLimits()?.maxWidth;
373
+ const inputMaxHeight = this.ngnResizableSizeLimits()?.maxHeight;
374
+ const formattedMaxWidth = this.formatSizeValue(inputMaxWidth);
375
+ const formattedMaxHeight = this.formatSizeValue(inputMaxHeight);
376
+ this._el.nativeElement.style.maxWidth = formattedMaxWidth
377
+ ? `min(${formattedMaxWidth}, ${maxWidth}px)`
378
+ : `${maxWidth}px`;
379
+ this._el.nativeElement.style.maxHeight = formattedMaxHeight
380
+ ? `min(${formattedMaxHeight}, ${maxHeight}px)`
381
+ : `${maxHeight}px`;
382
+ const inputMinWidth = this.ngnResizableSizeLimits()?.minWidth;
383
+ const inputMinHeight = this.ngnResizableSizeLimits()?.minHeight;
384
+ const formattedMinWidth = this.formatSizeValue(inputMinWidth);
385
+ const formattedMinHeight = this.formatSizeValue(inputMinHeight);
386
+ if (formattedMinWidth) {
387
+ this._el.nativeElement.style.minWidth = formattedMinWidth;
388
+ }
389
+ if (formattedMinHeight) {
390
+ this._el.nativeElement.style.minHeight = formattedMinHeight;
391
+ }
392
+ this.resized.set(true);
393
+ });
394
+ }
395
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnResizable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
396
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgnResizable, isStandalone: true, selector: "[ngnResizable]", inputs: { ngnResizable: { classPropertyName: "ngnResizable", publicName: "ngnResizable", isSignal: true, isRequired: false, transformFunction: null }, ngnResizableSizeLimits: { classPropertyName: "ngnResizableSizeLimits", publicName: "ngnResizableSizeLimits", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "theme.classes({ resizable: !!ngnResizable(), resized: resized()})" } }, ngImport: i0 });
397
+ }
398
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnResizable, decorators: [{
399
+ type: Directive,
400
+ args: [{
401
+ selector: '[ngnResizable]',
402
+ host: {
403
+ '[class]': 'theme.classes({ resizable: !!ngnResizable(), resized: resized()})',
404
+ },
405
+ }]
406
+ }], ctorParameters: () => [], propDecorators: { ngnResizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnResizable", required: false }] }], ngnResizableSizeLimits: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnResizableSizeLimits", required: false }] }] } });
407
+
408
+ class NgnScrollAmount {
409
+ _el = inject(ElementRef);
410
+ scrollTop = signal(this._el.nativeElement.scrollTop, ...(ngDevMode ? [{ debugName: "scrollTop" }] : []));
411
+ scrollLeft = signal(this._el.nativeElement.scrollLeft, ...(ngDevMode ? [{ debugName: "scrollLeft" }] : []));
412
+ _scrollEvent = domEventObservable(this._el.nativeElement, 'scroll');
413
+ constructor() {
414
+ afterRenderEffect(() => {
415
+ const obs = this._scrollEvent.pipe(map(e => {
416
+ const target = e.target;
417
+ return {
418
+ top: target.scrollTop,
419
+ left: target.scrollLeft,
420
+ };
421
+ }));
422
+ obs.subscribe(scroll => {
423
+ this.scrollTop.set(scroll.top);
424
+ this.scrollLeft.set(scroll.left);
425
+ });
426
+ });
427
+ }
428
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnScrollAmount, deps: [], target: i0.ɵɵFactoryTarget.Directive });
429
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.0", type: NgnScrollAmount, isStandalone: true, selector: "[ngnScrollAmount]", ngImport: i0 });
430
+ }
431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnScrollAmount, decorators: [{
432
+ type: Directive,
433
+ args: [{
434
+ selector: '[ngnScrollAmount]',
435
+ }]
436
+ }], ctorParameters: () => [] });
437
+
438
+ /**
439
+ * Generated bundle index. Do not edit.
440
+ */
441
+
442
+ export { NgnAutofocus, NgnDrag, NgnDragScroll, NgnMovable, NgnResizable, NgnScrollAmount };
443
+ //# sourceMappingURL=ngneers-controls-directives.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-directives.mjs","sources":["../../src/directives/autofocus.ts","../../src/directives/drag/drag-base.ts","../../src/directives/drag/drag-scroll.ts","../../src/directives/drag/drag.ts","../../src/directives/movable.ts","../../src/directives/resizable.ts","../../src/directives/scroll-amount.ts","../../src/directives/ngneers-controls-directives.ts"],"sourcesContent":["import {\r\n type AfterViewInit,\r\n booleanAttribute,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\n\r\n@Directive({ selector: '[ngnAutofocus]' })\r\nexport class NgnAutofocus implements AfterViewInit {\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\r\n private readonly _focused = signal(false);\r\n private readonly _isInitialized = signal(false);\r\n\r\n public readonly ngnAutofocus = input(true, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n effect(() => {\r\n if (!this.ngnAutofocus()) {\r\n this._focused.set(false);\r\n }\r\n });\r\n effect(() => {\r\n this.autoFocus();\r\n });\r\n }\r\n\r\n public ngAfterViewInit() {\r\n /**\r\n * The additional microtask ensures that the control is rendered and the\r\n * ngn-control-initializing class is removed before trying to focus the element.\r\n */\r\n if (this._el.nativeElement.getClientRects().length === 0) {\r\n queueMicrotask(() => {\r\n this._isInitialized.set(true);\r\n });\r\n } else {\r\n this._isInitialized.set(true);\r\n }\r\n }\r\n\r\n private autoFocus() {\r\n if (!this._isInitialized()) {\r\n return;\r\n }\r\n if (!this.ngnAutofocus()) {\r\n return;\r\n }\r\n if (this._focused()) {\r\n return;\r\n }\r\n this._el.nativeElement.focus();\r\n this._focused.set(true);\r\n }\r\n}\r\n","import {\r\n afterRenderEffect,\r\n Directive,\r\n DOCUMENT,\r\n ElementRef,\r\n inject,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { domEventHandler, domEventObservable, Platform } from '@ngneers/controls/api/ng';\r\n\r\nimport type { NgnDragInfo } from './types';\r\n\r\n@Directive()\r\nexport abstract class NgnDragBase {\r\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _isBrowser = inject(Platform).isBrowser;\r\n\r\n private _pointerDown = false;\r\n private _startX?: number = undefined;\r\n private _startY?: number = undefined;\r\n\r\n protected readonly isDragging = signal(false);\r\n public readonly dragStart = output<void>();\r\n public readonly dragEnd = output<void>();\r\n public readonly dragged = output<NgnDragInfo>();\r\n\r\n private readonly _pointerDownEvent = domEventObservable(this.el.nativeElement, 'pointerdown');\r\n private readonly _pointerMoveEvent = domEventObservable(this._document, 'pointermove');\r\n private readonly _pointerUpEvent = domEventObservable(this._document, 'pointerup');\r\n\r\n constructor() {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n domEventHandler(this.el.nativeElement, 'touchmove', e => {\r\n if (e.cancelable) {\r\n e.preventDefault();\r\n }\r\n });\r\n afterRenderEffect(() => {\r\n this._pointerDownEvent.subscribe(event => {\r\n this._pointerDown = true;\r\n this._startX = (event as PointerEvent).clientX;\r\n this._startY = (event as PointerEvent).clientY;\r\n });\r\n this._pointerUpEvent.subscribe(() => {\r\n if (!this._pointerDown) {\r\n return;\r\n }\r\n this._pointerDown = false;\r\n this._startX = undefined;\r\n this._startY = undefined;\r\n this.isDragging.set(false);\r\n this.dragEnd.emit();\r\n });\r\n\r\n this._pointerMoveEvent.subscribe(event => {\r\n if (!this._pointerDown) {\r\n return;\r\n }\r\n this.handleDrag(event);\r\n });\r\n });\r\n }\r\n\r\n protected abstract onDragged(delta: NgnDragInfo): void;\r\n\r\n private onDraggedInt(delta: NgnDragInfo) {\r\n this.dragged.emit(delta);\r\n this.onDragged(delta);\r\n }\r\n\r\n private handleDrag(event: Event) {\r\n const { clientX, clientY } = event as PointerEvent;\r\n if (this._startX === undefined || this._startY === undefined) {\r\n throw new Error('Start positions are undefined');\r\n }\r\n const deltaX = clientX - this._startX;\r\n const deltaY = clientY - this._startY;\r\n if (!this.isDragging()) {\r\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\r\n if (distance < 5) {\r\n return;\r\n }\r\n this.isDragging.set(true);\r\n this.dragStart.emit();\r\n }\r\n if (!this.isDragging()) {\r\n return;\r\n }\r\n this._startX = clientX;\r\n this._startY = clientY;\r\n this.onDraggedInt({ deltaX: deltaX, deltaY: deltaY, absoluteX: clientX, absoluteY: clientY });\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\nimport { NgnDragBase } from './drag-base';\r\n\r\nimport type { NgnDragInfo } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnDragScroll]',\r\n})\r\nexport class NgnDragScroll extends NgnDragBase {\r\n protected onDragged(delta: NgnDragInfo): void {\r\n this.el.nativeElement.scrollBy({\r\n left: -delta.deltaX,\r\n top: -delta.deltaY,\r\n behavior: 'auto',\r\n });\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\nimport { NgnDragBase } from './drag-base';\r\n\r\nimport type { NgnDragInfo } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnDrag]',\r\n})\r\nexport class NgnDrag extends NgnDragBase {\r\n protected onDragged(delta: NgnDragInfo): void {\r\n // do nothing\r\n }\r\n}\r\n","import {\r\n booleanAttribute,\r\n computed,\r\n Directive,\r\n DOCUMENT,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { domEventHandler, domEventSignal } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { signalWithPrevious } from '@ngneers/controls/utils-ng';\r\nimport { movableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\r\n\r\n@Directive({\r\n selector: '[ngnMovable]',\r\n})\r\nexport class NgnMovable extends NgnBase<'movable'> {\r\n protected readonly theme = this.injectThemeTemplate(movableDirectiveTemplate, {\r\n movable: () => this.ngnMovable(),\r\n moved: () => this.dragged(),\r\n });\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\r\n private readonly _document = inject(DOCUMENT);\r\n\r\n /**\r\n * Whether the element is movable.\r\n * @default true\r\n */\r\n public readonly ngnMovable = input(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * The handle element used to drag the element. If omitted, the entire element will be used as the drag handle.\r\n * @default null\r\n */\r\n public readonly ngnMovableDragHandle = input<HTMLElement | null>(null);\r\n\r\n /**\r\n * When `true`, the cursor will change to indicate that the element / drag handle is movable.\r\n * @default true\r\n */\r\n public readonly ngnMovableChangeCursor = input(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * When `true`, the movement will be limited to the viewport.\r\n * @default true\r\n */\r\n public readonly ngnMovableLimitToViewport = input(true, { transform: booleanAttribute });\r\n\r\n private readonly _ngnMovableDragHandleWithPrevious = signalWithPrevious(\r\n this.ngnMovableDragHandle,\r\n null\r\n );\r\n\r\n private readonly _eventElement = computed(() => {\r\n const handle = this.ngnMovableDragHandle();\r\n return handle ?? this._el.nativeElement;\r\n });\r\n\r\n protected readonly dragged = signal(false);\r\n\r\n private readonly _pointerDownSignal = domEventSignal(this._eventElement, 'pointerdown');\r\n private readonly _pointerMoveSignal = domEventSignal(this._document, 'pointermove');\r\n private readonly _pointerUpSignal = domEventSignal(this._document, 'pointerup');\r\n\r\n private readonly _isDragging = signal(false);\r\n private _startX = 0;\r\n private _startY = 0;\r\n\r\n constructor() {\r\n super();\r\n\r\n domEventHandler(this._el.nativeElement, 'touchmove', e => {\r\n if (!this.ngnMovable()) {\r\n return;\r\n }\r\n if (e.cancelable) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (!this.ngnMovable()) {\r\n return;\r\n }\r\n const pointerDown = this._pointerDownSignal();\r\n // check if primary button or touch\r\n if (pointerDown && (pointerDown.button === 0 || pointerDown.pointerType === 'touch')) {\r\n this._isDragging.set(true);\r\n this._startX = pointerDown.clientX - this._el.nativeElement.offsetLeft;\r\n this._startY = pointerDown.clientY - this._el.nativeElement.offsetTop;\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (!this.ngnMovable()) {\r\n return;\r\n }\r\n const pointerMove = this._pointerMoveSignal();\r\n if (pointerMove && untracked(this._isDragging)) {\r\n this.dragged.set(true);\r\n const newLeft = pointerMove.clientX - this._startX;\r\n const newTop = pointerMove.clientY - this._startY;\r\n\r\n if (this.ngnMovableLimitToViewport()) {\r\n const documentRect = this._document.documentElement.getBoundingClientRect();\r\n const elRect = this._el.nativeElement.getBoundingClientRect();\r\n\r\n const clampedLeft = Math.min(Math.max(newLeft, 0), documentRect.width - elRect.width);\r\n const clampedTop = Math.min(Math.max(newTop, 0), documentRect.height - elRect.height);\r\n\r\n this._el.nativeElement.style.left = `${clampedLeft}px`;\r\n this._el.nativeElement.style.top = `${clampedTop}px`;\r\n } else {\r\n this._el.nativeElement.style.left = `${pointerMove.clientX - this._startX}px`;\r\n this._el.nativeElement.style.top = `${pointerMove.clientY - this._startY}px`;\r\n }\r\n\r\n this._el.nativeElement.style.width = `${this._el.nativeElement.offsetWidth}px`;\r\n this._el.nativeElement.style.height = `${this._el.nativeElement.offsetHeight}px`;\r\n if (\r\n !['fixed', 'absolute', 'static'].includes(\r\n getComputedStyle(this._el.nativeElement).position\r\n )\r\n ) {\r\n this._el.nativeElement.style.position = 'fixed';\r\n }\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (!this.ngnMovable()) {\r\n return;\r\n }\r\n const pointerUp = this._pointerUpSignal();\r\n if (pointerUp && untracked(this._isDragging)) {\r\n this._isDragging.set(false);\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (!this.ngnMovable()) {\r\n this._isDragging.set(false);\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.refreshCursor();\r\n });\r\n }\r\n\r\n public bakePosition() {\r\n this._el.nativeElement.style.left = `${this._el.nativeElement.offsetLeft}px`;\r\n this._el.nativeElement.style.top = `${this._el.nativeElement.offsetTop}px`;\r\n if (\r\n !['fixed', 'absolute', 'static'].includes(getComputedStyle(this._el.nativeElement).position)\r\n ) {\r\n this._el.nativeElement.style.position = 'fixed';\r\n }\r\n this.dragged.set(true);\r\n }\r\n\r\n private refreshCursor() {\r\n const handle = this._ngnMovableDragHandleWithPrevious();\r\n if (handle.previous && handle.previous !== handle.current) {\r\n handle.previous.classList.remove(\r\n this.theme.class('drag-handle-grab'),\r\n this.theme.class('drag-handle-grabbing')\r\n );\r\n }\r\n if (!this.ngnMovable() || !this.ngnMovableChangeCursor()) {\r\n handle.current?.classList.remove(\r\n this.theme.class('drag-handle-grab'),\r\n this.theme.class('drag-handle-grabbing')\r\n );\r\n return;\r\n }\r\n if (this._isDragging()) {\r\n handle.current?.classList.add(this.theme.class('drag-handle-grabbing'));\r\n handle.current?.classList.remove(this.theme.class('drag-handle-grab'));\r\n } else {\r\n handle.current?.classList.add(this.theme.class('drag-handle-grab'));\r\n handle.current?.classList.remove(this.theme.class('drag-handle-grabbing'));\r\n }\r\n }\r\n}\r\n","import { Directive, DOCUMENT, effect, ElementRef, inject, input, signal } from '@angular/core';\r\nimport {\r\n domEventSignal,\r\n elementSizeSignal,\r\n injectThemeTemplate,\r\n Platform,\r\n} from '@ngneers/controls/api/ng';\r\nimport { resizableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\r\n\r\nimport { NgnMovable } from './movable';\r\n\r\n@Directive({\r\n selector: '[ngnResizable]',\r\n host: {\r\n '[class]': 'theme.classes({ resizable: !!ngnResizable(), resized: resized()})',\r\n },\r\n})\r\nexport class NgnResizable {\r\n protected readonly theme = injectThemeTemplate(resizableDirectiveTemplate);\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\r\n private readonly _isBrowser = inject(Platform).isBrowser;\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _ngnMovable = inject(NgnMovable, { optional: true });\r\n private _isPointerDown = false;\r\n\r\n /**\r\n * Whether the element is resizable.\r\n */\r\n public readonly ngnResizable = input<boolean | null | undefined | ''>(true);\r\n /**\r\n * The maximum size of the resizable element.\r\n */\r\n public readonly ngnResizableSizeLimits = input<{\r\n minWidth: string | number | null | undefined;\r\n minHeight: string | number | null | undefined;\r\n maxWidth: string | number | null | undefined;\r\n maxHeight: string | number | null | undefined;\r\n }>();\r\n\r\n protected readonly resized = signal(false);\r\n\r\n private readonly _pointerDownSignal = domEventSignal(this._el, 'pointerdown');\r\n private readonly _pointerUpSignal = domEventSignal(this._document, 'pointerup');\r\n\r\n private readonly _resizeEvent = elementSizeSignal(this._el);\r\n\r\n /**\r\n * Formats a size value from string | number | null | undefined to a CSS string.\r\n * @param value The size value to format\r\n * @returns The formatted CSS string or null if the value is null/undefined\r\n */\r\n private formatSizeValue(value: string | number | null | undefined): string | null {\r\n if (value === null || value === undefined) {\r\n return null;\r\n }\r\n return typeof value === 'number' ? `${value}px` : value;\r\n }\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this._pointerDownSignal()) {\r\n this._isPointerDown = true;\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (this._pointerUpSignal()) {\r\n this._isPointerDown = false;\r\n }\r\n });\r\n\r\n effect(() => {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n const _size = this._resizeEvent(); // just as the trigger\r\n if (!this._isPointerDown) {\r\n // only react to resize events when the pointer is down (user is resizing)\r\n return;\r\n }\r\n\r\n // If the element is also movable, bake its position to avoid misplacement after resizing\r\n this._ngnMovable?.bakePosition();\r\n\r\n // calculate the max width & height of the element based on the size, position & body\r\n\r\n const bodyWidth = this._document.body.clientWidth;\r\n const bodyHeight = this._document.body.clientHeight;\r\n\r\n const elRect = this._el.nativeElement.getBoundingClientRect();\r\n\r\n const maxWidth = bodyWidth - elRect.left;\r\n const maxHeight = bodyHeight - elRect.top;\r\n\r\n const inputMaxWidth = this.ngnResizableSizeLimits()?.maxWidth;\r\n const inputMaxHeight = this.ngnResizableSizeLimits()?.maxHeight;\r\n const formattedMaxWidth = this.formatSizeValue(inputMaxWidth);\r\n const formattedMaxHeight = this.formatSizeValue(inputMaxHeight);\r\n\r\n this._el.nativeElement.style.maxWidth = formattedMaxWidth\r\n ? `min(${formattedMaxWidth}, ${maxWidth}px)`\r\n : `${maxWidth}px`;\r\n this._el.nativeElement.style.maxHeight = formattedMaxHeight\r\n ? `min(${formattedMaxHeight}, ${maxHeight}px)`\r\n : `${maxHeight}px`;\r\n\r\n const inputMinWidth = this.ngnResizableSizeLimits()?.minWidth;\r\n const inputMinHeight = this.ngnResizableSizeLimits()?.minHeight;\r\n const formattedMinWidth = this.formatSizeValue(inputMinWidth);\r\n const formattedMinHeight = this.formatSizeValue(inputMinHeight);\r\n\r\n if (formattedMinWidth) {\r\n this._el.nativeElement.style.minWidth = formattedMinWidth;\r\n }\r\n if (formattedMinHeight) {\r\n this._el.nativeElement.style.minHeight = formattedMinHeight;\r\n }\r\n\r\n this.resized.set(true);\r\n });\r\n }\r\n}\r\n","import { afterRenderEffect, Directive, ElementRef, inject, signal } from '@angular/core';\r\nimport { domEventObservable } from '@ngneers/controls/api/ng';\r\nimport { map } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[ngnScrollAmount]',\r\n})\r\nexport class NgnScrollAmount {\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n public readonly scrollTop = signal(this._el.nativeElement.scrollTop);\r\n public readonly scrollLeft = signal(this._el.nativeElement.scrollLeft);\r\n private readonly _scrollEvent = domEventObservable(this._el.nativeElement, 'scroll');\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n const obs = this._scrollEvent.pipe(\r\n map(e => {\r\n const target = e.target as HTMLElement;\r\n return {\r\n top: target.scrollTop,\r\n left: target.scrollLeft,\r\n };\r\n })\r\n );\r\n obs.subscribe(scroll => {\r\n this.scrollTop.set(scroll.top);\r\n this.scrollLeft.set(scroll.left);\r\n });\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}