@ngutil/graphics 0.0.81 → 0.0.83

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.
@@ -131,13 +131,12 @@ class RippleDirective extends Destructible {
131
131
  #onMouseDown = (event) => {
132
132
  this.begin(event);
133
133
  };
134
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RippleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
135
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: RippleDirective, isStandalone: true, selector: "ng-template[nuRipple]", exportAs: ["nuRipple"], usesInheritance: true, ngImport: i0 }); }
134
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: RippleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
135
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.8", type: RippleDirective, isStandalone: true, selector: "ng-template[nuRipple]", exportAs: ["nuRipple"], usesInheritance: true, ngImport: i0 }); }
136
136
  }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: RippleDirective, decorators: [{
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: RippleDirective, decorators: [{
138
138
  type: Directive,
139
139
  args: [{
140
- standalone: true,
141
140
  selector: "ng-template[nuRipple]",
142
141
  exportAs: "nuRipple"
143
142
  }]
@@ -353,10 +352,10 @@ class CoverService {
353
352
  return new RevealCoverRef(container, options, this.#watcher);
354
353
  }
355
354
  }
356
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CoverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
357
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CoverService, providedIn: "root" }); }
355
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: CoverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
356
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: CoverService, providedIn: "root" }); }
358
357
  }
359
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CoverService, decorators: [{
358
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: CoverService, decorators: [{
360
359
  type: Injectable,
361
360
  args: [{ providedIn: "root" }]
362
361
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"ngutil-graphics.mjs","sources":["../../../../packages/graphics/src/util/animation-observable.ts","../../../../packages/graphics/src/util/polygon.ts","../../../../packages/graphics/src/ripple/ripple.directive.ts","../../../../packages/graphics/src/cover.service.ts","../../../../packages/graphics/src/ngutil-graphics.ts"],"sourcesContent":["import { AnimationBuilder, AnimationMetadata, AnimationOptions } from \"@angular/animations\"\n\nimport { Observable, Subscriber } from \"rxjs\"\n\nimport { coerceElement, ElementInput } from \"@ngutil/common\"\n\nexport interface AnimationObservableParams {\n builder: AnimationBuilder\n animation: AnimationMetadata | AnimationMetadata[]\n element: ElementInput\n options?: AnimationOptions\n}\n\nexport function animationObservable({ builder, animation, element, options }: AnimationObservableParams) {\n return new Observable((dst: Subscriber<void>) => {\n const factory = builder.build(animation)\n const player = factory.create(coerceElement(element), options)\n\n const done = () => {\n dst.next()\n dst.complete()\n }\n\n player.onDestroy(done)\n player.onDone(done)\n player.play()\n\n return () => {\n player.pause()\n player.destroy()\n }\n })\n}\n","import { Position } from \"@ngutil/style\"\n\nexport type Polygon = Position[]\n\nexport function polygonRect(topLeft: Position, bottomRight: Position): Polygon {\n const result: Polygon = []\n\n result.push(topLeft)\n result.push({ x: bottomRight.x, y: topLeft.y })\n result.push(bottomRight)\n result.push({ x: topLeft.x, y: bottomRight.y })\n result.push(topLeft)\n\n return result\n}\n\nconst OctoAngle = (Math.PI * 2) / 8\n\nexport function polygonRoundedRect(topLeft: Position, bottomRight: Position, radius: number): Polygon {\n if (radius <= 0) {\n return polygonRect(topLeft, bottomRight)\n }\n\n const result: Polygon = []\n const maxR = Math.min(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y) / 2\n const r = Math.min(radius, maxR)\n\n // top left half\n result.push(...polygonArc({ x: topLeft.x + r, y: topLeft.y + r }, r, OctoAngle * 3, OctoAngle * 2))\n result.push({ x: topLeft.x + r, y: topLeft.y })\n result.push({ x: bottomRight.x - r, y: topLeft.y })\n\n // top right\n result.push(...polygonArc({ x: bottomRight.x - r, y: topLeft.y + r }, r, OctoAngle * 2, OctoAngle * 0))\n result.push({ x: bottomRight.x, y: topLeft.y + r })\n\n // bottom right\n result.push(...polygonArc({ x: bottomRight.x - r, y: bottomRight.y - r }, r, OctoAngle * 0, -OctoAngle * 2))\n result.push({ x: bottomRight.x - r, y: bottomRight.y })\n\n // bottom left\n result.push(...polygonArc({ x: topLeft.x + r, y: bottomRight.y - r }, r, OctoAngle * 6, OctoAngle * 4))\n result.push({ x: topLeft.x, y: bottomRight.y - r })\n\n // top left half\n result.push({ x: topLeft.x, y: topLeft.y + r })\n result.push(...polygonArc({ x: topLeft.x + r, y: topLeft.y + r }, r, OctoAngle * 4, OctoAngle * 3))\n\n result.push(result[0])\n\n return result\n}\n\nexport function polygonArc(center: Position, radius: number, startAngle: number, endAngle: number): Polygon {\n const result: Polygon = []\n\n if (radius === 0) {\n return result\n }\n\n const reversed = startAngle > endAngle\n let angle = Math.min(startAngle, endAngle)\n const end = Math.max(startAngle, endAngle)\n\n for (; angle < end; angle += 0.1) {\n const x = center.x + radius * Math.cos(angle)\n const y = center.y - radius * Math.sin(angle)\n result.push({ x, y })\n }\n\n return reversed ? result.reverse() : result\n}\n\nexport function polygonToCss(polygon: Polygon): string {\n return `polygon(${polygon.map(p => `${p.x}px ${p.y}px`).join(\",\")})`\n}\n\nexport function 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","import { Directive, ElementRef, NgZone, TemplateRef } from \"@angular/core\"\n\nimport { Destructible, IDisposable } from \"@ngutil/common\"\n\nimport { maxPossibleRadius } from \"../util\"\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 el.addEventListener(\"transitioncancel\", 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 this.el.removeEventListener(\"transitioncancel\", 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","import { ElementRef, inject, Injectable } from \"@angular/core\"\n\nimport {\n combineLatest,\n filter,\n from,\n map,\n Observable,\n ObservableInput,\n of,\n Subscriber,\n switchMap,\n TeardownLogic\n} from \"rxjs\"\n\nimport { coerceElement, ElementInput, isElementInput } from \"@ngutil/common\"\nimport { Rect, rectContract, rectExpand, RectWatcher, SidesInput } from \"@ngutil/style\"\n\nimport { maxPossibleRadius, Polygon, polygonArc, polygonRect, polygonRoundedRect, polygonToCss } from \"./util\"\n\nexport interface CommonCoverOptions {\n color: \"transparent\" | string\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport interface SolidCoverOptions extends CommonCoverOptions {\n type: \"solid\"\n}\n\nexport interface CropCoverOptions extends CommonCoverOptions {\n type: \"crop\"\n /**\n * Element that will be interactive while the cover is visible\n */\n crop: ElementInput | ObservableInput<Rect | ElementInput>\n shape: CropShapeOptions\n expand?: SidesInput\n contract?: SidesInput\n disablePointerEvents?: boolean\n}\n\nexport type CropShapeOptions = CropRectOptions | CropCircleOptions | CropShapeCustom\n\nexport interface CropRectOptions {\n type: \"rect\"\n borderRadius?: number\n}\n\nexport interface CropCircleOptions {\n type: \"circle\"\n}\n\nexport type CropShapeCustom = (container: Rect, crop: Rect) => Polygon\n\nexport interface RevealCoverOptions extends CommonCoverOptions {\n type: \"reveal\"\n /**\n * Left and right coordinates inside the container\n */\n origin: { left: number; top: number }\n}\n\nexport type CoverOptions = SolidCoverOptions | CropCoverOptions | RevealCoverOptions\n\nexport abstract class CoverRef<O extends CommonCoverOptions, R = void> extends ElementRef<HTMLElement> {\n protected readonly watcher: RectWatcher\n\n constructor(\n readonly container: ElementInput,\n readonly options: O,\n watcher: RectWatcher\n ) {\n super(document.createElement(\"div\"))\n this.watcher = watcher\n\n Object.assign(this.nativeElement.style, {\n position: \"absolute\",\n inset: \"0px\"\n })\n }\n\n show(): Observable<R> {\n return new Observable(dest => {\n const element = this.nativeElement\n coerceElement(this.container).appendChild(element)\n dest.add(() => element.parentElement?.removeChild(element))\n return this._show(dest)\n })\n }\n\n protected applyStyle(mask: HTMLElement) {\n const options = this.options\n const backgroundColor = options.color === \"transparent\" ? \"rgba(255, 255, 255, 0.0001)\" : options.color\n\n if (options.style) {\n Object.assign(mask.style, { backgroundColor, ...options.style })\n } else {\n Object.assign(mask.style, { backgroundColor })\n }\n }\n\n protected abstract _show(dest: Subscriber<unknown>): TeardownLogic\n}\n\nexport class SolidCoverRef extends CoverRef<SolidCoverOptions> {\n protected override _show(dest: Subscriber<unknown>): TeardownLogic {\n this.applyStyle(this.nativeElement)\n }\n}\n\nexport class CropCoverRef extends CoverRef<CropCoverOptions> {\n protected override _show(dest: Subscriber<unknown>): TeardownLogic {\n const options = this.options\n const crop = isElementInput(options.crop) ? of(options.crop) : from(options.crop)\n let maskEl = this.nativeElement\n\n // TODO: a backdrop filter kicsit ksőbb jelenik meg így\n if (this.options.disablePointerEvents) {\n maskEl = document.createElement(\"div\")\n Object.assign(maskEl.style, {\n position: \"absolute\",\n inset: \"0px\"\n })\n this.applyStyle(maskEl)\n // maskEl.style.backdropFilter = null as any\n this.nativeElement.appendChild(maskEl)\n this.nativeElement.style.background = \"rgba(0, 0, 0, 0.1)\"\n // this.nativeElement.style.backdropFilter = this.options.style?.backdropFilter as any\n } else {\n this.applyStyle(this.nativeElement)\n }\n\n return combineLatest({\n container: this.watcher.watch(this.container, \"border-box\"),\n crop: crop.pipe(\n filter(value => value != null),\n switchMap(crop => {\n if (isElementInput(crop)) {\n return this.watcher.watch(coerceElement(crop), \"border-box\")\n } else {\n return of(crop)\n }\n }),\n map(crop => {\n if (this.options.expand) {\n crop = rectExpand(crop, this.options.expand)\n }\n\n if (this.options.contract) {\n crop = rectContract(crop, this.options.contract)\n }\n\n return crop\n })\n )\n }).subscribe(({ container, crop }) => {\n const outer = polygonRect({ x: 0, y: 0 }, { x: container.width, y: container.height })\n const croppedArea = this.#polygon(container, crop).reverse()\n const polygon = [...outer, ...croppedArea]\n\n maskEl.style.clipPath = polygonToCss(polygon)\n })\n }\n\n #polygon(container: Rect, crop: Rect): Polygon {\n const shape = this.options.shape\n if (typeof shape === \"function\") {\n return shape(container, crop)\n } else if (shape.type === \"circle\") {\n const r = maxPossibleRadius(crop.x, crop.y, crop.width, crop.height)\n return polygonArc({ x: crop.x + r, y: crop.y + r }, r, 0, Math.PI * 2)\n } else if (shape.type === \"rect\") {\n const top = Math.round(Math.max(crop.y - container.y, 0))\n const right = Math.round(Math.max(crop.x + crop.width))\n const bottom = Math.round(Math.max(crop.y + crop.height))\n const left = Math.round(Math.max(crop.x - container.x))\n\n if (shape.borderRadius != null) {\n return polygonRoundedRect({ x: left, y: top }, { x: right, y: bottom }, shape.borderRadius)\n } else {\n return polygonRect({ x: left, y: top }, { x: right, y: bottom })\n }\n }\n return []\n }\n}\n\nexport class RevealCoverRef extends CoverRef<RevealCoverOptions> {\n protected override _show(dest: Subscriber<unknown>): TeardownLogic {}\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class CoverService {\n readonly #watcher = inject(RectWatcher)\n\n create(container: ElementInput, options: CoverOptions) {\n switch (options.type) {\n case \"solid\":\n return new SolidCoverRef(container, options, this.#watcher)\n case \"crop\":\n return new CropCoverRef(container, options, this.#watcher)\n case \"reveal\":\n return new RevealCoverRef(container, options, this.#watcher)\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngutil-graphics.mjs","sources":["../../../../packages/graphics/src/util/animation-observable.ts","../../../../packages/graphics/src/util/polygon.ts","../../../../packages/graphics/src/ripple/ripple.directive.ts","../../../../packages/graphics/src/cover.service.ts","../../../../packages/graphics/src/ngutil-graphics.ts"],"sourcesContent":["import { AnimationBuilder, AnimationMetadata, AnimationOptions } from \"@angular/animations\"\n\nimport { Observable, Subscriber } from \"rxjs\"\n\nimport { coerceElement, ElementInput } from \"@ngutil/common\"\n\nexport interface AnimationObservableParams {\n builder: AnimationBuilder\n animation: AnimationMetadata | AnimationMetadata[]\n element: ElementInput\n options?: AnimationOptions\n}\n\nexport function animationObservable({ builder, animation, element, options }: AnimationObservableParams) {\n return new Observable((dst: Subscriber<void>) => {\n const factory = builder.build(animation)\n const player = factory.create(coerceElement(element), options)\n\n const done = () => {\n dst.next()\n dst.complete()\n }\n\n player.onDestroy(done)\n player.onDone(done)\n player.play()\n\n return () => {\n player.pause()\n player.destroy()\n }\n })\n}\n","import { Position } from \"@ngutil/style\"\n\nexport type Polygon = Position[]\n\nexport function polygonRect(topLeft: Position, bottomRight: Position): Polygon {\n const result: Polygon = []\n\n result.push(topLeft)\n result.push({ x: bottomRight.x, y: topLeft.y })\n result.push(bottomRight)\n result.push({ x: topLeft.x, y: bottomRight.y })\n result.push(topLeft)\n\n return result\n}\n\nconst OctoAngle = (Math.PI * 2) / 8\n\nexport function polygonRoundedRect(topLeft: Position, bottomRight: Position, radius: number): Polygon {\n if (radius <= 0) {\n return polygonRect(topLeft, bottomRight)\n }\n\n const result: Polygon = []\n const maxR = Math.min(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y) / 2\n const r = Math.min(radius, maxR)\n\n // top left half\n result.push(...polygonArc({ x: topLeft.x + r, y: topLeft.y + r }, r, OctoAngle * 3, OctoAngle * 2))\n result.push({ x: topLeft.x + r, y: topLeft.y })\n result.push({ x: bottomRight.x - r, y: topLeft.y })\n\n // top right\n result.push(...polygonArc({ x: bottomRight.x - r, y: topLeft.y + r }, r, OctoAngle * 2, OctoAngle * 0))\n result.push({ x: bottomRight.x, y: topLeft.y + r })\n\n // bottom right\n result.push(...polygonArc({ x: bottomRight.x - r, y: bottomRight.y - r }, r, OctoAngle * 0, -OctoAngle * 2))\n result.push({ x: bottomRight.x - r, y: bottomRight.y })\n\n // bottom left\n result.push(...polygonArc({ x: topLeft.x + r, y: bottomRight.y - r }, r, OctoAngle * 6, OctoAngle * 4))\n result.push({ x: topLeft.x, y: bottomRight.y - r })\n\n // top left half\n result.push({ x: topLeft.x, y: topLeft.y + r })\n result.push(...polygonArc({ x: topLeft.x + r, y: topLeft.y + r }, r, OctoAngle * 4, OctoAngle * 3))\n\n result.push(result[0])\n\n return result\n}\n\nexport function polygonArc(center: Position, radius: number, startAngle: number, endAngle: number): Polygon {\n const result: Polygon = []\n\n if (radius === 0) {\n return result\n }\n\n const reversed = startAngle > endAngle\n let angle = Math.min(startAngle, endAngle)\n const end = Math.max(startAngle, endAngle)\n\n for (; angle < end; angle += 0.1) {\n const x = center.x + radius * Math.cos(angle)\n const y = center.y - radius * Math.sin(angle)\n result.push({ x, y })\n }\n\n return reversed ? result.reverse() : result\n}\n\nexport function polygonToCss(polygon: Polygon): string {\n return `polygon(${polygon.map(p => `${p.x}px ${p.y}px`).join(\",\")})`\n}\n\nexport function 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","import { Directive, ElementRef, NgZone, TemplateRef } from \"@angular/core\"\n\nimport { Destructible, IDisposable } from \"@ngutil/common\"\n\nimport { maxPossibleRadius } from \"../util\"\n\n@Directive({\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 el.addEventListener(\"transitioncancel\", 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 this.el.removeEventListener(\"transitioncancel\", 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","import { ElementRef, inject, Injectable } from \"@angular/core\"\n\nimport {\n combineLatest,\n filter,\n from,\n map,\n Observable,\n ObservableInput,\n of,\n Subscriber,\n switchMap,\n TeardownLogic\n} from \"rxjs\"\n\nimport { coerceElement, ElementInput, isElementInput } from \"@ngutil/common\"\nimport { Rect, rectContract, rectExpand, RectWatcher, SidesInput } from \"@ngutil/style\"\n\nimport { maxPossibleRadius, Polygon, polygonArc, polygonRect, polygonRoundedRect, polygonToCss } from \"./util\"\n\nexport interface CommonCoverOptions {\n color: \"transparent\" | string\n style?: Partial<CSSStyleDeclaration>\n}\n\nexport interface SolidCoverOptions extends CommonCoverOptions {\n type: \"solid\"\n}\n\nexport interface CropCoverOptions extends CommonCoverOptions {\n type: \"crop\"\n /**\n * Element that will be interactive while the cover is visible\n */\n crop: ElementInput | ObservableInput<Rect | ElementInput>\n shape: CropShapeOptions\n expand?: SidesInput\n contract?: SidesInput\n disablePointerEvents?: boolean\n}\n\nexport type CropShapeOptions = CropRectOptions | CropCircleOptions | CropShapeCustom\n\nexport interface CropRectOptions {\n type: \"rect\"\n borderRadius?: number\n}\n\nexport interface CropCircleOptions {\n type: \"circle\"\n}\n\nexport type CropShapeCustom = (container: Rect, crop: Rect) => Polygon\n\nexport interface RevealCoverOptions extends CommonCoverOptions {\n type: \"reveal\"\n /**\n * Left and right coordinates inside the container\n */\n origin: { left: number; top: number }\n}\n\nexport type CoverOptions = SolidCoverOptions | CropCoverOptions | RevealCoverOptions\n\nexport abstract class CoverRef<O extends CommonCoverOptions, R = void> extends ElementRef<HTMLElement> {\n protected readonly watcher: RectWatcher\n\n constructor(\n readonly container: ElementInput,\n readonly options: O,\n watcher: RectWatcher\n ) {\n super(document.createElement(\"div\"))\n this.watcher = watcher\n\n Object.assign(this.nativeElement.style, {\n position: \"absolute\",\n inset: \"0px\"\n })\n }\n\n show(): Observable<R> {\n return new Observable(dest => {\n const element = this.nativeElement\n coerceElement(this.container).appendChild(element)\n dest.add(() => element.parentElement?.removeChild(element))\n return this._show(dest)\n })\n }\n\n protected applyStyle(mask: HTMLElement) {\n const options = this.options\n const backgroundColor = options.color === \"transparent\" ? \"rgba(255, 255, 255, 0.0001)\" : options.color\n\n if (options.style) {\n Object.assign(mask.style, { backgroundColor, ...options.style })\n } else {\n Object.assign(mask.style, { backgroundColor })\n }\n }\n\n protected abstract _show(dest: Subscriber<unknown>): TeardownLogic\n}\n\nexport class SolidCoverRef extends CoverRef<SolidCoverOptions> {\n protected override _show(dest: Subscriber<unknown>): TeardownLogic {\n this.applyStyle(this.nativeElement)\n }\n}\n\nexport class CropCoverRef extends CoverRef<CropCoverOptions> {\n protected override _show(dest: Subscriber<unknown>): TeardownLogic {\n const options = this.options\n const crop = isElementInput(options.crop) ? of(options.crop) : from(options.crop)\n let maskEl = this.nativeElement\n\n // TODO: a backdrop filter kicsit ksőbb jelenik meg így\n if (this.options.disablePointerEvents) {\n maskEl = document.createElement(\"div\")\n Object.assign(maskEl.style, {\n position: \"absolute\",\n inset: \"0px\"\n })\n this.applyStyle(maskEl)\n // maskEl.style.backdropFilter = null as any\n this.nativeElement.appendChild(maskEl)\n this.nativeElement.style.background = \"rgba(0, 0, 0, 0.1)\"\n // this.nativeElement.style.backdropFilter = this.options.style?.backdropFilter as any\n } else {\n this.applyStyle(this.nativeElement)\n }\n\n return combineLatest({\n container: this.watcher.watch(this.container, \"border-box\"),\n crop: crop.pipe(\n filter(value => value != null),\n switchMap(crop => {\n if (isElementInput(crop)) {\n return this.watcher.watch(coerceElement(crop), \"border-box\")\n } else {\n return of(crop)\n }\n }),\n map(crop => {\n if (this.options.expand) {\n crop = rectExpand(crop, this.options.expand)\n }\n\n if (this.options.contract) {\n crop = rectContract(crop, this.options.contract)\n }\n\n return crop\n })\n )\n }).subscribe(({ container, crop }) => {\n const outer = polygonRect({ x: 0, y: 0 }, { x: container.width, y: container.height })\n const croppedArea = this.#polygon(container, crop).reverse()\n const polygon = [...outer, ...croppedArea]\n\n maskEl.style.clipPath = polygonToCss(polygon)\n })\n }\n\n #polygon(container: Rect, crop: Rect): Polygon {\n const shape = this.options.shape\n if (typeof shape === \"function\") {\n return shape(container, crop)\n } else if (shape.type === \"circle\") {\n const r = maxPossibleRadius(crop.x, crop.y, crop.width, crop.height)\n return polygonArc({ x: crop.x + r, y: crop.y + r }, r, 0, Math.PI * 2)\n } else if (shape.type === \"rect\") {\n const top = Math.round(Math.max(crop.y - container.y, 0))\n const right = Math.round(Math.max(crop.x + crop.width))\n const bottom = Math.round(Math.max(crop.y + crop.height))\n const left = Math.round(Math.max(crop.x - container.x))\n\n if (shape.borderRadius != null) {\n return polygonRoundedRect({ x: left, y: top }, { x: right, y: bottom }, shape.borderRadius)\n } else {\n return polygonRect({ x: left, y: top }, { x: right, y: bottom })\n }\n }\n return []\n }\n}\n\nexport class RevealCoverRef extends CoverRef<RevealCoverOptions> {\n protected override _show(dest: Subscriber<unknown>): TeardownLogic {}\n}\n\n@Injectable({ providedIn: \"root\" })\nexport class CoverService {\n readonly #watcher = inject(RectWatcher)\n\n create(container: ElementInput, options: CoverOptions) {\n switch (options.type) {\n case \"solid\":\n return new SolidCoverRef(container, options, this.#watcher)\n case \"crop\":\n return new CropCoverRef(container, options, this.#watcher)\n case \"reveal\":\n return new RevealCoverRef(container, options, this.#watcher)\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@ngutil/graphics",
3
- "version": "0.0.81",
3
+ "version": "0.0.83",
4
4
  "peerDependencies": {
5
- "@angular/animations": "18.2.6",
6
- "@angular/common": "18.2.6",
7
- "@angular/core": "18.2.6",
5
+ "@angular/animations": "19.2.8",
6
+ "@angular/common": "19.2.8",
7
+ "@angular/core": "19.2.8",
8
8
  "rxjs": "^7.8.1",
9
- "@ngutil/common": "0.0.81",
10
- "@ngutil/style": "0.0.81"
9
+ "@ngutil/style": "0.0.83",
10
+ "@ngutil/common": "0.0.83"
11
11
  },
12
12
  "publishConfig": {
13
13
  "access": "public",
@@ -22,8 +22,6 @@
22
22
  },
23
23
  ".": {
24
24
  "types": "./index.d.ts",
25
- "esm2022": "./esm2022/ngutil-graphics.mjs",
26
- "esm": "./esm2022/ngutil-graphics.mjs",
27
25
  "default": "./fesm2022/ngutil-graphics.mjs"
28
26
  }
29
27
  },
@@ -1,134 +0,0 @@
1
- import { ElementRef, inject, Injectable } from "@angular/core";
2
- import { combineLatest, filter, from, map, Observable, of, switchMap } from "rxjs";
3
- import { coerceElement, isElementInput } from "@ngutil/common";
4
- import { rectContract, rectExpand, RectWatcher } from "@ngutil/style";
5
- import { maxPossibleRadius, polygonArc, polygonRect, polygonRoundedRect, polygonToCss } from "./util";
6
- import * as i0 from "@angular/core";
7
- export class CoverRef extends ElementRef {
8
- constructor(container, options, watcher) {
9
- super(document.createElement("div"));
10
- this.container = container;
11
- this.options = options;
12
- this.watcher = watcher;
13
- Object.assign(this.nativeElement.style, {
14
- position: "absolute",
15
- inset: "0px"
16
- });
17
- }
18
- show() {
19
- return new Observable(dest => {
20
- const element = this.nativeElement;
21
- coerceElement(this.container).appendChild(element);
22
- dest.add(() => element.parentElement?.removeChild(element));
23
- return this._show(dest);
24
- });
25
- }
26
- applyStyle(mask) {
27
- const options = this.options;
28
- const backgroundColor = options.color === "transparent" ? "rgba(255, 255, 255, 0.0001)" : options.color;
29
- if (options.style) {
30
- Object.assign(mask.style, { backgroundColor, ...options.style });
31
- }
32
- else {
33
- Object.assign(mask.style, { backgroundColor });
34
- }
35
- }
36
- }
37
- export class SolidCoverRef extends CoverRef {
38
- _show(dest) {
39
- this.applyStyle(this.nativeElement);
40
- }
41
- }
42
- export class CropCoverRef extends CoverRef {
43
- _show(dest) {
44
- const options = this.options;
45
- const crop = isElementInput(options.crop) ? of(options.crop) : from(options.crop);
46
- let maskEl = this.nativeElement;
47
- // TODO: a backdrop filter kicsit ksőbb jelenik meg így
48
- if (this.options.disablePointerEvents) {
49
- maskEl = document.createElement("div");
50
- Object.assign(maskEl.style, {
51
- position: "absolute",
52
- inset: "0px"
53
- });
54
- this.applyStyle(maskEl);
55
- // maskEl.style.backdropFilter = null as any
56
- this.nativeElement.appendChild(maskEl);
57
- this.nativeElement.style.background = "rgba(0, 0, 0, 0.1)";
58
- // this.nativeElement.style.backdropFilter = this.options.style?.backdropFilter as any
59
- }
60
- else {
61
- this.applyStyle(this.nativeElement);
62
- }
63
- return combineLatest({
64
- container: this.watcher.watch(this.container, "border-box"),
65
- crop: crop.pipe(filter(value => value != null), switchMap(crop => {
66
- if (isElementInput(crop)) {
67
- return this.watcher.watch(coerceElement(crop), "border-box");
68
- }
69
- else {
70
- return of(crop);
71
- }
72
- }), map(crop => {
73
- if (this.options.expand) {
74
- crop = rectExpand(crop, this.options.expand);
75
- }
76
- if (this.options.contract) {
77
- crop = rectContract(crop, this.options.contract);
78
- }
79
- return crop;
80
- }))
81
- }).subscribe(({ container, crop }) => {
82
- const outer = polygonRect({ x: 0, y: 0 }, { x: container.width, y: container.height });
83
- const croppedArea = this.#polygon(container, crop).reverse();
84
- const polygon = [...outer, ...croppedArea];
85
- maskEl.style.clipPath = polygonToCss(polygon);
86
- });
87
- }
88
- #polygon(container, crop) {
89
- const shape = this.options.shape;
90
- if (typeof shape === "function") {
91
- return shape(container, crop);
92
- }
93
- else if (shape.type === "circle") {
94
- const r = maxPossibleRadius(crop.x, crop.y, crop.width, crop.height);
95
- return polygonArc({ x: crop.x + r, y: crop.y + r }, r, 0, Math.PI * 2);
96
- }
97
- else if (shape.type === "rect") {
98
- const top = Math.round(Math.max(crop.y - container.y, 0));
99
- const right = Math.round(Math.max(crop.x + crop.width));
100
- const bottom = Math.round(Math.max(crop.y + crop.height));
101
- const left = Math.round(Math.max(crop.x - container.x));
102
- if (shape.borderRadius != null) {
103
- return polygonRoundedRect({ x: left, y: top }, { x: right, y: bottom }, shape.borderRadius);
104
- }
105
- else {
106
- return polygonRect({ x: left, y: top }, { x: right, y: bottom });
107
- }
108
- }
109
- return [];
110
- }
111
- }
112
- export class RevealCoverRef extends CoverRef {
113
- _show(dest) { }
114
- }
115
- export class CoverService {
116
- #watcher = inject(RectWatcher);
117
- create(container, options) {
118
- switch (options.type) {
119
- case "solid":
120
- return new SolidCoverRef(container, options, this.#watcher);
121
- case "crop":
122
- return new CropCoverRef(container, options, this.#watcher);
123
- case "reveal":
124
- return new RevealCoverRef(container, options, this.#watcher);
125
- }
126
- }
127
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CoverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
128
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CoverService, providedIn: "root" }); }
129
- }
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CoverService, decorators: [{
131
- type: Injectable,
132
- args: [{ providedIn: "root" }]
133
- }] });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY292ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoaWNzL3NyYy9jb3Zlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUU5RCxPQUFPLEVBQ0gsYUFBYSxFQUNiLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsRUFFVixFQUFFLEVBRUYsU0FBUyxFQUVaLE1BQU0sTUFBTSxDQUFBO0FBRWIsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDNUUsT0FBTyxFQUFRLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sZUFBZSxDQUFBO0FBRXZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBVyxVQUFVLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTs7QUE4QzlHLE1BQU0sT0FBZ0IsUUFBaUQsU0FBUSxVQUF1QjtJQUdsRyxZQUNhLFNBQXVCLEVBQ3ZCLE9BQVUsRUFDbkIsT0FBb0I7UUFFcEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUozQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQUc7UUFJbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFFdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtZQUNwQyxRQUFRLEVBQUUsVUFBVTtZQUNwQixLQUFLLEVBQUUsS0FBSztTQUNmLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxJQUFJO1FBQ0EsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6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QUksWUFBWSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzlELEtBQUssUUFBUTtnQkFDVCxPQUFPLElBQUksY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3BFLENBQUM7SUFDTCxDQUFDOzhHQVpRLFlBQVk7a0hBQVosWUFBWSxjQURDLE1BQU07OzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHtcbiAgICBjb21iaW5lTGF0ZXN0LFxuICAgIGZpbHRlcixcbiAgICBmcm9tLFxuICAgIG1hcCxcbiAgICBPYnNlcnZhYmxlLFxuICAgIE9ic2VydmFibGVJbnB1dCxcbiAgICBvZixcbiAgICBTdWJzY3JpYmVyLFxuICAgIHN3aXRjaE1hcCxcbiAgICBUZWFyZG93bkxvZ2ljXG59IGZyb20gXCJyeGpzXCJcblxuaW1wb3J0IHsgY29lcmNlRWxlbWVudCwgRWxlbWVudElucHV0LCBpc0VsZW1lbnRJbnB1dCB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5pbXBvcnQgeyBSZWN0LCByZWN0Q29udHJhY3QsIHJlY3RFeHBhbmQsIFJlY3RXYXRjaGVyLCBTaWRlc0lucHV0IH0gZnJvbSBcIkBuZ3V0aWwvc3R5bGVcIlxuXG5pbXBvcnQgeyBtYXhQb3NzaWJsZVJhZGl1cywgUG9seWdvbiwgcG9seWdvbkFyYywgcG9seWdvblJlY3QsIHBvbHlnb25Sb3VuZGVkUmVjdCwgcG9seWdvblRvQ3NzIH0gZnJvbSBcIi4vdXRpbFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uQ292ZXJPcHRpb25zIHtcbiAgICBjb2xvcjogXCJ0cmFuc3BhcmVudFwiIHwgc3RyaW5nXG4gICAgc3R5bGU/OiBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29saWRDb3Zlck9wdGlvbnMgZXh0ZW5kcyBDb21tb25Db3Zlck9wdGlvbnMge1xuICAgIHR5cGU6IFwic29saWRcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyb3BDb3Zlck9wdGlvbnMgZXh0ZW5kcyBDb21tb25Db3Zlck9wdGlvbnMge1xuICAgIHR5cGU6IFwiY3JvcFwiXG4gICAgLyoqXG4gICAgICogRWxlbWVudCB0aGF0IHdpbGwgYmUgaW50ZXJhY3RpdmUgd2hpbGUgdGhlIGNvdmVyIGlzIHZpc2libGVcbiAgICAgKi9cbiAgICBjcm9wOiBFbGVtZW50SW5wdXQgfCBPYnNlcnZhYmxlSW5wdXQ8UmVjdCB8IEVsZW1lbnRJbnB1dD5cbiAgICBzaGFwZTogQ3JvcFNoYXBlT3B0aW9uc1xuICAgIGV4cGFuZD86IFNpZGVzSW5wdXRcbiAgICBjb250cmFjdD86IFNpZGVzSW5wdXRcbiAgICBkaXNhYmxlUG9pbnRlckV2ZW50cz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgQ3JvcFNoYXBlT3B0aW9ucyA9IENyb3BSZWN0T3B0aW9ucyB8IENyb3BDaXJjbGVPcHRpb25zIHwgQ3JvcFNoYXBlQ3VzdG9tXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcFJlY3RPcHRpb25zIHtcbiAgICB0eXBlOiBcInJlY3RcIlxuICAgIGJvcmRlclJhZGl1cz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyb3BDaXJjbGVPcHRpb25zIHtcbiAgICB0eXBlOiBcImNpcmNsZVwiXG59XG5cbmV4cG9ydCB0eXBlIENyb3BTaGFwZUN1c3RvbSA9IChjb250YWluZXI6IFJlY3QsIGNyb3A6IFJlY3QpID0+IFBvbHlnb25cblxuZXhwb3J0IGludGVyZmFjZSBSZXZlYWxDb3Zlck9wdGlvbnMgZXh0ZW5kcyBDb21tb25Db3Zlck9wdGlvbnMge1xuICAgIHR5cGU6IFwicmV2ZWFsXCJcbiAgICAvKipcbiAgICAgKiBMZWZ0IGFuZCByaWdodCBjb29yZGluYXRlcyBpbnNpZGUgdGhlIGNvbnRhaW5lclxuICAgICAqL1xuICAgIG9yaWdpbjogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyIH1cbn1cblxuZXhwb3J0IHR5cGUgQ292ZXJPcHRpb25zID0gU29saWRDb3Zlck9wdGlvbnMgfCBDcm9wQ292ZXJPcHRpb25zIHwgUmV2ZWFsQ292ZXJPcHRpb25zXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb3ZlclJlZjxPIGV4dGVuZHMgQ29tbW9uQ292ZXJPcHRpb25zLCBSID0gdm9pZD4gZXh0ZW5kcyBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHdhdGNoZXI6IFJlY3RXYXRjaGVyXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcmVhZG9ubHkgY29udGFpbmVyOiBFbGVtZW50SW5wdXQsXG4gICAgICAgIHJlYWRvbmx5IG9wdGlvbnM6IE8sXG4gICAgICAgIHdhdGNoZXI6IFJlY3RXYXRjaGVyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpXG4gICAgICAgIHRoaXMud2F0Y2hlciA9IHdhdGNoZXJcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIGluc2V0OiBcIjBweFwiXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc2hvdygpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGRlc3QgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgY29lcmNlRWxlbWVudCh0aGlzLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoZWxlbWVudClcbiAgICAgICAgICAgIGRlc3QuYWRkKCgpID0+IGVsZW1lbnQucGFyZW50RWxlbWVudD8ucmVtb3ZlQ2hpbGQoZWxlbWVudCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2hvdyhkZXN0KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcHBseVN0eWxlKG1hc2s6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gb3B0aW9ucy5jb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiID8gXCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDAwMSlcIiA6IG9wdGlvbnMuY29sb3JcblxuICAgICAgICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYXNrLnN0eWxlLCB7IGJhY2tncm91bmRDb2xvciwgLi4ub3B0aW9ucy5zdHlsZSB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYXNrLnN0eWxlLCB7IGJhY2tncm91bmRDb2xvciB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IF9zaG93KGRlc3Q6IFN1YnNjcmliZXI8dW5rbm93bj4pOiBUZWFyZG93bkxvZ2ljXG59XG5cbmV4cG9ydCBjbGFzcyBTb2xpZENvdmVyUmVmIGV4dGVuZHMgQ292ZXJSZWY8U29saWRDb3Zlck9wdGlvbnM+IHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3Nob3coZGVzdDogU3Vic2NyaWJlcjx1bmtub3duPik6IFRlYXJkb3duTG9naWMge1xuICAgICAgICB0aGlzLmFwcGx5U3R5bGUodGhpcy5uYXRpdmVFbGVtZW50KVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyb3BDb3ZlclJlZiBleHRlbmRzIENvdmVyUmVmPENyb3BDb3Zlck9wdGlvbnM+IHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3Nob3coZGVzdDogU3Vic2NyaWJlcjx1bmtub3duPik6IFRlYXJkb3duTG9naWMge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG4gICAgICAgIGNvbnN0IGNyb3AgPSBpc0VsZW1lbnRJbnB1dChvcHRpb25zLmNyb3ApID8gb2Yob3B0aW9ucy5jcm9wKSA6IGZyb20ob3B0aW9ucy5jcm9wKVxuICAgICAgICBsZXQgbWFza0VsID0gdGhpcy5uYXRpdmVFbGVtZW50XG5cbiAgICAgICAgLy8gVE9ETzogYSBiYWNrZHJvcCBmaWx0ZXIga2ljc2l0IGtzxZFiYiBqZWxlbmlrIG1lZyDDrWd5XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZVBvaW50ZXJFdmVudHMpIHtcbiAgICAgICAgICAgIG1hc2tFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFza0VsLnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgICAgICBpbnNldDogXCIwcHhcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZShtYXNrRWwpXG4gICAgICAgICAgICAvLyBtYXNrRWwuc3R5bGUuYmFja2Ryb3BGaWx0ZXIgPSBudWxsIGFzIGFueVxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKG1hc2tFbClcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gXCJyZ2JhKDAsIDAsIDAsIDAuMSlcIlxuICAgICAgICAgICAgLy8gdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLmJhY2tkcm9wRmlsdGVyID0gdGhpcy5vcHRpb25zLnN0eWxlPy5iYWNrZHJvcEZpbHRlciBhcyBhbnlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdCh7XG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMud2F0Y2hlci53YXRjaCh0aGlzLmNvbnRhaW5lciwgXCJib3JkZXItYm94XCIpLFxuICAgICAgICAgICAgY3JvcDogY3JvcC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPSBudWxsKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoY3JvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0VsZW1lbnRJbnB1dChjcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hlci53YXRjaChjb2VyY2VFbGVtZW50KGNyb3ApLCBcImJvcmRlci1ib3hcIilcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihjcm9wKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWFwKGNyb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3JvcCA9IHJlY3RFeHBhbmQoY3JvcCwgdGhpcy5vcHRpb25zLmV4cGFuZClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udHJhY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AgPSByZWN0Q29udHJhY3QoY3JvcCwgdGhpcy5vcHRpb25zLmNvbnRyYWN0KVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyb3BcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICB9KS5zdWJzY3JpYmUoKHsgY29udGFpbmVyLCBjcm9wIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG91dGVyID0gcG9seWdvblJlY3QoeyB4OiAwLCB5OiAwIH0sIHsgeDogY29udGFpbmVyLndpZHRoLCB5OiBjb250YWluZXIuaGVpZ2h0IH0pXG4gICAgICAgICAgICBjb25zdCBjcm9wcGVkQXJlYSA9IHRoaXMuI3BvbHlnb24oY29udGFpbmVyLCBjcm9wKS5yZXZlcnNlKClcbiAgICAgICAgICAgIGNvbnN0IHBvbHlnb24gPSBbLi4ub3V0ZXIsIC4uLmNyb3BwZWRBcmVhXVxuXG4gICAgICAgICAgICBtYXNrRWwuc3R5bGUuY2xpcFBhdGggPSBwb2x5Z29uVG9Dc3MocG9seWdvbilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAjcG9seWdvbihjb250YWluZXI6IFJlY3QsIGNyb3A6IFJlY3QpOiBQb2x5Z29uIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLm9wdGlvbnMuc2hhcGVcbiAgICAgICAgaWYgKHR5cGVvZiBzaGFwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gc2hhcGUoY29udGFpbmVyLCBjcm9wKVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlLnR5cGUgPT09IFwiY2lyY2xlXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBtYXhQb3NzaWJsZVJhZGl1cyhjcm9wLngsIGNyb3AueSwgY3JvcC53aWR0aCwgY3JvcC5oZWlnaHQpXG4gICAgICAgICAgICByZXR1cm4gcG9seWdvbkFyYyh7IHg6IGNyb3AueCArIHIsIHk6IGNyb3AueSArIHIgfSwgciwgMCwgTWF0aC5QSSAqIDIpXG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUudHlwZSA9PT0gXCJyZWN0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IE1hdGgucm91bmQoTWF0aC5tYXgoY3JvcC55IC0gY29udGFpbmVyLnksIDApKVxuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBNYXRoLnJvdW5kKE1hdGgubWF4KGNyb3AueCArIGNyb3Aud2lkdGgpKVxuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC5yb3VuZChNYXRoLm1heChjcm9wLnkgKyBjcm9wLmhlaWdodCkpXG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gTWF0aC5yb3VuZChNYXRoLm1heChjcm9wLnggLSBjb250YWluZXIueCkpXG5cbiAgICAgICAgICAgIGlmIChzaGFwZS5ib3JkZXJSYWRpdXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2x5Z29uUm91bmRlZFJlY3QoeyB4OiBsZWZ0LCB5OiB0b3AgfSwgeyB4OiByaWdodCwgeTogYm90dG9tIH0sIHNoYXBlLmJvcmRlclJhZGl1cylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25SZWN0KHsgeDogbGVmdCwgeTogdG9wIH0sIHsgeDogcmlnaHQsIHk6IGJvdHRvbSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldmVhbENvdmVyUmVmIGV4dGVuZHMgQ292ZXJSZWY8UmV2ZWFsQ292ZXJPcHRpb25zPiB7XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIF9zaG93KGRlc3Q6IFN1YnNjcmliZXI8dW5rbm93bj4pOiBUZWFyZG93bkxvZ2ljIHt9XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcbmV4cG9ydCBjbGFzcyBDb3ZlclNlcnZpY2Uge1xuICAgIHJlYWRvbmx5ICN3YXRjaGVyID0gaW5qZWN0KFJlY3RXYXRjaGVyKVxuXG4gICAgY3JlYXRlKGNvbnRhaW5lcjogRWxlbWVudElucHV0LCBvcHRpb25zOiBDb3Zlck9wdGlvbnMpIHtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzb2xpZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU29saWRDb3ZlclJlZihjb250YWluZXIsIG9wdGlvbnMsIHRoaXMuI3dhdGNoZXIpXG4gICAgICAgICAgICBjYXNlIFwiY3JvcFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3JvcENvdmVyUmVmKGNvbnRhaW5lciwgb3B0aW9ucywgdGhpcy4jd2F0Y2hlcilcbiAgICAgICAgICAgIGNhc2UgXCJyZXZlYWxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJldmVhbENvdmVyUmVmKGNvbnRhaW5lciwgb3B0aW9ucywgdGhpcy4jd2F0Y2hlcilcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
package/esm2022/index.mjs DELETED
@@ -1,4 +0,0 @@
1
- export * from "./ripple/ripple.directive";
2
- export * from "./cover.service";
3
- export * from "./util";
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaGljcy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQTtBQUN6QyxjQUFjLGlCQUFpQixDQUFBO0FBQy9CLGNBQWMsUUFBUSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vcmlwcGxlL3JpcHBsZS5kaXJlY3RpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vY292ZXIuc2VydmljZVwiXG5leHBvcnQgKiBmcm9tIFwiLi91dGlsXCJcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd1dGlsLWdyYXBoaWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZ3JhcGhpY3Mvc3JjL25ndXRpbC1ncmFwaGljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -1,155 +0,0 @@
1
- import { Directive, ElementRef, NgZone, TemplateRef } from "@angular/core";
2
- import { Destructible } from "@ngutil/common";
3
- import { maxPossibleRadius } from "../util";
4
- import * as i0 from "@angular/core";
5
- export 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: "18.2.6", 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: "18.2.6", type: RippleDirective, isStandalone: true, selector: "ng-template[nuRipple]", exportAs: ["nuRipple"], usesInheritance: true, ngImport: i0 }); }
56
- }
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", 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
- export 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
- el.addEventListener("transitioncancel", this.#transEnd);
124
- document.addEventListener("mouseup", this.autoDestroy, { capture: true, passive: true });
125
- document.addEventListener("dragend", this.autoDestroy, { capture: true, passive: true });
126
- });
127
- }
128
- start() {
129
- // eslint-disable-next-line no-extra-semi
130
- ;
131
- this.isRunning = true;
132
- // XXX: force style apply
133
- const opacity = typeof window !== "undefined" ? Number(window.getComputedStyle(this.el).opacity) : 1;
134
- this.el.style.opacity = opacity ? "0.3" : "0.3";
135
- this.el.style.transform = "scale(1)";
136
- }
137
- dispose() {
138
- this.el.removeEventListener("transitionstart", this.#transBegin);
139
- this.el.removeEventListener("transitionend", this.#transEnd);
140
- this.el.removeEventListener("transitioncancel", this.#transEnd);
141
- document.removeEventListener("mouseup", this.autoDestroy, { capture: true });
142
- this.el.parentNode?.removeChild(this.el);
143
- this.onDestroy();
144
- }
145
- #transBegin;
146
- #transEnd;
147
- #fadeOut() {
148
- if (this.#hiding) {
149
- return;
150
- }
151
- this.#hiding = true;
152
- this.el.style.opacity = "0";
153
- }
154
- }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoaWNzL3NyYy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFFLE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLENBQUE7O0FBTzNDLE1BQU0sT0FBTyxlQUFnQixTQUFRLFlBQVk7SUFDN0MsUUFBUSxDQUFTO0lBRWpCLFlBQ3FCLE1BQXdCLEVBQ3hCLElBQVksRUFDWixFQUFvQjtRQUVyQyxLQUFLLEVBQUUsQ0FBQTtRQUpVLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixPQUFFLEdBQUYsRUFBRSxDQUFrQjtRQUdyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFBO1lBQzdDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ3ZELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7WUFDaEYsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFpQjtRQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFBO1FB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QyxFQUFFLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELFdBQVcsQ0FHVjtJQUVELFNBQVMsQ0FnQlI7SUFFRCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixPQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDL0IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuXG5pbXBvcnQgeyBEZXN0cnVjdGlibGUsIElEaXNwb3NhYmxlIH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuaW1wb3J0IHsgbWF4UG9zc2libGVSYWRpdXMgfSBmcm9tIFwiLi4vdXRpbFwiXG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6IFwibmctdGVtcGxhdGVbbnVSaXBwbGVdXCIsXG4gICAgZXhwb3J0QXM6IFwibnVSaXBwbGVcIlxufSlcbmV4cG9ydCBjbGFzcyBSaXBwbGVEaXJlY3RpdmUgZXh0ZW5kcyBEZXN0cnVjdGlibGUge1xuICAgICNjdXJyZW50PzogUmlwcGxlXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cGxSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBFbGVtZW50UmVmPE5vZGU+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCB0aGlzLiNvbk1vdXNlRG93bilcbiAgICAgICAgICAgICAgICB0aGlzLmQuYW55KCgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMuI29uTW91c2VEb3duKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBiZWdpbihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLiNjdXJyZW50Py5hdXRvRGVzdHJveSgpXG4gICAgICAgIGNvbnN0IGNmZyA9IHRoaXMuI2NyZWF0ZVJpcHBsZUNvbmZpZyhldmVudClcbiAgICAgICAgY29uc3QgcmlwcGxlID0gdGhpcy4jY3JlYXRlUmlwcGxlKGNmZylcbiAgICAgICAgdGhpcy4jY3VycmVudCA9IHJpcHBsZVxuXG4gICAgICAgIGNvbnN0IHJlZkVsID0gdGhpcy50cGxSZWYuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50XG4gICAgICAgIHJlZkVsLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShyaXBwbGUuZWwsIHJlZkVsKVxuICAgICAgICByaXBwbGUuc3RhcnQoKVxuICAgIH1cblxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy4jY3VycmVudD8uYXV0b0Rlc3Ryb3koKVxuICAgIH1cblxuICAgICNjcmVhdGVSaXBwbGUoY29uZmlnOiBSaXBwbGVDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmlwcGxlID0gbmV3IFJpcHBsZShjb25maWcsIHRoaXMuem9uZSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnQgPT09IHJpcHBsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnQgPSB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kLmRpc3Bvc2FibGUocmlwcGxlKVxuICAgICAgICByZXR1cm4gcmlwcGxlXG4gICAgfVxuXG4gICAgI2NyZWF0ZVJpcHBsZUNvbmZpZyhldmVudDogTW91c2VFdmVudCk6IFJpcHBsZUNvbmZpZyB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGNvbnN0IHcgPSBib3VuZHMud2lkdGhcbiAgICAgICAgY29uc3QgaCA9IGJvdW5kcy5oZWlnaHRcbiAgICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSBib3VuZHMubGVmdFxuICAgICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIGJvdW5kcy50b3BcbiAgICAgICAgY29uc3QgciA9IG1heFBvc3NpYmxlUmFkaXVzKHgsIHksIHcsIGgpICsgTWF0aC5taW4odywgaClcbiAgICAgICAgcmV0dXJuIHsgeCwgeSwgdywgaCwgciwgZDogNjAwIH1cbiAgICB9XG5cbiAgICAjb25Nb3VzZURvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5iZWdpbihldmVudClcbiAgICB9XG59XG5cbnR5cGUgUmlwcGxlQ29uZmlnID0geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXI7IHI6IG51bWJlcjsgZDogbnVtYmVyIH1cblxuZXhwb3J0IGNsYXNzIFJpcHBsZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZWw6IEhUTUxEaXZFbGVtZW50XG4gICAgcHVibGljIHJlYWRvbmx5IGlzUnVubmluZzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICAjYXV0b0Rlc3Ryb3kgPSBmYWxzZVxuICAgICNoaWRpbmcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbmZpZzogUmlwcGxlQ29uZmlnLFxuICAgICAgICB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvbkRlc3Ryb3k6ICgpID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiXG4gICAgICAgIGVsLnN0eWxlLnRvcCA9IGAke2NvbmZpZy55IC0gY29uZmlnLnJ9cHhgXG4gICAgICAgIGVsLnN0eWxlLmxlZnQgPSBgJHtjb25maWcueCAtIGNvbmZpZy5yfXB4YFxuICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGAke2NvbmZpZy5yICogMn1weGBcbiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gYCR7Y29uZmlnLnIgKiAyfXB4YFxuICAgICAgICBlbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCJcbiAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJ2YXIoLS1yaXBwbGUtY29sb3IpXCJcbiAgICAgICAgZWwuc3R5bGUuYm9yZGVyUmFkaXVzID0gXCI1MCVcIlxuICAgICAgICBlbC5zdHlsZS50cmFuc2l0aW9uID0gYG9wYWNpdHkgJHtjb25maWcuZCAvIDJ9bXMgZWFzZS1vdXQsIHRyYW5zZm9ybSAke2NvbmZpZy5kfW1zIGVhc2Utb3V0YFxuICAgICAgICBlbC5zdHlsZS5vcGFjaXR5ID0gXCIwXCJcbiAgICAgICAgZWwuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gXCJjZW50ZXJcIlxuICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBcInNjYWxlKDApXCJcbiAgICAgICAgdGhpcy5lbCA9IGVsXG5cbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbnN0YXJ0XCIsIHRoaXMuI3RyYW5zQmVnaW4pXG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCB0aGlzLiN0cmFuc0VuZClcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uY2FuY2VsXCIsIHRoaXMuI3RyYW5zRW5kKVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5hdXRvRGVzdHJveSwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ2VuZFwiLCB0aGlzLmF1dG9EZXN0cm95LCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXNlbWlcbiAgICAgICAgOyh0aGlzIGFzIHsgaXNSdW5uaW5nOiBib29sZWFuIH0pLmlzUnVubmluZyA9IHRydWVcbiAgICAgICAgLy8gWFhYOiBmb3JjZSBzdHlsZSBhcHBseVxuICAgICAgICBjb25zdCBvcGFjaXR5ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IE51bWJlcih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKS5vcGFjaXR5KSA6IDFcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eSA/IFwiMC4zXCIgOiBcIjAuM1wiXG4gICAgICAgIHRoaXMuZWwuc3R5bGUudHJhbnNmb3JtID0gXCJzY2FsZSgxKVwiXG4gICAgfVxuXG4gICAgYXV0b0Rlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgICAgICAgdGhpcy4jYXV0b0Rlc3Ryb3kgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNmYWRlT3V0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25zdGFydFwiLCB0aGlzLiN0cmFuc0JlZ2luKVxuICAgICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIHRoaXMuI3RyYW5zRW5kKVxuICAgICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uY2FuY2VsXCIsIHRoaXMuI3RyYW5zRW5kKVxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLmF1dG9EZXN0cm95LCB7IGNhcHR1cmU6IHRydWUgfSlcbiAgICAgICAgdGhpcy5lbC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmVsKVxuICAgICAgICB0aGlzLm9uRGVzdHJveSgpXG4gICAgfVxuXG4gICAgI3RyYW5zQmVnaW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1zZW1pXG4gICAgICAgIDsodGhpcyBhcyB7IGlzUnVubmluZzogYm9vbGVhbiB9KS5pc1J1bm5pbmcgPSB0cnVlXG4gICAgfVxuXG4gICAgI3RyYW5zRW5kID0gKGV2ZW50OiBUcmFuc2l0aW9uRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gXCJvcGFjaXR5XCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNoaWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jYXV0b0Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZmFkZU91dCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXNlbWlcbiAgICAgICAgICAgIDsodGhpcyBhcyB7IGlzUnVubmluZzogYm9vbGVhbiB9KS5pc1J1bm5pbmcgPSBmYWxzZVxuICAgICAgICAgICAgaWYgKHRoaXMuI2F1dG9EZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNmYWRlT3V0KCkge1xuICAgICAgICBpZiAodGhpcy4jaGlkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoaWRpbmcgPSB0cnVlXG4gICAgICAgIHRoaXMuZWwuc3R5bGUub3BhY2l0eSA9IFwiMFwiXG4gICAgfVxufVxuIl19
@@ -1,20 +0,0 @@
1
- import { Observable } from "rxjs";
2
- import { coerceElement } from "@ngutil/common";
3
- export function animationObservable({ builder, animation, element, options }) {
4
- return new Observable((dst) => {
5
- const factory = builder.build(animation);
6
- const player = factory.create(coerceElement(element), options);
7
- const done = () => {
8
- dst.next();
9
- dst.complete();
10
- };
11
- player.onDestroy(done);
12
- player.onDone(done);
13
- player.play();
14
- return () => {
15
- player.pause();
16
- player.destroy();
17
- };
18
- });
19
- }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9uLW9ic2VydmFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaGljcy9zcmMvdXRpbC9hbmltYXRpb24tb2JzZXJ2YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sZ0JBQWdCLENBQUE7QUFTNUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUE2QjtJQUNuRyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsR0FBcUIsRUFBRSxFQUFFO1FBQzVDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDeEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFOUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2QsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ1YsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2xCLENBQUMsQ0FBQTtRQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFYixPQUFPLEdBQUcsRUFBRTtZQUNSLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNkLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNwQixDQUFDLENBQUE7SUFDTCxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbmltYXRpb25CdWlsZGVyLCBBbmltYXRpb25NZXRhZGF0YSwgQW5pbWF0aW9uT3B0aW9ucyB9IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCJcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaWJlciB9IGZyb20gXCJyeGpzXCJcblxuaW1wb3J0IHsgY29lcmNlRWxlbWVudCwgRWxlbWVudElucHV0IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBBbmltYXRpb25PYnNlcnZhYmxlUGFyYW1zIHtcbiAgICBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyXG4gICAgYW5pbWF0aW9uOiBBbmltYXRpb25NZXRhZGF0YSB8IEFuaW1hdGlvbk1ldGFkYXRhW11cbiAgICBlbGVtZW50OiBFbGVtZW50SW5wdXRcbiAgICBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW5pbWF0aW9uT2JzZXJ2YWJsZSh7IGJ1aWxkZXIsIGFuaW1hdGlvbiwgZWxlbWVudCwgb3B0aW9ucyB9OiBBbmltYXRpb25PYnNlcnZhYmxlUGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChkc3Q6IFN1YnNjcmliZXI8dm9pZD4pID0+IHtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IGJ1aWxkZXIuYnVpbGQoYW5pbWF0aW9uKVxuICAgICAgICBjb25zdCBwbGF5ZXIgPSBmYWN0b3J5LmNyZWF0ZShjb2VyY2VFbGVtZW50KGVsZW1lbnQpLCBvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBkc3QubmV4dCgpXG4gICAgICAgICAgICBkc3QuY29tcGxldGUoKVxuICAgICAgICB9XG5cbiAgICAgICAgcGxheWVyLm9uRGVzdHJveShkb25lKVxuICAgICAgICBwbGF5ZXIub25Eb25lKGRvbmUpXG4gICAgICAgIHBsYXllci5wbGF5KClcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcGxheWVyLnBhdXNlKClcbiAgICAgICAgICAgIHBsYXllci5kZXN0cm95KClcbiAgICAgICAgfVxuICAgIH0pXG59XG4iXX0=
@@ -1,3 +0,0 @@
1
- export * from "./animation-observable";
2
- export * from "./polygon";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmFwaGljcy9zcmMvdXRpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdCQUF3QixDQUFBO0FBQ3RDLGNBQWMsV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYW5pbWF0aW9uLW9ic2VydmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vcG9seWdvblwiXG4iXX0=
@@ -1,60 +0,0 @@
1
- export function polygonRect(topLeft, bottomRight) {
2
- const result = [];
3
- result.push(topLeft);
4
- result.push({ x: bottomRight.x, y: topLeft.y });
5
- result.push(bottomRight);
6
- result.push({ x: topLeft.x, y: bottomRight.y });
7
- result.push(topLeft);
8
- return result;
9
- }
10
- const OctoAngle = (Math.PI * 2) / 8;
11
- export function polygonRoundedRect(topLeft, bottomRight, radius) {
12
- if (radius <= 0) {
13
- return polygonRect(topLeft, bottomRight);
14
- }
15
- const result = [];
16
- const maxR = Math.min(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y) / 2;
17
- const r = Math.min(radius, maxR);
18
- // top left half
19
- result.push(...polygonArc({ x: topLeft.x + r, y: topLeft.y + r }, r, OctoAngle * 3, OctoAngle * 2));
20
- result.push({ x: topLeft.x + r, y: topLeft.y });
21
- result.push({ x: bottomRight.x - r, y: topLeft.y });
22
- // top right
23
- result.push(...polygonArc({ x: bottomRight.x - r, y: topLeft.y + r }, r, OctoAngle * 2, OctoAngle * 0));
24
- result.push({ x: bottomRight.x, y: topLeft.y + r });
25
- // bottom right
26
- result.push(...polygonArc({ x: bottomRight.x - r, y: bottomRight.y - r }, r, OctoAngle * 0, -OctoAngle * 2));
27
- result.push({ x: bottomRight.x - r, y: bottomRight.y });
28
- // bottom left
29
- result.push(...polygonArc({ x: topLeft.x + r, y: bottomRight.y - r }, r, OctoAngle * 6, OctoAngle * 4));
30
- result.push({ x: topLeft.x, y: bottomRight.y - r });
31
- // top left half
32
- result.push({ x: topLeft.x, y: topLeft.y + r });
33
- result.push(...polygonArc({ x: topLeft.x + r, y: topLeft.y + r }, r, OctoAngle * 4, OctoAngle * 3));
34
- result.push(result[0]);
35
- return result;
36
- }
37
- export function polygonArc(center, radius, startAngle, endAngle) {
38
- const result = [];
39
- if (radius === 0) {
40
- return result;
41
- }
42
- const reversed = startAngle > endAngle;
43
- let angle = Math.min(startAngle, endAngle);
44
- const end = Math.max(startAngle, endAngle);
45
- for (; angle < end; angle += 0.1) {
46
- const x = center.x + radius * Math.cos(angle);
47
- const y = center.y - radius * Math.sin(angle);
48
- result.push({ x, y });
49
- }
50
- return reversed ? result.reverse() : result;
51
- }
52
- export function polygonToCss(polygon) {
53
- return `polygon(${polygon.map(p => `${p.x}px ${p.y}px`).join(",")})`;
54
- }
55
- export function maxPossibleRadius(x, y, w, h) {
56
- const distX = Math.max(x, Math.abs(w - x));
57
- const distY = Math.max(y, Math.abs(h - y));
58
- return Math.sqrt(distX * distX + distY * distY);
59
- }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9seWdvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dyYXBoaWNzL3NyYy91dGlsL3BvbHlnb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUFpQixFQUFFLFdBQXFCO0lBQ2hFLE1BQU0sTUFBTSxHQUFZLEVBQUUsQ0FBQTtJQUUxQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFcEIsT0FBTyxNQUFNLENBQUE7QUFDakIsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7QUFFbkMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWlCLEVBQUUsV0FBcUIsRUFBRSxNQUFjO0lBQ3ZGLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2QsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUE7SUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9FLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBRWhDLGdCQUFnQjtJQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25HLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRW5ELFlBQVk7SUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRW5ELGVBQWU7SUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFdkQsY0FBYztJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFbkQsZ0JBQWdCO0lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFbkcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUV0QixPQUFPLE1BQU0sQ0FBQTtBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFnQixFQUFFLE1BQWMsRUFBRSxVQUFrQixFQUFFLFFBQWdCO0lBQzdGLE1BQU0sTUFBTSxHQUFZLEVBQUUsQ0FBQTtJQUUxQixJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNmLE9BQU8sTUFBTSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsUUFBUSxDQUFBO0lBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBRTFDLE9BQU8sS0FBSyxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO0FBQy9DLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLE9BQWdCO0lBQ3pDLE9BQU8sV0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFBO0FBQ3hFLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN4RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFBO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb3NpdGlvbiB9IGZyb20gXCJAbmd1dGlsL3N0eWxlXCJcblxuZXhwb3J0IHR5cGUgUG9seWdvbiA9IFBvc2l0aW9uW11cblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25SZWN0KHRvcExlZnQ6IFBvc2l0aW9uLCBib3R0b21SaWdodDogUG9zaXRpb24pOiBQb2x5Z29uIHtcbiAgICBjb25zdCByZXN1bHQ6IFBvbHlnb24gPSBbXVxuXG4gICAgcmVzdWx0LnB1c2godG9wTGVmdClcbiAgICByZXN1bHQucHVzaCh7IHg6IGJvdHRvbVJpZ2h0LngsIHk6IHRvcExlZnQueSB9KVxuICAgIHJlc3VsdC5wdXNoKGJvdHRvbVJpZ2h0KVxuICAgIHJlc3VsdC5wdXNoKHsgeDogdG9wTGVmdC54LCB5OiBib3R0b21SaWdodC55IH0pXG4gICAgcmVzdWx0LnB1c2godG9wTGVmdClcblxuICAgIHJldHVybiByZXN1bHRcbn1cblxuY29uc3QgT2N0b0FuZ2xlID0gKE1hdGguUEkgKiAyKSAvIDhcblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25Sb3VuZGVkUmVjdCh0b3BMZWZ0OiBQb3NpdGlvbiwgYm90dG9tUmlnaHQ6IFBvc2l0aW9uLCByYWRpdXM6IG51bWJlcik6IFBvbHlnb24ge1xuICAgIGlmIChyYWRpdXMgPD0gMCkge1xuICAgICAgICByZXR1cm4gcG9seWdvblJlY3QodG9wTGVmdCwgYm90dG9tUmlnaHQpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBQb2x5Z29uID0gW11cbiAgICBjb25zdCBtYXhSID0gTWF0aC5taW4oYm90dG9tUmlnaHQueCAtIHRvcExlZnQueCwgYm90dG9tUmlnaHQueSAtIHRvcExlZnQueSkgLyAyXG4gICAgY29uc3QgciA9IE1hdGgubWluKHJhZGl1cywgbWF4UilcblxuICAgIC8vIHRvcCBsZWZ0IGhhbGZcbiAgICByZXN1bHQucHVzaCguLi5wb2x5Z29uQXJjKHsgeDogdG9wTGVmdC54ICsgciwgeTogdG9wTGVmdC55ICsgciB9LCByLCBPY3RvQW5nbGUgKiAzLCBPY3RvQW5nbGUgKiAyKSlcbiAgICByZXN1bHQucHVzaCh7IHg6IHRvcExlZnQueCArIHIsIHk6IHRvcExlZnQueSB9KVxuICAgIHJlc3VsdC5wdXNoKHsgeDogYm90dG9tUmlnaHQueCAtIHIsIHk6IHRvcExlZnQueSB9KVxuXG4gICAgLy8gdG9wIHJpZ2h0XG4gICAgcmVzdWx0LnB1c2goLi4ucG9seWdvbkFyYyh7IHg6IGJvdHRvbVJpZ2h0LnggLSByLCB5OiB0b3BMZWZ0LnkgKyByIH0sIHIsIE9jdG9BbmdsZSAqIDIsIE9jdG9BbmdsZSAqIDApKVxuICAgIHJlc3VsdC5wdXNoKHsgeDogYm90dG9tUmlnaHQueCwgeTogdG9wTGVmdC55ICsgciB9KVxuXG4gICAgLy8gYm90dG9tIHJpZ2h0XG4gICAgcmVzdWx0LnB1c2goLi4ucG9seWdvbkFyYyh7IHg6IGJvdHRvbVJpZ2h0LnggLSByLCB5OiBib3R0b21SaWdodC55IC0gciB9LCByLCBPY3RvQW5nbGUgKiAwLCAtT2N0b0FuZ2xlICogMikpXG4gICAgcmVzdWx0LnB1c2goeyB4OiBib3R0b21SaWdodC54IC0gciwgeTogYm90dG9tUmlnaHQueSB9KVxuXG4gICAgLy8gYm90dG9tIGxlZnRcbiAgICByZXN1bHQucHVzaCguLi5wb2x5Z29uQXJjKHsgeDogdG9wTGVmdC54ICsgciwgeTogYm90dG9tUmlnaHQueSAtIHIgfSwgciwgT2N0b0FuZ2xlICogNiwgT2N0b0FuZ2xlICogNCkpXG4gICAgcmVzdWx0LnB1c2goeyB4OiB0b3BMZWZ0LngsIHk6IGJvdHRvbVJpZ2h0LnkgLSByIH0pXG5cbiAgICAvLyB0b3AgbGVmdCBoYWxmXG4gICAgcmVzdWx0LnB1c2goeyB4OiB0b3BMZWZ0LngsIHk6IHRvcExlZnQueSArIHIgfSlcbiAgICByZXN1bHQucHVzaCguLi5wb2x5Z29uQXJjKHsgeDogdG9wTGVmdC54ICsgciwgeTogdG9wTGVmdC55ICsgciB9LCByLCBPY3RvQW5nbGUgKiA0LCBPY3RvQW5nbGUgKiAzKSlcblxuICAgIHJlc3VsdC5wdXNoKHJlc3VsdFswXSlcblxuICAgIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25BcmMoY2VudGVyOiBQb3NpdGlvbiwgcmFkaXVzOiBudW1iZXIsIHN0YXJ0QW5nbGU6IG51bWJlciwgZW5kQW5nbGU6IG51bWJlcik6IFBvbHlnb24ge1xuICAgIGNvbnN0IHJlc3VsdDogUG9seWdvbiA9IFtdXG5cbiAgICBpZiAocmFkaXVzID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBjb25zdCByZXZlcnNlZCA9IHN0YXJ0QW5nbGUgPiBlbmRBbmdsZVxuICAgIGxldCBhbmdsZSA9IE1hdGgubWluKHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKVxuICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKVxuXG4gICAgZm9yICg7IGFuZ2xlIDwgZW5kOyBhbmdsZSArPSAwLjEpIHtcbiAgICAgICAgY29uc3QgeCA9IGNlbnRlci54ICsgcmFkaXVzICogTWF0aC5jb3MoYW5nbGUpXG4gICAgICAgIGNvbnN0IHkgPSBjZW50ZXIueSAtIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKVxuICAgICAgICByZXN1bHQucHVzaCh7IHgsIHkgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2ZXJzZWQgPyByZXN1bHQucmV2ZXJzZSgpIDogcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2x5Z29uVG9Dc3MocG9seWdvbjogUG9seWdvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwb2x5Z29uKCR7cG9seWdvbi5tYXAocCA9PiBgJHtwLnh9cHggJHtwLnl9cHhgKS5qb2luKFwiLFwiKX0pYFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9zc2libGVSYWRpdXMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKSB7XG4gICAgY29uc3QgZGlzdFggPSBNYXRoLm1heCh4LCBNYXRoLmFicyh3IC0geCkpXG4gICAgY29uc3QgZGlzdFkgPSBNYXRoLm1heCh5LCBNYXRoLmFicyhoIC0geSkpXG4gICAgcmV0dXJuIE1hdGguc3FydChkaXN0WCAqIGRpc3RYICsgZGlzdFkgKiBkaXN0WSlcbn1cbiJdfQ==