@ngneers/controls 0.0.1-pre1 → 0.0.1-pre3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/fesm2022/ngneers-controls-accordion.mjs +194 -0
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api-ng.mjs +668 -0
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api.mjs +256 -227
- package/fesm2022/ngneers-controls-api.mjs.map +1 -1
- package/fesm2022/ngneers-controls-avatar.mjs +70 -0
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +397 -0
- package/fesm2022/ngneers-controls-base.mjs.map +1 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs +74 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button-group.mjs +51 -0
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button.mjs +62 -0
- package/fesm2022/ngneers-controls-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs +63 -0
- package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar.mjs +468 -0
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-checkbox.mjs +58 -0
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
- package/fesm2022/ngneers-controls-chip.mjs +52 -0
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +43 -0
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-dialog.mjs +329 -33
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +443 -0
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
- package/fesm2022/ngneers-controls-drawer.mjs +232 -0
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs +120 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-filter.mjs +516 -0
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs +87 -0
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs +87 -0
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +57 -0
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon.mjs +60 -18
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +107 -0
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-field.mjs +141 -0
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-mask.mjs +282 -0
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input.mjs +69 -0
- package/fesm2022/ngneers-controls-input.mjs.map +1 -0
- package/fesm2022/ngneers-controls-item-view.mjs +441 -0
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
- package/fesm2022/ngneers-controls-list-box.mjs +157 -53
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +332 -0
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-message.mjs +29 -0
- package/fesm2022/ngneers-controls-message.mjs.map +1 -0
- package/fesm2022/ngneers-controls-paginator.mjs +111 -0
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
- package/fesm2022/ngneers-controls-popover.mjs +129 -40
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +82 -0
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +162 -78
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +55 -0
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-select.mjs +313 -103
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +155 -0
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
- package/fesm2022/ngneers-controls-spinner.mjs +169 -0
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
- package/fesm2022/ngneers-controls-splitter.mjs +717 -0
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +39 -0
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
- package/fesm2022/ngneers-controls-table.mjs +379 -0
- package/fesm2022/ngneers-controls-table.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tabs.mjs +287 -0
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tag.mjs +29 -0
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toast.mjs +184 -0
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs +65 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tooltip.mjs +454 -0
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs +227 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils.mjs +217 -60
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/fesm2022/ngneers-controls.mjs.map +1 -1
- package/package.json +167 -32
- package/types/ngneers-controls-accordion.d.ts +114 -0
- package/types/ngneers-controls-api-ng.d.ts +291 -0
- package/types/ngneers-controls-api.d.ts +99 -0
- package/types/ngneers-controls-avatar.d.ts +50 -0
- package/types/ngneers-controls-base.d.ts +166 -0
- package/types/ngneers-controls-breadcrumb.d.ts +86 -0
- package/types/ngneers-controls-button-group.d.ts +30 -0
- package/types/ngneers-controls-button.d.ts +34 -0
- package/types/ngneers-controls-calendar.d.ts +275 -0
- package/types/ngneers-controls-checkbox.d.ts +38 -0
- package/types/ngneers-controls-chip.d.ts +37 -0
- package/types/ngneers-controls-defer.d.ts +22 -0
- package/types/ngneers-controls-dialog.d.ts +218 -0
- package/types/ngneers-controls-directives.d.ts +146 -0
- package/types/ngneers-controls-drawer.d.ts +220 -0
- package/types/ngneers-controls-edit-inplace.d.ts +182 -0
- package/types/ngneers-controls-filter.d.ts +304 -0
- package/types/ngneers-controls-i18n.d.ts +108 -0
- package/types/ngneers-controls-icon.d.ts +74 -0
- package/types/ngneers-controls-inplace.d.ts +95 -0
- package/types/ngneers-controls-input-field.d.ts +159 -0
- package/types/ngneers-controls-input-mask.d.ts +83 -0
- package/types/ngneers-controls-input.d.ts +27 -0
- package/types/ngneers-controls-item-view.d.ts +211 -0
- package/types/ngneers-controls-list-box.d.ts +216 -0
- package/types/ngneers-controls-menu.d.ts +178 -0
- package/types/ngneers-controls-message.d.ts +19 -0
- package/types/ngneers-controls-paginator.d.ts +162 -0
- package/types/ngneers-controls-popover.d.ts +101 -0
- package/types/ngneers-controls-progress.d.ts +44 -0
- package/types/ngneers-controls-scroller.d.ts +137 -0
- package/types/ngneers-controls-select-button.d.ts +37 -0
- package/types/ngneers-controls-select.d.ts +314 -0
- package/types/ngneers-controls-slider.d.ts +53 -0
- package/types/ngneers-controls-spinner.d.ts +105 -0
- package/types/ngneers-controls-splitter.d.ts +391 -0
- package/types/ngneers-controls-switch.d.ts +18 -0
- package/types/ngneers-controls-table.d.ts +157 -0
- package/types/ngneers-controls-tabs.d.ts +106 -0
- package/types/ngneers-controls-tag.d.ts +19 -0
- package/types/ngneers-controls-toast.d.ts +70 -0
- package/types/ngneers-controls-toggle-button.d.ts +46 -0
- package/types/ngneers-controls-tooltip.d.ts +188 -0
- package/types/ngneers-controls-utils-ng.d.ts +57 -0
- package/types/ngneers-controls-utils.d.ts +130 -0
- package/api/index.d.ts +0 -134
- package/custom-types/index.d.ts +0 -7
- package/dialog/index.d.ts +0 -43
- package/fesm2022/ngneers-controls-custom-types.mjs +0 -4
- package/fesm2022/ngneers-controls-custom-types.mjs.map +0 -1
- package/fesm2022/ngneers-controls-form-field.mjs +0 -33
- package/fesm2022/ngneers-controls-form-field.mjs.map +0 -1
- package/fesm2022/ngneers-controls-lazy-cacher.mjs +0 -30
- package/fesm2022/ngneers-controls-lazy-cacher.mjs.map +0 -1
- package/fesm2022/ngneers-controls-text-field.mjs +0 -23
- package/fesm2022/ngneers-controls-text-field.mjs.map +0 -1
- package/form-field/index.d.ts +0 -19
- package/icon/index.d.ts +0 -30
- package/lazy-cacher/index.d.ts +0 -14
- package/list-box/index.d.ts +0 -58
- package/popover/index.d.ts +0 -41
- package/scroller/index.d.ts +0 -95
- package/select/index.d.ts +0 -86
- package/text-field/index.d.ts +0 -10
- package/utils/index.d.ts +0 -36
- /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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"}
|