@radix-ng/primitives 1.0.0-beta.2 → 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.
Files changed (104) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +76 -6
  3. package/fesm2022/radix-ng-primitives-accordion.mjs +5 -3
  4. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  5. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +31 -24
  6. package/fesm2022/radix-ng-primitives-alert-dialog.mjs.map +1 -1
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs +1744 -0
  8. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -0
  9. package/fesm2022/radix-ng-primitives-calendar.mjs +5 -3
  10. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  11. package/fesm2022/radix-ng-primitives-combobox.mjs +1399 -606
  12. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  13. package/fesm2022/radix-ng-primitives-config.mjs +13 -4
  14. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  15. package/fesm2022/radix-ng-primitives-context-menu.mjs +51 -10
  16. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  17. package/fesm2022/radix-ng-primitives-core.mjs +1345 -64
  18. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  19. package/fesm2022/radix-ng-primitives-date-field.mjs +5 -3
  20. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  21. package/fesm2022/radix-ng-primitives-dialog.mjs +271 -145
  22. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  23. package/fesm2022/radix-ng-primitives-direction-provider.mjs +70 -0
  24. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -0
  25. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +519 -184
  26. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  27. package/fesm2022/radix-ng-primitives-drawer.mjs +154 -64
  28. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  29. package/fesm2022/radix-ng-primitives-field.mjs +3 -2
  30. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  31. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +517 -0
  32. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -0
  33. package/fesm2022/radix-ng-primitives-focus-scope.mjs +296 -70
  34. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  35. package/fesm2022/radix-ng-primitives-menu.mjs +894 -299
  36. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  37. package/fesm2022/radix-ng-primitives-menubar.mjs +32 -4
  38. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  39. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +176 -207
  40. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  41. package/fesm2022/radix-ng-primitives-popover.mjs +250 -250
  42. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  43. package/fesm2022/radix-ng-primitives-popper.mjs +94 -45
  44. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-portal.mjs +107 -17
  46. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-presence.mjs +262 -79
  48. package/fesm2022/radix-ng-primitives-presence.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-preview-card.mjs +172 -218
  50. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  51. package/fesm2022/radix-ng-primitives-roving-focus.mjs +4 -2
  52. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  53. package/fesm2022/radix-ng-primitives-scroll-area.mjs +5 -4
  54. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  55. package/fesm2022/radix-ng-primitives-select.mjs +303 -234
  56. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  57. package/fesm2022/radix-ng-primitives-slider.mjs +5 -3
  58. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  59. package/fesm2022/radix-ng-primitives-stepper.mjs +5 -3
  60. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  61. package/fesm2022/radix-ng-primitives-time-field.mjs +5 -3
  62. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  63. package/fesm2022/radix-ng-primitives-toast.mjs +15 -36
  64. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  65. package/fesm2022/radix-ng-primitives-toggle-group.mjs +5 -3
  66. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  67. package/fesm2022/radix-ng-primitives-toolbar.mjs +5 -3
  68. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  69. package/fesm2022/radix-ng-primitives-tooltip.mjs +105 -145
  70. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  71. package/package.json +14 -1
  72. package/types/radix-ng-primitives-accordion.d.ts +4 -3
  73. package/types/radix-ng-primitives-alert-dialog.d.ts +17 -11
  74. package/types/radix-ng-primitives-autocomplete.d.ts +661 -0
  75. package/types/radix-ng-primitives-calendar.d.ts +5 -3
  76. package/types/radix-ng-primitives-combobox.d.ts +727 -293
  77. package/types/radix-ng-primitives-config.d.ts +1 -1
  78. package/types/radix-ng-primitives-context-menu.d.ts +15 -5
  79. package/types/radix-ng-primitives-core.d.ts +762 -14
  80. package/types/radix-ng-primitives-date-field.d.ts +3 -2
  81. package/types/radix-ng-primitives-dialog.d.ts +107 -55
  82. package/types/radix-ng-primitives-direction-provider.d.ts +41 -0
  83. package/types/radix-ng-primitives-dismissable-layer.d.ts +147 -99
  84. package/types/radix-ng-primitives-drawer.d.ts +49 -22
  85. package/types/radix-ng-primitives-field.d.ts +1 -0
  86. package/types/radix-ng-primitives-floating-focus-manager.d.ts +175 -0
  87. package/types/radix-ng-primitives-focus-scope.d.ts +132 -1
  88. package/types/radix-ng-primitives-menu.d.ts +204 -112
  89. package/types/radix-ng-primitives-navigation-menu.d.ts +61 -101
  90. package/types/radix-ng-primitives-popover.d.ts +82 -115
  91. package/types/radix-ng-primitives-popper.d.ts +46 -10
  92. package/types/radix-ng-primitives-portal.d.ts +53 -8
  93. package/types/radix-ng-primitives-presence.d.ts +98 -17
  94. package/types/radix-ng-primitives-preview-card.d.ts +63 -95
  95. package/types/radix-ng-primitives-roving-focus.d.ts +7 -6
  96. package/types/radix-ng-primitives-scroll-area.d.ts +2 -2
  97. package/types/radix-ng-primitives-select.d.ts +192 -158
  98. package/types/radix-ng-primitives-slider.d.ts +5 -4
  99. package/types/radix-ng-primitives-stepper.d.ts +4 -3
  100. package/types/radix-ng-primitives-time-field.d.ts +3 -2
  101. package/types/radix-ng-primitives-toast.d.ts +7 -7
  102. package/types/radix-ng-primitives-toggle-group.d.ts +5 -4
  103. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  104. package/types/radix-ng-primitives-tooltip.d.ts +48 -84
@@ -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: false
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
- features?.forEach((feature) => config.setConfig(feature));
47
+ const configs = inject(RADIX_NG_CONFIG);
48
+ configs.forEach((feature) => config.setConfig(feature));
44
49
  return;
45
50
  });
46
- return makeEnvironmentProviders([...providers, initializer]);
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: false\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 features?.forEach((feature) => config.setConfig(feature));\n return;\n });\n\n return makeEnvironmentProviders([...providers, initializer]);\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;;;MCRrB,eAAe,GAAG,IAAI,cAAc,CAAgB,iBAAiB;AAElF;;;;;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,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzD;AACJ,IAAA,CAAC,CAAC;IAEF,OAAO,wBAAwB,CAAC,CAAC,GAAG,SAAS,EAAE,WAAW,CAAC,CAAC;AAChE;;ACnCA;;AAEG;;;;"}
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
- inject(DestroyRef).onDestroy(() => this.cancelLongPress());
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
- this.rootContext.openAt(event.clientX, event.clientY, fromKeyboard ? 'first' : 'popup');
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
- this.rootContext.openAt(clientX, clientY);
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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"}