@radix-ng/primitives 1.0.9 → 1.1.0

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 (65) hide show
  1. package/README.md +26 -5
  2. package/fesm2022/radix-ng-primitives-autocomplete.mjs +35 -19
  3. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  4. package/fesm2022/radix-ng-primitives-checkbox.mjs +55 -7
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  6. package/fesm2022/radix-ng-primitives-combobox.mjs +46 -21
  7. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  8. package/fesm2022/radix-ng-primitives-composite.mjs +221 -36
  9. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -1
  10. package/fesm2022/radix-ng-primitives-core.mjs +189 -26
  11. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  12. package/fesm2022/radix-ng-primitives-date-field.mjs +29 -13
  13. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  14. package/fesm2022/radix-ng-primitives-field.mjs +127 -23
  15. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  16. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +9 -0
  17. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -1
  18. package/fesm2022/radix-ng-primitives-focus-scope.mjs +241 -95
  19. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  20. package/fesm2022/radix-ng-primitives-form.mjs +35 -4
  21. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -1
  22. package/fesm2022/radix-ng-primitives-input.mjs +87 -15
  23. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  24. package/fesm2022/radix-ng-primitives-menu.mjs +131 -16
  25. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  26. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +17 -3
  27. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  28. package/fesm2022/radix-ng-primitives-popper.mjs +223 -29
  29. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  30. package/fesm2022/radix-ng-primitives-portal.mjs +16 -5
  31. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  32. package/fesm2022/radix-ng-primitives-scroll-area.mjs +6 -3
  33. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  34. package/fesm2022/radix-ng-primitives-select.mjs +49 -17
  35. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  36. package/fesm2022/radix-ng-primitives-signal-forms.mjs +27 -11
  37. package/fesm2022/radix-ng-primitives-signal-forms.mjs.map +1 -1
  38. package/fesm2022/radix-ng-primitives-time-field.mjs +24 -10
  39. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  40. package/package.json +8 -7
  41. package/types/radix-ng-primitives-autocomplete.d.ts +7 -2
  42. package/types/radix-ng-primitives-checkbox.d.ts +10 -1
  43. package/types/radix-ng-primitives-combobox.d.ts +29 -2
  44. package/types/radix-ng-primitives-composite.d.ts +48 -2
  45. package/types/radix-ng-primitives-core.d.ts +165 -104
  46. package/types/radix-ng-primitives-date-field.d.ts +21 -8
  47. package/types/radix-ng-primitives-field.d.ts +55 -8
  48. package/types/radix-ng-primitives-floating-focus-manager.d.ts +7 -0
  49. package/types/radix-ng-primitives-focus-scope.d.ts +61 -44
  50. package/types/radix-ng-primitives-form.d.ts +9 -0
  51. package/types/radix-ng-primitives-input.d.ts +10 -2
  52. package/types/radix-ng-primitives-menu.d.ts +59 -7
  53. package/types/radix-ng-primitives-navigation-menu.d.ts +2 -2
  54. package/types/radix-ng-primitives-popover.d.ts +2 -2
  55. package/types/radix-ng-primitives-popper.d.ts +186 -48
  56. package/types/radix-ng-primitives-portal.d.ts +18 -8
  57. package/types/radix-ng-primitives-preview-card.d.ts +2 -2
  58. package/types/radix-ng-primitives-select.d.ts +17 -3
  59. package/types/radix-ng-primitives-signal-forms.d.ts +22 -8
  60. package/types/radix-ng-primitives-time-field.d.ts +21 -10
  61. package/types/radix-ng-primitives-tooltip.d.ts +2 -2
  62. package/fesm2022/radix-ng-primitives-focus-guards.mjs +0 -53
  63. package/fesm2022/radix-ng-primitives-focus-guards.mjs.map +0 -1
  64. package/focus-guards/README.md +0 -1
  65. package/types/radix-ng-primitives-focus-guards.d.ts +0 -15
@@ -1 +1 @@
1
- {"version":3,"file":"radix-ng-primitives-popper.mjs","sources":["../../../packages/primitives/popper/src/popper-anchor.ts","../../../packages/primitives/popper/src/popper.ts","../../../packages/primitives/popper/src/popper-content.config.ts","../../../packages/primitives/popper/src/utils.ts","../../../packages/primitives/popper/src/popper-content-wrapper.ts","../../../packages/primitives/popper/src/popper-arrow.ts","../../../packages/primitives/popper/src/popper-content.ts","../../../packages/primitives/popper/index.ts","../../../packages/primitives/popper/radix-ng-primitives-popper.ts"],"sourcesContent":["import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[rdxPopperAnchor]'\n})\nexport class RdxPopperAnchor {\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n","import { contentChild, Directive, signal } from '@angular/core';\nimport type { ReferenceElement } from '@floating-ui/dom';\nimport { RdxPopperAnchor } from './popper-anchor';\n\n@Directive({\n selector: '[rdxPopperRoot]'\n})\nexport class RdxPopper {\n readonly anchor = contentChild(RdxPopperAnchor);\n readonly anchorOverride = signal<ReferenceElement | undefined>(undefined);\n}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { Align, Side } from './utils';\n\n/**\n * Default positioning values for `RdxPopperContentWrapper`.\n *\n * Lets a composing primitive (e.g. tooltip) provide its own Base UI-aligned defaults without\n * changing the shared popper defaults that other consumers (e.g. popover) rely on. Any value left\n * `undefined` falls back to the wrapper's built-in default. Consumer template bindings always win.\n */\nexport interface RdxPopperContentConfig {\n side?: Side;\n align?: Align;\n sideOffset?: number;\n alignOffset?: number;\n arrowPadding?: number;\n avoidCollisions?: boolean;\n collisionPadding?: number | Partial<Record<Side, number>>;\n sticky?: 'partial' | 'always';\n hideWhenDetached?: boolean;\n positionStrategy?: 'fixed' | 'absolute';\n updatePositionStrategy?: 'optimized' | 'always';\n}\n\nexport const RdxPopperContentConfigToken = new InjectionToken<RdxPopperContentConfig>('RdxPopperContentConfig', {\n factory: () => ({})\n});\n\nexport function provideRdxPopperContentConfig(config: RdxPopperContentConfig): Provider {\n return { provide: RdxPopperContentConfigToken, useValue: config };\n}\n","import type { Middleware, Placement } from '@floating-ui/dom';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst SIDE_OPTIONS = ['top', 'right', 'bottom', 'left'] as const;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst ALIGN_OPTIONS = ['start', 'center', 'end'] as const;\n\nexport type Side = (typeof SIDE_OPTIONS)[number];\nexport type Align = (typeof ALIGN_OPTIONS)[number];\n\nexport function isNotNull<T>(value: T | null): value is T {\n return value !== null;\n}\n\nexport function transformOrigin(options: { arrowWidth: number; arrowHeight: number }): Middleware {\n return {\n name: 'transformOrigin',\n options,\n fn(data) {\n const { placement, rects, middlewareData } = data;\n\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isArrowHidden = cannotCenterArrow;\n const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;\n const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;\n\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);\n const noArrowAlign = { start: '0%', center: '50%', end: '100%' }[placedAlign];\n\n const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;\n const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;\n\n let x = '';\n let y = '';\n\n if (placedSide === 'bottom') {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${-arrowHeight}px`;\n } else if (placedSide === 'top') {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${rects.floating.height + arrowHeight}px`;\n } else if (placedSide === 'right') {\n x = `${-arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n } else if (placedSide === 'left') {\n x = `${rects.floating.width + arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n }\n return { data: { x, y } };\n }\n };\n}\n\nexport function getSideAndAlignFromPlacement(placement: Placement) {\n const [side, align = 'center'] = placement.split('-');\n return [side as Side, align as Align] as const;\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChild,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n linkedSignal,\n numberAttribute,\n output,\n Provider,\n resource,\n signal,\n Type\n} from '@angular/core';\nimport type { ComputePositionReturn, ReferenceElement, VirtualElement } from '@floating-ui/dom';\nimport {\n autoUpdate,\n computePosition,\n flip,\n arrow as floatingUIArrow,\n hide,\n limitShift,\n offset,\n Placement,\n shift,\n size\n} from '@floating-ui/dom';\nimport { BooleanInput, createContext, elementSize, NumberInput, watch } from '@radix-ng/primitives/core';\nimport { RdxPopper } from './popper';\nimport { RdxPopperArrow } from './popper-arrow';\nimport { RdxPopperContentConfigToken } from './popper-content.config';\nimport { Align, isNotNull, Side, transformOrigin } from './utils';\n\nexport type RdxPopperAnchorElement =\n | Element\n | ElementRef<Element>\n | VirtualElement\n | (() => Element | VirtualElement | null)\n | null\n | undefined;\n\ntype PopperPositionParams = {\n anchor: ReferenceElement | null;\n strategy: 'fixed' | 'absolute';\n placement: Placement;\n sideOffset: number;\n alignOffset: number;\n arrowHeight: number;\n arrowWidth: number;\n avoidCollisions: boolean;\n sticky: 'partial' | 'always';\n detectOverflowOptions: {\n padding: number | Partial<Record<Side, number>>;\n boundary: Element[];\n altBoundary: boolean;\n };\n arrow: RdxPopperArrow | undefined;\n arrowPadding: number;\n hideWhenDetached: boolean;\n};\n\nconst context = () => {\n const popperContentWrapper = inject(RdxPopperContentWrapper);\n\n return {\n placedSide: popperContentWrapper.placedSide,\n placedAlign: popperContentWrapper.placedAlign,\n arrowX: popperContentWrapper.arrowX,\n arrowY: popperContentWrapper.arrowY,\n shouldHideArrow: popperContentWrapper.shouldHideArrow,\n isPositioned: popperContentWrapper.isPositioned,\n anchorHidden: popperContentWrapper.anchorHidden\n };\n};\n\nexport type PopperContentWrapperContext = ReturnType<typeof context>;\n\nexport const [injectPopperContentWrapperContext, providePopperContentWrapperContext] =\n createContext<PopperContentWrapperContext>('PopperContentWrapperContext', 'utils/popper');\n\n@Directive({\n selector: '[rdxPopperContentWrapper]',\n providers: [providePopperContentWrapperContext(context)],\n host: {\n 'data-radix-popper-content-wrapper': '',\n // Placement state, emitted once for every positioner (ADR 0012). The popup\n // (`RdxPopperContent`) keeps its own `data-side`/`data-align` as popup-level styling hooks.\n '[attr.data-side]': 'placedSide()',\n '[attr.data-align]': 'placedAlign()',\n '[attr.data-anchor-hidden]': 'anchorHidden() ? \"\" : undefined',\n '[style]': 'style()'\n }\n})\nexport class RdxPopperContentWrapper {\n private readonly elementRef = inject(ElementRef);\n private readonly injector = inject(Injector);\n\n private readonly context = inject(RdxPopper);\n\n /** Optional positioning defaults provided by a composing primitive (e.g. tooltip). */\n private readonly config = inject(RdxPopperContentConfigToken);\n\n /**\n * An element to position the popup against. Defaults to the popper anchor.\n */\n readonly anchor = input<RdxPopperAnchorElement>();\n\n /**\n * The preferred side of the anchor to render against when open.\n * Will be reversed when collisions occur and avoidCollisions is enabled.\n */\n readonly side = input<Side>(this.config.side ?? 'bottom');\n\n /**\n * Distance between the anchor and the popup in pixels.\n */\n readonly sideOffset = input<number, NumberInput>(this.config.sideOffset ?? 0, { transform: numberAttribute });\n\n /**\n * How to align the popup relative to the specified side. May change when collisions occur.\n */\n readonly align = input<Align>(this.config.align ?? 'center');\n\n /** An offset in pixels from the `start` or `end` alignment options. */\n readonly alignOffset = input<number, NumberInput>(this.config.alignOffset ?? 0, { transform: numberAttribute });\n\n /**\n * Minimum distance to maintain between the arrow and the edges of the popup.\n * If your content has border-radius, this will prevent it from overflowing the corners.\n */\n readonly arrowPadding = input<number, NumberInput>(this.config.arrowPadding ?? 0, { transform: numberAttribute });\n\n /** When `true`, overrides the `side` and `align` preferences to prevent collisions with boundary edges. */\n readonly avoidCollisions = input<boolean, BooleanInput>(this.config.avoidCollisions ?? true, {\n transform: booleanAttribute\n });\n\n /**\n * The element used as the collision boundary.\n * By default this is the viewport, though you can provide additional element(s) to be included in this check.\n */\n readonly collisionBoundary = input<ElementRef<HTMLElement> | ElementRef<HTMLElement>[]>();\n /**\n * The distance in pixels from the boundary edges where collision detection should occur.\n * Accepts a number (same for all sides), or a partial padding object, for example: `{ top: 20, left: 20 }`.\n */\n readonly collisionPadding = input<number | Partial<Record<Side, number>>>(this.config.collisionPadding ?? 0);\n\n /**\n * The sticky behavior on the align axis. `partial` will keep the\n * content in the boundary as long as the trigger is at least partially\n * in the boundary whilst \"always\" will keep the content in the boundary\n * regardless.\n */\n readonly sticky = input<'partial' | 'always'>(this.config.sticky ?? 'partial');\n\n /**\n * Whether to hide the content when the trigger becomes fully occluded.\n */\n readonly hideWhenDetached = input<boolean, BooleanInput>(this.config.hideWhenDetached ?? false, {\n transform: booleanAttribute\n });\n\n /**\n * The type of CSS position property to use.\n */\n readonly positionStrategy = input<'fixed' | 'absolute'>(this.config.positionStrategy ?? 'fixed');\n\n /**\n * Strategy to update the position of the floating element on every animation frame.\n */\n readonly updatePositionStrategy = input<'optimized' | 'always'>(this.config.updatePositionStrategy ?? 'optimized');\n\n /**\n * Emits when the element is placed.\n */\n readonly placed = output<void>();\n\n readonly arrow = contentChild(forwardRef(() => RdxPopperArrow));\n\n /**\n * When `true`, the content is rendered click/hover-through (`pointer-events: none`). Used for\n * cursor-following content (e.g. a tooltip tracking the pointer) that must never intercept the\n * pointer and steal hover from its trigger.\n */\n readonly nonInteractive = signal(false);\n\n readonly shouldHideArrow = computed(() => this.position.value()?.middlewareData['arrow']?.centerOffset !== 0);\n /** Whether the arrow could not be centered on the anchor because the popup was shifted. */\n readonly arrowUncentered = computed(\n () => (this.position.value()?.middlewareData['arrow']?.centerOffset ?? 0) !== 0\n );\n readonly arrowX = computed(() => this.position.value()?.middlewareData['arrow']?.x);\n readonly arrowY = computed(() => this.position.value()?.middlewareData['arrow']?.y);\n readonly anchorHidden = computed(() => this.position.value()?.middlewareData.hide?.referenceHidden === true);\n\n private readonly desiredPlacement = computed(\n () => (this.side() + (this.align() !== 'center' ? '-' + this.align() : '')) as Placement\n );\n\n private readonly arrowSize = computed(() => {\n const arrowElementRef = this.arrow()?.elementRef;\n\n if (!arrowElementRef) {\n return computed(() => ({\n height: 0,\n width: 0\n }));\n }\n\n return elementSize({\n elementRef: arrowElementRef,\n injector: this.injector\n });\n });\n\n private readonly boundary = computed(() => {\n const boundary = this.collisionBoundary();\n\n if (Array.isArray(boundary)) {\n return boundary.map((e) => e.nativeElement);\n }\n\n if (!boundary) {\n return [];\n }\n\n return [boundary.nativeElement];\n });\n\n private readonly hasExplicitBoundaries = computed(() => this.boundary().length > 0);\n\n private readonly detectOverflowOptions = computed(() => ({\n padding: this.collisionPadding(),\n boundary: this.boundary().filter(isNotNull),\n // with `strategy: 'fixed'`, this is the only way to get it to respect boundaries\n altBoundary: this.hasExplicitBoundaries()\n }));\n\n private readonly resolvedAnchor = computed<ReferenceElement | null>(() => {\n const anchor = this.anchor();\n const resolvedAnchor = typeof anchor === 'function' ? anchor() : anchor;\n\n if (resolvedAnchor instanceof ElementRef) {\n return resolvedAnchor.nativeElement;\n }\n\n if (resolvedAnchor) {\n return resolvedAnchor;\n }\n\n return this.context.anchorOverride() ?? this.context.anchor()?.elementRef.nativeElement ?? null;\n });\n\n private readonly position = resource<ComputePositionReturn | null, PopperPositionParams>({\n params: () => this.positionParams(),\n loader: ({ params }) => {\n if (!params.anchor) {\n return Promise.resolve(null);\n }\n\n return computePosition(params.anchor, this.elementRef.nativeElement, {\n // default to `fixed` strategy so users don't have to pick and we also avoid focus scroll issues\n strategy: params.strategy,\n placement: params.placement,\n middleware: [\n offset({\n mainAxis: params.sideOffset + params.arrowHeight || 0,\n alignmentAxis: params.alignOffset\n }),\n params.avoidCollisions &&\n shift({\n mainAxis: true,\n crossAxis: false,\n limiter: params.sticky === 'partial' ? limitShift() : undefined,\n ...params.detectOverflowOptions\n }),\n params.avoidCollisions && flip({ ...params.detectOverflowOptions }),\n size({\n ...params.detectOverflowOptions,\n apply: ({ elements, rects, availableWidth, availableHeight }) => {\n const { width: anchorWidth, height: anchorHeight } = rects.reference;\n const contentStyle = elements.floating.style;\n contentStyle.setProperty('--radix-popper-available-width', `${availableWidth}px`);\n contentStyle.setProperty('--radix-popper-available-height', `${availableHeight}px`);\n contentStyle.setProperty('--radix-popper-anchor-width', `${anchorWidth}px`);\n contentStyle.setProperty('--radix-popper-anchor-height', `${anchorHeight}px`);\n }\n }),\n params.arrow &&\n floatingUIArrow({\n element: params.arrow.elementRef.nativeElement,\n padding: params.arrowPadding\n }),\n transformOrigin({\n arrowWidth: params.arrowWidth,\n arrowHeight: params.arrowHeight\n }),\n params.hideWhenDetached &&\n hide({\n strategy: 'referenceHidden',\n ...params.detectOverflowOptions\n })\n ]\n });\n }\n });\n\n private positionParams(): PopperPositionParams {\n return {\n anchor: this.resolvedAnchor(),\n strategy: this.positionStrategy(),\n placement: this.desiredPlacement(),\n sideOffset: this.sideOffset(),\n alignOffset: this.alignOffset(),\n arrowHeight: this.arrowSize()().height,\n arrowWidth: this.arrowSize()().width,\n avoidCollisions: this.avoidCollisions(),\n sticky: this.sticky(),\n detectOverflowOptions: this.detectOverflowOptions(),\n arrow: this.arrow(),\n arrowPadding: this.arrowPadding(),\n hideWhenDetached: this.hideWhenDetached()\n };\n }\n\n /**\n * The last successfully computed position, retained while a new one is being computed.\n *\n * The `position` resource resets `value()` to `undefined` whenever its params change (e.g. on\n * every pointer move while a tooltip tracks the cursor). Reading it directly would blank the\n * popup (`visibility: hidden` + off-screen transform) for the frames between a move and the next\n * resolved position — a visible flicker at high pointer-move rates. Holding the previous value\n * keeps the popup placed and visible until the new position is ready.\n */\n private readonly resolvedPosition = linkedSignal<\n ComputePositionReturn | undefined,\n ComputePositionReturn | undefined\n >({\n source: () => this.position.value() ?? undefined,\n computation: (value, previous) => value ?? previous?.value\n });\n\n /**\n * Whether the panel is positioned.\n */\n readonly isPositioned = computed(() => !!this.position.value());\n\n /**\n * The current placement of the panel.\n */\n readonly placement = computed(() => {\n const placement = this.position.value()?.placement;\n\n if (!placement) {\n return;\n }\n\n const [side, align = 'center'] = placement.split('-');\n\n return {\n side: side as Side,\n align: align as Align\n };\n });\n\n /**\n * The side the panel is currently placed against.\n */\n readonly placedSide = computed(() => this.placement()?.side);\n\n /**\n * The current alignment of the panel.\n */\n readonly placedAlign = computed(() => this.placement()?.align);\n\n protected readonly style = computed(() => {\n const pos = this.resolvedPosition();\n const x = pos?.x;\n const y = pos?.y;\n\n const ready = Number.isFinite(x) && Number.isFinite(y);\n\n return {\n position: this.positionStrategy(),\n transform: ready ? '' : 'translate(0, -200%)', // keep off the page when measuring\n minWidth: 'max-content',\n // ADR 0012 §3: z-index belongs on the positioner (set it via a class/style on the\n // positioner element), Base UI-aligned. The wrapper no longer copies the popup's computed\n // z-index, so a positioner no longer requires an inner `RdxPopperContent` to exist.\n top: Number.isFinite(y) ? `${y}px` : '',\n left: Number.isFinite(x) ? `${x}px` : '',\n '--radix-popper-transform-origin': [\n pos?.middlewareData['transformOrigin']?.x,\n pos?.middlewareData['transformOrigin']?.y\n ].join(' '),\n '--radix-popper-content-wrapper-width': `${this.elementRef.nativeElement.offsetWidth}px`,\n '--radix-popper-content-wrapper-height': `${this.elementRef.nativeElement.offsetHeight}px`,\n\n // Unified Base UI-style variables (ADR 0012), emitted once for every positioner so\n // consumers learn a single dialect. They alias the engine-level `--radix-popper-*` values\n // (the `--anchor-*`/`--available-*` ones are set imperatively by the `size` middleware).\n '--anchor-width': 'var(--radix-popper-anchor-width)',\n '--anchor-height': 'var(--radix-popper-anchor-height)',\n '--available-width': 'var(--radix-popper-available-width)',\n '--available-height': 'var(--radix-popper-available-height)',\n '--positioner-width': 'var(--radix-popper-content-wrapper-width)',\n '--positioner-height': 'var(--radix-popper-content-wrapper-height)',\n '--transform-origin': 'var(--radix-popper-transform-origin)',\n\n visibility: ready ? 'visible' : 'hidden',\n pointerEvents: this.nonInteractive() || !ready ? 'none' : 'auto',\n\n // hide the content if using the hide middleware and should be hidden\n // set visibility to hidden and disable pointer events so the UI behaves\n // as if the PopperContent isn't there at all\n ...(pos?.middlewareData.hide?.referenceHidden && {\n visibility: 'hidden',\n pointerEvents: 'none'\n })\n };\n });\n\n private readonly afterRenderEffect = afterRenderEffect((onCleanup) => {\n this.position.reload();\n\n const anchor = this.resolvedAnchor();\n if (!anchor) {\n return;\n }\n\n const cleanup = autoUpdate(anchor, this.elementRef.nativeElement, () => this.position.reload(), {\n animationFrame: this.updatePositionStrategy() === 'always'\n });\n\n onCleanup(cleanup);\n });\n\n constructor() {\n watch([this.isPositioned], ([isPositioned]) => {\n if (!isPositioned) {\n return;\n }\n\n afterNextRender(\n () => {\n this.placed.emit();\n },\n { injector: this.injector }\n );\n });\n }\n}\n\n/**\n * Providers a \"thin\" positioner that `extends RdxPopperContentWrapper` must include. Angular\n * inherits a base directive's inputs/outputs/host bindings/queries but **not** its `providers`, so\n * the `useExisting` alias (lets the popup and arrow resolve the subclass through the\n * {@link RdxPopperContentWrapper} token) and the wrapper context provider (what\n * `injectPopperContentWrapperContext()` reads) are re-declared here in one place.\n *\n * Combine with {@link provideRdxPopperContentConfig} for per-primitive positioning defaults:\n *\n * ```ts\n * providers: [\n * ...provideRdxPopperContentWrapper(RdxComboboxPositioner),\n * provideRdxPopperContentConfig({ sideOffset: 4, align: 'start' })\n * ]\n * ```\n */\nexport function provideRdxPopperContentWrapper(positioner: Type<RdxPopperContentWrapper>): Provider[] {\n return [{ provide: RdxPopperContentWrapper, useExisting: positioner }, providePopperContentWrapperContext(context)];\n}\n\n/**\n * Deprecated per-primitive aliases of the unified popper variables (ADR 0012). Since the wrapper now\n * emits the unified `--anchor-*` / `--available-*` / `--transform-origin` set itself, a positioner no\n * longer hand-writes a re-namespacing `[style]` map; it spreads this helper into a host `[style]`\n * binding only to keep the legacy `--radix-<name>-content-*` / `--radix-<name>-trigger-*` names alive\n * for one release of consumer back-compat. Migrate to the unified set; these are removed next minor.\n *\n * @deprecated Use the unified `--anchor-*` / `--available-*` / `--transform-origin` variables.\n */\nexport function legacyPopperVars(name: string): Record<string, string> {\n return {\n [`--radix-${name}-content-transform-origin`]: 'var(--radix-popper-transform-origin)',\n [`--radix-${name}-content-available-width`]: 'var(--radix-popper-available-width)',\n [`--radix-${name}-content-available-height`]: 'var(--radix-popper-available-height)',\n [`--radix-${name}-trigger-width`]: 'var(--radix-popper-anchor-width)',\n [`--radix-${name}-trigger-height`]: 'var(--radix-popper-anchor-height)'\n };\n}\n","import {\n computed,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n inputBinding,\n numberAttribute\n} from '@angular/core';\nimport { RdxArrow } from '@radix-ng/primitives/arrow';\nimport { injectPopperContentWrapperContext } from './popper-content-wrapper';\nimport { Side } from './utils';\n\nconst OPPOSITE_SIDE: Record<Side, Side> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right'\n};\n\n@Directive({\n selector: '[rdxPopperArrow]',\n host: {\n // The arrow is purely decorative — keep it out of the accessibility tree (Base UI does the same).\n 'aria-hidden': 'true',\n '[style]': 'style()'\n }\n})\nexport class RdxPopperArrow {\n private readonly popperContentContext = injectPopperContentWrapperContext();\n\n private readonly environmentInjector = inject(EnvironmentInjector);\n\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly width = input(10, { transform: numberAttribute });\n\n readonly height = input(5, { transform: numberAttribute });\n\n baseSide = computed(() => OPPOSITE_SIDE[this.popperContentContext.placedSide()!]);\n\n protected readonly style = computed(() => {\n return {\n position: 'absolute',\n left: this.popperContentContext.arrowX() ? `${this.popperContentContext.arrowX()}px` : undefined,\n top: this.popperContentContext.arrowY() ? `${this.popperContentContext.arrowY()}px` : undefined,\n [this.baseSide()]: 0,\n transformOrigin: {\n top: '',\n right: '0 0',\n bottom: 'center 0',\n left: '100% 0'\n }[this.popperContentContext.placedSide()!],\n transform: {\n top: 'translateY(100%)',\n right: 'translateY(50%) rotate(90deg) translateX(-50%)',\n bottom: `rotate(180deg)`,\n left: 'translateY(50%) rotate(-90deg) translateX(50%)'\n }[this.popperContentContext.placedSide()!],\n visibility: this.popperContentContext.shouldHideArrow() ? 'hidden' : undefined\n };\n });\n\n private onCleanup = effect((onCleanup) => {\n const component = createComponent(RdxArrow, {\n environmentInjector: this.environmentInjector,\n hostElement: this.elementRef.nativeElement,\n projectableNodes: [Array.from(this.elementRef.nativeElement.childNodes)],\n bindings: [inputBinding('width', () => this.width()), inputBinding('height', () => this.height())]\n });\n\n component.changeDetectorRef.detectChanges();\n\n onCleanup(() => component.destroy());\n });\n}\n","import { computed, Directive } from '@angular/core';\nimport { injectPopperContentWrapperContext } from './popper-content-wrapper';\n\n@Directive({\n selector: '[rdxPopperContent]',\n host: {\n '[attr.data-side]': 'popperContentWrapper?.placedSide()',\n '[attr.data-align]': 'popperContentWrapper?.placedAlign()',\n '[style]': 'style()'\n }\n})\nexport class RdxPopperContent {\n /**\n * Optional so the directive can be composed onto a content part that is also used outside Popper\n * positioning (e.g. select's `item-aligned` mode, where there is no `RdxPopperContentWrapper`\n * ancestor). With no wrapper the `data-side` / `data-align` bindings and the animation guard\n * simply no-op.\n */\n protected readonly popperContentWrapper = injectPopperContentWrapperContext(true);\n\n /**\n * if the PopperContent hasn't been placed yet (not all measurements done)\n * we prevent animations so that users's animation don't kick in too early referring wrong sides\n */\n protected readonly style = computed(() => ({\n animation: this.popperContentWrapper && !this.popperContentWrapper.isPositioned() ? 'none' : undefined\n }));\n}\n","import { RdxPopper } from './src/popper';\nimport { RdxPopperAnchor } from './src/popper-anchor';\nimport { RdxPopperArrow } from './src/popper-arrow';\nimport { RdxPopperContent } from './src/popper-content';\nimport { RdxPopperContentWrapper } from './src/popper-content-wrapper';\n\nexport * from './src/popper';\nexport * from './src/popper-anchor';\nexport * from './src/popper-arrow';\nexport * from './src/popper-content';\nexport * from './src/popper-content-wrapper';\nexport * from './src/popper-content.config';\nexport * from './src/utils';\n\nexport const popperImports = [RdxPopper, RdxPopperArrow, RdxPopperContentWrapper, RdxPopperContent, RdxPopperAnchor];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["floatingUIArrow"],"mappings":"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"}
1
+ {"version":3,"file":"radix-ng-primitives-popper.mjs","sources":["../../../packages/primitives/popper/src/popper-anchor.ts","../../../packages/primitives/popper/src/popper.ts","../../../packages/primitives/popper/src/popper-content.config.ts","../../../packages/primitives/popper/src/utils.ts","../../../packages/primitives/popper/src/popper-content-wrapper.ts","../../../packages/primitives/popper/src/popper-arrow.ts","../../../packages/primitives/popper/src/popper-content.ts","../../../packages/primitives/popper/index.ts","../../../packages/primitives/popper/radix-ng-primitives-popper.ts"],"sourcesContent":["import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[rdxPopperAnchor]'\n})\nexport class RdxPopperAnchor {\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n","import { contentChild, Directive, signal } from '@angular/core';\nimport type { ReferenceElement } from '@floating-ui/dom';\nimport { RdxPopperAnchor } from './popper-anchor';\n\n@Directive({\n selector: '[rdxPopperRoot]'\n})\nexport class RdxPopper {\n readonly anchor = contentChild(RdxPopperAnchor);\n readonly anchorOverride = signal<ReferenceElement | undefined>(undefined);\n}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { Align, OffsetFunction, RdxCollisionAvoidance, Side, SideOrLogical } from './utils';\n\n/**\n * Default positioning values for `RdxPopperContentWrapper`.\n *\n * Lets a composing primitive (e.g. tooltip) provide its own Base UI-aligned defaults without\n * changing the shared popper defaults that other consumers (e.g. popover) rely on. Any value left\n * `undefined` falls back to the wrapper's built-in default. Consumer template bindings always win.\n */\nexport interface RdxPopperContentConfig {\n side?: SideOrLogical;\n align?: Align;\n sideOffset?: number | OffsetFunction;\n alignOffset?: number | OffsetFunction;\n arrowPadding?: number;\n /**\n * @deprecated Use {@link collisionAvoidance} instead. Kept for back-compat: `false` disables all\n * collision avoidance (equivalent to `{ side: 'none', align: 'none', fallbackAxisSide: 'none' }`).\n */\n avoidCollisions?: boolean;\n /** Per-primitive collision-avoidance default (Base UI parity). See {@link RdxCollisionAvoidance}. */\n collisionAvoidance?: RdxCollisionAvoidance;\n collisionPadding?: number | Partial<Record<Side, number>>;\n sticky?: 'partial' | 'always';\n hideWhenDetached?: boolean;\n positionStrategy?: 'fixed' | 'absolute';\n updatePositionStrategy?: 'optimized' | 'always';\n}\n\n/**\n * Collision-avoidance preset for dropdown-style popups (Base UI `DROPDOWN_COLLISION_AVOIDANCE`).\n *\n * Dropdowns (select / combobox / autocomplete / menu) strictly prefer their top/bottom placement and\n * cap their height with `var(--available-height)`, so they must **not** fall back to the perpendicular\n * (left/right) axis. `side`/`align` fall back to the wrapper default (`'flip'`).\n */\nexport const DROPDOWN_COLLISION_AVOIDANCE: RdxCollisionAvoidance = { fallbackAxisSide: 'none' };\n\n/**\n * Collision-avoidance preset for regular popups (Base UI `POPUP_COLLISION_AVOIDANCE`).\n *\n * Popovers / tooltips / preview cards aren't height-capped and may freely flip to the perpendicular\n * axis, preferring the logical end side. This equals the wrapper's built-in default; it is exported so\n * popups can state the intent explicitly.\n */\nexport const POPUP_COLLISION_AVOIDANCE: RdxCollisionAvoidance = { fallbackAxisSide: 'end' };\n\nexport const RdxPopperContentConfigToken = new InjectionToken<RdxPopperContentConfig>('RdxPopperContentConfig', {\n factory: () => ({})\n});\n\nexport function provideRdxPopperContentConfig(config: RdxPopperContentConfig): Provider {\n return { provide: RdxPopperContentConfigToken, useValue: config };\n}\n","import type { Middleware, Placement } from '@floating-ui/dom';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst SIDE_OPTIONS = ['top', 'right', 'bottom', 'left'] as const;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst ALIGN_OPTIONS = ['start', 'center', 'end'] as const;\n\nexport type Side = (typeof SIDE_OPTIONS)[number];\nexport type Align = (typeof ALIGN_OPTIONS)[number];\n\n/** Logical (writing-direction-relative) inline sides, resolved to a physical {@link Side} by text direction. */\nexport type LogicalSide = 'inline-start' | 'inline-end';\n\n/** A physical {@link Side} or a {@link LogicalSide} — accepted by the positioner's `side` input. */\nexport type SideOrLogical = Side | LogicalSide;\n\n/**\n * Resolve a logical inline side to a physical one for the current text direction; physical sides pass\n * through unchanged (Base UI `useAnchorPositioning`). `inline-start` is the reading-start edge\n * (`left` in LTR, `right` in RTL); `inline-end` is the reading-end edge.\n */\nexport function resolvePhysicalSide(side: SideOrLogical, isRtl: boolean): Side {\n if (side === 'inline-start') {\n return isRtl ? 'right' : 'left';\n }\n\n if (side === 'inline-end') {\n return isRtl ? 'left' : 'right';\n }\n\n return side;\n}\n\n/**\n * Report a rendered physical side back in the same \"kind\" the consumer requested (Base UI\n * `getLogicalSide`): when a logical side was requested, a `left`/`right` rendered side is mapped back\n * to `inline-start`/`inline-end` for the direction (so a post-collision flip surfaces logically); a\n * physical request, or a `top`/`bottom` rendered side, passes through unchanged.\n */\nexport function toLogicalSide(requestedSide: SideOrLogical, renderedSide: Side, isRtl: boolean): SideOrLogical {\n const requestedLogical = requestedSide === 'inline-start' || requestedSide === 'inline-end';\n\n if (!requestedLogical) {\n return renderedSide;\n }\n\n if (renderedSide === 'left') {\n return isRtl ? 'inline-end' : 'inline-start';\n }\n\n if (renderedSide === 'right') {\n return isRtl ? 'inline-start' : 'inline-end';\n }\n\n return renderedSide;\n}\n\n/**\n * How the popper avoids collisions with the boundary edges (Base UI `collisionAvoidance`).\n *\n * - `side` — behavior on the **preferred placement axis** (`top`/`bottom` or `left`/`right`):\n * `'flip'` swaps to the opposite side when it doesn't fit, `'shift'` keeps the side and nudges the\n * popup within the boundary, `'none'` leaves side-axis overflow uncorrected.\n * - `align` — behavior on the **alignment axis** (`start`/`center`/`end`): `'flip'` swaps `start`/`end`,\n * `'shift'` nudges the popup along the alignment axis, `'none'` leaves it uncorrected.\n * - `fallbackAxisSide` — when neither preferred side fits, whether to fall back to the perpendicular\n * axis and which logical side to prefer (`'start'` / `'end'`), or `'none'` to stay on the axis.\n *\n * Any omitted field falls back to the wrapper default (`side: 'flip'`, `align: 'flip'`,\n * `fallbackAxisSide: 'end'`), matching Base UI.\n */\nexport interface RdxCollisionAvoidance {\n side?: 'flip' | 'shift' | 'none';\n align?: 'flip' | 'shift' | 'none';\n fallbackAxisSide?: 'start' | 'end' | 'none';\n}\n\n/** Fully-resolved {@link RdxCollisionAvoidance} — every field present (no wrapper-default fallback left). */\nexport type ResolvedCollisionAvoidance = Required<RdxCollisionAvoidance>;\n\n/**\n * Function form of `sideOffset` / `alignOffset` (Base UI `OffsetFunction`). Receives the resolved\n * placement and the measured anchor / positioner dimensions, and returns the offset in pixels — e.g.\n * `({ anchor }) => anchor.width` to offset by the trigger's own width. `side` is the side the popup is\n * placed against — reported logically (`inline-start` / `inline-end`) when a logical side was\n * requested, otherwise physical (Base UI parity).\n */\nexport type OffsetFunction = (data: {\n side: SideOrLogical;\n align: Align;\n anchor: { width: number; height: number };\n positioner: { width: number; height: number };\n}) => number;\n\nexport function isNotNull<T>(value: T | null): value is T {\n return value !== null;\n}\n\nexport function transformOrigin(options: { arrowWidth: number; arrowHeight: number }): Middleware {\n return {\n name: 'transformOrigin',\n options,\n fn(data) {\n const { placement, rects, middlewareData } = data;\n\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isArrowHidden = cannotCenterArrow;\n const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;\n const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;\n\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);\n const noArrowAlign = { start: '0%', center: '50%', end: '100%' }[placedAlign];\n\n const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;\n const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;\n\n let x = '';\n let y = '';\n\n if (placedSide === 'bottom') {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${-arrowHeight}px`;\n } else if (placedSide === 'top') {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${rects.floating.height + arrowHeight}px`;\n } else if (placedSide === 'right') {\n x = `${-arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n } else if (placedSide === 'left') {\n x = `${rects.floating.width + arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n }\n return { data: { x, y } };\n }\n };\n}\n\nexport function getSideAndAlignFromPlacement(placement: Placement) {\n const [side, align = 'center'] = placement.split('-');\n return [side as Side, align as Align] as const;\n}\n","import {\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChild,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n linkedSignal,\n numberAttribute,\n output,\n Provider,\n resource,\n Signal,\n signal,\n Type\n} from '@angular/core';\nimport type { ComputePositionReturn, ReferenceElement, VirtualElement } from '@floating-ui/dom';\nimport {\n autoUpdate,\n computePosition,\n flip,\n arrow as floatingUIArrow,\n hide,\n limitShift,\n offset,\n Placement,\n shift,\n size\n} from '@floating-ui/dom';\nimport { BooleanInput, createContext, Direction, elementSize, NumberInput, watch } from '@radix-ng/primitives/core';\nimport { injectDirection } from '@radix-ng/primitives/direction-provider';\nimport { RdxPopper } from './popper';\nimport { RdxPopperArrow } from './popper-arrow';\nimport { RdxPopperContentConfigToken } from './popper-content.config';\nimport {\n Align,\n getSideAndAlignFromPlacement,\n isNotNull,\n OffsetFunction,\n RdxCollisionAvoidance,\n ResolvedCollisionAvoidance,\n resolvePhysicalSide,\n Side,\n SideOrLogical,\n toLogicalSide,\n transformOrigin\n} from './utils';\n\n/**\n * `input()` transform for `sideOffset` / `alignOffset`: coerce string/number attribute values to a\n * number but pass an {@link OffsetFunction} through untouched. A **named** module-level function (not\n * an inline arrow) so compodoc parses the file — see CLAUDE.md's compodoc gotcha.\n */\nfunction coerceOffset(value: number | OffsetFunction | string | null | undefined): number | OffsetFunction {\n return typeof value === 'function' ? value : numberAttribute(value);\n}\n\nexport type RdxPopperAnchorElement =\n | Element\n | ElementRef<Element>\n | VirtualElement\n | (() => Element | VirtualElement | null)\n | null\n | undefined;\n\ntype PopperPositionParams = {\n positioningActive: boolean;\n anchor: ReferenceElement | null;\n strategy: 'fixed' | 'absolute';\n placement: Placement;\n /** The original requested side (may be logical) — used to report the side logically to offset functions. */\n side: SideOrLogical;\n isRtl: boolean;\n align: Align;\n sideOffset: number | OffsetFunction;\n alignOffset: number | OffsetFunction;\n arrowHeight: number;\n arrowWidth: number;\n collisionAvoidance: ResolvedCollisionAvoidance;\n sticky: 'partial' | 'always';\n detectOverflowOptions: {\n padding: number | Partial<Record<Side, number>>;\n boundary: Element[];\n altBoundary: boolean;\n };\n arrow: RdxPopperArrow | undefined;\n arrowPadding: number;\n hideWhenDetached: boolean;\n};\n\nconst context = () => {\n const popperContentWrapper = inject(RdxPopperContentWrapper);\n\n return {\n placedSide: popperContentWrapper.placedSide,\n physicalPlacedSide: popperContentWrapper.physicalPlacedSide,\n placedAlign: popperContentWrapper.placedAlign,\n arrowX: popperContentWrapper.arrowX,\n arrowY: popperContentWrapper.arrowY,\n shouldHideArrow: popperContentWrapper.shouldHideArrow,\n isPositioned: popperContentWrapper.isPositioned,\n anchorHidden: popperContentWrapper.anchorHidden\n };\n};\n\nexport type PopperContentWrapperContext = ReturnType<typeof context>;\n\nexport const [injectPopperContentWrapperContext, providePopperContentWrapperContext] =\n createContext<PopperContentWrapperContext>('PopperContentWrapperContext', 'utils/popper');\n\n@Directive({\n selector: '[rdxPopperContentWrapper]',\n providers: [providePopperContentWrapperContext(context)],\n host: {\n 'data-radix-popper-content-wrapper': '',\n // Placement state, emitted once for every positioner (ADR 0012). The popup\n // (`RdxPopperContent`) keeps its own `data-side`/`data-align` as popup-level styling hooks.\n '[attr.data-side]': 'placedSide()',\n '[attr.data-align]': 'placedAlign()',\n '[attr.data-anchor-hidden]': 'anchorHidden() ? \"\" : undefined',\n '[style]': 'style()'\n }\n})\nexport class RdxPopperContentWrapper {\n private readonly elementRef = inject(ElementRef);\n private readonly injector = inject(Injector);\n\n private readonly context = inject(RdxPopper);\n\n /** Optional positioning defaults provided by a composing primitive (e.g. tooltip). */\n private readonly config = inject(RdxPopperContentConfigToken);\n\n /**\n * An element to position the popup against. Defaults to the popper anchor.\n */\n readonly anchor = input<RdxPopperAnchorElement>();\n\n /**\n * The preferred side of the anchor to render against when open.\n * Will be reversed when collisions occur and avoidCollisions is enabled.\n *\n * Accepts the logical `'inline-start'` / `'inline-end'` in addition to the physical sides; those\n * resolve to `left` / `right` for the text direction (Base UI parity). The placed side reported via\n * `data-side` / `placedSide()` echoes the requested kind: logical in → logical out (even after a\n * collision flip), physical in → physical out.\n */\n readonly side = input<SideOrLogical>(this.config.side ?? 'bottom');\n\n /**\n * Text direction, used only to resolve a logical `side` (`inline-start` / `inline-end`) to a\n * physical one. Falls back to an enclosing direction provider, then `ltr`.\n */\n readonly dir = input<Direction | undefined>(undefined);\n private readonly direction = injectDirection(this.dir);\n\n /** The `side` input with any logical inline value resolved to a physical side for the direction. */\n private readonly resolvedSide = computed<Side>(() => resolvePhysicalSide(this.side(), this.direction() === 'rtl'));\n\n /**\n * Distance between the anchor and the popup in pixels. Also accepts an {@link OffsetFunction} that\n * reads the anchor / positioner dimensions and the resolved side / align.\n */\n readonly sideOffset = input(this.config.sideOffset ?? 0, { transform: coerceOffset });\n\n /**\n * How to align the popup relative to the specified side. May change when collisions occur.\n */\n readonly align = input<Align>(this.config.align ?? 'center');\n\n /**\n * An offset in pixels from the `start` or `end` alignment options. Also accepts an\n * {@link OffsetFunction} (same signature as `sideOffset`).\n */\n readonly alignOffset = input(this.config.alignOffset ?? 0, { transform: coerceOffset });\n\n /**\n * Minimum distance to maintain between the arrow and the edges of the popup.\n * If your content has border-radius, this will prevent it from overflowing the corners.\n */\n readonly arrowPadding = input<number, NumberInput>(this.config.arrowPadding ?? 0, { transform: numberAttribute });\n\n /**\n * When `true`, overrides the `side` and `align` preferences to prevent collisions with boundary edges.\n *\n * @deprecated Use {@link collisionAvoidance} for fine-grained control (Base UI parity). Still honored:\n * `false` disables all avoidance (unless a `collisionAvoidance` object is provided, which wins).\n */\n readonly avoidCollisions = input<boolean, BooleanInput>(this.config.avoidCollisions ?? true, {\n transform: booleanAttribute\n });\n\n /**\n * How the popup avoids colliding with the boundary edges, per axis (Base UI `collisionAvoidance`).\n * Overrides the deprecated `avoidCollisions` and any per-primitive preset. An object here **fully\n * replaces** the preset — omitted fields fall back to `side: 'flip'`, `align: 'flip'`,\n * `fallbackAxisSide: 'end'`, never to the preset. See {@link RdxCollisionAvoidance}.\n */\n readonly collisionAvoidance = input<RdxCollisionAvoidance | undefined>(undefined);\n\n /**\n * Collision avoidance resolved against the deprecated `avoidCollisions` flag, the per-primitive\n * config preset, and the wrapper defaults. Precedence: an explicit `collisionAvoidance` input →\n * a legacy `avoidCollisions=false` (disables everything) → the config preset → the Base UI defaults.\n */\n private readonly effectiveCollisionAvoidance = computed<ResolvedCollisionAvoidance>(() => {\n const explicit = this.collisionAvoidance();\n\n // Legacy escape hatch (deprecated): `avoidCollisions=false` disables avoidance entirely — unless\n // the consumer passes an explicit `collisionAvoidance` object, which always wins. Checked before\n // the preset so `[avoidCollisions]=\"false\"` still works on a positioner that ships a preset.\n if (!explicit && this.avoidCollisions() === false) {\n return { side: 'none', align: 'none', fallbackAxisSide: 'none' };\n }\n\n // A consumer object fully REPLACES the preset (Base UI parity — the preset is only the default\n // when the consumer passes nothing); omitted fields fall back to the global defaults, not the\n // preset. `??` (not spread-merge) is what enforces the \"replaces, not merges\" semantics.\n const source = explicit ?? this.config.collisionAvoidance;\n\n return {\n side: source?.side ?? 'flip',\n align: source?.align ?? 'flip',\n fallbackAxisSide: source?.fallbackAxisSide ?? 'end'\n };\n });\n\n /**\n * The element used as the collision boundary.\n * By default this is the viewport, though you can provide additional element(s) to be included in this check.\n */\n readonly collisionBoundary = input<ElementRef<HTMLElement> | ElementRef<HTMLElement>[]>();\n /**\n * The distance in pixels from the boundary edges where collision detection should occur.\n * Accepts a number (same for all sides), or a partial padding object, for example: `{ top: 20, left: 20 }`.\n */\n readonly collisionPadding = input<number | Partial<Record<Side, number>>>(this.config.collisionPadding ?? 0);\n\n /**\n * The sticky behavior on the align axis. `partial` will keep the\n * content in the boundary as long as the trigger is at least partially\n * in the boundary whilst \"always\" will keep the content in the boundary\n * regardless.\n */\n readonly sticky = input<'partial' | 'always'>(this.config.sticky ?? 'partial');\n\n /**\n * Whether to hide the content when the trigger becomes fully occluded.\n */\n readonly hideWhenDetached = input<boolean, BooleanInput>(this.config.hideWhenDetached ?? false, {\n transform: booleanAttribute\n });\n\n /**\n * The type of CSS position property to use.\n */\n readonly positionStrategy = input<'fixed' | 'absolute'>(this.config.positionStrategy ?? 'fixed');\n\n /**\n * Strategy to update the position of the floating element on every animation frame.\n */\n readonly updatePositionStrategy = input<'optimized' | 'always'>(this.config.updatePositionStrategy ?? 'optimized');\n\n /**\n * Emits when the element is placed.\n */\n readonly placed = output<void>();\n\n readonly arrow = contentChild(forwardRef(() => RdxPopperArrow));\n\n /**\n * When `true`, the content is rendered click/hover-through (`pointer-events: none`). Used for\n * cursor-following content (e.g. a tooltip tracking the pointer) that must never intercept the\n * pointer and steal hover from its trigger.\n */\n readonly nonInteractive = signal(false);\n\n readonly shouldHideArrow = computed(() => this.position.value()?.middlewareData['arrow']?.centerOffset !== 0);\n /** Whether the arrow could not be centered on the anchor because the popup was shifted. */\n readonly arrowUncentered = computed(\n () => (this.position.value()?.middlewareData['arrow']?.centerOffset ?? 0) !== 0\n );\n readonly arrowX = computed(() => this.position.value()?.middlewareData['arrow']?.x);\n readonly arrowY = computed(() => this.position.value()?.middlewareData['arrow']?.y);\n readonly anchorHidden = computed(() => this.position.value()?.middlewareData.hide?.referenceHidden === true);\n\n private readonly desiredPlacement = computed(\n () => (this.resolvedSide() + (this.align() !== 'center' ? '-' + this.align() : '')) as Placement\n );\n\n private readonly arrowSize = computed(() => {\n const arrowElementRef = this.arrow()?.elementRef;\n\n if (!arrowElementRef) {\n return computed(() => ({\n height: 0,\n width: 0\n }));\n }\n\n return elementSize({\n elementRef: arrowElementRef,\n injector: this.injector\n });\n });\n\n private readonly boundary = computed(() => {\n const boundary = this.collisionBoundary();\n\n if (Array.isArray(boundary)) {\n return boundary.map((e) => e.nativeElement);\n }\n\n if (!boundary) {\n return [];\n }\n\n return [boundary.nativeElement];\n });\n\n private readonly hasExplicitBoundaries = computed(() => this.boundary().length > 0);\n\n private readonly detectOverflowOptions = computed(() => ({\n padding: this.collisionPadding(),\n boundary: this.boundary().filter(isNotNull),\n // with `strategy: 'fixed'`, this is the only way to get it to respect boundaries\n altBoundary: this.hasExplicitBoundaries()\n }));\n\n private readonly resolvedAnchor = computed<ReferenceElement | null>(() => {\n const anchor = this.anchor();\n const resolvedAnchor = typeof anchor === 'function' ? anchor() : anchor;\n\n if (resolvedAnchor instanceof ElementRef) {\n return resolvedAnchor.nativeElement;\n }\n\n if (resolvedAnchor) {\n return resolvedAnchor;\n }\n\n return this.context.anchorOverride() ?? this.context.anchor()?.elementRef.nativeElement ?? null;\n });\n\n private readonly position = resource<ComputePositionReturn | null, PopperPositionParams>({\n params: () => this.positionParams(),\n loader: ({ params }) => {\n // Skip computing a position for a paused (closed keep-mounted) positioner.\n if (!params.positioningActive || !params.anchor) {\n return Promise.resolve(null);\n }\n\n const ca = params.collisionAvoidance;\n // Ported from Base UI `useAnchorPositioning`: `side`/`align`/`fallbackAxisSide` select and\n // configure the `flip()` / `shift()` middleware instead of the old boolean toggle.\n const shiftDisabled = ca.align === 'none' && ca.side !== 'shift';\n const crossAxisShiftEnabled = !shiftDisabled && (params.sticky === 'always' || ca.side === 'shift');\n\n const flipMiddleware =\n ca.side === 'none'\n ? undefined\n : flip({\n ...params.detectOverflowOptions,\n mainAxis: ca.side === 'flip',\n crossAxis: ca.align === 'flip' ? 'alignment' : false,\n fallbackAxisSideDirection: ca.fallbackAxisSide\n });\n\n const shiftMiddleware = shiftDisabled\n ? undefined\n : shift({\n ...params.detectOverflowOptions,\n mainAxis: ca.align !== 'none',\n crossAxis: crossAxisShiftEnabled,\n // `partial` keeps the popup attached to the anchor (limitShift); `always` keeps it\n // fully inside the boundary regardless (no limiter).\n limiter: params.sticky === 'partial' ? limitShift() : undefined\n });\n\n // https://floating-ui.com/docs/flip#combining-with-shift — run shift first when shifting is\n // the primary correction (or for center alignment), otherwise flip first.\n const collisionMiddleware =\n ca.side === 'shift' || ca.align === 'shift' || params.align === 'center'\n ? [shiftMiddleware, flipMiddleware]\n : [flipMiddleware, shiftMiddleware];\n\n return computePosition(params.anchor, this.elementRef.nativeElement, {\n // default to `fixed` strategy so users don't have to pick and we also avoid focus scroll issues\n strategy: params.strategy,\n placement: params.placement,\n middleware: [\n offset((state) => {\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(state.placement);\n const data = {\n // Report the placed side in the same kind the consumer requested: logical\n // when a logical `side` was passed (so a post-collision flip stays logical),\n // physical otherwise (Base UI parity).\n side: toLogicalSide(params.side, placedSide, params.isRtl),\n align: placedAlign,\n anchor: {\n width: state.rects.reference.width,\n height: state.rects.reference.height\n },\n positioner: {\n width: state.rects.floating.width,\n height: state.rects.floating.height\n }\n };\n const sideAxis =\n typeof params.sideOffset === 'function' ? params.sideOffset(data) : params.sideOffset;\n const alignAxis =\n typeof params.alignOffset === 'function' ? params.alignOffset(data) : params.alignOffset;\n\n return {\n mainAxis: sideAxis + params.arrowHeight || 0,\n // both axes so `alignOffset` also applies to center-aligned popups\n // (`alignmentAxis` overrides `crossAxis` for start/end placements)\n crossAxis: alignAxis,\n alignmentAxis: alignAxis\n };\n }),\n ...collisionMiddleware,\n size({\n ...params.detectOverflowOptions,\n apply: ({ elements, rects, availableWidth, availableHeight }) => {\n const { width: anchorWidth, height: anchorHeight } = rects.reference;\n const contentStyle = elements.floating.style;\n contentStyle.setProperty('--radix-popper-available-width', `${availableWidth}px`);\n contentStyle.setProperty('--radix-popper-available-height', `${availableHeight}px`);\n contentStyle.setProperty('--radix-popper-anchor-width', `${anchorWidth}px`);\n contentStyle.setProperty('--radix-popper-anchor-height', `${anchorHeight}px`);\n }\n }),\n params.arrow &&\n floatingUIArrow({\n element: params.arrow.elementRef.nativeElement,\n padding: params.arrowPadding\n }),\n transformOrigin({\n arrowWidth: params.arrowWidth,\n arrowHeight: params.arrowHeight\n }),\n params.hideWhenDetached &&\n hide({\n strategy: 'referenceHidden',\n ...params.detectOverflowOptions\n })\n ]\n });\n }\n });\n\n private positionParams(): PopperPositionParams {\n return {\n positioningActive: this.positioningActive(),\n anchor: this.resolvedAnchor(),\n strategy: this.positionStrategy(),\n placement: this.desiredPlacement(),\n side: this.side(),\n isRtl: this.direction() === 'rtl',\n align: this.align(),\n sideOffset: this.sideOffset(),\n alignOffset: this.alignOffset(),\n arrowHeight: this.arrowSize()().height,\n arrowWidth: this.arrowSize()().width,\n collisionAvoidance: this.effectiveCollisionAvoidance(),\n sticky: this.sticky(),\n detectOverflowOptions: this.detectOverflowOptions(),\n arrow: this.arrow(),\n arrowPadding: this.arrowPadding(),\n hideWhenDetached: this.hideWhenDetached()\n };\n }\n\n /**\n * The last successfully computed position, retained while a new one is being computed.\n *\n * The `position` resource resets `value()` to `undefined` whenever its params change (e.g. on\n * every pointer move while a tooltip tracks the cursor). Reading it directly would blank the\n * popup (`visibility: hidden` + off-screen transform) for the frames between a move and the next\n * resolved position — a visible flicker at high pointer-move rates. Holding the previous value\n * keeps the popup placed and visible until the new position is ready.\n */\n private readonly resolvedPosition = linkedSignal<\n ComputePositionReturn | undefined,\n ComputePositionReturn | undefined\n >({\n source: () => this.position.value() ?? undefined,\n computation: (value, previous) => value ?? previous?.value\n });\n\n /**\n * Whether the panel is positioned.\n */\n readonly isPositioned = computed(() => !!this.position.value());\n\n /**\n * The current placement of the panel.\n */\n readonly placement = computed(() => {\n const placement = this.position.value()?.placement;\n\n if (!placement) {\n return;\n }\n\n const [side, align = 'center'] = placement.split('-');\n\n return {\n side: side as Side,\n align: align as Align\n };\n });\n\n /**\n * The physical side the panel is currently placed against. Internal geometry (arrow position,\n * transform origins) must use this — never {@link placedSide}, which can be logical.\n */\n readonly physicalPlacedSide = computed(() => this.placement()?.side);\n\n /**\n * The side the panel is currently placed against, reported in the kind the consumer requested\n * (Base UI positioner `side`): when a logical `side` was passed, a placed `left`/`right` maps back\n * to `inline-start`/`inline-end` for the direction — so a post-collision flip stays logical and\n * `[data-side=\"inline-start\"]` CSS is direction-agnostic. A physical request is always reported\n * physically.\n */\n readonly placedSide = computed<SideOrLogical | undefined>(() => {\n const side = this.placement()?.side;\n\n return side === undefined ? undefined : toLogicalSide(this.side(), side, this.direction() === 'rtl');\n });\n\n /**\n * The current alignment of the panel.\n */\n readonly placedAlign = computed(() => this.placement()?.align);\n\n protected readonly style = computed(() => {\n const pos = this.resolvedPosition();\n const x = pos?.x;\n const y = pos?.y;\n\n const ready = Number.isFinite(x) && Number.isFinite(y);\n\n return {\n position: this.positionStrategy(),\n transform: ready ? '' : 'translate(0, -200%)', // keep off the page when measuring\n minWidth: 'max-content',\n // ADR 0012 §3: z-index belongs on the positioner (set it via a class/style on the\n // positioner element), Base UI-aligned. The wrapper no longer copies the popup's computed\n // z-index, so a positioner no longer requires an inner `RdxPopperContent` to exist.\n top: Number.isFinite(y) ? `${y}px` : '',\n left: Number.isFinite(x) ? `${x}px` : '',\n '--radix-popper-transform-origin': [\n pos?.middlewareData['transformOrigin']?.x,\n pos?.middlewareData['transformOrigin']?.y\n ].join(' '),\n '--radix-popper-content-wrapper-width': `${this.elementRef.nativeElement.offsetWidth}px`,\n '--radix-popper-content-wrapper-height': `${this.elementRef.nativeElement.offsetHeight}px`,\n\n // Unified Base UI-style variables (ADR 0012), emitted once for every positioner so\n // consumers learn a single dialect. They alias the engine-level `--radix-popper-*` values\n // (the `--anchor-*`/`--available-*` ones are set imperatively by the `size` middleware).\n '--anchor-width': 'var(--radix-popper-anchor-width)',\n '--anchor-height': 'var(--radix-popper-anchor-height)',\n '--available-width': 'var(--radix-popper-available-width)',\n '--available-height': 'var(--radix-popper-available-height)',\n '--positioner-width': 'var(--radix-popper-content-wrapper-width)',\n '--positioner-height': 'var(--radix-popper-content-wrapper-height)',\n '--transform-origin': 'var(--radix-popper-transform-origin)',\n\n visibility: ready ? 'visible' : 'hidden',\n pointerEvents: this.nonInteractive() || !ready ? 'none' : 'auto',\n\n // hide the content if using the hide middleware and should be hidden\n // set visibility to hidden and disable pointer events so the UI behaves\n // as if the PopperContent isn't there at all\n ...(pos?.middlewareData.hide?.referenceHidden && {\n visibility: 'hidden',\n pointerEvents: 'none'\n })\n };\n });\n\n /**\n * Whether the positioner should actively track its anchor (recompute + `autoUpdate`). Defaults to\n * always-on — the historical behavior, correct for a positioner that unmounts when its layer closes.\n * A positioner that can stay mounted while closed (`keepMounted`) **overrides** this with its\n * open/presence signal so a closed, hidden positioner doesn't spin an endless `autoUpdate`\n * `requestAnimationFrame` loop (only relevant when `updatePositionStrategy: 'always'`). It's a\n * reassignable field (not `readonly`) because the render effect below reads it lazily, after the\n * subclass constructor has swapped it in.\n */\n protected positioningActive: Signal<boolean> = computed(() => true);\n\n private readonly afterRenderEffect = afterRenderEffect((onCleanup) => {\n // Closed keep-mounted positioner: skip positioning entirely so `autoUpdate` doesn't keep firing.\n if (!this.positioningActive()) {\n return;\n }\n\n this.position.reload();\n\n const anchor = this.resolvedAnchor();\n if (!anchor) {\n return;\n }\n\n const cleanup = autoUpdate(anchor, this.elementRef.nativeElement, () => this.position.reload(), {\n animationFrame: this.updatePositionStrategy() === 'always'\n });\n\n onCleanup(cleanup);\n });\n\n constructor() {\n watch([this.isPositioned], ([isPositioned]) => {\n if (!isPositioned) {\n return;\n }\n\n afterNextRender(\n () => {\n this.placed.emit();\n },\n { injector: this.injector }\n );\n });\n }\n}\n\n/**\n * Providers a \"thin\" positioner that `extends RdxPopperContentWrapper` must include. Angular\n * inherits a base directive's inputs/outputs/host bindings/queries but **not** its `providers`, so\n * the `useExisting` alias (lets the popup and arrow resolve the subclass through the\n * {@link RdxPopperContentWrapper} token) and the wrapper context provider (what\n * `injectPopperContentWrapperContext()` reads) are re-declared here in one place.\n *\n * Combine with {@link provideRdxPopperContentConfig} for per-primitive positioning defaults:\n *\n * ```ts\n * providers: [\n * ...provideRdxPopperContentWrapper(RdxComboboxPositioner),\n * provideRdxPopperContentConfig({ sideOffset: 4, align: 'start' })\n * ]\n * ```\n */\nexport function provideRdxPopperContentWrapper(positioner: Type<RdxPopperContentWrapper>): Provider[] {\n return [{ provide: RdxPopperContentWrapper, useExisting: positioner }, providePopperContentWrapperContext(context)];\n}\n\n/**\n * Deprecated per-primitive aliases of the unified popper variables (ADR 0012). Since the wrapper now\n * emits the unified `--anchor-*` / `--available-*` / `--transform-origin` set itself, a positioner no\n * longer hand-writes a re-namespacing `[style]` map; it spreads this helper into a host `[style]`\n * binding only to keep the legacy `--radix-<name>-content-*` / `--radix-<name>-trigger-*` names alive\n * for one release of consumer back-compat. Migrate to the unified set; these are removed next minor.\n *\n * @deprecated Use the unified `--anchor-*` / `--available-*` / `--transform-origin` variables.\n */\nexport function legacyPopperVars(name: string): Record<string, string> {\n return {\n [`--radix-${name}-content-transform-origin`]: 'var(--radix-popper-transform-origin)',\n [`--radix-${name}-content-available-width`]: 'var(--radix-popper-available-width)',\n [`--radix-${name}-content-available-height`]: 'var(--radix-popper-available-height)',\n [`--radix-${name}-trigger-width`]: 'var(--radix-popper-anchor-width)',\n [`--radix-${name}-trigger-height`]: 'var(--radix-popper-anchor-height)'\n };\n}\n","import {\n computed,\n createComponent,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n inputBinding,\n numberAttribute\n} from '@angular/core';\nimport { RdxArrow } from '@radix-ng/primitives/arrow';\nimport { injectPopperContentWrapperContext } from './popper-content-wrapper';\nimport { Side } from './utils';\n\nconst OPPOSITE_SIDE: Record<Side, Side> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right'\n};\n\n@Directive({\n selector: '[rdxPopperArrow]',\n host: {\n // The arrow is purely decorative — keep it out of the accessibility tree (Base UI does the same).\n 'aria-hidden': 'true',\n '[style]': 'style()'\n }\n})\nexport class RdxPopperArrow {\n private readonly popperContentContext = injectPopperContentWrapperContext();\n\n private readonly environmentInjector = inject(EnvironmentInjector);\n\n readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly width = input(10, { transform: numberAttribute });\n\n readonly height = input(5, { transform: numberAttribute });\n\n // Geometry is physical: the arrow reads `physicalPlacedSide` (`placedSide` can be logical\n // `inline-start`/`inline-end` when a logical side was requested — a styling hook, not a direction).\n baseSide = computed(() => OPPOSITE_SIDE[this.popperContentContext.physicalPlacedSide()!]);\n\n protected readonly style = computed(() => {\n return {\n position: 'absolute',\n left: this.popperContentContext.arrowX() ? `${this.popperContentContext.arrowX()}px` : undefined,\n top: this.popperContentContext.arrowY() ? `${this.popperContentContext.arrowY()}px` : undefined,\n [this.baseSide()]: 0,\n transformOrigin: {\n top: '',\n right: '0 0',\n bottom: 'center 0',\n left: '100% 0'\n }[this.popperContentContext.physicalPlacedSide()!],\n transform: {\n top: 'translateY(100%)',\n right: 'translateY(50%) rotate(90deg) translateX(-50%)',\n bottom: `rotate(180deg)`,\n left: 'translateY(50%) rotate(-90deg) translateX(50%)'\n }[this.popperContentContext.physicalPlacedSide()!],\n visibility: this.popperContentContext.shouldHideArrow() ? 'hidden' : undefined\n };\n });\n\n private onCleanup = effect((onCleanup) => {\n const component = createComponent(RdxArrow, {\n environmentInjector: this.environmentInjector,\n hostElement: this.elementRef.nativeElement,\n projectableNodes: [Array.from(this.elementRef.nativeElement.childNodes)],\n bindings: [inputBinding('width', () => this.width()), inputBinding('height', () => this.height())]\n });\n\n component.changeDetectorRef.detectChanges();\n\n onCleanup(() => component.destroy());\n });\n}\n","import { computed, Directive } from '@angular/core';\nimport { injectPopperContentWrapperContext } from './popper-content-wrapper';\n\n@Directive({\n selector: '[rdxPopperContent]',\n host: {\n '[attr.data-side]': 'popperContentWrapper?.placedSide()',\n '[attr.data-align]': 'popperContentWrapper?.placedAlign()',\n '[style]': 'style()'\n }\n})\nexport class RdxPopperContent {\n /**\n * Optional so the directive can be composed onto a content part that is also used outside Popper\n * positioning (e.g. select's `item-aligned` mode, where there is no `RdxPopperContentWrapper`\n * ancestor). With no wrapper the `data-side` / `data-align` bindings and the animation guard\n * simply no-op.\n */\n protected readonly popperContentWrapper = injectPopperContentWrapperContext(true);\n\n /**\n * if the PopperContent hasn't been placed yet (not all measurements done)\n * we prevent animations so that users's animation don't kick in too early referring wrong sides\n */\n protected readonly style = computed(() => ({\n animation: this.popperContentWrapper && !this.popperContentWrapper.isPositioned() ? 'none' : undefined\n }));\n}\n","import { RdxPopper } from './src/popper';\nimport { RdxPopperAnchor } from './src/popper-anchor';\nimport { RdxPopperArrow } from './src/popper-arrow';\nimport { RdxPopperContent } from './src/popper-content';\nimport { RdxPopperContentWrapper } from './src/popper-content-wrapper';\n\nexport * from './src/popper';\nexport * from './src/popper-anchor';\nexport * from './src/popper-arrow';\nexport * from './src/popper-content';\nexport * from './src/popper-content-wrapper';\nexport * from './src/popper-content.config';\nexport * from './src/utils';\n\nexport const popperImports = [RdxPopper, RdxPopperArrow, RdxPopperContentWrapper, RdxPopperContent, RdxPopperAnchor];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["floatingUIArrow"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { DOCUMENT, isPlatformBrowser } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { ElementRef, inject, PLATFORM_ID, DestroyRef, input, linkedSignal, computed, effect, Directive, ViewContainerRef, TemplateRef, signal, Injector } from '@angular/core';
4
- import { PresenceMachine, RDX_PRESENCE_CONTEXT } from '@radix-ng/primitives/presence';
3
+ import { ElementRef, inject, PLATFORM_ID, DestroyRef, input, linkedSignal, computed, effect, Directive, ViewContainerRef, TemplateRef, booleanAttribute, signal, Injector } from '@angular/core';
4
+ import { RDX_PRESENCE_CONTEXT, PresenceMachine } from '@radix-ng/primitives/presence';
5
5
 
6
6
  /**
7
7
  * Resolve a {@link RdxPortalContainer} to a concrete element. Returns `null` when nothing usable is
@@ -104,6 +104,17 @@ class RdxPortalPresence {
104
104
  */
105
105
  this.container = input(/* @ts-ignore */
106
106
  ...(ngDevMode ? [undefined, { debugName: "container" }] : /* istanbul ignore next */ []));
107
+ /**
108
+ * Keep the portal mounted (in the container) while the layer is closed. When `true` the content
109
+ * stays in the DOM regardless of the {@link RDX_PRESENCE_CONTEXT} `present` flag — the consumer is
110
+ * responsible for hiding it while closed (typically via the `data-closed` / `data-open` state on the
111
+ * positioner). Any `*rdxXxxPortal` wrapper opts in by mapping this input in its `hostDirectives`.
112
+ */
113
+ this.keepMounted = input(false, { ...(ngDevMode ? { debugName: "keepMounted" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
114
+ /** The layer's own open/present flag, OR'd with {@link keepMounted} to gate mount/unmount. */
115
+ this.contextPresent = inject(RDX_PRESENCE_CONTEXT).present;
116
+ this.present = computed(() => this.contextPresent() || this.keepMounted(), /* @ts-ignore */
117
+ ...(ngDevMode ? [{ debugName: "present" }] : /* istanbul ignore next */ []));
107
118
  this._computedContainer = linkedSignal(this.container, /* @ts-ignore */
108
119
  ...(ngDevMode ? [{ debugName: "_computedContainer" }] : /* istanbul ignore next */ []));
109
120
  this.elementContainer = computed(() => {
@@ -116,7 +127,7 @@ class RdxPortalPresence {
116
127
  ...(ngDevMode ? [{ debugName: "mountedNodes" }] : /* istanbul ignore next */ []));
117
128
  this.viewRef = null;
118
129
  const machine = new PresenceMachine({
119
- present: inject(RDX_PRESENCE_CONTEXT).present,
130
+ present: this.present,
120
131
  isBrowser: this.isBrowser,
121
132
  injector: inject(Injector),
122
133
  mountView: () => this.mountView(),
@@ -155,14 +166,14 @@ class RdxPortalPresence {
155
166
  this.mountedNodes.set([]);
156
167
  }
157
168
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxPortalPresence, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
158
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: RdxPortalPresence, isStandalone: true, inputs: { container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
169
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: RdxPortalPresence, isStandalone: true, inputs: { container: { classPropertyName: "container", publicName: "container", isSignal: true, isRequired: false, transformFunction: null }, keepMounted: { classPropertyName: "keepMounted", publicName: "keepMounted", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
159
170
  }
160
171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxPortalPresence, decorators: [{
161
172
  type: Directive,
162
173
  args: [{
163
174
  standalone: true
164
175
  }]
165
- }], ctorParameters: () => [], propDecorators: { container: [{ type: i0.Input, args: [{ isSignal: true, alias: "container", required: false }] }] } });
176
+ }], ctorParameters: () => [], propDecorators: { container: [{ type: i0.Input, args: [{ isSignal: true, alias: "container", required: false }] }], keepMounted: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepMounted", required: false }] }] } });
166
177
 
167
178
  /**
168
179
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"radix-ng-primitives-portal.mjs","sources":["../../../packages/primitives/portal/src/resolve-container.ts","../../../packages/primitives/portal/src/portal.ts","../../../packages/primitives/portal/src/portal-presence.ts","../../../packages/primitives/portal/radix-ng-primitives-portal.ts"],"sourcesContent":["import { ElementRef } from '@angular/core';\n\n/**\n * A target container for a portal. Accepts an `ElementRef`, a native element, or a CSS selector\n * resolved against the document.\n */\nexport type RdxPortalContainer = ElementRef<HTMLElement> | HTMLElement | string;\n\n/**\n * Resolve a {@link RdxPortalContainer} to a concrete element. Returns `null` when nothing usable is\n * provided (a missing container, a selector matching nothing, or a non-element value), so callers can\n * fall back to `document.body`. Shared by `RdxPortal` and `RdxPortalPresence`.\n */\nexport function resolvePortalContainer(\n container: RdxPortalContainer | undefined,\n document: Document | null\n): HTMLElement | null {\n if (!container) {\n return null;\n }\n if (typeof container === 'string') {\n return document?.querySelector<HTMLElement>(container) ?? null;\n }\n if (container instanceof ElementRef) {\n return container.nativeElement ?? null;\n }\n // Anything that isn't a real element (e.g. a TemplateRef passed by mistake) falls back to the\n // default container so the content still leaves the flow instead of staying in place.\n return container instanceof HTMLElement ? container : null;\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n PLATFORM_ID\n} from '@angular/core';\nimport { RdxPortalContainer, resolvePortalContainer } from './resolve-container';\n\n@Directive({\n selector: '[rdxPortal]',\n exportAs: 'rdxPortal'\n})\nexport class RdxPortal {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * Specify a container to portal the content into. Can be an `ElementRef`, a native element, or a\n * CSS selector. Defaults to `document.body` when not set (or when a selector matches nothing).\n */\n readonly container = input<RdxPortalContainer>();\n\n private readonly _computedContainer = linkedSignal(this.container);\n readonly computedContainer = this._computedContainer.asReadonly();\n\n private readonly elementContainer = computed<HTMLElement | null>(() => {\n const provided = resolvePortalContainer(this.computedContainer(), this.document);\n const body = this.document?.body ?? null;\n return provided ?? body;\n });\n\n constructor() {\n const isBrowser = isPlatformBrowser(this.platformId);\n if (!isBrowser || !this.document) {\n return;\n }\n\n const element = this.elementRef.nativeElement;\n // Anchor the original DOM position with a comment node, so the element can be restored\n // exactly where it was when the directive is destroyed.\n const anchor = this.document.createComment('rdx-portal');\n element.parentNode?.insertBefore(anchor, element);\n\n // Move reactively: the effect runs after inputs are bound (so `container` is respected on\n // first render) and re-runs whenever the target container changes. `appendChild` relocates\n // the element, it does not clone it.\n effect(() => {\n this.elementContainer()?.appendChild(element);\n });\n\n this.destroyRef.onDestroy(() => {\n anchor.parentNode?.replaceChild(element, anchor);\n });\n }\n\n setContainer(container: RdxPortalContainer) {\n this._computedContainer.set(container);\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n Directive,\n effect,\n EmbeddedViewRef,\n inject,\n Injector,\n input,\n linkedSignal,\n PLATFORM_ID,\n signal,\n TemplateRef,\n ViewContainerRef\n} from '@angular/core';\nimport { PresenceMachine, RDX_PRESENCE_CONTEXT } from '@radix-ng/primitives/presence';\nimport { RdxPortalContainer, resolvePortalContainer } from './resolve-container';\n\n/**\n * Structural directive merging what `RdxPortal` + `RdxPresenceDirective` did as a pair: it mounts its\n * template while `present()` (from {@link RDX_PRESENCE_CONTEXT}) is `true`, **relocates every root\n * node into a portal container** (default `document.body`), and on close runs the presence exit state\n * machine — keeping the content mounted until every running CSS exit `@keyframes` on any root node\n * finishes.\n *\n * Unlike `RdxPortal`, it adds **no wrapper element**: the template's root nodes become direct children\n * of the container. Use the `*` microsyntax for the common single-root case\n * (`<div *rdxXxxPortal rdxXxxPositioner>`) or the explicit `<ng-template rdxXxxPortal>` form for a\n * custom container or multiple root nodes (e.g. a dialog backdrop + popup).\n *\n * SSR: on the server the view renders in place and is never relocated; after hydration the relocation\n * effect moves the nodes into the container (same browser-guarded split `RdxPortal` uses).\n */\n@Directive({\n standalone: true\n})\nexport class RdxPortalPresence {\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly templateRef = inject(TemplateRef<void>);\n private readonly document = inject(DOCUMENT, { optional: true });\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /**\n * Container to portal the content into. Can be an `ElementRef`, a native element, or a CSS\n * selector. Defaults to `document.body` (or when a selector matches nothing).\n */\n readonly container = input<RdxPortalContainer>();\n\n private readonly _computedContainer = linkedSignal(this.container);\n\n private readonly elementContainer = computed<HTMLElement | null>(() => {\n const provided = resolvePortalContainer(this._computedContainer(), this.document);\n return provided ?? this.document?.body ?? null;\n });\n\n /** The live view's root nodes, exposed as a signal so the relocation effect re-runs on (re)mount. */\n private readonly mountedNodes = signal<Node[]>([]);\n private viewRef: EmbeddedViewRef<void> | null = null;\n\n constructor() {\n const machine = new PresenceMachine({\n present: inject(RDX_PRESENCE_CONTEXT).present,\n isBrowser: this.isBrowser,\n injector: inject(Injector),\n mountView: () => this.mountView(),\n destroyView: () => this.destroyView()\n });\n\n // Relocate reactively: re-runs whenever the resolved container changes or the view is\n // (re)mounted. On the server we never relocate — the nodes render in place.\n effect(() => {\n const container = this.elementContainer();\n const nodes = this.mountedNodes();\n if (!this.isBrowser || !container) {\n return;\n }\n for (const node of nodes) {\n container.appendChild(node);\n }\n });\n\n inject(DestroyRef).onDestroy(() => machine.dispose());\n }\n\n /** Imperatively override the portal container (parity with `RdxPortal.setContainer`). */\n setContainer(container: RdxPortalContainer): void {\n this._computedContainer.set(container);\n }\n\n private mountView(): HTMLElement[] {\n this.viewRef = this.viewContainerRef.createEmbeddedView(this.templateRef);\n const rootNodes = this.viewRef.rootNodes as Node[];\n this.mountedNodes.set(rootNodes);\n // Watch every element root for exit animations (dialog returns backdrop + popup).\n return rootNodes.filter((node): node is HTMLElement => node instanceof HTMLElement);\n }\n\n private destroyView(): void {\n // Destroying the view removes the nodes from wherever they currently live (the container) —\n // no anchor-comment juggling, unlike `RdxPortal` which restores its host element.\n this.viewRef?.destroy();\n this.viewRef = null;\n this.mountedNodes.set([]);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"radix-ng-primitives-portal.mjs","sources":["../../../packages/primitives/portal/src/resolve-container.ts","../../../packages/primitives/portal/src/portal.ts","../../../packages/primitives/portal/src/portal-presence.ts","../../../packages/primitives/portal/radix-ng-primitives-portal.ts"],"sourcesContent":["import { ElementRef } from '@angular/core';\n\n/**\n * A target container for a portal. Accepts an `ElementRef`, a native element, or a CSS selector\n * resolved against the document.\n */\nexport type RdxPortalContainer = ElementRef<HTMLElement> | HTMLElement | string;\n\n/**\n * Resolve a {@link RdxPortalContainer} to a concrete element. Returns `null` when nothing usable is\n * provided (a missing container, a selector matching nothing, or a non-element value), so callers can\n * fall back to `document.body`. Shared by `RdxPortal` and `RdxPortalPresence`.\n */\nexport function resolvePortalContainer(\n container: RdxPortalContainer | undefined,\n document: Document | null\n): HTMLElement | null {\n if (!container) {\n return null;\n }\n if (typeof container === 'string') {\n return document?.querySelector<HTMLElement>(container) ?? null;\n }\n if (container instanceof ElementRef) {\n return container.nativeElement ?? null;\n }\n // Anything that isn't a real element (e.g. a TemplateRef passed by mistake) falls back to the\n // default container so the content still leaves the flow instead of staying in place.\n return container instanceof HTMLElement ? container : null;\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n PLATFORM_ID\n} from '@angular/core';\nimport { RdxPortalContainer, resolvePortalContainer } from './resolve-container';\n\n@Directive({\n selector: '[rdxPortal]',\n exportAs: 'rdxPortal'\n})\nexport class RdxPortal {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * Specify a container to portal the content into. Can be an `ElementRef`, a native element, or a\n * CSS selector. Defaults to `document.body` when not set (or when a selector matches nothing).\n */\n readonly container = input<RdxPortalContainer>();\n\n private readonly _computedContainer = linkedSignal(this.container);\n readonly computedContainer = this._computedContainer.asReadonly();\n\n private readonly elementContainer = computed<HTMLElement | null>(() => {\n const provided = resolvePortalContainer(this.computedContainer(), this.document);\n const body = this.document?.body ?? null;\n return provided ?? body;\n });\n\n constructor() {\n const isBrowser = isPlatformBrowser(this.platformId);\n if (!isBrowser || !this.document) {\n return;\n }\n\n const element = this.elementRef.nativeElement;\n // Anchor the original DOM position with a comment node, so the element can be restored\n // exactly where it was when the directive is destroyed.\n const anchor = this.document.createComment('rdx-portal');\n element.parentNode?.insertBefore(anchor, element);\n\n // Move reactively: the effect runs after inputs are bound (so `container` is respected on\n // first render) and re-runs whenever the target container changes. `appendChild` relocates\n // the element, it does not clone it.\n effect(() => {\n this.elementContainer()?.appendChild(element);\n });\n\n this.destroyRef.onDestroy(() => {\n anchor.parentNode?.replaceChild(element, anchor);\n });\n }\n\n setContainer(container: RdxPortalContainer) {\n this._computedContainer.set(container);\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n EmbeddedViewRef,\n inject,\n Injector,\n input,\n linkedSignal,\n PLATFORM_ID,\n signal,\n TemplateRef,\n ViewContainerRef\n} from '@angular/core';\nimport { PresenceMachine, RDX_PRESENCE_CONTEXT } from '@radix-ng/primitives/presence';\nimport { RdxPortalContainer, resolvePortalContainer } from './resolve-container';\n\n/**\n * Structural directive merging what `RdxPortal` + `RdxPresenceDirective` did as a pair: it mounts its\n * template while `present()` (from {@link RDX_PRESENCE_CONTEXT}) is `true`, **relocates every root\n * node into a portal container** (default `document.body`), and on close runs the presence exit state\n * machine — keeping the content mounted until every running CSS exit `@keyframes` on any root node\n * finishes.\n *\n * Unlike `RdxPortal`, it adds **no wrapper element**: the template's root nodes become direct children\n * of the container. Use the `*` microsyntax for the common single-root case\n * (`<div *rdxXxxPortal rdxXxxPositioner>`) or the explicit `<ng-template rdxXxxPortal>` form for a\n * custom container or multiple root nodes (e.g. a dialog backdrop + popup).\n *\n * SSR: on the server the view renders in place and is never relocated; after hydration the relocation\n * effect moves the nodes into the container (same browser-guarded split `RdxPortal` uses).\n */\n@Directive({\n standalone: true\n})\nexport class RdxPortalPresence {\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly templateRef = inject(TemplateRef<void>);\n private readonly document = inject(DOCUMENT, { optional: true });\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n /**\n * Container to portal the content into. Can be an `ElementRef`, a native element, or a CSS\n * selector. Defaults to `document.body` (or when a selector matches nothing).\n */\n readonly container = input<RdxPortalContainer>();\n\n /**\n * Keep the portal mounted (in the container) while the layer is closed. When `true` the content\n * stays in the DOM regardless of the {@link RDX_PRESENCE_CONTEXT} `present` flag — the consumer is\n * responsible for hiding it while closed (typically via the `data-closed` / `data-open` state on the\n * positioner). Any `*rdxXxxPortal` wrapper opts in by mapping this input in its `hostDirectives`.\n */\n readonly keepMounted = input(false, { transform: booleanAttribute });\n\n /** The layer's own open/present flag, OR'd with {@link keepMounted} to gate mount/unmount. */\n private readonly contextPresent = inject(RDX_PRESENCE_CONTEXT).present;\n private readonly present = computed(() => this.contextPresent() || this.keepMounted());\n\n private readonly _computedContainer = linkedSignal(this.container);\n\n private readonly elementContainer = computed<HTMLElement | null>(() => {\n const provided = resolvePortalContainer(this._computedContainer(), this.document);\n return provided ?? this.document?.body ?? null;\n });\n\n /** The live view's root nodes, exposed as a signal so the relocation effect re-runs on (re)mount. */\n private readonly mountedNodes = signal<Node[]>([]);\n private viewRef: EmbeddedViewRef<void> | null = null;\n\n constructor() {\n const machine = new PresenceMachine({\n present: this.present,\n isBrowser: this.isBrowser,\n injector: inject(Injector),\n mountView: () => this.mountView(),\n destroyView: () => this.destroyView()\n });\n\n // Relocate reactively: re-runs whenever the resolved container changes or the view is\n // (re)mounted. On the server we never relocate — the nodes render in place.\n effect(() => {\n const container = this.elementContainer();\n const nodes = this.mountedNodes();\n if (!this.isBrowser || !container) {\n return;\n }\n for (const node of nodes) {\n container.appendChild(node);\n }\n });\n\n inject(DestroyRef).onDestroy(() => machine.dispose());\n }\n\n /** Imperatively override the portal container (parity with `RdxPortal.setContainer`). */\n setContainer(container: RdxPortalContainer): void {\n this._computedContainer.set(container);\n }\n\n private mountView(): HTMLElement[] {\n this.viewRef = this.viewContainerRef.createEmbeddedView(this.templateRef);\n const rootNodes = this.viewRef.rootNodes as Node[];\n this.mountedNodes.set(rootNodes);\n // Watch every element root for exit animations (dialog returns backdrop + popup).\n return rootNodes.filter((node): node is HTMLElement => node instanceof HTMLElement);\n }\n\n private destroyView(): void {\n // Destroying the view removes the nodes from wherever they currently live (the container) —\n // no anchor-comment juggling, unlike `RdxPortal` which restores its host element.\n this.viewRef?.destroy();\n this.viewRef = null;\n this.mountedNodes.set([]);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -522,7 +522,11 @@ class RdxScrollAreaViewport {
522
522
  return;
523
523
  }
524
524
  this.computeThumbPosition();
525
- if (!this.programmaticScroll) {
525
+ // WebKit consumes a touch that catches an in-flight momentum scroll or rubber-band bounce
526
+ // without dispatching any DOM events for the whole gesture (not even `touchstart`), so such a
527
+ // scroll can't be attributed to the user through events. Treat every scroll in touch modality
528
+ // as user-driven instead, otherwise the scrollbar never shows on iOS (Base UI parity).
529
+ if (this.rootContext.touchModality() || !this.programmaticScroll) {
526
530
  this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });
527
531
  }
528
532
  // Debounce restoring the programmatic flag so momentum scrolling (no further
@@ -569,7 +573,7 @@ class RdxScrollAreaViewport {
569
573
  this.destroyRef.onDestroy(() => resizeObserver.disconnect());
570
574
  }
571
575
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxScrollAreaViewport, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
572
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: RdxScrollAreaViewport, isStandalone: true, selector: "[rdxScrollAreaViewport]", host: { attributes: { "role": "presentation" }, listeners: { "scroll": "onScroll()", "wheel": "onUserInteraction()", "touchmove": "onUserInteraction()", "pointermove": "onUserInteraction()", "pointerenter": "onUserInteraction()", "keydown": "onUserInteraction()" }, properties: { "style.overflow": "\"scroll\"", "attr.tabindex": "(rootContext.hiddenState().x && rootContext.hiddenState().y) ? -1 : 0", "attr.data-id": "rootContext.rootId + \"-viewport\"", "attr.data-scrolling": "(rootContext.scrollingX() || rootContext.scrollingY()) ? \"\" : undefined", "attr.data-has-overflow-x": "!rootContext.hiddenState().x ? \"\" : undefined", "attr.data-has-overflow-y": "!rootContext.hiddenState().y ? \"\" : undefined", "attr.data-overflow-x-start": "rootContext.overflowEdges().xStart ? \"\" : undefined", "attr.data-overflow-x-end": "rootContext.overflowEdges().xEnd ? \"\" : undefined", "attr.data-overflow-y-start": "rootContext.overflowEdges().yStart ? \"\" : undefined", "attr.data-overflow-y-end": "rootContext.overflowEdges().yEnd ? \"\" : undefined" } }, providers: [provideScrollAreaViewportContext(viewportContext)], exportAs: ["rdxScrollAreaViewport"], ngImport: i0 }); }
576
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: RdxScrollAreaViewport, isStandalone: true, selector: "[rdxScrollAreaViewport]", host: { attributes: { "role": "presentation" }, listeners: { "scroll": "onScroll()", "wheel": "onUserInteraction()", "pointermove": "onUserInteraction()", "pointerenter": "onUserInteraction()", "keydown": "onUserInteraction()" }, properties: { "style.overflow": "\"scroll\"", "attr.tabindex": "(rootContext.hiddenState().x && rootContext.hiddenState().y) ? -1 : 0", "attr.data-id": "rootContext.rootId + \"-viewport\"", "attr.data-scrolling": "(rootContext.scrollingX() || rootContext.scrollingY()) ? \"\" : undefined", "attr.data-has-overflow-x": "!rootContext.hiddenState().x ? \"\" : undefined", "attr.data-has-overflow-y": "!rootContext.hiddenState().y ? \"\" : undefined", "attr.data-overflow-x-start": "rootContext.overflowEdges().xStart ? \"\" : undefined", "attr.data-overflow-x-end": "rootContext.overflowEdges().xEnd ? \"\" : undefined", "attr.data-overflow-y-start": "rootContext.overflowEdges().yStart ? \"\" : undefined", "attr.data-overflow-y-end": "rootContext.overflowEdges().yEnd ? \"\" : undefined" } }, providers: [provideScrollAreaViewportContext(viewportContext)], exportAs: ["rdxScrollAreaViewport"], ngImport: i0 }); }
573
577
  }
574
578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxScrollAreaViewport, decorators: [{
575
579
  type: Directive,
@@ -591,7 +595,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
591
595
  '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? "" : undefined',
592
596
  '(scroll)': 'onScroll()',
593
597
  '(wheel)': 'onUserInteraction()',
594
- '(touchmove)': 'onUserInteraction()',
595
598
  '(pointermove)': 'onUserInteraction()',
596
599
  '(pointerenter)': 'onUserInteraction()',
597
600
  '(keydown)': 'onUserInteraction()'