@ngutil/graphics 0.0.3-dev.13 → 0.0.3-dev.14

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 CHANGED
@@ -1,2 +1,2 @@
1
- export * from "./lib/graphics/graphics.component";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaGljcy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQ0FBbUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2xpYi9ncmFwaGljcy9ncmFwaGljcy5jb21wb25lbnRcIlxuIl19
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 { Component } from '@angular/core';
2
+ import { Directive } from '@angular/core';
3
+ import { Destructible } from '@ngutil/common';
4
4
 
5
- class GraphicsComponent {
6
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: GraphicsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7
- 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 }] }); }
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 { GraphicsComponent };
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 "./lib/graphics/graphics.component";
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-dev.13",
3
+ "version": "0.0.3-dev.14",
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.3-dev.14"
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
@@ -1,5 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- export declare class GraphicsComponent {
3
- static ɵfac: i0.ɵɵFactoryDeclaration<GraphicsComponent, never>;
4
- static ɵcmp: i0.ɵɵComponentDeclaration<GraphicsComponent, "nu-graphics", never, {}, {}, never, never, true, never>;
5
- }