@radix-ng/primitives 1.0.0-beta.3 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/radix-ng-primitives-accordion.mjs +5 -3
- package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-alert-dialog.mjs +3 -2
- package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-autocomplete.mjs +617 -659
- package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-calendar.mjs +5 -3
- package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-combobox.mjs +1305 -572
- package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-config.mjs +13 -4
- package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
- package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-core.mjs +1345 -64
- package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
- package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-dialog.mjs +240 -112
- package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
- package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
- package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-drawer.mjs +3 -3
- package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-field.mjs +3 -2
- package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +517 -0
- package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-focus-scope.mjs +296 -70
- package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menu.mjs +861 -286
- package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
- package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs +144 -159
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popover.mjs +220 -205
- package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popper.mjs +94 -51
- package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-presence.mjs +1 -1
- package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-preview-card.mjs +141 -173
- package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
- package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
- package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-select.mjs +211 -156
- package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs +5 -3
- package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-stepper.mjs +5 -3
- package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
- package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
- package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toggle-group.mjs +5 -3
- package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
- package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tooltip.mjs +73 -110
- package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
- package/package.json +10 -1
- package/types/radix-ng-primitives-accordion.d.ts +4 -3
- package/types/radix-ng-primitives-autocomplete.d.ts +217 -152
- package/types/radix-ng-primitives-calendar.d.ts +5 -3
- package/types/radix-ng-primitives-combobox.d.ts +672 -283
- package/types/radix-ng-primitives-config.d.ts +1 -1
- package/types/radix-ng-primitives-context-menu.d.ts +15 -5
- package/types/radix-ng-primitives-core.d.ts +762 -14
- package/types/radix-ng-primitives-date-field.d.ts +3 -2
- package/types/radix-ng-primitives-dialog.d.ts +77 -32
- package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
- package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
- package/types/radix-ng-primitives-field.d.ts +1 -0
- package/types/radix-ng-primitives-floating-focus-manager.d.ts +175 -0
- package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
- package/types/radix-ng-primitives-menu.d.ts +186 -103
- package/types/radix-ng-primitives-navigation-menu.d.ts +37 -75
- package/types/radix-ng-primitives-popover.d.ts +59 -92
- package/types/radix-ng-primitives-popper.d.ts +39 -9
- package/types/radix-ng-primitives-preview-card.d.ts +39 -72
- package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
- package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
- package/types/radix-ng-primitives-select.d.ts +145 -108
- package/types/radix-ng-primitives-slider.d.ts +5 -4
- package/types/radix-ng-primitives-stepper.d.ts +4 -3
- package/types/radix-ng-primitives-time-field.d.ts +3 -2
- package/types/radix-ng-primitives-toast.d.ts +7 -7
- package/types/radix-ng-primitives-toggle-group.d.ts +5 -4
- package/types/radix-ng-primitives-toolbar.d.ts +3 -2
- package/types/radix-ng-primitives-tooltip.d.ts +24 -67
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, Injectable, InjectionToken, provideAppInitializer, inject, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
+
import { RDX_DIRECTION } from '@radix-ng/primitives/direction-provider';
|
|
3
4
|
|
|
4
5
|
class RadixNG {
|
|
5
6
|
constructor() {
|
|
@@ -21,7 +22,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
21
22
|
args: [{ providedIn: 'root' }]
|
|
22
23
|
}] });
|
|
23
24
|
|
|
24
|
-
const RADIX_NG_CONFIG = new InjectionToken('RADIX_NG_CONFIG'
|
|
25
|
+
const RADIX_NG_CONFIG = new InjectionToken('RADIX_NG_CONFIG', {
|
|
26
|
+
providedIn: 'root',
|
|
27
|
+
factory: () => []
|
|
28
|
+
});
|
|
25
29
|
/**
|
|
26
30
|
* Provides RadixNG configuration as environment providers.
|
|
27
31
|
*
|
|
@@ -32,7 +36,7 @@ function provideRadixNG(...features) {
|
|
|
32
36
|
const providers = features?.map((feature) => ({
|
|
33
37
|
provide: RADIX_NG_CONFIG,
|
|
34
38
|
useValue: feature,
|
|
35
|
-
multi:
|
|
39
|
+
multi: true
|
|
36
40
|
}));
|
|
37
41
|
/**
|
|
38
42
|
* Creates an AppInitializer to load and apply each RadixNG configuration
|
|
@@ -40,10 +44,15 @@ function provideRadixNG(...features) {
|
|
|
40
44
|
*/
|
|
41
45
|
const initializer = provideAppInitializer(() => {
|
|
42
46
|
const config = inject(RadixNG);
|
|
43
|
-
|
|
47
|
+
const configs = inject(RADIX_NG_CONFIG);
|
|
48
|
+
configs.forEach((feature) => config.setConfig(feature));
|
|
44
49
|
return;
|
|
45
50
|
});
|
|
46
|
-
return makeEnvironmentProviders([
|
|
51
|
+
return makeEnvironmentProviders([
|
|
52
|
+
...providers,
|
|
53
|
+
{ provide: RDX_DIRECTION, useFactory: () => inject(RadixNG).dir },
|
|
54
|
+
initializer
|
|
55
|
+
]);
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radix-ng-primitives-config.mjs","sources":["../../../packages/primitives/config/src/config.ts","../../../packages/primitives/config/src/config.provider.ts","../../../packages/primitives/config/radix-ng-primitives-config.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { Direction } from '@radix-ng/primitives/core';\n\nexport type RadixNGConfig = {\n /**\n * The global reading direction of your application. This will be inherited by all primitives.\n * @defaultValue 'ltr'\n */\n dir?: Direction;\n\n /**\n * The global locale of your application. This will be inherited by all primitives.\n * @defaultValue 'en'\n */\n locale?: string;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class RadixNG {\n readonly dir = signal<Direction>('ltr');\n\n readonly locale = signal<string>('en');\n\n setConfig(config: RadixNGConfig): void {\n const { dir, locale } = config || {};\n\n if (dir) this.dir.set(dir);\n if (locale) this.locale.set(locale);\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n provideAppInitializer\n} from '@angular/core';\nimport { RadixNG, type RadixNGConfig } from './config';\n\nexport const RADIX_NG_CONFIG = new InjectionToken<RadixNGConfig>('RADIX_NG_CONFIG');\n\n/**\n * Provides RadixNG configuration as environment providers.\n *\n * @param features One or more RadixNG configuration objects.\n * @returns A set of environment providers that register the RadixNG configs.\n */\nexport function provideRadixNG(...features: RadixNGConfig[]): EnvironmentProviders {\n const providers = features?.map((feature) => ({\n provide: RADIX_NG_CONFIG,\n useValue: feature,\n multi:
|
|
1
|
+
{"version":3,"file":"radix-ng-primitives-config.mjs","sources":["../../../packages/primitives/config/src/config.ts","../../../packages/primitives/config/src/config.provider.ts","../../../packages/primitives/config/radix-ng-primitives-config.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { Direction } from '@radix-ng/primitives/core';\n\nexport type RadixNGConfig = {\n /**\n * The global reading direction of your application. This will be inherited by all primitives.\n * @defaultValue 'ltr'\n */\n dir?: Direction;\n\n /**\n * The global locale of your application. This will be inherited by all primitives.\n * @defaultValue 'en'\n */\n locale?: string;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class RadixNG {\n readonly dir = signal<Direction>('ltr');\n\n readonly locale = signal<string>('en');\n\n setConfig(config: RadixNGConfig): void {\n const { dir, locale } = config || {};\n\n if (dir) this.dir.set(dir);\n if (locale) this.locale.set(locale);\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n InjectionToken,\n makeEnvironmentProviders,\n provideAppInitializer\n} from '@angular/core';\nimport { RDX_DIRECTION } from '@radix-ng/primitives/direction-provider';\nimport { RadixNG, type RadixNGConfig } from './config';\n\nexport const RADIX_NG_CONFIG = new InjectionToken<readonly RadixNGConfig[]>('RADIX_NG_CONFIG', {\n providedIn: 'root',\n factory: () => []\n});\n\n/**\n * Provides RadixNG configuration as environment providers.\n *\n * @param features One or more RadixNG configuration objects.\n * @returns A set of environment providers that register the RadixNG configs.\n */\nexport function provideRadixNG(...features: RadixNGConfig[]): EnvironmentProviders {\n const providers = features?.map((feature) => ({\n provide: RADIX_NG_CONFIG,\n useValue: feature,\n multi: true\n }));\n\n /**\n * Creates an AppInitializer to load and apply each RadixNG configuration\n * to the global RadixNG service before the app starts.\n */\n const initializer = provideAppInitializer(() => {\n const config = inject(RadixNG);\n const configs = inject(RADIX_NG_CONFIG);\n\n configs.forEach((feature) => config.setConfig(feature));\n return;\n });\n\n return makeEnvironmentProviders([\n ...providers,\n { provide: RDX_DIRECTION, useFactory: () => inject(RadixNG).dir },\n initializer\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAkBa,OAAO,CAAA;AADpB,IAAA,WAAA,GAAA;AAEa,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAY,KAAK,0EAAC;AAE9B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAS,IAAI,6EAAC;AAQzC,IAAA;AANG,IAAA,SAAS,CAAC,MAAqB,EAAA;QAC3B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,EAAE;AAEpC,QAAA,IAAI,GAAG;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IACvC;8GAVS,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAP,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,OAAO,cADM,MAAM,EAAA,CAAA,CAAA;;2FACnB,OAAO,EAAA,UAAA,EAAA,CAAA;kBADnB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCPrB,eAAe,GAAG,IAAI,cAAc,CAA2B,iBAAiB,EAAE;AAC3F,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM;AAClB,CAAA;AAED;;;;;AAKG;AACG,SAAU,cAAc,CAAC,GAAG,QAAyB,EAAA;IACvD,MAAM,SAAS,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,MAAM;AAC1C,QAAA,OAAO,EAAE,eAAe;AACxB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,KAAK,EAAE;AACV,KAAA,CAAC,CAAC;AAEH;;;AAGG;AACH,IAAA,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAK;AAC3C,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;AAC9B,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;AAEvC,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvD;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,wBAAwB,CAAC;AAC5B,QAAA,GAAG,SAAS;AACZ,QAAA,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE;QACjE;AACH,KAAA,CAAC;AACN;;AC7CA;;AAEG;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, Directive, input, booleanAttribute, numberAttribute, DestroyRef, NgModule } from '@angular/core';
|
|
2
|
+
import { inject, Directive, ElementRef, input, booleanAttribute, numberAttribute, DestroyRef, NgModule } from '@angular/core';
|
|
3
3
|
import { createContext } from '@radix-ng/primitives/core';
|
|
4
4
|
import * as i1 from '@radix-ng/primitives/menu';
|
|
5
5
|
import { RdxMenuRoot } from '@radix-ng/primitives/menu';
|
|
@@ -11,8 +11,8 @@ const contextFactory = () => {
|
|
|
11
11
|
return {
|
|
12
12
|
isOpen: root.menuRoot.open,
|
|
13
13
|
disabled: root.menuRoot.disabled,
|
|
14
|
-
openAt: (clientX, clientY, autoFocus) => root.openAt(clientX, clientY, autoFocus),
|
|
15
|
-
close: () => root.menuRoot.close()
|
|
14
|
+
openAt: (clientX, clientY, autoFocus, event) => root.openAt(clientX, clientY, autoFocus, event),
|
|
15
|
+
close: (reason, event) => root.menuRoot.close(reason, event)
|
|
16
16
|
};
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
@@ -27,14 +27,19 @@ class RdxContextMenuRoot {
|
|
|
27
27
|
constructor() {
|
|
28
28
|
this.menuRoot = inject(RdxMenuRoot);
|
|
29
29
|
this.popper = inject(RdxPopper);
|
|
30
|
+
// Tell the composed menu root it is a Context Menu, so its per-kind policy (modal focus trap,
|
|
31
|
+
// backdrop, outside-press grace) differs from a plain dropdown (Base UI `MenuParent.type`).
|
|
32
|
+
this.menuRoot.markAsContextMenu();
|
|
30
33
|
}
|
|
31
34
|
/**
|
|
32
35
|
* Open the menu with the popup anchored at the given viewport coordinates.
|
|
33
36
|
*
|
|
34
37
|
* `autoFocus` defaults to `'popup'` so a right-click opens with the popup focused but no item
|
|
35
|
-
* highlighted (matching Base UI's pointer behavior). Pass `'first'` for keyboard opening.
|
|
38
|
+
* highlighted (matching Base UI's pointer behavior). Pass `'first'` for keyboard opening. `event` is
|
|
39
|
+
* the originating pointer event (threaded to the menu so a touch long-press is recorded for the
|
|
40
|
+
* anchored scroll-lock policy, ADR 0016 §3).
|
|
36
41
|
*/
|
|
37
|
-
openAt(clientX, clientY, autoFocus = 'popup') {
|
|
42
|
+
openAt(clientX, clientY, autoFocus = 'popup', event) {
|
|
38
43
|
if (this.menuRoot.disabled()) {
|
|
39
44
|
return;
|
|
40
45
|
}
|
|
@@ -53,7 +58,7 @@ class RdxContextMenuRoot {
|
|
|
53
58
|
};
|
|
54
59
|
this.popper.anchorOverride.set(anchor);
|
|
55
60
|
// Move focus into the popup so keyboard navigation and outside-dismiss work immediately.
|
|
56
|
-
this.menuRoot.show(autoFocus);
|
|
61
|
+
this.menuRoot.show(autoFocus, 'trigger-press', event);
|
|
57
62
|
}
|
|
58
63
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxContextMenuRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
59
64
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxContextMenuRoot, isStandalone: true, selector: "[rdxContextMenuRoot]", providers: [provideRdxContextMenuRootContext(contextFactory)], exportAs: ["rdxContextMenuRoot"], hostDirectives: [{ directive: i1.RdxMenuRoot, inputs: ["open", "open", "modal", "modal", "loopFocus", "loopFocus", "highlightItemOnHover", "highlightItemOnHover"], outputs: ["openChange", "openChange", "onOpenChange", "onOpenChange", "onOpenChangeComplete", "onOpenChangeComplete"] }], ngImport: i0 }); }
|
|
@@ -72,7 +77,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
72
77
|
],
|
|
73
78
|
providers: [provideRdxContextMenuRootContext(contextFactory)]
|
|
74
79
|
}]
|
|
75
|
-
}] });
|
|
80
|
+
}], ctorParameters: () => [] });
|
|
76
81
|
|
|
77
82
|
/**
|
|
78
83
|
* An area that opens the context menu on right click (or a touch long-press).
|
|
@@ -83,12 +88,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
83
88
|
class RdxContextMenuTrigger {
|
|
84
89
|
constructor() {
|
|
85
90
|
this.rootContext = injectRdxContextMenuRootContext();
|
|
91
|
+
this.menuRoot = inject(RdxMenuRoot);
|
|
92
|
+
this.elementRef = inject(ElementRef);
|
|
86
93
|
/** Whether the trigger is disabled. */
|
|
87
94
|
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
88
95
|
/** How long (ms) a touch must be held before the menu opens. */
|
|
89
96
|
this.longPressDelay = input(500, { ...(ngDevMode ? { debugName: "longPressDelay" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
90
97
|
this.lastPointerDownTime = 0;
|
|
91
|
-
|
|
98
|
+
this.allowMouseUp = false;
|
|
99
|
+
this.handleDocumentMouseUp = (event) => {
|
|
100
|
+
this.clearContextMenuMouseUpGuard();
|
|
101
|
+
if (!this.allowMouseUp) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.allowMouseUp = false;
|
|
105
|
+
const target = event.target;
|
|
106
|
+
const popup = this.menuRoot.popupElement();
|
|
107
|
+
if (target && popup?.contains(target)) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.rootContext.close('cancel-open', event);
|
|
111
|
+
};
|
|
112
|
+
inject(DestroyRef).onDestroy(() => {
|
|
113
|
+
this.cancelLongPress();
|
|
114
|
+
this.clearContextMenuMouseUpGuard();
|
|
115
|
+
});
|
|
92
116
|
}
|
|
93
117
|
onContextMenu(event) {
|
|
94
118
|
if (this.disabled()) {
|
|
@@ -101,7 +125,9 @@ class RdxContextMenuTrigger {
|
|
|
101
125
|
// pointerdown, so it opens with the first item highlighted; a pointer opens the popup
|
|
102
126
|
// without highlighting an item.
|
|
103
127
|
const fromKeyboard = event.timeStamp - this.lastPointerDownTime > 300;
|
|
104
|
-
|
|
128
|
+
// A right-click `contextmenu` event has no `pointerType`, so this records a non-touch open.
|
|
129
|
+
this.rootContext.openAt(event.clientX, event.clientY, fromKeyboard ? 'first' : 'popup', event);
|
|
130
|
+
this.armContextMenuMouseUpGuard(event.currentTarget);
|
|
105
131
|
}
|
|
106
132
|
onPointerDown(event) {
|
|
107
133
|
this.lastPointerDownTime = event.timeStamp;
|
|
@@ -113,7 +139,8 @@ class RdxContextMenuTrigger {
|
|
|
113
139
|
this.cancelLongPress();
|
|
114
140
|
this.longPressTimer = setTimeout(() => {
|
|
115
141
|
this.longPressTimer = undefined;
|
|
116
|
-
|
|
142
|
+
// Pass the touch pointer event so the menu records a touch open (ADR 0016 §3).
|
|
143
|
+
this.rootContext.openAt(clientX, clientY, 'popup', event);
|
|
117
144
|
}, this.longPressDelay());
|
|
118
145
|
}
|
|
119
146
|
onPointerMove(event) {
|
|
@@ -132,6 +159,20 @@ class RdxContextMenuTrigger {
|
|
|
132
159
|
this.longPressTimer = undefined;
|
|
133
160
|
this.longPressOrigin = undefined;
|
|
134
161
|
}
|
|
162
|
+
armContextMenuMouseUpGuard(trigger) {
|
|
163
|
+
this.clearContextMenuMouseUpGuard();
|
|
164
|
+
this.allowMouseUp = false;
|
|
165
|
+
this.allowMouseUpTimer = setTimeout(() => {
|
|
166
|
+
this.allowMouseUpTimer = undefined;
|
|
167
|
+
this.allowMouseUp = true;
|
|
168
|
+
}, 500);
|
|
169
|
+
trigger.ownerDocument.addEventListener('mouseup', this.handleDocumentMouseUp, { once: true });
|
|
170
|
+
}
|
|
171
|
+
clearContextMenuMouseUpGuard() {
|
|
172
|
+
clearTimeout(this.allowMouseUpTimer);
|
|
173
|
+
this.allowMouseUpTimer = undefined;
|
|
174
|
+
this.elementRef?.nativeElement?.ownerDocument?.removeEventListener('mouseup', this.handleDocumentMouseUp);
|
|
175
|
+
}
|
|
135
176
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxContextMenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
136
177
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxContextMenuTrigger, isStandalone: true, selector: "[rdxContextMenuTrigger]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, longPressDelay: { classPropertyName: "longPressDelay", publicName: "longPressDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "contextmenu": "onContextMenu($event)", "pointerdown": "onPointerDown($event)", "pointermove": "onPointerMove($event)", "pointerup": "cancelLongPress()", "pointercancel": "cancelLongPress()", "pointerleave": "cancelLongPress()" }, properties: { "attr.data-state": "rootContext.isOpen() ? \"open\" : \"closed\"", "attr.data-disabled": "disabled() ? \"\" : undefined" } }, exportAs: ["rdxContextMenuTrigger"], ngImport: i0 }); }
|
|
137
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radix-ng-primitives-context-menu.mjs","sources":["../../../packages/primitives/context-menu/src/context-menu-root.ts","../../../packages/primitives/context-menu/src/context-menu-trigger.ts","../../../packages/primitives/context-menu/index.ts","../../../packages/primitives/context-menu/radix-ng-primitives-context-menu.ts"],"sourcesContent":["import { Directive, inject, Signal } from '@angular/core';\nimport type { VirtualElement } from '@floating-ui/dom';\nimport { createContext } from '@radix-ng/primitives/core';\nimport { RdxMenuAutoFocusInput, RdxMenuRoot } from '@radix-ng/primitives/menu';\nimport { RdxPopper } from '@radix-ng/primitives/popper';\n\nexport interface RdxContextMenuRootContext {\n /** Whether the context menu is currently open. */\n isOpen: Signal<boolean>;\n /** Whether the whole menu is disabled. */\n disabled: Signal<boolean>;\n /** Open the menu anchored at the given viewport coordinates. */\n openAt: (clientX: number, clientY: number, autoFocus?: RdxMenuAutoFocusInput) => void;\n /** Close the menu. */\n close: () => void;\n}\n\nexport const [injectRdxContextMenuRootContext, provideRdxContextMenuRootContext] =\n createContext<RdxContextMenuRootContext>('RdxContextMenuRootContext', 'components/context-menu');\n\nconst contextFactory = (): RdxContextMenuRootContext => {\n const root = inject(RdxContextMenuRoot);\n return {\n isOpen: root.menuRoot.open,\n disabled: root.menuRoot.disabled,\n openAt: (clientX, clientY, autoFocus) => root.openAt(clientX, clientY, autoFocus),\n close: () => root.menuRoot.close()\n };\n};\n\n/**\n * Groups all parts of a context menu. Composes the Menu primitive but, instead of anchoring the\n * popup to a trigger element, anchors it to the pointer position captured by `rdxContextMenuTrigger`.\n *\n * Reuse the Menu popup parts inside it — `rdxMenuPositioner`, `rdxMenuPopup`, `rdxMenuItem`,\n * `rdxMenuCheckboxItem`, `rdxMenuRadioGroup`, `rdxMenuSubTrigger`, `rdxMenuSeparator`, … all behave\n * identically here.\n */\n@Directive({\n selector: '[rdxContextMenuRoot]',\n exportAs: 'rdxContextMenuRoot',\n hostDirectives: [\n {\n directive: RdxMenuRoot,\n inputs: ['open', 'modal', 'loopFocus', 'highlightItemOnHover'],\n outputs: ['openChange', 'onOpenChange', 'onOpenChangeComplete']\n }\n ],\n providers: [provideRdxContextMenuRootContext(contextFactory)]\n})\nexport class RdxContextMenuRoot {\n readonly menuRoot = inject(RdxMenuRoot);\n private readonly popper = inject(RdxPopper);\n\n /**\n * Open the menu with the popup anchored at the given viewport coordinates.\n *\n * `autoFocus` defaults to `'popup'` so a right-click opens with the popup focused but no item\n * highlighted (matching Base UI's pointer behavior). Pass `'first'` for keyboard opening.\n */\n openAt(clientX: number, clientY: number, autoFocus: RdxMenuAutoFocusInput = 'popup'): void {\n if (this.menuRoot.disabled()) {\n return;\n }\n\n const anchor: VirtualElement = {\n getBoundingClientRect: () =>\n ({\n width: 0,\n height: 0,\n x: clientX,\n y: clientY,\n top: clientY,\n left: clientX,\n right: clientX,\n bottom: clientY,\n toJSON: () => ({})\n }) as DOMRect\n };\n\n this.popper.anchorOverride.set(anchor);\n // Move focus into the popup so keyboard navigation and outside-dismiss work immediately.\n this.menuRoot.show(autoFocus);\n }\n}\n","import { booleanAttribute, DestroyRef, Directive, inject, input, numberAttribute } from '@angular/core';\nimport { BooleanInput, NumberInput } from '@radix-ng/primitives/core';\nimport { injectRdxContextMenuRootContext } from './context-menu-root';\n\n/**\n * An area that opens the context menu on right click (or a touch long-press).\n *\n * Apply it to the element that should respond to the context-menu gesture; the popup is positioned\n * at the pointer, not against this element.\n */\n@Directive({\n selector: '[rdxContextMenuTrigger]',\n exportAs: 'rdxContextMenuTrigger',\n host: {\n '[attr.data-state]': 'rootContext.isOpen() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '(contextmenu)': 'onContextMenu($event)',\n '(pointerdown)': 'onPointerDown($event)',\n '(pointermove)': 'onPointerMove($event)',\n '(pointerup)': 'cancelLongPress()',\n '(pointercancel)': 'cancelLongPress()',\n '(pointerleave)': 'cancelLongPress()'\n }\n})\nexport class RdxContextMenuTrigger {\n protected readonly rootContext = injectRdxContextMenuRootContext();\n\n /** Whether the trigger is disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** How long (ms) a touch must be held before the menu opens. */\n readonly longPressDelay = input<number, NumberInput>(500, { transform: numberAttribute });\n\n private longPressTimer: ReturnType<typeof setTimeout> | undefined;\n private longPressOrigin: { x: number; y: number } | undefined;\n private lastPointerDownTime = 0;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.cancelLongPress());\n }\n\n protected onContextMenu(event: MouseEvent): void {\n if (this.disabled()) {\n return;\n }\n\n // Suppress the native context menu and open ours at the pointer.\n event.preventDefault();\n this.cancelLongPress();\n\n // A keyboard-initiated context menu (e.g. the Menu key / Shift+F10) is not preceded by a\n // pointerdown, so it opens with the first item highlighted; a pointer opens the popup\n // without highlighting an item.\n const fromKeyboard = event.timeStamp - this.lastPointerDownTime > 300;\n this.rootContext.openAt(event.clientX, event.clientY, fromKeyboard ? 'first' : 'popup');\n }\n\n protected onPointerDown(event: PointerEvent): void {\n this.lastPointerDownTime = event.timeStamp;\n\n if (this.disabled() || event.pointerType !== 'touch') {\n return;\n }\n\n const { clientX, clientY } = event;\n this.longPressOrigin = { x: clientX, y: clientY };\n this.cancelLongPress();\n this.longPressTimer = setTimeout(() => {\n this.longPressTimer = undefined;\n this.rootContext.openAt(clientX, clientY);\n }, this.longPressDelay());\n }\n\n protected onPointerMove(event: PointerEvent): void {\n // A finger that drifts more than ~10px is a scroll/drag, not a long-press.\n if (!this.longPressOrigin) {\n return;\n }\n\n const dx = event.clientX - this.longPressOrigin.x;\n const dy = event.clientY - this.longPressOrigin.y;\n if (Math.hypot(dx, dy) > 10) {\n this.cancelLongPress();\n }\n }\n\n protected cancelLongPress(): void {\n clearTimeout(this.longPressTimer);\n this.longPressTimer = undefined;\n this.longPressOrigin = undefined;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxContextMenuRoot } from './src/context-menu-root';\nimport { RdxContextMenuTrigger } from './src/context-menu-trigger';\n\nexport * from './src/context-menu-root';\nexport * from './src/context-menu-trigger';\n\n/**\n * Context-menu-specific parts. The popup, items, checkbox/radio, submenus, separators, etc. come\n * from `@radix-ng/primitives/menu` (`RdxMenuModule`) and behave identically inside a context menu.\n */\nconst contextMenuImports = [RdxContextMenuRoot, RdxContextMenuTrigger];\n\n@NgModule({\n imports: [...contextMenuImports],\n exports: [...contextMenuImports]\n})\nexport class RdxContextMenuModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"radix-ng-primitives-context-menu.mjs","sources":["../../../packages/primitives/context-menu/src/context-menu-root.ts","../../../packages/primitives/context-menu/src/context-menu-trigger.ts","../../../packages/primitives/context-menu/index.ts","../../../packages/primitives/context-menu/radix-ng-primitives-context-menu.ts"],"sourcesContent":["import { Directive, inject, Signal } from '@angular/core';\nimport type { VirtualElement } from '@floating-ui/dom';\nimport { createContext } from '@radix-ng/primitives/core';\nimport { RdxMenuAutoFocusInput, RdxMenuOpenChangeReason, RdxMenuRoot } from '@radix-ng/primitives/menu';\nimport { RdxPopper } from '@radix-ng/primitives/popper';\n\nexport interface RdxContextMenuRootContext {\n /** Whether the context menu is currently open. */\n isOpen: Signal<boolean>;\n /** Whether the whole menu is disabled. */\n disabled: Signal<boolean>;\n /** Open the menu anchored at the given viewport coordinates. */\n openAt: (clientX: number, clientY: number, autoFocus?: RdxMenuAutoFocusInput, event?: Event) => void;\n /** Close the menu. */\n close: (reason?: RdxMenuOpenChangeReason, event?: Event) => void;\n}\n\nexport const [injectRdxContextMenuRootContext, provideRdxContextMenuRootContext] =\n createContext<RdxContextMenuRootContext>('RdxContextMenuRootContext', 'components/context-menu');\n\nconst contextFactory = (): RdxContextMenuRootContext => {\n const root = inject(RdxContextMenuRoot);\n return {\n isOpen: root.menuRoot.open,\n disabled: root.menuRoot.disabled,\n openAt: (clientX, clientY, autoFocus, event) => root.openAt(clientX, clientY, autoFocus, event),\n close: (reason, event) => root.menuRoot.close(reason, event)\n };\n};\n\n/**\n * Groups all parts of a context menu. Composes the Menu primitive but, instead of anchoring the\n * popup to a trigger element, anchors it to the pointer position captured by `rdxContextMenuTrigger`.\n *\n * Reuse the Menu popup parts inside it — `rdxMenuPositioner`, `rdxMenuPopup`, `rdxMenuItem`,\n * `rdxMenuCheckboxItem`, `rdxMenuRadioGroup`, `rdxMenuSubTrigger`, `rdxMenuSeparator`, … all behave\n * identically here.\n */\n@Directive({\n selector: '[rdxContextMenuRoot]',\n exportAs: 'rdxContextMenuRoot',\n hostDirectives: [\n {\n directive: RdxMenuRoot,\n inputs: ['open', 'modal', 'loopFocus', 'highlightItemOnHover'],\n outputs: ['openChange', 'onOpenChange', 'onOpenChangeComplete']\n }\n ],\n providers: [provideRdxContextMenuRootContext(contextFactory)]\n})\nexport class RdxContextMenuRoot {\n readonly menuRoot = inject(RdxMenuRoot);\n private readonly popper = inject(RdxPopper);\n\n constructor() {\n // Tell the composed menu root it is a Context Menu, so its per-kind policy (modal focus trap,\n // backdrop, outside-press grace) differs from a plain dropdown (Base UI `MenuParent.type`).\n this.menuRoot.markAsContextMenu();\n }\n\n /**\n * Open the menu with the popup anchored at the given viewport coordinates.\n *\n * `autoFocus` defaults to `'popup'` so a right-click opens with the popup focused but no item\n * highlighted (matching Base UI's pointer behavior). Pass `'first'` for keyboard opening. `event` is\n * the originating pointer event (threaded to the menu so a touch long-press is recorded for the\n * anchored scroll-lock policy, ADR 0016 §3).\n */\n openAt(clientX: number, clientY: number, autoFocus: RdxMenuAutoFocusInput = 'popup', event?: Event): void {\n if (this.menuRoot.disabled()) {\n return;\n }\n\n const anchor: VirtualElement = {\n getBoundingClientRect: () =>\n ({\n width: 0,\n height: 0,\n x: clientX,\n y: clientY,\n top: clientY,\n left: clientX,\n right: clientX,\n bottom: clientY,\n toJSON: () => ({})\n }) as DOMRect\n };\n\n this.popper.anchorOverride.set(anchor);\n // Move focus into the popup so keyboard navigation and outside-dismiss work immediately.\n this.menuRoot.show(autoFocus, 'trigger-press', event);\n }\n}\n","import { booleanAttribute, DestroyRef, Directive, ElementRef, inject, input, numberAttribute } from '@angular/core';\nimport { BooleanInput, NumberInput } from '@radix-ng/primitives/core';\nimport { RdxMenuRoot } from '@radix-ng/primitives/menu';\nimport { injectRdxContextMenuRootContext } from './context-menu-root';\n\n/**\n * An area that opens the context menu on right click (or a touch long-press).\n *\n * Apply it to the element that should respond to the context-menu gesture; the popup is positioned\n * at the pointer, not against this element.\n */\n@Directive({\n selector: '[rdxContextMenuTrigger]',\n exportAs: 'rdxContextMenuTrigger',\n host: {\n '[attr.data-state]': 'rootContext.isOpen() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '(contextmenu)': 'onContextMenu($event)',\n '(pointerdown)': 'onPointerDown($event)',\n '(pointermove)': 'onPointerMove($event)',\n '(pointerup)': 'cancelLongPress()',\n '(pointercancel)': 'cancelLongPress()',\n '(pointerleave)': 'cancelLongPress()'\n }\n})\nexport class RdxContextMenuTrigger {\n protected readonly rootContext = injectRdxContextMenuRootContext();\n private readonly menuRoot = inject(RdxMenuRoot);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Whether the trigger is disabled. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** How long (ms) a touch must be held before the menu opens. */\n readonly longPressDelay = input<number, NumberInput>(500, { transform: numberAttribute });\n\n private longPressTimer: ReturnType<typeof setTimeout> | undefined;\n private allowMouseUpTimer: ReturnType<typeof setTimeout> | undefined;\n private longPressOrigin: { x: number; y: number } | undefined;\n private lastPointerDownTime = 0;\n private allowMouseUp = false;\n private readonly handleDocumentMouseUp = (event: MouseEvent): void => {\n this.clearContextMenuMouseUpGuard();\n\n if (!this.allowMouseUp) {\n return;\n }\n\n this.allowMouseUp = false;\n const target = event.target as Node | null;\n const popup = this.menuRoot.popupElement();\n\n if (target && popup?.contains(target)) {\n return;\n }\n\n this.rootContext.close('cancel-open', event);\n };\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.cancelLongPress();\n this.clearContextMenuMouseUpGuard();\n });\n }\n\n protected onContextMenu(event: MouseEvent): void {\n if (this.disabled()) {\n return;\n }\n\n // Suppress the native context menu and open ours at the pointer.\n event.preventDefault();\n this.cancelLongPress();\n\n // A keyboard-initiated context menu (e.g. the Menu key / Shift+F10) is not preceded by a\n // pointerdown, so it opens with the first item highlighted; a pointer opens the popup\n // without highlighting an item.\n const fromKeyboard = event.timeStamp - this.lastPointerDownTime > 300;\n // A right-click `contextmenu` event has no `pointerType`, so this records a non-touch open.\n this.rootContext.openAt(event.clientX, event.clientY, fromKeyboard ? 'first' : 'popup', event);\n this.armContextMenuMouseUpGuard(event.currentTarget as HTMLElement);\n }\n\n protected onPointerDown(event: PointerEvent): void {\n this.lastPointerDownTime = event.timeStamp;\n\n if (this.disabled() || event.pointerType !== 'touch') {\n return;\n }\n\n const { clientX, clientY } = event;\n this.longPressOrigin = { x: clientX, y: clientY };\n this.cancelLongPress();\n this.longPressTimer = setTimeout(() => {\n this.longPressTimer = undefined;\n // Pass the touch pointer event so the menu records a touch open (ADR 0016 §3).\n this.rootContext.openAt(clientX, clientY, 'popup', event);\n }, this.longPressDelay());\n }\n\n protected onPointerMove(event: PointerEvent): void {\n // A finger that drifts more than ~10px is a scroll/drag, not a long-press.\n if (!this.longPressOrigin) {\n return;\n }\n\n const dx = event.clientX - this.longPressOrigin.x;\n const dy = event.clientY - this.longPressOrigin.y;\n if (Math.hypot(dx, dy) > 10) {\n this.cancelLongPress();\n }\n }\n\n protected cancelLongPress(): void {\n clearTimeout(this.longPressTimer);\n this.longPressTimer = undefined;\n this.longPressOrigin = undefined;\n }\n\n private armContextMenuMouseUpGuard(trigger: HTMLElement): void {\n this.clearContextMenuMouseUpGuard();\n this.allowMouseUp = false;\n this.allowMouseUpTimer = setTimeout(() => {\n this.allowMouseUpTimer = undefined;\n this.allowMouseUp = true;\n }, 500);\n\n trigger.ownerDocument.addEventListener('mouseup', this.handleDocumentMouseUp, { once: true });\n }\n\n private clearContextMenuMouseUpGuard(): void {\n clearTimeout(this.allowMouseUpTimer);\n this.allowMouseUpTimer = undefined;\n this.elementRef?.nativeElement?.ownerDocument?.removeEventListener('mouseup', this.handleDocumentMouseUp);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxContextMenuRoot } from './src/context-menu-root';\nimport { RdxContextMenuTrigger } from './src/context-menu-trigger';\n\nexport * from './src/context-menu-root';\nexport * from './src/context-menu-trigger';\n\n/**\n * Context-menu-specific parts. The popup, items, checkbox/radio, submenus, separators, etc. come\n * from `@radix-ng/primitives/menu` (`RdxMenuModule`) and behave identically inside a context menu.\n */\nconst contextMenuImports = [RdxContextMenuRoot, RdxContextMenuTrigger];\n\n@NgModule({\n imports: [...contextMenuImports],\n exports: [...contextMenuImports]\n})\nexport class RdxContextMenuModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|