@ngutil/graphics 0.0.3-dev.9 → 0.0.4
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/esm2022/index.mjs +2 -2
- package/esm2022/ripple/ripple.directive.mjs +157 -0
- package/fesm2022/ngutil-graphics.mjs +155 -10
- package/fesm2022/ngutil-graphics.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/package.json +3 -2
- package/ripple/ripple.directive.d.ts +33 -0
- package/esm2022/lib/graphics/graphics.component.mjs +0 -12
- package/lib/graphics/graphics.component.d.ts +0 -5
package/esm2022/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from "./ripple/ripple.directive";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaGljcy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlXCJcbiJdfQ==
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Directive, ElementRef, NgZone, TemplateRef } from "@angular/core";
|
|
2
|
+
import { Destructible } from "@ngutil/common";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class RippleDirective extends Destructible {
|
|
5
|
+
#current;
|
|
6
|
+
constructor(tplRef, zone, el) {
|
|
7
|
+
super();
|
|
8
|
+
this.tplRef = tplRef;
|
|
9
|
+
this.zone = zone;
|
|
10
|
+
this.el = el;
|
|
11
|
+
zone.runOutsideAngular(() => {
|
|
12
|
+
const target = el.nativeElement.parentElement;
|
|
13
|
+
if (target) {
|
|
14
|
+
target.addEventListener("mousedown", this.#onMouseDown);
|
|
15
|
+
this.d.any(() => target.removeEventListener("mousedown", this.#onMouseDown));
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
begin(event) {
|
|
20
|
+
this.#current?.autoDestroy();
|
|
21
|
+
const cfg = this.#createRippleConfig(event);
|
|
22
|
+
const ripple = this.#createRipple(cfg);
|
|
23
|
+
this.#current = ripple;
|
|
24
|
+
const refEl = this.tplRef.elementRef.nativeElement;
|
|
25
|
+
refEl.parentNode?.insertBefore(ripple.el, refEl);
|
|
26
|
+
ripple.start();
|
|
27
|
+
}
|
|
28
|
+
end() {
|
|
29
|
+
this.#current?.autoDestroy();
|
|
30
|
+
}
|
|
31
|
+
#createRipple(config) {
|
|
32
|
+
const ripple = new Ripple(config, this.zone, () => {
|
|
33
|
+
if (this.#current === ripple) {
|
|
34
|
+
this.#current = undefined;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
this.d.disposable(ripple);
|
|
38
|
+
return ripple;
|
|
39
|
+
}
|
|
40
|
+
#createRippleConfig(event) {
|
|
41
|
+
const container = event.currentTarget;
|
|
42
|
+
const bounds = container.getBoundingClientRect();
|
|
43
|
+
const w = bounds.width;
|
|
44
|
+
const h = bounds.height;
|
|
45
|
+
const x = event.clientX - bounds.left;
|
|
46
|
+
const y = event.clientY - bounds.top;
|
|
47
|
+
const r = maxPossibleRadius(x, y, w, h) + Math.min(w, h);
|
|
48
|
+
return { x, y, w, h, r, d: 600 };
|
|
49
|
+
}
|
|
50
|
+
#onMouseDown = (event) => {
|
|
51
|
+
this.begin(event);
|
|
52
|
+
};
|
|
53
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: RippleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
54
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: RippleDirective, isStandalone: true, selector: "ng-template[nuRipple]", exportAs: ["nuRipple"], usesInheritance: true, ngImport: i0 }); }
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: RippleDirective, decorators: [{
|
|
57
|
+
type: Directive,
|
|
58
|
+
args: [{
|
|
59
|
+
standalone: true,
|
|
60
|
+
selector: "ng-template[nuRipple]",
|
|
61
|
+
exportAs: "nuRipple"
|
|
62
|
+
}]
|
|
63
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.NgZone }, { type: i0.ElementRef }] });
|
|
64
|
+
export class Ripple {
|
|
65
|
+
#autoDestroy;
|
|
66
|
+
#hiding;
|
|
67
|
+
constructor(config, zone, onDestroy) {
|
|
68
|
+
this.onDestroy = onDestroy;
|
|
69
|
+
this.isRunning = false;
|
|
70
|
+
this.#autoDestroy = false;
|
|
71
|
+
this.#hiding = false;
|
|
72
|
+
this.autoDestroy = () => {
|
|
73
|
+
if (this.isRunning) {
|
|
74
|
+
this.#autoDestroy = true;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.#fadeOut();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.#transBegin = () => {
|
|
81
|
+
// eslint-disable-next-line no-extra-semi
|
|
82
|
+
;
|
|
83
|
+
this.isRunning = true;
|
|
84
|
+
};
|
|
85
|
+
this.#transEnd = (event) => {
|
|
86
|
+
if (event.propertyName === "opacity") {
|
|
87
|
+
if (this.#hiding) {
|
|
88
|
+
this.dispose();
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (this.#autoDestroy) {
|
|
92
|
+
this.#fadeOut();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (event.propertyName === "transform") {
|
|
97
|
+
// eslint-disable-next-line no-extra-semi
|
|
98
|
+
;
|
|
99
|
+
this.isRunning = false;
|
|
100
|
+
if (this.#autoDestroy) {
|
|
101
|
+
this.dispose();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const el = document.createElement("div");
|
|
106
|
+
el.style.position = "absolute";
|
|
107
|
+
el.style.top = `${config.y - config.r}px`;
|
|
108
|
+
el.style.left = `${config.x - config.r}px`;
|
|
109
|
+
el.style.width = `${config.r * 2}px`;
|
|
110
|
+
el.style.height = `${config.r * 2}px`;
|
|
111
|
+
el.style.pointerEvents = "none";
|
|
112
|
+
el.style.backgroundColor = "var(--ripple-color)";
|
|
113
|
+
el.style.borderRadius = "50%";
|
|
114
|
+
el.style.transition = `opacity ${config.d / 2}ms ease-out, transform ${config.d}ms ease-out`;
|
|
115
|
+
el.style.opacity = "0";
|
|
116
|
+
el.style.transformOrigin = "center";
|
|
117
|
+
el.style.transform = "scale(0)";
|
|
118
|
+
this.el = el;
|
|
119
|
+
zone.runOutsideAngular(() => {
|
|
120
|
+
el.addEventListener("transitionstart", this.#transBegin);
|
|
121
|
+
el.addEventListener("transitionend", this.#transEnd);
|
|
122
|
+
document.addEventListener("mouseup", this.autoDestroy, { capture: true, passive: true });
|
|
123
|
+
document.addEventListener("dragend", this.autoDestroy, { capture: true, passive: true });
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
start() {
|
|
127
|
+
// eslint-disable-next-line no-extra-semi
|
|
128
|
+
;
|
|
129
|
+
this.isRunning = true;
|
|
130
|
+
// XXX: force style apply
|
|
131
|
+
const opacity = typeof window !== "undefined" ? Number(window.getComputedStyle(this.el).opacity) : 1;
|
|
132
|
+
this.el.style.opacity = opacity ? "0.3" : "0.3";
|
|
133
|
+
this.el.style.transform = "scale(1)";
|
|
134
|
+
}
|
|
135
|
+
dispose() {
|
|
136
|
+
this.el.removeEventListener("transitionstart", this.#transBegin);
|
|
137
|
+
this.el.removeEventListener("transitionend", this.#transEnd);
|
|
138
|
+
document.removeEventListener("mouseup", this.autoDestroy, { capture: true });
|
|
139
|
+
this.el.parentNode?.removeChild(this.el);
|
|
140
|
+
this.onDestroy();
|
|
141
|
+
}
|
|
142
|
+
#transBegin;
|
|
143
|
+
#transEnd;
|
|
144
|
+
#fadeOut() {
|
|
145
|
+
if (this.#hiding) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.#hiding = true;
|
|
149
|
+
this.el.style.opacity = "0";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function maxPossibleRadius(x, y, w, h) {
|
|
153
|
+
const distX = Math.max(x, Math.abs(w - x));
|
|
154
|
+
const distY = Math.max(y, Math.abs(h - y));
|
|
155
|
+
return Math.sqrt(distX * distX + distY * distY);
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoaWNzL3NyYy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFFLE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQTs7QUFPMUQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsWUFBWTtJQUM3QyxRQUFRLENBQVM7SUFFakIsWUFDcUIsTUFBd0IsRUFDeEIsSUFBWSxFQUNaLEVBQW9CO1FBRXJDLEtBQUssRUFBRSxDQUFBO1FBSlUsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFDeEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLE9BQUUsR0FBRixFQUFFLENBQWtCO1FBR3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUE7WUFDN0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDVCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFDdkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtZQUNoRixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQWlCO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUE7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtB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SSxDQUFBO1FBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDL0IsQ0FBQztDQUNKO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUE7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgTmdab25lLCBUZW1wbGF0ZVJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgRGVzdHJ1Y3RpYmxlLCBJRGlzcG9zYWJsZSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6IFwibmctdGVtcGxhdGVbbnVSaXBwbGVdXCIsXG4gICAgZXhwb3J0QXM6IFwibnVSaXBwbGVcIlxufSlcbmV4cG9ydCBjbGFzcyBSaXBwbGVEaXJlY3RpdmUgZXh0ZW5kcyBEZXN0cnVjdGlibGUge1xuICAgICNjdXJyZW50PzogUmlwcGxlXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cGxSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmPE5vZGU+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLiNvbk1vdXNlRG93bilcbiAgICAgICAgICAgICAgICB0aGlzLmQuYW55KCgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMuI29uTW91c2VEb3duKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBiZWdpbihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLiNjdXJyZW50Py5hdXRvRGVzdHJveSgpXG4gICAgICAgIGNvbnN0IGNmZyA9IHRoaXMuI2NyZWF0ZVJpcHBsZUNvbmZpZyhldmVudClcbiAgICAgICAgY29uc3QgcmlwcGxlID0gdGhpcy4jY3JlYXRlUmlwcGxlKGNmZylcbiAgICAgICAgdGhpcy4jY3VycmVudCA9IHJpcHBsZVxuXG4gICAgICAgIGNvbnN0IHJlZkVsID0gdGhpcy50cGxSZWYuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50XG4gICAgICAgIHJlZkVsLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShyaXBwbGUuZWwsIHJlZkVsKVxuICAgICAgICByaXBwbGUuc3RhcnQoKVxuICAgIH1cblxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy4jY3VycmVudD8uYXV0b0Rlc3Ryb3koKVxuICAgIH1cblxuICAgICNjcmVhdGVSaXBwbGUoY29uZmlnOiBSaXBwbGVDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmlwcGxlID0gbmV3IFJpcHBsZShjb25maWcsIHRoaXMuem9uZSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnQgPT09IHJpcHBsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnQgPSB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kLmRpc3Bvc2FibGUocmlwcGxlKVxuICAgICAgICByZXR1cm4gcmlwcGxlXG4gICAgfVxuXG4gICAgI2NyZWF0ZVJpcHBsZUNvbmZpZyhldmVudDogTW91c2VFdmVudCk6IFJpcHBsZUNvbmZpZyB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGNvbnN0IHcgPSBib3VuZHMud2lkdGhcbiAgICAgICAgY29uc3QgaCA9IGJvdW5kcy5oZWlnaHRcbiAgICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSBib3VuZHMubGVmdFxuICAgICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIGJvdW5kcy50b3BcbiAgICAgICAgY29uc3QgciA9IG1heFBvc3NpYmxlUmFkaXVzKHgsIHksIHcsIGgpICsgTWF0aC5taW4odywgaClcbiAgICAgICAgcmV0dXJuIHsgeCwgeSwgdywgaCwgciwgZDogNjAwIH1cbiAgICB9XG5cbiAgICAjb25Nb3VzZURvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5iZWdpbihldmVudClcbiAgICB9XG59XG5cbnR5cGUgUmlwcGxlQ29uZmlnID0geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXI7IHI6IG51bWJlcjsgZDogbnVtYmVyIH1cblxuZXhwb3J0IGNsYXNzIFJpcHBsZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWw6IEhUTUxEaXZFbGVtZW50XG4gICAgcHVibGljIHJlYWRvbmx5IGlzUnVubmluZzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICAjYXV0b0Rlc3Ryb3kgPSBmYWxzZVxuICAgICNoaWRpbmcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbmZpZzogUmlwcGxlQ29uZmlnLFxuICAgICAgICB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvbkRlc3Ryb3k6ICgpID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiXG4gICAgICAgIGVsLnN0eWxlLnRvcCA9IGAke2NvbmZpZy55IC0gY29uZmlnLnJ9cHhgXG4gICAgICAgIGVsLnN0eWxlLmxlZnQgPSBgJHtjb25maWcueCAtIGNvbmZpZy5yfXB4YFxuICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGAke2NvbmZpZy5yICogMn1weGBcbiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gYCR7Y29uZmlnLnIgKiAyfXB4YFxuICAgICAgICBlbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCJcbiAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJ2YXIoLS1yaXBwbGUtY29sb3IpXCJcbiAgICAgICAgZWwuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCI1MCVcIlxuICAgICAgICBlbC5zdHlsZS50cmFuc2l0aW9uID0gYG9wYWNpdHkgJHtjb25maWcuZCAvIDJ9bXMgZWFzZS1vdXQsIHRyYW5zZm9ybSAke2NvbmZpZy5kfW1zIGVhc2Utb3V0YFxuICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gXCIwXCJcbiAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gXCJjZW50ZXJcIlxuICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBcInNjYWxlKDApXCJcbiAgICAgICAgdGhpcy5lbCA9IGVsXG5cbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbnN0YXJ0XCIsIHRoaXMuI3RyYW5zQmVnaW4pXG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCB0aGlzLiN0cmFuc0VuZClcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuYXV0b0Rlc3Ryb3ksIHsgY2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdlbmRcIiwgdGhpcy5hdXRvRGVzdHJveSwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1zZW1pXG4gICAgICAgIDsodGhpcyBhcyB7IGlzUnVubmluZzogYm9vbGVhbiB9KS5pc1J1bm5pbmcgPSB0cnVlXG4gICAgICAgIC8vIFhYWDogZm9yY2Ugc3R5bGUgYXBwbHlcbiAgICAgICAgY29uc3Qgb3BhY2l0eSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyBOdW1iZXIod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbCkub3BhY2l0eSkgOiAxXG4gICAgICAgIHRoaXMuZWwuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHkgPyBcIjAuM1wiIDogXCIwLjNcIlxuICAgICAgICB0aGlzLmVsLnN0eWxlLnRyYW5zZm9ybSA9IFwic2NhbGUoMSlcIlxuICAgIH1cblxuICAgIGF1dG9EZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI2F1dG9EZXN0cm95ID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZmFkZU91dCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uc3RhcnRcIiwgdGhpcy4jdHJhbnNCZWdpbilcbiAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCB0aGlzLiN0cmFuc0VuZClcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5hdXRvRGVzdHJveSwgeyBjYXB0dXJlOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuZWwucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5lbClcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3koKVxuICAgIH1cblxuICAgICN0cmFuc0JlZ2luID0gKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0cmEtc2VtaVxuICAgICAgICA7KHRoaXMgYXMgeyBpc1J1bm5pbmc6IGJvb2xlYW4gfSkuaXNSdW5uaW5nID0gdHJ1ZVxuICAgIH1cblxuICAgICN0cmFuc0VuZCA9IChldmVudDogVHJhbnNpdGlvbkV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5wcm9wZXJ0eU5hbWUgPT09IFwib3BhY2l0eVwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGlkaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2F1dG9EZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2ZhZGVPdXQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5wcm9wZXJ0eU5hbWUgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1zZW1pXG4gICAgICAgICAgICA7KHRoaXMgYXMgeyBpc1J1bm5pbmc6IGJvb2xlYW4gfSkuaXNSdW5uaW5nID0gZmFsc2VcbiAgICAgICAgICAgIGlmICh0aGlzLiNhdXRvRGVzdHJveSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZmFkZU91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2hpZGluZykge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaGlkaW5nID0gdHJ1ZVxuICAgICAgICB0aGlzLmVsLnN0eWxlLm9wYWNpdHkgPSBcIjBcIlxuICAgIH1cbn1cblxuZnVuY3Rpb24gbWF4UG9zc2libGVSYWRpdXMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKSB7XG4gICAgY29uc3QgZGlzdFggPSBNYXRoLm1heCh4LCBNYXRoLmFicyh3IC0geCkpXG4gICAgY29uc3QgZGlzdFkgPSBNYXRoLm1heCh5LCBNYXRoLmFicyhoIC0geSkpXG4gICAgcmV0dXJuIE1hdGguc3FydChkaXN0WCAqIGRpc3RYICsgZGlzdFkgKiBkaXN0WSlcbn1cbiJdfQ==
|
|
@@ -1,19 +1,164 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
1
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
2
|
+
import { Directive } from '@angular/core';
|
|
3
|
+
import { Destructible } from '@ngutil/common';
|
|
4
4
|
|
|
5
|
-
class
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
class RippleDirective extends Destructible {
|
|
6
|
+
#current;
|
|
7
|
+
constructor(tplRef, zone, el) {
|
|
8
|
+
super();
|
|
9
|
+
this.tplRef = tplRef;
|
|
10
|
+
this.zone = zone;
|
|
11
|
+
this.el = el;
|
|
12
|
+
zone.runOutsideAngular(() => {
|
|
13
|
+
const target = el.nativeElement.parentElement;
|
|
14
|
+
if (target) {
|
|
15
|
+
target.addEventListener("mousedown", this.#onMouseDown);
|
|
16
|
+
this.d.any(() => target.removeEventListener("mousedown", this.#onMouseDown));
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
begin(event) {
|
|
21
|
+
this.#current?.autoDestroy();
|
|
22
|
+
const cfg = this.#createRippleConfig(event);
|
|
23
|
+
const ripple = this.#createRipple(cfg);
|
|
24
|
+
this.#current = ripple;
|
|
25
|
+
const refEl = this.tplRef.elementRef.nativeElement;
|
|
26
|
+
refEl.parentNode?.insertBefore(ripple.el, refEl);
|
|
27
|
+
ripple.start();
|
|
28
|
+
}
|
|
29
|
+
end() {
|
|
30
|
+
this.#current?.autoDestroy();
|
|
31
|
+
}
|
|
32
|
+
#createRipple(config) {
|
|
33
|
+
const ripple = new Ripple(config, this.zone, () => {
|
|
34
|
+
if (this.#current === ripple) {
|
|
35
|
+
this.#current = undefined;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
this.d.disposable(ripple);
|
|
39
|
+
return ripple;
|
|
40
|
+
}
|
|
41
|
+
#createRippleConfig(event) {
|
|
42
|
+
const container = event.currentTarget;
|
|
43
|
+
const bounds = container.getBoundingClientRect();
|
|
44
|
+
const w = bounds.width;
|
|
45
|
+
const h = bounds.height;
|
|
46
|
+
const x = event.clientX - bounds.left;
|
|
47
|
+
const y = event.clientY - bounds.top;
|
|
48
|
+
const r = maxPossibleRadius(x, y, w, h) + Math.min(w, h);
|
|
49
|
+
return { x, y, w, h, r, d: 600 };
|
|
50
|
+
}
|
|
51
|
+
#onMouseDown = (event) => {
|
|
52
|
+
this.begin(event);
|
|
53
|
+
};
|
|
54
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: RippleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
55
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: RippleDirective, isStandalone: true, selector: "ng-template[nuRipple]", exportAs: ["nuRipple"], usesInheritance: true, ngImport: i0 }); }
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: RippleDirective, decorators: [{
|
|
58
|
+
type: Directive,
|
|
59
|
+
args: [{
|
|
60
|
+
standalone: true,
|
|
61
|
+
selector: "ng-template[nuRipple]",
|
|
62
|
+
exportAs: "nuRipple"
|
|
63
|
+
}]
|
|
64
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.NgZone }, { type: i0.ElementRef }] });
|
|
65
|
+
class Ripple {
|
|
66
|
+
#autoDestroy;
|
|
67
|
+
#hiding;
|
|
68
|
+
constructor(config, zone, onDestroy) {
|
|
69
|
+
this.onDestroy = onDestroy;
|
|
70
|
+
this.isRunning = false;
|
|
71
|
+
this.#autoDestroy = false;
|
|
72
|
+
this.#hiding = false;
|
|
73
|
+
this.autoDestroy = () => {
|
|
74
|
+
if (this.isRunning) {
|
|
75
|
+
this.#autoDestroy = true;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.#fadeOut();
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
this.#transBegin = () => {
|
|
82
|
+
// eslint-disable-next-line no-extra-semi
|
|
83
|
+
;
|
|
84
|
+
this.isRunning = true;
|
|
85
|
+
};
|
|
86
|
+
this.#transEnd = (event) => {
|
|
87
|
+
if (event.propertyName === "opacity") {
|
|
88
|
+
if (this.#hiding) {
|
|
89
|
+
this.dispose();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (this.#autoDestroy) {
|
|
93
|
+
this.#fadeOut();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (event.propertyName === "transform") {
|
|
98
|
+
// eslint-disable-next-line no-extra-semi
|
|
99
|
+
;
|
|
100
|
+
this.isRunning = false;
|
|
101
|
+
if (this.#autoDestroy) {
|
|
102
|
+
this.dispose();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const el = document.createElement("div");
|
|
107
|
+
el.style.position = "absolute";
|
|
108
|
+
el.style.top = `${config.y - config.r}px`;
|
|
109
|
+
el.style.left = `${config.x - config.r}px`;
|
|
110
|
+
el.style.width = `${config.r * 2}px`;
|
|
111
|
+
el.style.height = `${config.r * 2}px`;
|
|
112
|
+
el.style.pointerEvents = "none";
|
|
113
|
+
el.style.backgroundColor = "var(--ripple-color)";
|
|
114
|
+
el.style.borderRadius = "50%";
|
|
115
|
+
el.style.transition = `opacity ${config.d / 2}ms ease-out, transform ${config.d}ms ease-out`;
|
|
116
|
+
el.style.opacity = "0";
|
|
117
|
+
el.style.transformOrigin = "center";
|
|
118
|
+
el.style.transform = "scale(0)";
|
|
119
|
+
this.el = el;
|
|
120
|
+
zone.runOutsideAngular(() => {
|
|
121
|
+
el.addEventListener("transitionstart", this.#transBegin);
|
|
122
|
+
el.addEventListener("transitionend", this.#transEnd);
|
|
123
|
+
document.addEventListener("mouseup", this.autoDestroy, { capture: true, passive: true });
|
|
124
|
+
document.addEventListener("dragend", this.autoDestroy, { capture: true, passive: true });
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
start() {
|
|
128
|
+
// eslint-disable-next-line no-extra-semi
|
|
129
|
+
;
|
|
130
|
+
this.isRunning = true;
|
|
131
|
+
// XXX: force style apply
|
|
132
|
+
const opacity = typeof window !== "undefined" ? Number(window.getComputedStyle(this.el).opacity) : 1;
|
|
133
|
+
this.el.style.opacity = opacity ? "0.3" : "0.3";
|
|
134
|
+
this.el.style.transform = "scale(1)";
|
|
135
|
+
}
|
|
136
|
+
dispose() {
|
|
137
|
+
this.el.removeEventListener("transitionstart", this.#transBegin);
|
|
138
|
+
this.el.removeEventListener("transitionend", this.#transEnd);
|
|
139
|
+
document.removeEventListener("mouseup", this.autoDestroy, { capture: true });
|
|
140
|
+
this.el.parentNode?.removeChild(this.el);
|
|
141
|
+
this.onDestroy();
|
|
142
|
+
}
|
|
143
|
+
#transBegin;
|
|
144
|
+
#transEnd;
|
|
145
|
+
#fadeOut() {
|
|
146
|
+
if (this.#hiding) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this.#hiding = true;
|
|
150
|
+
this.el.style.opacity = "0";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function maxPossibleRadius(x, y, w, h) {
|
|
154
|
+
const distX = Math.max(x, Math.abs(w - x));
|
|
155
|
+
const distY = Math.max(y, Math.abs(h - y));
|
|
156
|
+
return Math.sqrt(distX * distX + distY * distY);
|
|
8
157
|
}
|
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: GraphicsComponent, decorators: [{
|
|
10
|
-
type: Component,
|
|
11
|
-
args: [{ selector: "nu-graphics", standalone: true, imports: [CommonModule], template: `<p>graphics works!</p>` }]
|
|
12
|
-
}] });
|
|
13
158
|
|
|
14
159
|
/**
|
|
15
160
|
* Generated bundle index. Do not edit.
|
|
16
161
|
*/
|
|
17
162
|
|
|
18
|
-
export {
|
|
163
|
+
export { Ripple, RippleDirective };
|
|
19
164
|
//# sourceMappingURL=ngutil-graphics.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngutil-graphics.mjs","sources":["../../../../packages/graphics/src/lib/graphics/graphics.component.ts","../../../../packages/graphics/src/ngutil-graphics.ts"],"sourcesContent":["import { CommonModule } from \"@angular/common\"\nimport { Component } from \"@angular/core\"\n\n@Component({\n selector: \"nu-graphics\",\n standalone: true,\n imports: [CommonModule],\n template: `<p>graphics works!</p>`,\n styleUrl: \"./graphics.component.scss\"\n})\nexport class GraphicsComponent {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAUa,iBAAiB,CAAA;8GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHhB,CAAwB,sBAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EADxB,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAIb,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,YACb,CAAwB,sBAAA,CAAA,EAAA,CAAA;;;ACPtC;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ngutil-graphics.mjs","sources":["../../../../packages/graphics/src/ripple/ripple.directive.ts","../../../../packages/graphics/src/ngutil-graphics.ts"],"sourcesContent":["import { Directive, ElementRef, NgZone, TemplateRef } from \"@angular/core\"\n\nimport { Destructible, IDisposable } from \"@ngutil/common\"\n\n@Directive({\n standalone: true,\n selector: \"ng-template[nuRipple]\",\n exportAs: \"nuRipple\"\n})\nexport class RippleDirective extends Destructible {\n #current?: Ripple\n\n constructor(\n private readonly tplRef: TemplateRef<any>,\n private readonly zone: NgZone,\n private readonly el: ElementRef<Node>\n ) {\n super()\n zone.runOutsideAngular(() => {\n const target = el.nativeElement.parentElement\n if (target) {\n target.addEventListener(\"mousedown\", this.#onMouseDown)\n this.d.any(() => target.removeEventListener(\"mousedown\", this.#onMouseDown))\n }\n })\n }\n\n begin(event: MouseEvent) {\n this.#current?.autoDestroy()\n const cfg = this.#createRippleConfig(event)\n const ripple = this.#createRipple(cfg)\n this.#current = ripple\n\n const refEl = this.tplRef.elementRef.nativeElement as HTMLElement\n refEl.parentNode?.insertBefore(ripple.el, refEl)\n ripple.start()\n }\n\n end() {\n this.#current?.autoDestroy()\n }\n\n #createRipple(config: RippleConfig) {\n const ripple = new Ripple(config, this.zone, () => {\n if (this.#current === ripple) {\n this.#current = undefined\n }\n })\n this.d.disposable(ripple)\n return ripple\n }\n\n #createRippleConfig(event: MouseEvent): RippleConfig {\n const container = event.currentTarget as HTMLElement\n const bounds = container.getBoundingClientRect()\n const w = bounds.width\n const h = bounds.height\n const x = event.clientX - bounds.left\n const y = event.clientY - bounds.top\n const r = maxPossibleRadius(x, y, w, h) + Math.min(w, h)\n return { x, y, w, h, r, d: 600 }\n }\n\n #onMouseDown = (event: MouseEvent) => {\n this.begin(event)\n }\n}\n\ntype RippleConfig = { x: number; y: number; w: number; h: number; r: number; d: number }\n\nexport class Ripple implements IDisposable {\n public readonly el: HTMLDivElement\n public readonly isRunning: boolean = false\n\n #autoDestroy = false\n #hiding = false\n\n constructor(\n config: RippleConfig,\n zone: NgZone,\n public readonly onDestroy: () => void\n ) {\n const el = document.createElement(\"div\")\n el.style.position = \"absolute\"\n el.style.top = `${config.y - config.r}px`\n el.style.left = `${config.x - config.r}px`\n el.style.width = `${config.r * 2}px`\n el.style.height = `${config.r * 2}px`\n el.style.pointerEvents = \"none\"\n el.style.backgroundColor = \"var(--ripple-color)\"\n el.style.borderRadius = \"50%\"\n el.style.transition = `opacity ${config.d / 2}ms ease-out, transform ${config.d}ms ease-out`\n el.style.opacity = \"0\"\n el.style.transformOrigin = \"center\"\n el.style.transform = \"scale(0)\"\n this.el = el\n\n zone.runOutsideAngular(() => {\n el.addEventListener(\"transitionstart\", this.#transBegin)\n el.addEventListener(\"transitionend\", this.#transEnd)\n document.addEventListener(\"mouseup\", this.autoDestroy, { capture: true, passive: true })\n document.addEventListener(\"dragend\", this.autoDestroy, { capture: true, passive: true })\n })\n }\n\n start() {\n // eslint-disable-next-line no-extra-semi\n ;(this as { isRunning: boolean }).isRunning = true\n // XXX: force style apply\n const opacity = typeof window !== \"undefined\" ? Number(window.getComputedStyle(this.el).opacity) : 1\n this.el.style.opacity = opacity ? \"0.3\" : \"0.3\"\n this.el.style.transform = \"scale(1)\"\n }\n\n autoDestroy = () => {\n if (this.isRunning) {\n this.#autoDestroy = true\n } else {\n this.#fadeOut()\n }\n }\n\n dispose(): void {\n this.el.removeEventListener(\"transitionstart\", this.#transBegin)\n this.el.removeEventListener(\"transitionend\", this.#transEnd)\n document.removeEventListener(\"mouseup\", this.autoDestroy, { capture: true })\n this.el.parentNode?.removeChild(this.el)\n this.onDestroy()\n }\n\n #transBegin = () => {\n // eslint-disable-next-line no-extra-semi\n ;(this as { isRunning: boolean }).isRunning = true\n }\n\n #transEnd = (event: TransitionEvent) => {\n if (event.propertyName === \"opacity\") {\n if (this.#hiding) {\n this.dispose()\n } else {\n if (this.#autoDestroy) {\n this.#fadeOut()\n }\n }\n } else if (event.propertyName === \"transform\") {\n // eslint-disable-next-line no-extra-semi\n ;(this as { isRunning: boolean }).isRunning = false\n if (this.#autoDestroy) {\n this.dispose()\n }\n }\n }\n\n #fadeOut() {\n if (this.#hiding) {\n return\n }\n this.#hiding = true\n this.el.style.opacity = \"0\"\n }\n}\n\nfunction maxPossibleRadius(x: number, y: number, w: number, h: number) {\n const distX = Math.max(x, Math.abs(w - x))\n const distY = Math.max(y, Math.abs(h - y))\n return Math.sqrt(distX * distX + distY * distY)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./
|
|
1
|
+
export * from "./ripple/ripple.directive";
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngutil/graphics",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"directory": "../../dist/packages/graphics/"
|
|
7
7
|
},
|
|
8
8
|
"peerDependencies": {
|
|
9
9
|
"@angular/common": "^17.1.0",
|
|
10
|
-
"@angular/core": "^17.1.0"
|
|
10
|
+
"@angular/core": "^17.1.0",
|
|
11
|
+
"@ngutil/common": "0.0.4"
|
|
11
12
|
},
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"tslib": "^2.3.0"
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ElementRef, NgZone, TemplateRef } from "@angular/core";
|
|
2
|
+
import { Destructible, IDisposable } from "@ngutil/common";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class RippleDirective extends Destructible {
|
|
5
|
+
#private;
|
|
6
|
+
private readonly tplRef;
|
|
7
|
+
private readonly zone;
|
|
8
|
+
private readonly el;
|
|
9
|
+
constructor(tplRef: TemplateRef<any>, zone: NgZone, el: ElementRef<Node>);
|
|
10
|
+
begin(event: MouseEvent): void;
|
|
11
|
+
end(): void;
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RippleDirective, never>;
|
|
13
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RippleDirective, "ng-template[nuRipple]", ["nuRipple"], {}, {}, never, never, true, never>;
|
|
14
|
+
}
|
|
15
|
+
type RippleConfig = {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
w: number;
|
|
19
|
+
h: number;
|
|
20
|
+
r: number;
|
|
21
|
+
d: number;
|
|
22
|
+
};
|
|
23
|
+
export declare class Ripple implements IDisposable {
|
|
24
|
+
#private;
|
|
25
|
+
readonly onDestroy: () => void;
|
|
26
|
+
readonly el: HTMLDivElement;
|
|
27
|
+
readonly isRunning: boolean;
|
|
28
|
+
constructor(config: RippleConfig, zone: NgZone, onDestroy: () => void);
|
|
29
|
+
start(): void;
|
|
30
|
+
autoDestroy: () => void;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from "@angular/common";
|
|
2
|
-
import { Component } from "@angular/core";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class GraphicsComponent {
|
|
5
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: GraphicsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: GraphicsComponent, isStandalone: true, selector: "nu-graphics", ngImport: i0, template: `<p>graphics works!</p>`, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
7
|
-
}
|
|
8
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: GraphicsComponent, decorators: [{
|
|
9
|
-
type: Component,
|
|
10
|
-
args: [{ selector: "nu-graphics", standalone: true, imports: [CommonModule], template: `<p>graphics works!</p>` }]
|
|
11
|
-
}] });
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGhpY3Mvc3JjL2xpYi9ncmFwaGljcy9ncmFwaGljcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7O0FBU3pDLE1BQU0sT0FBTyxpQkFBaUI7OEdBQWpCLGlCQUFpQjtrR0FBakIsaUJBQWlCLHVFQUhoQix3QkFBd0IseUVBRHhCLFlBQVk7OzJGQUliLGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFDSSxhQUFhLGNBQ1gsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2Isd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51LWdyYXBoaWNzXCIsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxwPmdyYXBoaWNzIHdvcmtzITwvcD5gLFxuICAgIHN0eWxlVXJsOiBcIi4vZ3JhcGhpY3MuY29tcG9uZW50LnNjc3NcIlxufSlcbmV4cG9ydCBjbGFzcyBHcmFwaGljc0NvbXBvbmVudCB7fVxuIl19
|