@acorex/cdk 22.1.0-next.30 → 22.1.0-next.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/fesm2022/acorex-cdk-accordion.mjs +19 -19
  2. package/fesm2022/acorex-cdk-carousel.mjs +25 -7
  3. package/fesm2022/acorex-cdk-carousel.mjs.map +1 -1
  4. package/fesm2022/acorex-cdk-clipboard.mjs +6 -6
  5. package/fesm2022/acorex-cdk-common.mjs +169 -93
  6. package/fesm2022/acorex-cdk-common.mjs.map +1 -1
  7. package/fesm2022/acorex-cdk-dom.mjs +3 -3
  8. package/fesm2022/acorex-cdk-drag-drop.mjs +210 -68
  9. package/fesm2022/acorex-cdk-drag-drop.mjs.map +1 -1
  10. package/fesm2022/acorex-cdk-drawer.mjs +10 -10
  11. package/fesm2022/acorex-cdk-focus-trap.mjs +3 -3
  12. package/fesm2022/acorex-cdk-full-screen.mjs +26 -147
  13. package/fesm2022/acorex-cdk-full-screen.mjs.map +1 -1
  14. package/fesm2022/acorex-cdk-gesture.mjs +202 -0
  15. package/fesm2022/acorex-cdk-gesture.mjs.map +1 -0
  16. package/fesm2022/acorex-cdk-highlight.mjs +108 -0
  17. package/fesm2022/acorex-cdk-highlight.mjs.map +1 -0
  18. package/fesm2022/acorex-cdk-horizontal-scroll.mjs +150 -125
  19. package/fesm2022/acorex-cdk-horizontal-scroll.mjs.map +1 -1
  20. package/fesm2022/acorex-cdk-input-mask.mjs +3 -3
  21. package/fesm2022/acorex-cdk-list-navigation.mjs +10 -10
  22. package/fesm2022/acorex-cdk-outline.mjs +277 -74
  23. package/fesm2022/acorex-cdk-outline.mjs.map +1 -1
  24. package/fesm2022/acorex-cdk-overlay.mjs +192 -18
  25. package/fesm2022/acorex-cdk-overlay.mjs.map +1 -1
  26. package/fesm2022/acorex-cdk-pan-view.mjs +3 -3
  27. package/fesm2022/acorex-cdk-resizable.mjs +3 -3
  28. package/fesm2022/acorex-cdk-selection.mjs +10 -10
  29. package/fesm2022/acorex-cdk-shimmer.mjs +220 -0
  30. package/fesm2022/acorex-cdk-shimmer.mjs.map +1 -0
  31. package/fesm2022/acorex-cdk-sliding-item.mjs +72 -62
  32. package/fesm2022/acorex-cdk-sliding-item.mjs.map +1 -1
  33. package/fesm2022/acorex-cdk-sticky.mjs +3 -3
  34. package/fesm2022/acorex-cdk-uploader.mjs +9 -9
  35. package/fesm2022/acorex-cdk-virtual-scroll.mjs +10 -10
  36. package/fesm2022/acorex-cdk-z-index.mjs +3 -3
  37. package/gesture/README.md +3 -0
  38. package/horizontal-scroll/README.md +1 -1
  39. package/package.json +16 -7
  40. package/shimmer/README.md +11 -0
  41. package/sliding-item/README.md +4 -2
  42. package/types/acorex-cdk-carousel.d.ts +2 -0
  43. package/types/acorex-cdk-clipboard.d.ts +1 -1
  44. package/types/acorex-cdk-common.d.ts +36 -19
  45. package/types/acorex-cdk-drag-drop.d.ts +31 -4
  46. package/types/acorex-cdk-full-screen.d.ts +18 -43
  47. package/types/acorex-cdk-gesture.d.ts +132 -0
  48. package/types/acorex-cdk-highlight.d.ts +54 -0
  49. package/types/acorex-cdk-horizontal-scroll.d.ts +39 -28
  50. package/types/acorex-cdk-outline.d.ts +20 -0
  51. package/types/acorex-cdk-overlay.d.ts +47 -4
  52. package/types/acorex-cdk-shimmer.d.ts +68 -0
  53. package/types/acorex-cdk-sliding-item.d.ts +22 -4
  54. package/types/acorex-cdk-uploader.d.ts +1 -1
  55. package/fesm2022/acorex-cdk-double-click.mjs +0 -178
  56. package/fesm2022/acorex-cdk-double-click.mjs.map +0 -1
  57. package/types/acorex-cdk-double-click.d.ts +0 -66
@@ -1,66 +1,77 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnDestroy } from '@angular/core';
3
+ import * as i1 from '@acorex/cdk/gesture';
3
4
 
4
5
  /**
5
- * Converts vertical mouse-wheel scrolling and pointer drag/swipe into horizontal scrolling on the host element.
6
- * Applies only when the host can scroll horizontally. Pointer events cover mouse, touch, and pen.
6
+ * Converts vertical mouse-wheel scrolling and pan gestures into scrolling on the host element.
7
+ * Supports horizontal and vertical orientations. Pan is provided by the hosted AXGestureDirective.
7
8
  *
8
9
  * Usage:
9
10
  * <div axHorizontalScroll [speed]="150" class="overflow-x-auto">
10
11
  * ...
11
12
  * </div>
13
+ *
14
+ * Do not put `axGesture` on the same element; this directive already hosts it.
12
15
  */
13
16
  declare class AXHorizontalScrollDirective implements OnDestroy {
14
17
  #private;
15
- private elementRef;
16
- private platformId;
17
- private zone;
18
+ private readonly elementRef;
19
+ private readonly platformId;
20
+ private readonly zone;
21
+ private readonly gesture;
22
+ private readonly destroyRef;
18
23
  /**
19
- * Disables wheel-to-horizontal conversion and pointer drag when true.
24
+ * Disables wheel-to-horizontal conversion and pan scrolling when true.
20
25
  */
21
26
  disabled: _angular_core.InputSignal<boolean>;
22
27
  /**
23
- * Horizontal scroll animation duration in milliseconds.
28
+ * Scroll axis. Horizontal converts wheel + pan; vertical uses pan only.
29
+ * @defaultValue 'horizontal'
30
+ */
31
+ orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
32
+ /** Internal orientation state; can be overridden programmatically by host components. */
33
+ readonly scrollOrientation: _angular_core.WritableSignal<"horizontal" | "vertical">;
34
+ /**
35
+ * Scroll animation duration in milliseconds.
24
36
  * Lower values scroll faster; `0` applies the scroll instantly.
25
37
  */
26
38
  speed: _angular_core.InputSignal<number>;
27
39
  private animationFrameId;
28
- private targetScrollLeft;
40
+ private targetScrollPosition;
29
41
  private scrollPosition;
30
42
  private lastFrameTime;
31
- private pointerId;
32
- private pointerStartX;
33
- private pointerStartY;
34
- private pointerStartScrollLeft;
35
- private pointerAxis;
36
- private lastPointerX;
37
- private lastPointerTime;
38
- private pointerVelocityX;
43
+ private isPanning;
44
+ private ignorePan;
45
+ private panStartScrollPosition;
39
46
  private suppressClickListener;
40
47
  private suppressClickTimer;
41
- private readonly axisLockThreshold;
48
+ private _isRtl;
42
49
  private readonly interactiveSelector;
43
50
  private readonly wheelListener;
44
- private readonly pointerDownListener;
45
- private readonly pointerMoveListener;
46
- private readonly pointerUpListener;
51
+ protected touchAction(): string | null;
52
+ constructor();
47
53
  ngOnDestroy(): void;
48
54
  private get nativeElement();
55
+ private isHorizontal;
56
+ private get rtlSign();
57
+ private refreshRtlState;
58
+ private getCurrentScrollPosition;
59
+ private getMaxScrollPosition;
60
+ private canScroll;
61
+ private applyScrollPosition;
62
+ private isDragInProgress;
49
63
  private handleWheel;
50
- private handlePointerDown;
51
- private handlePointerMove;
52
- private handlePointerUp;
53
- private releasePointer;
64
+ private handlePanStart;
65
+ private handlePanMove;
66
+ private handlePanEnd;
67
+ private clearPanStyles;
54
68
  private suppressClick;
55
69
  private clearClickSuppression;
56
70
  private syncScrollState;
57
71
  private startAnimation;
58
- private applyScrollPosition;
59
72
  private stopAnimation;
60
- private canScrollHorizontally;
61
- private getMaxScrollLeft;
62
73
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXHorizontalScrollDirective, never>;
63
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXHorizontalScrollDirective, "[axHorizontalScroll]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
74
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXHorizontalScrollDirective, "[axHorizontalScroll]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.AXGestureDirective; inputs: {}; outputs: {}; }]>;
64
75
  }
65
76
 
66
77
  export { AXHorizontalScrollDirective };
@@ -27,6 +27,8 @@ declare class AXOutlineContainerDirective implements OnDestroy, AfterViewInit {
27
27
  scrollableElementId: _angular_core.InputSignal<string>;
28
28
  private scrollTop;
29
29
  private outlineItems;
30
+ private lastScrollSpyIndex;
31
+ private heldActiveIndex;
30
32
  private scrollableElement;
31
33
  private mutationSubject;
32
34
  private readonly MUTATION_DEBOUNCE_TIME;
@@ -34,7 +36,25 @@ declare class AXOutlineContainerDirective implements OnDestroy, AfterViewInit {
34
36
  outlineItems$: BehaviorSubject<outlineItemType[]>;
35
37
  ngOnDestroy(): void;
36
38
  ngAfterViewInit(): void;
39
+ scrollToItem(id: string): void;
40
+ private resolveScrollEventTarget;
41
+ private readScrollTop;
42
+ private handleInContentOutlineLinkClick;
43
+ private scrollToItemFromHash;
44
+ private releaseHeldActiveIndex;
45
+ private stopOngoingSmoothScroll;
46
+ private getOutlineIdFromHref;
47
+ private syncLocationHash;
37
48
  private scrollChanged;
49
+ private bindUserScrollIntent;
50
+ private resolveActiveIndex;
51
+ /**
52
+ * Maps scroll position to the active outline item. Sections with little content often
53
+ * have overlapping activation thresholds; each section gets a minimum scroll slot so
54
+ * short blocks are not skipped while scrolling.
55
+ */
56
+ private resolveByScrollSlots;
57
+ private applyActiveIndex;
38
58
  private setOutlineItems;
39
59
  refreshOutlineItems(): void;
40
60
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXOutlineContainerDirective, never>;
@@ -4,6 +4,40 @@ import { AXZToken } from '@acorex/core/z-index';
4
4
  import * as i0 from '@angular/core';
5
5
  import { ElementRef, EmbeddedViewRef, ComponentRef } from '@angular/core';
6
6
 
7
+ declare const AX_OVERLAY_DEFAULT_ENTER_ANIMATION: string[];
8
+ declare const AX_OVERLAY_DEFAULT_LEAVE_ANIMATION: string[];
9
+ type AXOverlayAnimation = boolean | string[] | {
10
+ enter?: string[];
11
+ leave?: string[];
12
+ };
13
+ interface AXOverlayResolvedAnimation {
14
+ enter: string[];
15
+ leave: string[];
16
+ }
17
+ /**
18
+ * Resolves overlay animation classes.
19
+ * - omitted: no animation (opt-in at the overlay layer)
20
+ * - `true`: default fade in/out
21
+ * - `false` or `[]`: no animation
22
+ * - `string[]`: custom enter classes only
23
+ * - `{ enter, leave }`: omitted keys fall back to the default fade classes
24
+ */
25
+ declare function resolveOverlayAnimation(animation?: AXOverlayAnimation): AXOverlayResolvedAnimation;
26
+ /** Prefers the content/pane so transforms are not applied to the full-screen container. */
27
+ declare function getOverlayAnimationTarget(container: HTMLElement): HTMLElement;
28
+ declare function applyOverlayAnimationClasses(element: HTMLElement, classes: string[]): void;
29
+ declare function removeOverlayAnimationClasses(element: HTMLElement, classes: string[]): void;
30
+ declare function prefersReducedMotion(documentRef: Document): boolean;
31
+ declare function parseCssTimeList(value: string): number[];
32
+ /** Maps theme duration utility classes to milliseconds (see tailwind-base). */
33
+ declare function getAnimationDurationFromClasses(classes: string[]): number;
34
+ declare function getOverlayAnimationTimeout(element: HTMLElement, documentRef: Document, fallbackMs?: number): number;
35
+ declare function playOverlayLeaveAnimation(element: HTMLElement, enter: string[], leave: string[], documentRef: Document): Promise<void>;
36
+ declare function waitForOverlayAnimationEnd(element: HTMLElement, documentRef: Document, options?: {
37
+ fallbackMs?: number;
38
+ animationName?: string;
39
+ }): Promise<void>;
40
+
7
41
  type AXOverlayVisualContextScope = 'full' | 'theme';
8
42
  interface AXOverlayVisualContext {
9
43
  appearance?: string;
@@ -29,7 +63,7 @@ interface AXOverlayRef<T> {
29
63
  instance: EmbeddedViewRef<T> | ComponentRef<T>;
30
64
  /** Updates the overlay position relative to the anchor */
31
65
  updatePosition: () => void;
32
- /** Destroys the overlay and removes it from the DOM */
66
+ /** Destroys the overlay. DOM removal waits for a leave animation when one is configured. */
33
67
  dispose: () => void;
34
68
  /** The overlay container element */
35
69
  overlayElement: HTMLElement | null;
@@ -62,12 +96,20 @@ interface AXOverlayOptions extends AXComponentOptions {
62
96
  anchorOptions?: AXOverlayAnchorOptions;
63
97
  /** Custom CSS class for the overlay panel */
64
98
  panelClass?: string | string[];
99
+ /**
100
+ * Enter/leave animation applied to overlay content (`.ax-overlay-content` or `.ax-overlay-pane`),
101
+ * not the full-screen container. Omitted: no animation. `true`: default fade in/out.
102
+ * `false` or `[]`: disabled. A class array is enter-only. `{ enter, leave }` configures both.
103
+ */
104
+ animation?: AXOverlayAnimation;
65
105
  /** Whether to close when clicking outside */
66
106
  closeOnOutsideClick?: boolean;
67
107
  /** Whether to close when pressing Escape */
68
108
  closeOnEscape?: boolean;
69
109
  /** Width of the overlay container (e.g., 'auto', '200px', '100%') */
70
110
  width?: string;
111
+ /** Dispose this overlay when Angular starts a navigation. Default: true. */
112
+ closeOnNavigation?: boolean;
71
113
  /** Callback when the overlay is disposed (e.g., due to scroll) */
72
114
  onDispose?: () => void;
73
115
  /** Whether to use centered container (default: true). Set to false for positioned overlays like toasts */
@@ -127,6 +169,7 @@ declare class AXOverlayService {
127
169
  private document;
128
170
  private zIndexService;
129
171
  private _platform;
172
+ private router;
130
173
  /**
131
174
  * Creates an overlay with optional anchor-based positioning.
132
175
  * @param content - Component or template to display
@@ -160,8 +203,8 @@ declare class AXOverlayService {
160
203
  private positionOverlay;
161
204
  private applyOverlayVisualContext;
162
205
  static ɵfac: i0.ɵɵFactoryDeclaration<AXOverlayService, never>;
163
- static ɵprov: i0.ɵɵInjectableDeclaration<AXOverlayService>;
206
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
164
207
  }
165
208
 
166
- export { APPEARANCE_CLASSES, AXOverlayService, CONTRAST_CLASSES, MANAGED_OVERLAY_VISUAL_CLASSES, SIZE_CLASSES, THEME_CLASSES, applyVisualContext, calculateAnchorPosition, clampToViewport, findBestPosition, fitsInViewport, resolveContextElement, resolveVisualContext };
167
- export type { AXOverlayAnchorOptions, AXOverlayOptions, AXOverlayRef, AXOverlayVisualContext, AXOverlayVisualContextScope };
209
+ export { APPEARANCE_CLASSES, AXOverlayService, AX_OVERLAY_DEFAULT_ENTER_ANIMATION, AX_OVERLAY_DEFAULT_LEAVE_ANIMATION, CONTRAST_CLASSES, MANAGED_OVERLAY_VISUAL_CLASSES, SIZE_CLASSES, THEME_CLASSES, applyOverlayAnimationClasses, applyVisualContext, calculateAnchorPosition, clampToViewport, findBestPosition, fitsInViewport, getAnimationDurationFromClasses, getOverlayAnimationTarget, getOverlayAnimationTimeout, parseCssTimeList, playOverlayLeaveAnimation, prefersReducedMotion, removeOverlayAnimationClasses, resolveContextElement, resolveOverlayAnimation, resolveVisualContext, waitForOverlayAnimationEnd };
210
+ export type { AXOverlayAnchorOptions, AXOverlayAnimation, AXOverlayOptions, AXOverlayRef, AXOverlayResolvedAnimation, AXOverlayVisualContext, AXOverlayVisualContextScope };
@@ -0,0 +1,68 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /**
4
+ * Applies the shimmer text effect to a host element.
5
+ */
6
+ declare class AXShimmerDirective {
7
+ #private;
8
+ private readonly hostElement;
9
+ private readonly destroyRef;
10
+ private readonly platformId;
11
+ private readonly refresh;
12
+ /**
13
+ * Plays the shimmer animation once instead of looping.
14
+ *
15
+ * @defaultValue false
16
+ */
17
+ once: _angular_core.InputSignal<boolean>;
18
+ /**
19
+ * Reverses the shimmer sweep direction.
20
+ *
21
+ * @defaultValue false
22
+ */
23
+ reverse: _angular_core.InputSignal<boolean>;
24
+ /**
25
+ * Disables the shimmer effect and renders normal text.
26
+ *
27
+ * @defaultValue false
28
+ */
29
+ disabled: _angular_core.InputSignal<boolean>;
30
+ /**
31
+ * Duration of one shimmer sweep in milliseconds.
32
+ *
33
+ * @defaultValue 2000
34
+ */
35
+ duration: _angular_core.InputSignal<number>;
36
+ /**
37
+ * Width of the highlight band. Numbers use the spacing scale; strings accept any CSS length.
38
+ */
39
+ spread: _angular_core.InputSignal<string | number>;
40
+ /**
41
+ * Tilt of the highlight band in degrees.
42
+ *
43
+ * @defaultValue 20
44
+ */
45
+ angle: _angular_core.InputSignal<number>;
46
+ /**
47
+ * Explicit highlight color. Accepts ACoreX semantic colors (`primary`, `danger`, …) or any CSS color value.
48
+ * Falls back to a tint derived from currentColor when omitted.
49
+ */
50
+ color: _angular_core.InputSignal<string>;
51
+ constructor();
52
+ private get element();
53
+ private resolveSpread;
54
+ private isSemanticColor;
55
+ private resolveHighlightColor;
56
+ private isDarkMode;
57
+ private isRtl;
58
+ private prefersReducedMotion;
59
+ private buildBackgroundImage;
60
+ private applyShimmerStyles;
61
+ private clearShimmerStyles;
62
+ private restartShimmerAnimation;
63
+ private cancelShimmerAnimation;
64
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXShimmerDirective, never>;
65
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXShimmerDirective, "[axShimmer]", never, { "once": { "alias": "once"; "required": false; "isSignal": true; }; "reverse": { "alias": "reverse"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "spread": { "alias": "spread"; "required": false; "isSignal": true; }; "angle": { "alias": "angle"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
66
+ }
67
+
68
+ export { AXShimmerDirective };
@@ -1,18 +1,36 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import * as i1 from '@acorex/cdk/gesture';
2
3
 
4
+ /**
5
+ * Enables horizontal sliding on the host via the hosted AXGestureDirective pan events.
6
+ *
7
+ * Do not put `axGesture` on the same element; this directive already hosts it.
8
+ */
3
9
  declare class AXSlidingItemDirective {
4
10
  #private;
5
- private hostElement;
6
- private isMouseDown;
7
- private prevX;
11
+ private readonly hostElement;
12
+ private readonly gesture;
13
+ private readonly destroyRef;
8
14
  currentX: _angular_core.WritableSignal<number>;
9
15
  stopPoint: _angular_core.WritableSignal<number>;
10
16
  disableSlidingRight: _angular_core.WritableSignal<boolean>;
11
17
  disableSlidingLeft: _angular_core.WritableSignal<boolean>;
18
+ protected readonly cursor: _angular_core.WritableSignal<string>;
19
+ private originX;
20
+ constructor();
21
+ private handlePanStart;
22
+ private handlePanMove;
23
+ private handlePanEnd;
12
24
  private dismiss;
25
+ /**
26
+ * Sets the position of the sliding element.
27
+ *
28
+ * @param pos - The horizontal position in pixels to set the element to
29
+ * @returns void - No return value. The element's transform is updated to the specified position.
30
+ */
13
31
  setPosition(pos: number): void;
14
32
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSlidingItemDirective, never>;
15
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXSlidingItemDirective, "[axSlidingItem]", never, {}, {}, never, never, true, never>;
33
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXSlidingItemDirective, "[axSlidingItem]", never, {}, {}, never, never, true, [{ directive: typeof i1.AXGestureDirective; inputs: {}; outputs: {}; }]>;
16
34
  }
17
35
 
18
36
  export { AXSlidingItemDirective };
@@ -381,7 +381,7 @@ declare class AXUploaderService {
381
381
  private bindEvents;
382
382
  private applyFileTypeValidation;
383
383
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXUploaderService, never>;
384
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXUploaderService>;
384
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
385
385
  }
386
386
 
387
387
  export { AXUploadRequest, AXUploaderBrowseDirective, AXUploaderService, AXUploaderZoneDirective };
@@ -1,178 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, output, Directive } from '@angular/core';
3
-
4
- /**
5
- * Directive to detect single-click and double-click events on the host element.
6
- * Supports both desktop (click-based detection) and mobile (touchend) events.
7
- * Prevents native click event propagation and emits separate single-click and double-click events.
8
- * Can be disabled to allow native DOM behavior (click and dblclick events).
9
- *
10
- * Usage:
11
- * <button
12
- * axDoubleClick
13
- * [duration]="300"
14
- * [disabled]="false"
15
- * (onClick)="onSingleClick($event)"
16
- * (onDblClick)="onDoubleClick($event)"
17
- * >Click me</button>
18
- */
19
- class AXDoubleClickDirective {
20
- constructor() {
21
- this.elementRef = inject(ElementRef);
22
- /**
23
- * Input to configure the duration in milliseconds for detecting double-clicks.
24
- * Defaults to 250ms.
25
- * Two clicks/taps within this duration are considered a double-click.
26
- */
27
- this.duration = input(250, /* @ts-ignore */
28
- ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
29
- /**
30
- * Input to disable the directive's custom click handling.
31
- * When true, native click and dblclick events will fire normally (DOM default behavior).
32
- * When false (default), the directive prevents default and emits custom single/double-click events.
33
- * Defaults to false.
34
- */
35
- this.disabled = input(false, /* @ts-ignore */
36
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
37
- /**
38
- * Output event emitted when a single-click is detected.
39
- * Emits after the configured duration milliseconds if no second click occurs.
40
- * Emits the MouseEvent.
41
- */
42
- this.onClick = output();
43
- /**
44
- * Output event emitted when a double-click is detected.
45
- * Emits when two clicks occur within the configured duration milliseconds.
46
- * Emits the Event (MouseEvent for desktop, TouchEvent for mobile).
47
- */
48
- this.onDblClick = output();
49
- this.lastClick = 0;
50
- this.lastTap = 0;
51
- this.clickTimeout = null;
52
- this.pendingClickEvent = null;
53
- }
54
- /**
55
- * Handles click events and detects both single-clicks and double-clicks.
56
- * Prevents native click propagation and emits appropriate events.
57
- * When disabled is true, emits click immediately, still detects double-clicks, and allows native DOM behavior (no preventDefault).
58
- */
59
- handleClick(event) {
60
- const duration = this.duration();
61
- const currentTime = new Date().getTime();
62
- const clickGap = currentTime - this.lastClick;
63
- // If disabled, emit click immediately and still track for double-click, but don't prevent default
64
- if (this.disabled()) {
65
- // Emit single click immediately
66
- this.onClick.emit(event);
67
- // Still track for double-click detection
68
- if (clickGap > 0 && clickGap < duration) {
69
- // Double-click detected - emit double-click
70
- if (this.clickTimeout) {
71
- clearTimeout(this.clickTimeout);
72
- this.clickTimeout = null;
73
- }
74
- if (this.pendingClickEvent) {
75
- this.pendingClickEvent = null;
76
- }
77
- this.onDblClick.emit(event);
78
- this.lastClick = 0;
79
- }
80
- else {
81
- // First click - store it and wait to see if a second click comes
82
- this.lastClick = currentTime;
83
- this.pendingClickEvent = event;
84
- if (this.clickTimeout) {
85
- clearTimeout(this.clickTimeout);
86
- }
87
- // Set timeout to emit double-click if second click occurs within duration
88
- // Note: We already emitted single-click, so we just track for double-click here
89
- this.clickTimeout = setTimeout(() => {
90
- // No double-click detected within duration, reset state
91
- this.pendingClickEvent = null;
92
- this.lastClick = 0;
93
- this.clickTimeout = null;
94
- }, duration);
95
- }
96
- // Don't prevent default - allow native click and dblclick to fire
97
- return;
98
- }
99
- // When enabled, prevent the native click event from propagating
100
- event.preventDefault();
101
- event.stopPropagation();
102
- event.stopImmediatePropagation();
103
- if (clickGap > 0 && clickGap < duration) {
104
- // Double-click detected - clear pending single click and emit double-click
105
- if (this.clickTimeout) {
106
- clearTimeout(this.clickTimeout);
107
- this.clickTimeout = null;
108
- }
109
- if (this.pendingClickEvent) {
110
- this.pendingClickEvent = null;
111
- }
112
- this.onDblClick.emit(event);
113
- this.lastClick = 0;
114
- }
115
- else {
116
- // First click - store it and wait to see if a second click comes
117
- this.lastClick = currentTime;
118
- this.pendingClickEvent = event;
119
- if (this.clickTimeout) {
120
- clearTimeout(this.clickTimeout);
121
- }
122
- // Set timeout to emit single-click if no second click occurs
123
- this.clickTimeout = setTimeout(() => {
124
- // No double-click detected, emit single-click
125
- if (this.pendingClickEvent) {
126
- this.onClick.emit(this.pendingClickEvent);
127
- this.pendingClickEvent = null;
128
- }
129
- this.lastClick = 0;
130
- this.clickTimeout = null;
131
- }, duration);
132
- }
133
- }
134
- /**
135
- * Handles touchend events (mobile) to detect double-tap.
136
- * When disabled is true, allows native touch behavior.
137
- */
138
- onTouchEnd(event) {
139
- // If disabled, let native events fire normally
140
- if (this.disabled()) {
141
- return;
142
- }
143
- const duration = this.duration();
144
- const currentTime = new Date().getTime();
145
- const tapGap = currentTime - this.lastTap;
146
- if (tapGap > 0 && tapGap < duration) {
147
- // Detected a double-tap
148
- this.onDblClick.emit(event);
149
- event.preventDefault(); // Prevent further default actions
150
- }
151
- this.lastTap = currentTime;
152
- }
153
- ngOnDestroy() {
154
- if (this.clickTimeout) {
155
- clearTimeout(this.clickTimeout);
156
- this.clickTimeout = null;
157
- }
158
- }
159
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXDoubleClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
160
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXDoubleClickDirective, isStandalone: true, selector: "[axDoubleClick]", inputs: { duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onClick: "onClick", onDblClick: "onDblClick" }, host: { listeners: { "click": "handleClick($event)", "touchend": "onTouchEnd($event)" } }, ngImport: i0 }); }
161
- }
162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXDoubleClickDirective, decorators: [{
163
- type: Directive,
164
- args: [{
165
- selector: '[axDoubleClick]',
166
- host: {
167
- '(click)': 'handleClick($event)',
168
- '(touchend)': 'onTouchEnd($event)',
169
- },
170
- }]
171
- }], propDecorators: { duration: [{ type: i0.Input, args: [{ isSignal: true, alias: "duration", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], onClick: [{ type: i0.Output, args: ["onClick"] }], onDblClick: [{ type: i0.Output, args: ["onDblClick"] }] } });
172
-
173
- /**
174
- * Generated bundle index. Do not edit.
175
- */
176
-
177
- export { AXDoubleClickDirective };
178
- //# sourceMappingURL=acorex-cdk-double-click.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acorex-cdk-double-click.mjs","sources":["../../../../packages/cdk/double-click/src/lib/double-click.directive.ts","../../../../packages/cdk/double-click/src/acorex-cdk-double-click.ts"],"sourcesContent":["import { Directive, ElementRef, inject, input, OnDestroy, output } from '@angular/core';\n\n/**\n * Directive to detect single-click and double-click events on the host element.\n * Supports both desktop (click-based detection) and mobile (touchend) events.\n * Prevents native click event propagation and emits separate single-click and double-click events.\n * Can be disabled to allow native DOM behavior (click and dblclick events).\n *\n * Usage:\n * <button\n * axDoubleClick\n * [duration]=\"300\"\n * [disabled]=\"false\"\n * (onClick)=\"onSingleClick($event)\"\n * (onDblClick)=\"onDoubleClick($event)\"\n * >Click me</button>\n */\n@Directive({\n selector: '[axDoubleClick]',\n host: {\n '(click)': 'handleClick($event)',\n '(touchend)': 'onTouchEnd($event)',\n },\n})\nexport class AXDoubleClickDirective implements OnDestroy {\n private elementRef = inject(ElementRef);\n\n /**\n * Input to configure the duration in milliseconds for detecting double-clicks.\n * Defaults to 250ms.\n * Two clicks/taps within this duration are considered a double-click.\n */\n public duration = input<number>(250);\n\n /**\n * Input to disable the directive's custom click handling.\n * When true, native click and dblclick events will fire normally (DOM default behavior).\n * When false (default), the directive prevents default and emits custom single/double-click events.\n * Defaults to false.\n */\n public disabled = input<boolean>(false);\n\n /**\n * Output event emitted when a single-click is detected.\n * Emits after the configured duration milliseconds if no second click occurs.\n * Emits the MouseEvent.\n */\n public onClick = output<MouseEvent>();\n\n /**\n * Output event emitted when a double-click is detected.\n * Emits when two clicks occur within the configured duration milliseconds.\n * Emits the Event (MouseEvent for desktop, TouchEvent for mobile).\n */\n public onDblClick = output<Event>();\n\n private lastClick = 0;\n private lastTap = 0;\n private clickTimeout: ReturnType<typeof setTimeout> | null = null;\n private pendingClickEvent: MouseEvent | null = null;\n\n /**\n * Handles click events and detects both single-clicks and double-clicks.\n * Prevents native click propagation and emits appropriate events.\n * When disabled is true, emits click immediately, still detects double-clicks, and allows native DOM behavior (no preventDefault).\n */\n handleClick(event: MouseEvent): void {\n const duration = this.duration();\n const currentTime = new Date().getTime();\n const clickGap = currentTime - this.lastClick;\n\n // If disabled, emit click immediately and still track for double-click, but don't prevent default\n if (this.disabled()) {\n // Emit single click immediately\n this.onClick.emit(event);\n\n // Still track for double-click detection\n if (clickGap > 0 && clickGap < duration) {\n // Double-click detected - emit double-click\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n this.clickTimeout = null;\n }\n if (this.pendingClickEvent) {\n this.pendingClickEvent = null;\n }\n this.onDblClick.emit(event);\n this.lastClick = 0;\n } else {\n // First click - store it and wait to see if a second click comes\n this.lastClick = currentTime;\n this.pendingClickEvent = event;\n\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n }\n\n // Set timeout to emit double-click if second click occurs within duration\n // Note: We already emitted single-click, so we just track for double-click here\n this.clickTimeout = setTimeout(() => {\n // No double-click detected within duration, reset state\n this.pendingClickEvent = null;\n this.lastClick = 0;\n this.clickTimeout = null;\n }, duration);\n }\n\n // Don't prevent default - allow native click and dblclick to fire\n return;\n }\n\n // When enabled, prevent the native click event from propagating\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n if (clickGap > 0 && clickGap < duration) {\n // Double-click detected - clear pending single click and emit double-click\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n this.clickTimeout = null;\n }\n if (this.pendingClickEvent) {\n this.pendingClickEvent = null;\n }\n this.onDblClick.emit(event);\n this.lastClick = 0;\n } else {\n // First click - store it and wait to see if a second click comes\n this.lastClick = currentTime;\n this.pendingClickEvent = event;\n\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n }\n\n // Set timeout to emit single-click if no second click occurs\n this.clickTimeout = setTimeout(() => {\n // No double-click detected, emit single-click\n if (this.pendingClickEvent) {\n this.onClick.emit(this.pendingClickEvent);\n this.pendingClickEvent = null;\n }\n this.lastClick = 0;\n this.clickTimeout = null;\n }, duration);\n }\n }\n\n /**\n * Handles touchend events (mobile) to detect double-tap.\n * When disabled is true, allows native touch behavior.\n */\n onTouchEnd(event: TouchEvent): void {\n // If disabled, let native events fire normally\n if (this.disabled()) {\n return;\n }\n\n const duration = this.duration();\n const currentTime = new Date().getTime();\n const tapGap = currentTime - this.lastTap;\n\n if (tapGap > 0 && tapGap < duration) {\n // Detected a double-tap\n this.onDblClick.emit(event);\n event.preventDefault(); // Prevent further default actions\n }\n this.lastTap = currentTime;\n }\n\n ngOnDestroy(): void {\n if (this.clickTimeout) {\n clearTimeout(this.clickTimeout);\n this.clickTimeout = null;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;AAcG;MAQU,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;AAQU,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC;;;;AAIG;QACI,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,GAAG;qFAAC;AAEpC;;;;;AAKG;QACI,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK;qFAAC;AAEvC;;;;AAIG;QACI,IAAA,CAAA,OAAO,GAAG,MAAM,EAAc;AAErC;;;;AAIG;QACI,IAAA,CAAA,UAAU,GAAG,MAAM,EAAS;QAE3B,IAAA,CAAA,SAAS,GAAG,CAAC;QACb,IAAA,CAAA,OAAO,GAAG,CAAC;QACX,IAAA,CAAA,YAAY,GAAyC,IAAI;QACzD,IAAA,CAAA,iBAAiB,GAAsB,IAAI;AAsHpD,IAAA;AApHC;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAiB,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;AACxC,QAAA,MAAM,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC,SAAS;;AAG7C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;;AAEnB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;YAGxB,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,QAAQ,EAAE;;AAEvC,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,oBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;gBAC1B;AACA,gBAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,oBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;gBAC/B;AACA,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,gBAAA,IAAI,CAAC,SAAS,GAAG,CAAC;YACpB;iBAAO;;AAEL,gBAAA,IAAI,CAAC,SAAS,GAAG,WAAW;AAC5B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAE9B,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,oBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;gBACjC;;;AAIA,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;;AAElC,oBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,oBAAA,IAAI,CAAC,SAAS,GAAG,CAAC;AAClB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;gBAC1B,CAAC,EAAE,QAAQ,CAAC;YACd;;YAGA;QACF;;QAGA,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,wBAAwB,EAAE;QAEhC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,QAAQ,EAAE;;AAEvC,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YAC1B;AACA,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;YAC/B;AACA,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,CAAC,SAAS,GAAG,CAAC;QACpB;aAAO;;AAEL,YAAA,IAAI,CAAC,SAAS,GAAG,WAAW;AAC5B,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAE9B,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;YACjC;;AAGA,YAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;;AAElC,gBAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;oBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACzC,oBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;gBAC/B;AACA,gBAAA,IAAI,CAAC,SAAS,GAAG,CAAC;AAClB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YAC1B,CAAC,EAAE,QAAQ,CAAC;QACd;IACF;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,KAAiB,EAAA;;AAE1B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC,OAAO;QAEzC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,QAAQ,EAAE;;AAEnC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,YAAA,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,WAAW;IAC5B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;8GAxJW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,qBAAqB;AAChC,wBAAA,YAAY,EAAE,oBAAoB;AACnC,qBAAA;AACF,iBAAA;;;ACvBD;;AAEG;;;;"}
@@ -1,66 +0,0 @@
1
- import * as _angular_core from '@angular/core';
2
- import { OnDestroy } from '@angular/core';
3
-
4
- /**
5
- * Directive to detect single-click and double-click events on the host element.
6
- * Supports both desktop (click-based detection) and mobile (touchend) events.
7
- * Prevents native click event propagation and emits separate single-click and double-click events.
8
- * Can be disabled to allow native DOM behavior (click and dblclick events).
9
- *
10
- * Usage:
11
- * <button
12
- * axDoubleClick
13
- * [duration]="300"
14
- * [disabled]="false"
15
- * (onClick)="onSingleClick($event)"
16
- * (onDblClick)="onDoubleClick($event)"
17
- * >Click me</button>
18
- */
19
- declare class AXDoubleClickDirective implements OnDestroy {
20
- private elementRef;
21
- /**
22
- * Input to configure the duration in milliseconds for detecting double-clicks.
23
- * Defaults to 250ms.
24
- * Two clicks/taps within this duration are considered a double-click.
25
- */
26
- duration: _angular_core.InputSignal<number>;
27
- /**
28
- * Input to disable the directive's custom click handling.
29
- * When true, native click and dblclick events will fire normally (DOM default behavior).
30
- * When false (default), the directive prevents default and emits custom single/double-click events.
31
- * Defaults to false.
32
- */
33
- disabled: _angular_core.InputSignal<boolean>;
34
- /**
35
- * Output event emitted when a single-click is detected.
36
- * Emits after the configured duration milliseconds if no second click occurs.
37
- * Emits the MouseEvent.
38
- */
39
- onClick: _angular_core.OutputEmitterRef<MouseEvent>;
40
- /**
41
- * Output event emitted when a double-click is detected.
42
- * Emits when two clicks occur within the configured duration milliseconds.
43
- * Emits the Event (MouseEvent for desktop, TouchEvent for mobile).
44
- */
45
- onDblClick: _angular_core.OutputEmitterRef<Event>;
46
- private lastClick;
47
- private lastTap;
48
- private clickTimeout;
49
- private pendingClickEvent;
50
- /**
51
- * Handles click events and detects both single-clicks and double-clicks.
52
- * Prevents native click propagation and emits appropriate events.
53
- * When disabled is true, emits click immediately, still detects double-clicks, and allows native DOM behavior (no preventDefault).
54
- */
55
- handleClick(event: MouseEvent): void;
56
- /**
57
- * Handles touchend events (mobile) to detect double-tap.
58
- * When disabled is true, allows native touch behavior.
59
- */
60
- onTouchEnd(event: TouchEvent): void;
61
- ngOnDestroy(): void;
62
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXDoubleClickDirective, never>;
63
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXDoubleClickDirective, "[axDoubleClick]", never, { "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "onClick": "onClick"; "onDblClick": "onDblClick"; }, never, never, true, never>;
64
- }
65
-
66
- export { AXDoubleClickDirective };