@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-scroll-area.mjs","sources":["../../../packages/primitives/scroll-area/src/constants.ts","../../../packages/primitives/scroll-area/src/utils.ts","../../../packages/primitives/scroll-area/src/scroll-area-root.ts","../../../packages/primitives/scroll-area/src/scroll-area-viewport.ts","../../../packages/primitives/scroll-area/src/scroll-area-content.ts","../../../packages/primitives/scroll-area/src/scroll-area-corner.ts","../../../packages/primitives/scroll-area/src/scroll-area-scrollbar.ts","../../../packages/primitives/scroll-area/src/scroll-area-thumb.ts","../../../packages/primitives/scroll-area/index.ts","../../../packages/primitives/scroll-area/radix-ng-primitives-scroll-area.ts"],"sourcesContent":["/** How long (ms) the `data-scrolling` attribute stays applied after the last scroll movement. */\nexport const SCROLL_TIMEOUT = 500;\n\n/** Minimum size (px) of the thumb so it stays grabbable on very large content. */\nexport const MIN_THUMB_SIZE = 16;\n\n/** 100 ms without scroll events ≈ scroll end (mirrors the native `scrollend` heuristic). */\nexport const SCROLL_END_TIMEOUT = 100;\n\n/** Distance (px) within which a scroll offset is snapped to an edge. */\nexport const SCROLL_EDGE_TOLERANCE_PX = 1;\n","import { clamp } from '@radix-ng/primitives/core';\nimport { SCROLL_EDGE_TOLERANCE_PX } from './constants';\n\n/**\n * Returns the combined start/end `margin` or `padding` of an element along an axis,\n * resolving logical (inline/block) properties so RTL layouts compute correctly.\n */\nexport function getOffset(element: Element | null, prop: 'margin' | 'padding', axis: 'x' | 'y'): number {\n if (!element) {\n return 0;\n }\n\n const styles = getComputedStyle(element);\n const propAxis = axis === 'x' ? 'Inline' : 'Block';\n\n // Safari misreports `marginInlineEnd` in RTL. We have to assume the start/end\n // values are symmetrical, which is likely.\n if (axis === 'x' && prop === 'margin') {\n return parseFloat(styles[`${prop}InlineStart` as keyof CSSStyleDeclaration] as string) * 2;\n }\n\n return (\n parseFloat(styles[`${prop}${propAxis}Start` as keyof CSSStyleDeclaration] as string) +\n parseFloat(styles[`${prop}${propAxis}End` as keyof CSSStyleDeclaration] as string)\n );\n}\n\n/**\n * Snaps a scroll offset that is within {@link SCROLL_EDGE_TOLERANCE_PX} of either end\n * to that boundary, giving the overflow edge attributes a \"sticky\" feel at scroll limits.\n */\nexport function normalizeScrollOffset(value: number, max: number): number {\n if (max <= 0) {\n return 0;\n }\n\n const clamped = clamp(value, 0, max);\n const startDistance = clamped;\n const endDistance = max - clamped;\n const withinStartTolerance = startDistance <= SCROLL_EDGE_TOLERANCE_PX;\n const withinEndTolerance = endDistance <= SCROLL_EDGE_TOLERANCE_PX;\n\n if (withinStartTolerance && withinEndTolerance) {\n return startDistance <= endDistance ? 0 : max;\n }\n if (withinStartTolerance) {\n return 0;\n }\n if (withinEndTolerance) {\n return max;\n }\n\n return clamped;\n}\n\n/**\n * Injects (once per document) the CSS that hides the native scrollbars of the viewport.\n * Headless directives can't hide WebKit scrollbars via inline styles, so a small\n * stylesheet keyed by the `[rdxScrollAreaViewport]` selector is appended to `<head>`.\n */\nexport function injectScrollbarHideStyles(document: Document, nonce?: string | null): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-rdx-scroll-area]')) {\n return;\n }\n\n const style = document.createElement('style');\n style.setAttribute('data-rdx-scroll-area', '');\n if (nonce) {\n style.nonce = nonce;\n }\n style.textContent = `[rdxScrollAreaViewport]{scrollbar-width:none;-ms-overflow-style:none}[rdxScrollAreaViewport]::-webkit-scrollbar{display:none}`;\n document.head.appendChild(style);\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n signal,\n Signal\n} from '@angular/core';\nimport { BooleanInput, createContext, Direction, injectId } from '@radix-ng/primitives/core';\nimport { injectDirection } from '@radix-ng/primitives/direction-provider';\nimport { SCROLL_TIMEOUT } from './constants';\nimport { getOffset } from './utils';\n\nexport type Size = { width: number; height: number };\nexport type Coords = { x: number; y: number };\nexport type OverflowEdges = { xStart: boolean; xEnd: boolean; yStart: boolean; yEnd: boolean };\nexport type HiddenState = { x: boolean; y: boolean; corner: boolean };\n\n/** A minimal, React-`ref`-like mutable holder shared through context. */\nexport type MutableRef<T> = { current: T | null };\n\nexport type OverflowEdgeThreshold = number | Partial<{ xStart: number; xEnd: number; yStart: number; yEnd: number }>;\n\nconst DEFAULT_SIZE: Size = { width: 0, height: 0 };\nconst DEFAULT_OVERFLOW_EDGES: OverflowEdges = { xStart: false, xEnd: false, yStart: false, yEnd: false };\nconst DEFAULT_HIDDEN_STATE: HiddenState = { x: true, y: true, corner: true };\n\nexport interface ScrollAreaRootContext {\n readonly rootId: string;\n readonly direction: Signal<Direction>;\n readonly overflowEdgeThreshold: Signal<{ xStart: number; xEnd: number; yStart: number; yEnd: number }>;\n readonly disableStyleElements: Signal<boolean>;\n\n // Reactive state\n readonly hovering: Signal<boolean>;\n readonly scrollingX: Signal<boolean>;\n readonly scrollingY: Signal<boolean>;\n readonly touchModality: Signal<boolean>;\n readonly hasMeasuredScrollbar: Signal<boolean>;\n readonly cornerSize: Signal<Size>;\n readonly thumbSize: Signal<Size>;\n readonly hiddenState: Signal<HiddenState>;\n readonly overflowEdges: Signal<OverflowEdges>;\n\n // Element references (filled in by the child parts as they mount)\n readonly rootRef: MutableRef<HTMLElement>;\n readonly viewportRef: MutableRef<HTMLElement>;\n readonly scrollbarYRef: MutableRef<HTMLElement>;\n readonly scrollbarXRef: MutableRef<HTMLElement>;\n readonly thumbYRef: MutableRef<HTMLElement>;\n readonly thumbXRef: MutableRef<HTMLElement>;\n readonly cornerRef: MutableRef<HTMLElement>;\n\n // State setters used by the viewport's measurement pass\n setHovering(value: boolean): void;\n setHasMeasuredScrollbar(value: boolean): void;\n setScrollingX(value: boolean): void;\n setScrollingY(value: boolean): void;\n setThumbSize(value: Size): void;\n setCornerSize(value: Size): void;\n setHiddenState(value: HiddenState): void;\n setOverflowEdges(value: OverflowEdges): void;\n\n // Pointer/scroll handlers shared with the scrollbar and thumb\n handleScroll(position: Coords): void;\n handlePointerDown(event: PointerEvent): void;\n handlePointerMove(event: PointerEvent): void;\n handlePointerUp(event: PointerEvent): void;\n}\n\nexport const [injectScrollAreaRootContext, provideScrollAreaRootContext] = createContext<ScrollAreaRootContext>(\n 'ScrollAreaRootContext',\n 'components/scroll-area'\n);\n\nconst rootContext = (): ScrollAreaRootContext => {\n const root = inject(RdxScrollAreaRoot);\n return {\n rootId: root.rootId,\n direction: root.direction,\n overflowEdgeThreshold: root.normalizedThreshold,\n disableStyleElements: root.disableStyleElements,\n hovering: root.hovering,\n scrollingX: root.scrollingX,\n scrollingY: root.scrollingY,\n touchModality: root.touchModality,\n hasMeasuredScrollbar: root.hasMeasuredScrollbar,\n cornerSize: root.cornerSize,\n thumbSize: root.thumbSize,\n hiddenState: root.hiddenState,\n overflowEdges: root.overflowEdges,\n rootRef: root.rootRef,\n viewportRef: root.viewportRef,\n scrollbarYRef: root.scrollbarYRef,\n scrollbarXRef: root.scrollbarXRef,\n thumbYRef: root.thumbYRef,\n thumbXRef: root.thumbXRef,\n cornerRef: root.cornerRef,\n setHovering: (v) => root.hovering.set(v),\n setHasMeasuredScrollbar: (v) => root.hasMeasuredScrollbar.set(v),\n setScrollingX: (v) => root.setScrollingX(v),\n setScrollingY: (v) => root.setScrollingY(v),\n setThumbSize: (v) => root.setThumbSize(v),\n setCornerSize: (v) => root.setCornerSize(v),\n setHiddenState: (v) => root.setHiddenState(v),\n setOverflowEdges: (v) => root.setOverflowEdges(v),\n handleScroll: (p) => root.handleScroll(p),\n handlePointerDown: (e) => root.handlePointerDown(e),\n handlePointerMove: (e) => root.handlePointerMove(e),\n handlePointerUp: (e) => root.handlePointerUp(e)\n };\n};\n\n/**\n * Groups all parts of the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaRoot]',\n exportAs: 'rdxScrollAreaRoot',\n providers: [provideScrollAreaRootContext(rootContext)],\n host: {\n role: 'presentation',\n '[style.position]': '\"relative\"',\n '[style.--scroll-area-corner-height]': 'cornerSize().height + \"px\"',\n '[style.--scroll-area-corner-width]': 'cornerSize().width + \"px\"',\n '[attr.data-scrolling]': '(scrollingX() || scrollingY()) ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'overflowEdges().yEnd ? \"\" : undefined',\n '(pointerenter)': 'onPointerEnterOrMove($event)',\n '(pointermove)': 'onPointerEnterOrMove($event)',\n '(pointerdown)': 'onTouchModalityChange($event)',\n '(pointerleave)': 'hovering.set(false)'\n }\n})\nexport class RdxScrollAreaRoot {\n private readonly destroyRef = inject(DestroyRef);\n\n readonly rootId = injectId('rdx-scroll-area-');\n\n /** Text direction of the scroll area. Affects horizontal (RTL) scroll math. */\n readonly dirInput = input<Direction | undefined>(undefined, { alias: 'dir' });\n readonly direction: Signal<Direction> = injectDirection(this.dirInput);\n\n /**\n * The threshold in pixels that must be passed before the overflow edge attributes are applied.\n * Accepts a single number for all edges or an object to configure them individually.\n */\n readonly overflowEdgeThreshold = input<OverflowEdgeThreshold>(0);\n readonly disableStyleElements = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly normalizedThreshold = computed(() => normalizeOverflowEdgeThreshold(this.overflowEdgeThreshold()));\n\n readonly hovering = signal(false);\n readonly scrollingX = signal(false);\n readonly scrollingY = signal(false);\n readonly touchModality = signal(false);\n readonly hasMeasuredScrollbar = signal(false);\n readonly cornerSize = signal<Size>(DEFAULT_SIZE);\n readonly thumbSize = signal<Size>(DEFAULT_SIZE);\n readonly hiddenState = signal<HiddenState>(DEFAULT_HIDDEN_STATE);\n readonly overflowEdges = signal<OverflowEdges>(DEFAULT_OVERFLOW_EDGES);\n\n readonly rootRef: MutableRef<HTMLElement> = { current: inject(ElementRef).nativeElement };\n readonly viewportRef: MutableRef<HTMLElement> = { current: null };\n readonly scrollbarYRef: MutableRef<HTMLElement> = { current: null };\n readonly scrollbarXRef: MutableRef<HTMLElement> = { current: null };\n readonly thumbYRef: MutableRef<HTMLElement> = { current: null };\n readonly thumbXRef: MutableRef<HTMLElement> = { current: null };\n readonly cornerRef: MutableRef<HTMLElement> = { current: null };\n\n // Imperative drag state (deliberately non-reactive).\n private thumbDragging = false;\n private startY = 0;\n private startX = 0;\n private startScrollTop = 0;\n private startScrollLeft = 0;\n private currentOrientation: 'vertical' | 'horizontal' = 'vertical';\n private scrollPosition: Coords = { x: 0, y: 0 };\n\n private scrollYTimer: ReturnType<typeof setTimeout> | undefined;\n private scrollXTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n clearTimeout(this.scrollYTimer);\n clearTimeout(this.scrollXTimer);\n });\n }\n\n setScrollingX(value: boolean): void {\n this.scrollingX.set(value);\n }\n\n setScrollingY(value: boolean): void {\n this.scrollingY.set(value);\n }\n\n setThumbSize(value: Size): void {\n const prev = this.thumbSize();\n if (prev.width !== value.width || prev.height !== value.height) {\n this.thumbSize.set(value);\n }\n }\n\n setCornerSize(value: Size): void {\n const prev = this.cornerSize();\n if (prev.width !== value.width || prev.height !== value.height) {\n this.cornerSize.set(value);\n }\n }\n\n setHiddenState(value: HiddenState): void {\n const prev = this.hiddenState();\n if (prev.x !== value.x || prev.y !== value.y || prev.corner !== value.corner) {\n this.hiddenState.set(value);\n }\n }\n\n setOverflowEdges(value: OverflowEdges): void {\n const prev = this.overflowEdges();\n if (\n prev.xStart !== value.xStart ||\n prev.xEnd !== value.xEnd ||\n prev.yStart !== value.yStart ||\n prev.yEnd !== value.yEnd\n ) {\n this.overflowEdges.set(value);\n }\n }\n\n handleScroll(scrollPosition: Coords): void {\n const offsetX = scrollPosition.x - this.scrollPosition.x;\n const offsetY = scrollPosition.y - this.scrollPosition.y;\n this.scrollPosition = scrollPosition;\n\n if (offsetY !== 0) {\n this.scrollingY.set(true);\n clearTimeout(this.scrollYTimer);\n this.scrollYTimer = setTimeout(() => this.scrollingY.set(false), SCROLL_TIMEOUT);\n }\n\n if (offsetX !== 0) {\n this.scrollingX.set(true);\n clearTimeout(this.scrollXTimer);\n this.scrollXTimer = setTimeout(() => this.scrollingX.set(false), SCROLL_TIMEOUT);\n }\n }\n\n handlePointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n\n this.thumbDragging = true;\n this.startY = event.clientY;\n this.startX = event.clientX;\n this.currentOrientation =\n ((event.currentTarget as Element | null)?.getAttribute('data-orientation') as 'vertical' | 'horizontal') ??\n 'vertical';\n\n const viewport = this.viewportRef.current;\n if (viewport) {\n this.startScrollTop = viewport.scrollTop;\n this.startScrollLeft = viewport.scrollLeft;\n }\n if (this.thumbYRef.current && this.currentOrientation === 'vertical') {\n this.thumbYRef.current.setPointerCapture(event.pointerId);\n }\n if (this.thumbXRef.current && this.currentOrientation === 'horizontal') {\n this.thumbXRef.current.setPointerCapture(event.pointerId);\n }\n }\n\n handlePointerMove(event: PointerEvent): void {\n if (!this.thumbDragging) {\n return;\n }\n\n const deltaY = event.clientY - this.startY;\n const deltaX = event.clientX - this.startX;\n\n const viewport = this.viewportRef.current;\n if (!viewport) {\n return;\n }\n\n const scrollableContentHeight = viewport.scrollHeight;\n const viewportHeight = viewport.clientHeight;\n const scrollableContentWidth = viewport.scrollWidth;\n const viewportWidth = viewport.clientWidth;\n\n if (this.thumbYRef.current && this.scrollbarYRef.current && this.currentOrientation === 'vertical') {\n const scrollbarYOffset = getOffset(this.scrollbarYRef.current, 'padding', 'y');\n const thumbYOffset = getOffset(this.thumbYRef.current, 'margin', 'y');\n const thumbHeight = this.thumbYRef.current.offsetHeight;\n const maxThumbOffsetY =\n this.scrollbarYRef.current.offsetHeight - thumbHeight - scrollbarYOffset - thumbYOffset;\n const scrollRatioY = deltaY / maxThumbOffsetY;\n\n viewport.scrollTop = this.startScrollTop + scrollRatioY * (scrollableContentHeight - viewportHeight);\n event.preventDefault();\n\n this.scrollingY.set(true);\n clearTimeout(this.scrollYTimer);\n this.scrollYTimer = setTimeout(() => this.scrollingY.set(false), SCROLL_TIMEOUT);\n }\n\n if (this.thumbXRef.current && this.scrollbarXRef.current && this.currentOrientation === 'horizontal') {\n const scrollbarXOffset = getOffset(this.scrollbarXRef.current, 'padding', 'x');\n const thumbXOffset = getOffset(this.thumbXRef.current, 'margin', 'x');\n const thumbWidth = this.thumbXRef.current.offsetWidth;\n const maxThumbOffsetX =\n this.scrollbarXRef.current.offsetWidth - thumbWidth - scrollbarXOffset - thumbXOffset;\n const scrollRatioX = deltaX / maxThumbOffsetX;\n\n viewport.scrollLeft = this.startScrollLeft + scrollRatioX * (scrollableContentWidth - viewportWidth);\n event.preventDefault();\n\n this.scrollingX.set(true);\n clearTimeout(this.scrollXTimer);\n this.scrollXTimer = setTimeout(() => this.scrollingX.set(false), SCROLL_TIMEOUT);\n }\n }\n\n handlePointerUp(event: PointerEvent): void {\n this.thumbDragging = false;\n\n // `pointercancel` releases capture implicitly, so guard against releasing a\n // capture we no longer hold (which would throw).\n if (\n this.thumbYRef.current &&\n this.currentOrientation === 'vertical' &&\n this.thumbYRef.current.hasPointerCapture(event.pointerId)\n ) {\n this.thumbYRef.current.releasePointerCapture(event.pointerId);\n }\n if (\n this.thumbXRef.current &&\n this.currentOrientation === 'horizontal' &&\n this.thumbXRef.current.hasPointerCapture(event.pointerId)\n ) {\n this.thumbXRef.current.releasePointerCapture(event.pointerId);\n }\n }\n\n onTouchModalityChange(event: PointerEvent): void {\n this.touchModality.set(event.pointerType === 'touch');\n }\n\n onPointerEnterOrMove(event: PointerEvent): void {\n this.onTouchModalityChange(event);\n\n if (event.pointerType !== 'touch') {\n const root = this.rootRef.current;\n const target = event.target as Node | null;\n this.hovering.set(!!root && !!target && root.contains(target));\n }\n }\n}\n\nfunction normalizeOverflowEdgeThreshold(threshold: OverflowEdgeThreshold | undefined): {\n xStart: number;\n xEnd: number;\n yStart: number;\n yEnd: number;\n} {\n if (typeof threshold === 'number') {\n const value = Math.max(0, threshold);\n return { xStart: value, xEnd: value, yStart: value, yEnd: value };\n }\n\n return {\n xStart: Math.max(0, threshold?.xStart || 0),\n xEnd: Math.max(0, threshold?.xEnd || 0),\n yStart: Math.max(0, threshold?.yStart || 0),\n yEnd: Math.max(0, threshold?.yEnd || 0)\n };\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n CSP_NONCE,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID\n} from '@angular/core';\nimport { clamp, createContext } from '@radix-ng/primitives/core';\nimport { MIN_THUMB_SIZE, SCROLL_END_TIMEOUT } from './constants';\nimport { HiddenState, injectScrollAreaRootContext } from './scroll-area-root';\nimport { getOffset, injectScrollbarHideStyles, normalizeScrollOffset } from './utils';\n\nexport interface ScrollAreaViewportContext {\n /** Re-measures the viewport and repositions the thumbs. Called by the content's ResizeObserver. */\n computeThumbPosition(): void;\n}\n\nexport const [injectScrollAreaViewportContext, provideScrollAreaViewportContext] =\n createContext<ScrollAreaViewportContext>('ScrollAreaViewportContext', 'components/scroll-area');\n\nconst viewportContext = (): ScrollAreaViewportContext => {\n const viewport = inject(RdxScrollAreaViewport);\n return {\n computeThumbPosition: () => viewport.computeThumbPosition()\n };\n};\n\n/**\n * The actual scrollable container of the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaViewport]',\n exportAs: 'rdxScrollAreaViewport',\n providers: [provideScrollAreaViewportContext(viewportContext)],\n host: {\n role: 'presentation',\n '[style.overflow]': '\"scroll\"',\n '[attr.tabindex]': '(rootContext.hiddenState().x && rootContext.hiddenState().y) ? -1 : 0',\n '[attr.data-id]': 'rootContext.rootId + \"-viewport\"',\n '[attr.data-scrolling]': '(rootContext.scrollingX() || rootContext.scrollingY()) ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!rootContext.hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!rootContext.hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'rootContext.overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'rootContext.overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'rootContext.overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? \"\" : undefined',\n '(scroll)': 'onScroll()',\n '(wheel)': 'onUserInteraction()',\n '(touchmove)': 'onUserInteraction()',\n '(pointermove)': 'onUserInteraction()',\n '(pointerenter)': 'onUserInteraction()',\n '(keydown)': 'onUserInteraction()'\n }\n})\nexport class RdxScrollAreaViewport {\n protected readonly rootContext = injectScrollAreaRootContext();\n\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly cspNonce = inject(CSP_NONCE, { optional: true });\n\n private programmaticScroll = true;\n private lastMeasuredMetrics: [number, number, number, number] = [NaN, NaN, NaN, NaN];\n private scrollEndTimer: ReturnType<typeof setTimeout> | undefined;\n private animationsTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n this.rootContext.viewportRef.current = this.element;\n\n if (this.isBrowser) {\n effect(() => {\n if (!this.rootContext.disableStyleElements()) {\n injectScrollbarHideStyles(this.element.ownerDocument, this.cspNonce);\n }\n });\n }\n\n // Recompute after hidden-state toggles (so newly shown scrollbars get measured),\n // on direction flips, and when the overflow-edge threshold changes.\n const hiddenState = this.rootContext.hiddenState;\n const direction = this.rootContext.direction;\n const threshold = this.rootContext.overflowEdgeThreshold;\n effect(() => {\n hiddenState();\n direction();\n threshold();\n queueMicrotask(() => this.computeThumbPosition());\n });\n\n afterNextRender(() => {\n this.computeThumbPosition();\n this.observeViewport();\n\n if (this.element.matches(':hover')) {\n this.rootContext.setHovering(true);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n if (this.rootContext.viewportRef.current === this.element) {\n this.rootContext.viewportRef.current = null;\n }\n clearTimeout(this.scrollEndTimer);\n clearTimeout(this.animationsTimer);\n });\n }\n\n computeThumbPosition(): void {\n const viewportEl = this.rootContext.viewportRef.current;\n const scrollbarYEl = this.rootContext.scrollbarYRef.current;\n const scrollbarXEl = this.rootContext.scrollbarXRef.current;\n const thumbYEl = this.rootContext.thumbYRef.current;\n const thumbXEl = this.rootContext.thumbXRef.current;\n const cornerEl = this.rootContext.cornerRef.current;\n\n if (!viewportEl) {\n return;\n }\n\n const direction = this.rootContext.direction();\n const threshold = this.rootContext.overflowEdgeThreshold();\n const cornerSize = this.rootContext.cornerSize();\n\n const scrollableContentHeight = viewportEl.scrollHeight;\n const scrollableContentWidth = viewportEl.scrollWidth;\n const viewportHeight = viewportEl.clientHeight;\n const viewportWidth = viewportEl.clientWidth;\n const scrollTop = viewportEl.scrollTop;\n const scrollLeft = viewportEl.scrollLeft;\n\n const isFirstMeasurement = Number.isNaN(this.lastMeasuredMetrics[0]);\n this.lastMeasuredMetrics = [viewportHeight, scrollableContentHeight, viewportWidth, scrollableContentWidth];\n\n if (isFirstMeasurement) {\n this.rootContext.setHasMeasuredScrollbar(true);\n }\n\n if (scrollableContentHeight === 0 || scrollableContentWidth === 0) {\n return;\n }\n\n const nextHiddenState = getHiddenState(viewportEl);\n const scrollbarYHidden = nextHiddenState.y;\n const scrollbarXHidden = nextHiddenState.x;\n const ratioX = viewportWidth / scrollableContentWidth;\n const ratioY = viewportHeight / scrollableContentHeight;\n const maxScrollLeft = Math.max(0, scrollableContentWidth - viewportWidth);\n const maxScrollTop = Math.max(0, scrollableContentHeight - viewportHeight);\n\n let scrollLeftFromStart = 0;\n let scrollLeftFromEnd = 0;\n if (!scrollbarXHidden) {\n const rawScrollLeftFromStart =\n direction === 'rtl' ? clamp(-scrollLeft, 0, maxScrollLeft) : clamp(scrollLeft, 0, maxScrollLeft);\n scrollLeftFromStart = normalizeScrollOffset(rawScrollLeftFromStart, maxScrollLeft);\n scrollLeftFromEnd = maxScrollLeft - scrollLeftFromStart;\n }\n\n const rawScrollTopFromStart = !scrollbarYHidden ? clamp(scrollTop, 0, maxScrollTop) : 0;\n const scrollTopFromStart = !scrollbarYHidden ? normalizeScrollOffset(rawScrollTopFromStart, maxScrollTop) : 0;\n const scrollTopFromEnd = !scrollbarYHidden ? maxScrollTop - scrollTopFromStart : 0;\n const nextWidth = scrollbarXHidden ? 0 : viewportWidth;\n const nextHeight = scrollbarYHidden ? 0 : viewportHeight;\n\n let nextCornerWidth = 0;\n let nextCornerHeight = 0;\n if (!scrollbarXHidden && !scrollbarYHidden) {\n nextCornerWidth = scrollbarYEl?.offsetWidth || 0;\n nextCornerHeight = scrollbarXEl?.offsetHeight || 0;\n }\n\n // Only subtract corner size from scrollbar dimensions if the corner hasn't been sized yet.\n const cornerNotYetSized = cornerSize.width === 0 && cornerSize.height === 0;\n const cornerWidthOffset = cornerNotYetSized ? nextCornerWidth : 0;\n const cornerHeightOffset = cornerNotYetSized ? nextCornerHeight : 0;\n\n const scrollbarXOffset = getOffset(scrollbarXEl, 'padding', 'x');\n const scrollbarYOffset = getOffset(scrollbarYEl, 'padding', 'y');\n const thumbXOffset = getOffset(thumbXEl, 'margin', 'x');\n const thumbYOffset = getOffset(thumbYEl, 'margin', 'y');\n\n const idealNextWidth = nextWidth - scrollbarXOffset - thumbXOffset;\n const idealNextHeight = nextHeight - scrollbarYOffset - thumbYOffset;\n\n const maxNextWidth = scrollbarXEl\n ? Math.min(scrollbarXEl.offsetWidth - cornerWidthOffset, idealNextWidth)\n : idealNextWidth;\n const maxNextHeight = scrollbarYEl\n ? Math.min(scrollbarYEl.offsetHeight - cornerHeightOffset, idealNextHeight)\n : idealNextHeight;\n\n const clampedNextWidth = Math.max(MIN_THUMB_SIZE, maxNextWidth * ratioX);\n const clampedNextHeight = Math.max(MIN_THUMB_SIZE, maxNextHeight * ratioY);\n\n this.rootContext.setThumbSize({ width: clampedNextWidth, height: clampedNextHeight });\n\n // Handle Y (vertical) scroll\n if (scrollbarYEl && thumbYEl) {\n const maxThumbOffsetY = scrollbarYEl.offsetHeight - clampedNextHeight - scrollbarYOffset - thumbYOffset;\n const scrollRangeY = scrollableContentHeight - viewportHeight;\n const scrollRatioY = scrollRangeY === 0 ? 0 : scrollTop / scrollRangeY;\n // In Safari, don't allow it to go negative or too far as `scrollTop` considers the rubber band effect.\n const thumbOffsetY = Math.min(maxThumbOffsetY, Math.max(0, scrollRatioY * maxThumbOffsetY));\n thumbYEl.style.transform = `translate3d(0,${thumbOffsetY}px,0)`;\n }\n\n // Handle X (horizontal) scroll\n if (scrollbarXEl && thumbXEl) {\n const maxThumbOffsetX = scrollbarXEl.offsetWidth - clampedNextWidth - scrollbarXOffset - thumbXOffset;\n const scrollRangeX = scrollableContentWidth - viewportWidth;\n const scrollRatioX = scrollRangeX === 0 ? 0 : scrollLeft / scrollRangeX;\n const thumbOffsetX =\n direction === 'rtl'\n ? clamp(scrollRatioX * maxThumbOffsetX, -maxThumbOffsetX, 0)\n : clamp(scrollRatioX * maxThumbOffsetX, 0, maxThumbOffsetX);\n thumbXEl.style.transform = `translate3d(${thumbOffsetX}px,0,0)`;\n }\n\n viewportEl.style.setProperty('--scroll-area-overflow-x-start', `${scrollLeftFromStart}px`);\n viewportEl.style.setProperty('--scroll-area-overflow-x-end', `${scrollLeftFromEnd}px`);\n viewportEl.style.setProperty('--scroll-area-overflow-y-start', `${scrollTopFromStart}px`);\n viewportEl.style.setProperty('--scroll-area-overflow-y-end', `${scrollTopFromEnd}px`);\n\n if (cornerEl) {\n if (scrollbarXHidden || scrollbarYHidden) {\n this.rootContext.setCornerSize({ width: 0, height: 0 });\n } else {\n this.rootContext.setCornerSize({ width: nextCornerWidth, height: nextCornerHeight });\n }\n }\n\n this.rootContext.setHiddenState(nextHiddenState);\n\n this.rootContext.setOverflowEdges({\n xStart: !scrollbarXHidden && scrollLeftFromStart > threshold.xStart,\n xEnd: !scrollbarXHidden && scrollLeftFromEnd > threshold.xEnd,\n yStart: !scrollbarYHidden && scrollTopFromStart > threshold.yStart,\n yEnd: !scrollbarYHidden && scrollTopFromEnd > threshold.yEnd\n });\n }\n\n onScroll(): void {\n const viewportEl = this.rootContext.viewportRef.current;\n if (!viewportEl) {\n return;\n }\n\n this.computeThumbPosition();\n\n if (!this.programmaticScroll) {\n this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });\n }\n\n // Debounce restoring the programmatic flag so momentum scrolling (no further\n // user-interaction events) is still treated as user-driven.\n clearTimeout(this.scrollEndTimer);\n this.scrollEndTimer = setTimeout(() => {\n this.programmaticScroll = true;\n }, SCROLL_END_TIMEOUT);\n }\n\n onUserInteraction(): void {\n this.programmaticScroll = false;\n }\n\n private observeViewport(): void {\n const viewport = this.element;\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n let hasInitialized = false;\n const resizeObserver = new ResizeObserver(() => {\n if (!hasInitialized) {\n hasInitialized = true;\n const m = this.lastMeasuredMetrics;\n if (\n m[0] === viewport.clientHeight &&\n m[1] === viewport.scrollHeight &&\n m[2] === viewport.clientWidth &&\n m[3] === viewport.scrollWidth\n ) {\n return;\n }\n }\n this.computeThumbPosition();\n });\n resizeObserver.observe(viewport);\n\n // Wait for subtree animations to finish, then recompute geometry that may have\n // been affected by transform-based animations.\n this.animationsTimer = setTimeout(() => {\n const animations = viewport.getAnimations({ subtree: true });\n if (animations.length === 0) {\n return;\n }\n Promise.allSettled(animations.map((animation) => animation.finished))\n .then(() => this.computeThumbPosition())\n .catch(() => {});\n }, 0);\n\n this.destroyRef.onDestroy(() => resizeObserver.disconnect());\n }\n}\n\nfunction getHiddenState(viewport: HTMLElement): HiddenState {\n const y = viewport.clientHeight >= viewport.scrollHeight;\n const x = viewport.clientWidth >= viewport.scrollWidth;\n return { y, x, corner: y || x };\n}\n","import { afterNextRender, DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\nimport { injectScrollAreaViewportContext } from './scroll-area-viewport';\n\n/**\n * A container for the content of the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaContent]',\n exportAs: 'rdxScrollAreaContent',\n host: {\n role: 'presentation',\n '[style.min-width]': '\"fit-content\"',\n '[attr.data-scrolling]': '(rootContext.scrollingX() || rootContext.scrollingY()) ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!rootContext.hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!rootContext.hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'rootContext.overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'rootContext.overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'rootContext.overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? \"\" : undefined'\n }\n})\nexport class RdxScrollAreaContent {\n protected readonly rootContext = injectScrollAreaRootContext();\n private readonly viewportContext = injectScrollAreaViewportContext();\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n // Whether the content mounted after the viewport's first measurement; if so the\n // initial ResizeObserver fire is what brings the overflow state in sync.\n const computeOnInitialResize = this.rootContext.hasMeasuredScrollbar();\n\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n let hasInitialized = false;\n const resizeObserver = new ResizeObserver(() => {\n if (!hasInitialized) {\n hasInitialized = true;\n // ResizeObserver fires once upon observing. Skip that initial call to avoid\n // double-calculating the thumb position on mount, unless the content mounted\n // after the viewport's initial measurement.\n if (!computeOnInitialResize) {\n return;\n }\n }\n this.viewportContext.computeThumbPosition();\n });\n resizeObserver.observe(this.element);\n this.destroyRef.onDestroy(() => resizeObserver.disconnect());\n });\n }\n}\n","import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\n\n/**\n * A small rectangular area that appears at the intersection of horizontal and vertical scrollbars.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaCorner]',\n exportAs: 'rdxScrollAreaCorner',\n host: {\n '[style.position]': '\"absolute\"',\n '[style.bottom]': '\"0\"',\n '[style.inset-inline-end]': '\"0\"',\n '[style.width]': 'rootContext.cornerSize().width + \"px\"',\n '[style.height]': 'rootContext.cornerSize().height + \"px\"',\n '[style.display]': 'rootContext.hiddenState().corner ? \"none\" : null'\n }\n})\nexport class RdxScrollAreaCorner {\n protected readonly rootContext = injectScrollAreaRootContext();\n\n constructor() {\n const element: HTMLElement = inject(ElementRef).nativeElement;\n const destroyRef = inject(DestroyRef);\n this.rootContext.cornerRef.current = element;\n destroyRef.onDestroy(() => {\n if (this.rootContext.cornerRef.current === element) {\n this.rootContext.cornerRef.current = null;\n }\n });\n }\n}\n","import { booleanAttribute, computed, Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { BooleanInput, createContext } from '@radix-ng/primitives/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\nimport { getOffset } from './utils';\n\nexport type ScrollbarOrientation = 'vertical' | 'horizontal';\n\nexport interface ScrollAreaScrollbarContext {\n orientation: () => ScrollbarOrientation;\n}\n\nexport const [injectScrollAreaScrollbarContext, provideScrollAreaScrollbarContext] =\n createContext<ScrollAreaScrollbarContext>('ScrollAreaScrollbarContext', 'components/scroll-area');\n\nconst scrollbarContext = (): ScrollAreaScrollbarContext => {\n const scrollbar = inject(RdxScrollAreaScrollbar);\n return { orientation: () => scrollbar.orientation() };\n};\n\n/**\n * A vertical or horizontal scrollbar for the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaScrollbar]',\n exportAs: 'rdxScrollAreaScrollbar',\n providers: [provideScrollAreaScrollbarContext(scrollbarContext)],\n host: {\n '[attr.data-id]': 'rootContext.rootId + \"-scrollbar\"',\n '[attr.data-orientation]': 'orientation()',\n '[attr.data-hovering]': 'rootContext.hovering() ? \"\" : undefined',\n '[attr.data-scrolling]': 'scrolling() ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!rootContext.hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!rootContext.hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'rootContext.overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'rootContext.overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'rootContext.overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? \"\" : undefined',\n '[style.position]': '\"absolute\"',\n '[style.touch-action]': '\"none\"',\n '[style.user-select]': '\"none\"',\n '[style.display]': 'shouldRender() ? null : \"none\"',\n '[style.visibility]': 'hideTrackUntilMeasured() ? \"hidden\" : null',\n '[style.top]': 'orientation() === \"vertical\" ? \"0\" : null',\n '[style.bottom]': 'orientation() === \"vertical\" ? \"var(--scroll-area-corner-height)\" : \"0\"',\n '[style.inset-inline-start]': 'orientation() === \"horizontal\" ? \"0\" : null',\n '[style.inset-inline-end]': 'orientation() === \"vertical\" ? \"0\" : \"var(--scroll-area-corner-width)\"',\n '[style.--scroll-area-thumb-height]':\n 'orientation() === \"vertical\" ? rootContext.thumbSize().height + \"px\" : null',\n '[style.--scroll-area-thumb-width]':\n 'orientation() === \"horizontal\" ? rootContext.thumbSize().width + \"px\" : null',\n '(pointerdown)': 'onPointerDown($event)',\n '(pointerup)': 'rootContext.handlePointerUp($event)',\n '(pointercancel)': 'rootContext.handlePointerUp($event)',\n '(wheel)': 'onWheel($event)'\n }\n})\nexport class RdxScrollAreaScrollbar {\n protected readonly rootContext = injectScrollAreaRootContext();\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n\n /** Whether the scrollbar controls vertical or horizontal scroll. */\n readonly orientation = input<ScrollbarOrientation>('vertical');\n\n /** Whether to keep the element rendered when the viewport isn't scrollable. */\n readonly keepMounted = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n protected readonly scrolling = computed(() =>\n this.orientation() === 'horizontal' ? this.rootContext.scrollingX() : this.rootContext.scrollingY()\n );\n\n private readonly isHidden = computed(() =>\n this.orientation() === 'vertical' ? this.rootContext.hiddenState().y : this.rootContext.hiddenState().x\n );\n\n protected readonly shouldRender = computed(() => this.keepMounted() || !this.isHidden());\n\n protected readonly hideTrackUntilMeasured = computed(\n () => !this.rootContext.hasMeasuredScrollbar() && !this.keepMounted()\n );\n\n constructor() {\n // Register this element as the vertical or horizontal scrollbar ref.\n // Runs as an effect so the bound `orientation` input is available.\n effect((onCleanup) => {\n const ref =\n this.orientation() === 'vertical' ? this.rootContext.scrollbarYRef : this.rootContext.scrollbarXRef;\n ref.current = this.element;\n onCleanup(() => {\n if (ref.current === this.element) {\n ref.current = null;\n }\n });\n });\n }\n\n onWheel(event: WheelEvent): void {\n const viewportEl = this.rootContext.viewportRef.current;\n if (!viewportEl || event.ctrlKey) {\n return;\n }\n\n const horizontal = this.orientation() === 'horizontal';\n const delta = horizontal ? event.deltaX : event.deltaY;\n if (delta === 0) {\n return;\n }\n\n const direction = this.rootContext.direction();\n const maxScroll = horizontal\n ? viewportEl.scrollWidth - viewportEl.clientWidth\n : viewportEl.scrollHeight - viewportEl.clientHeight;\n // RTL horizontal scrolling uses a negative `scrollLeft` range, from 0 to `-maxScroll`.\n const minScroll = horizontal && direction === 'rtl' ? -maxScroll : 0;\n const maxScrollValue = horizontal && direction === 'rtl' ? 0 : maxScroll;\n const scrollValue = horizontal ? viewportEl.scrollLeft : viewportEl.scrollTop;\n\n // At an edge (or with no overflow), let the wheel chain to the parent/page.\n if ((scrollValue <= minScroll && delta < 0) || (scrollValue >= maxScrollValue && delta > 0)) {\n return;\n }\n\n event.preventDefault();\n\n const next = Math.min(maxScrollValue, Math.max(minScroll, scrollValue + delta));\n if (horizontal) {\n viewportEl.scrollLeft = next;\n } else {\n viewportEl.scrollTop = next;\n }\n\n this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });\n }\n\n onPointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n\n const orientation = this.orientation();\n const thumb =\n orientation === 'vertical' ? this.rootContext.thumbYRef.current : this.rootContext.thumbXRef.current;\n\n // Ignore clicks on the thumb itself.\n if (thumb && eventTargetsElement(event, thumb)) {\n return;\n }\n\n const viewportEl = this.rootContext.viewportRef.current;\n if (!viewportEl) {\n return;\n }\n\n const direction = this.rootContext.direction();\n\n if (\n orientation === 'vertical' &&\n this.rootContext.thumbYRef.current &&\n this.rootContext.scrollbarYRef.current\n ) {\n const thumbEl = this.rootContext.thumbYRef.current;\n const scrollbarEl = this.rootContext.scrollbarYRef.current;\n const thumbYOffset = getOffset(thumbEl, 'margin', 'y');\n const scrollbarYOffset = getOffset(scrollbarEl, 'padding', 'y');\n const thumbHeight = thumbEl.offsetHeight;\n const trackRectY = scrollbarEl.getBoundingClientRect();\n const clickY = event.clientY - trackRectY.top - thumbHeight / 2 - scrollbarYOffset + thumbYOffset / 2;\n\n const maxThumbOffsetY = scrollbarEl.offsetHeight - thumbHeight - scrollbarYOffset - thumbYOffset;\n const scrollRatioY = clickY / maxThumbOffsetY;\n viewportEl.scrollTop = scrollRatioY * (viewportEl.scrollHeight - viewportEl.clientHeight);\n }\n\n if (\n orientation === 'horizontal' &&\n this.rootContext.thumbXRef.current &&\n this.rootContext.scrollbarXRef.current\n ) {\n const thumbEl = this.rootContext.thumbXRef.current;\n const scrollbarEl = this.rootContext.scrollbarXRef.current;\n const thumbXOffset = getOffset(thumbEl, 'margin', 'x');\n const scrollbarXOffset = getOffset(scrollbarEl, 'padding', 'x');\n const thumbWidth = thumbEl.offsetWidth;\n const trackRectX = scrollbarEl.getBoundingClientRect();\n const clickX = event.clientX - trackRectX.left - thumbWidth / 2 - scrollbarXOffset + thumbXOffset / 2;\n\n const maxThumbOffsetX = scrollbarEl.offsetWidth - thumbWidth - scrollbarXOffset - thumbXOffset;\n const scrollRatioX = clickX / maxThumbOffsetX;\n const scrollRange = viewportEl.scrollWidth - viewportEl.clientWidth;\n\n let newScrollLeft: number;\n if (direction === 'rtl') {\n newScrollLeft = (1 - scrollRatioX) * scrollRange;\n // Adjust for browsers that use negative scrollLeft in RTL.\n if (viewportEl.scrollLeft <= 0) {\n newScrollLeft = -newScrollLeft;\n }\n } else {\n newScrollLeft = scrollRatioX * scrollRange;\n }\n viewportEl.scrollLeft = newScrollLeft;\n }\n\n this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });\n this.rootContext.handlePointerDown(event);\n }\n}\n\nfunction eventTargetsElement(event: Event, element: Element): boolean {\n if (event.composedPath().includes(element)) {\n return true;\n }\n\n const target = event.target;\n return isNode(target) && element.contains(target);\n}\n\nfunction isNode(value: EventTarget | null): value is Node {\n return !!value && 'nodeType' in value;\n}\n","import { Directive, effect, ElementRef, inject } from '@angular/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\nimport { injectScrollAreaScrollbarContext } from './scroll-area-scrollbar';\n\n/**\n * The draggable part of the scrollbar that indicates the current scroll position.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaThumb]',\n exportAs: 'rdxScrollAreaThumb',\n host: {\n '[attr.data-orientation]': 'scrollbarContext.orientation()',\n '[attr.data-scrolling]':\n '(scrollbarContext.orientation() === \"horizontal\" ? rootContext.scrollingX() : rootContext.scrollingY()) ? \"\" : undefined',\n '[style.visibility]': 'rootContext.hasMeasuredScrollbar() ? null : \"hidden\"',\n '[style.height]': 'scrollbarContext.orientation() === \"vertical\" ? \"var(--scroll-area-thumb-height)\" : null',\n '[style.width]': 'scrollbarContext.orientation() === \"horizontal\" ? \"var(--scroll-area-thumb-width)\" : null',\n '(pointerdown)': 'rootContext.handlePointerDown($event)',\n '(pointermove)': 'rootContext.handlePointerMove($event)',\n '(pointerup)': 'endDrag($event)',\n '(pointercancel)': 'endDrag($event)'\n }\n})\nexport class RdxScrollAreaThumb {\n protected readonly rootContext = injectScrollAreaRootContext();\n protected readonly scrollbarContext = injectScrollAreaScrollbarContext();\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n\n constructor() {\n effect((onCleanup) => {\n const ref =\n this.scrollbarContext.orientation() === 'vertical'\n ? this.rootContext.thumbYRef\n : this.rootContext.thumbXRef;\n ref.current = this.element;\n onCleanup(() => {\n if (ref.current === this.element) {\n ref.current = null;\n }\n });\n });\n }\n\n endDrag(event: PointerEvent): void {\n if (this.scrollbarContext.orientation() === 'vertical') {\n this.rootContext.setScrollingY(false);\n } else {\n this.rootContext.setScrollingX(false);\n }\n this.rootContext.handlePointerUp(event);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxScrollAreaContent } from './src/scroll-area-content';\nimport { RdxScrollAreaCorner } from './src/scroll-area-corner';\nimport { RdxScrollAreaRoot } from './src/scroll-area-root';\nimport { RdxScrollAreaScrollbar } from './src/scroll-area-scrollbar';\nimport { RdxScrollAreaThumb } from './src/scroll-area-thumb';\nimport { RdxScrollAreaViewport } from './src/scroll-area-viewport';\n\nexport * from './src/scroll-area-content';\nexport * from './src/scroll-area-corner';\nexport * from './src/scroll-area-root';\nexport * from './src/scroll-area-scrollbar';\nexport * from './src/scroll-area-thumb';\nexport * from './src/scroll-area-viewport';\n\nconst _imports = [\n RdxScrollAreaRoot,\n RdxScrollAreaViewport,\n RdxScrollAreaContent,\n RdxScrollAreaScrollbar,\n RdxScrollAreaThumb,\n RdxScrollAreaCorner\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxScrollAreaModule {}\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-scroll-area.mjs","sources":["../../../packages/primitives/scroll-area/src/constants.ts","../../../packages/primitives/scroll-area/src/utils.ts","../../../packages/primitives/scroll-area/src/scroll-area-root.ts","../../../packages/primitives/scroll-area/src/scroll-area-viewport.ts","../../../packages/primitives/scroll-area/src/scroll-area-content.ts","../../../packages/primitives/scroll-area/src/scroll-area-corner.ts","../../../packages/primitives/scroll-area/src/scroll-area-scrollbar.ts","../../../packages/primitives/scroll-area/src/scroll-area-thumb.ts","../../../packages/primitives/scroll-area/index.ts","../../../packages/primitives/scroll-area/radix-ng-primitives-scroll-area.ts"],"sourcesContent":["/** How long (ms) the `data-scrolling` attribute stays applied after the last scroll movement. */\nexport const SCROLL_TIMEOUT = 500;\n\n/** Minimum size (px) of the thumb so it stays grabbable on very large content. */\nexport const MIN_THUMB_SIZE = 16;\n\n/** 100 ms without scroll events ≈ scroll end (mirrors the native `scrollend` heuristic). */\nexport const SCROLL_END_TIMEOUT = 100;\n\n/** Distance (px) within which a scroll offset is snapped to an edge. */\nexport const SCROLL_EDGE_TOLERANCE_PX = 1;\n","import { clamp } from '@radix-ng/primitives/core';\nimport { SCROLL_EDGE_TOLERANCE_PX } from './constants';\n\n/**\n * Returns the combined start/end `margin` or `padding` of an element along an axis,\n * resolving logical (inline/block) properties so RTL layouts compute correctly.\n */\nexport function getOffset(element: Element | null, prop: 'margin' | 'padding', axis: 'x' | 'y'): number {\n if (!element) {\n return 0;\n }\n\n const styles = getComputedStyle(element);\n const propAxis = axis === 'x' ? 'Inline' : 'Block';\n\n // Safari misreports `marginInlineEnd` in RTL. We have to assume the start/end\n // values are symmetrical, which is likely.\n if (axis === 'x' && prop === 'margin') {\n return parseFloat(styles[`${prop}InlineStart` as keyof CSSStyleDeclaration] as string) * 2;\n }\n\n return (\n parseFloat(styles[`${prop}${propAxis}Start` as keyof CSSStyleDeclaration] as string) +\n parseFloat(styles[`${prop}${propAxis}End` as keyof CSSStyleDeclaration] as string)\n );\n}\n\n/**\n * Snaps a scroll offset that is within {@link SCROLL_EDGE_TOLERANCE_PX} of either end\n * to that boundary, giving the overflow edge attributes a \"sticky\" feel at scroll limits.\n */\nexport function normalizeScrollOffset(value: number, max: number): number {\n if (max <= 0) {\n return 0;\n }\n\n const clamped = clamp(value, 0, max);\n const startDistance = clamped;\n const endDistance = max - clamped;\n const withinStartTolerance = startDistance <= SCROLL_EDGE_TOLERANCE_PX;\n const withinEndTolerance = endDistance <= SCROLL_EDGE_TOLERANCE_PX;\n\n if (withinStartTolerance && withinEndTolerance) {\n return startDistance <= endDistance ? 0 : max;\n }\n if (withinStartTolerance) {\n return 0;\n }\n if (withinEndTolerance) {\n return max;\n }\n\n return clamped;\n}\n\n/**\n * Injects (once per document) the CSS that hides the native scrollbars of the viewport.\n * Headless directives can't hide WebKit scrollbars via inline styles, so a small\n * stylesheet keyed by the `[rdxScrollAreaViewport]` selector is appended to `<head>`.\n */\nexport function injectScrollbarHideStyles(document: Document, nonce?: string | null): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-rdx-scroll-area]')) {\n return;\n }\n\n const style = document.createElement('style');\n style.setAttribute('data-rdx-scroll-area', '');\n if (nonce) {\n style.nonce = nonce;\n }\n style.textContent = `[rdxScrollAreaViewport]{scrollbar-width:none;-ms-overflow-style:none}[rdxScrollAreaViewport]::-webkit-scrollbar{display:none}`;\n document.head.appendChild(style);\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n signal,\n Signal\n} from '@angular/core';\nimport { BooleanInput, createContext, Direction, injectId } from '@radix-ng/primitives/core';\nimport { injectDirection } from '@radix-ng/primitives/direction-provider';\nimport { SCROLL_TIMEOUT } from './constants';\nimport { getOffset } from './utils';\n\nexport type Size = { width: number; height: number };\nexport type Coords = { x: number; y: number };\nexport type OverflowEdges = { xStart: boolean; xEnd: boolean; yStart: boolean; yEnd: boolean };\nexport type HiddenState = { x: boolean; y: boolean; corner: boolean };\n\n/** A minimal, React-`ref`-like mutable holder shared through context. */\nexport type MutableRef<T> = { current: T | null };\n\nexport type OverflowEdgeThreshold = number | Partial<{ xStart: number; xEnd: number; yStart: number; yEnd: number }>;\n\nconst DEFAULT_SIZE: Size = { width: 0, height: 0 };\nconst DEFAULT_OVERFLOW_EDGES: OverflowEdges = { xStart: false, xEnd: false, yStart: false, yEnd: false };\nconst DEFAULT_HIDDEN_STATE: HiddenState = { x: true, y: true, corner: true };\n\nexport interface ScrollAreaRootContext {\n readonly rootId: string;\n readonly direction: Signal<Direction>;\n readonly overflowEdgeThreshold: Signal<{ xStart: number; xEnd: number; yStart: number; yEnd: number }>;\n readonly disableStyleElements: Signal<boolean>;\n\n // Reactive state\n readonly hovering: Signal<boolean>;\n readonly scrollingX: Signal<boolean>;\n readonly scrollingY: Signal<boolean>;\n readonly touchModality: Signal<boolean>;\n readonly hasMeasuredScrollbar: Signal<boolean>;\n readonly cornerSize: Signal<Size>;\n readonly thumbSize: Signal<Size>;\n readonly hiddenState: Signal<HiddenState>;\n readonly overflowEdges: Signal<OverflowEdges>;\n\n // Element references (filled in by the child parts as they mount)\n readonly rootRef: MutableRef<HTMLElement>;\n readonly viewportRef: MutableRef<HTMLElement>;\n readonly scrollbarYRef: MutableRef<HTMLElement>;\n readonly scrollbarXRef: MutableRef<HTMLElement>;\n readonly thumbYRef: MutableRef<HTMLElement>;\n readonly thumbXRef: MutableRef<HTMLElement>;\n readonly cornerRef: MutableRef<HTMLElement>;\n\n // State setters used by the viewport's measurement pass\n setHovering(value: boolean): void;\n setHasMeasuredScrollbar(value: boolean): void;\n setScrollingX(value: boolean): void;\n setScrollingY(value: boolean): void;\n setThumbSize(value: Size): void;\n setCornerSize(value: Size): void;\n setHiddenState(value: HiddenState): void;\n setOverflowEdges(value: OverflowEdges): void;\n\n // Pointer/scroll handlers shared with the scrollbar and thumb\n handleScroll(position: Coords): void;\n handlePointerDown(event: PointerEvent): void;\n handlePointerMove(event: PointerEvent): void;\n handlePointerUp(event: PointerEvent): void;\n}\n\nexport const [injectScrollAreaRootContext, provideScrollAreaRootContext] = createContext<ScrollAreaRootContext>(\n 'ScrollAreaRootContext',\n 'components/scroll-area'\n);\n\nconst rootContext = (): ScrollAreaRootContext => {\n const root = inject(RdxScrollAreaRoot);\n return {\n rootId: root.rootId,\n direction: root.direction,\n overflowEdgeThreshold: root.normalizedThreshold,\n disableStyleElements: root.disableStyleElements,\n hovering: root.hovering,\n scrollingX: root.scrollingX,\n scrollingY: root.scrollingY,\n touchModality: root.touchModality,\n hasMeasuredScrollbar: root.hasMeasuredScrollbar,\n cornerSize: root.cornerSize,\n thumbSize: root.thumbSize,\n hiddenState: root.hiddenState,\n overflowEdges: root.overflowEdges,\n rootRef: root.rootRef,\n viewportRef: root.viewportRef,\n scrollbarYRef: root.scrollbarYRef,\n scrollbarXRef: root.scrollbarXRef,\n thumbYRef: root.thumbYRef,\n thumbXRef: root.thumbXRef,\n cornerRef: root.cornerRef,\n setHovering: (v) => root.hovering.set(v),\n setHasMeasuredScrollbar: (v) => root.hasMeasuredScrollbar.set(v),\n setScrollingX: (v) => root.setScrollingX(v),\n setScrollingY: (v) => root.setScrollingY(v),\n setThumbSize: (v) => root.setThumbSize(v),\n setCornerSize: (v) => root.setCornerSize(v),\n setHiddenState: (v) => root.setHiddenState(v),\n setOverflowEdges: (v) => root.setOverflowEdges(v),\n handleScroll: (p) => root.handleScroll(p),\n handlePointerDown: (e) => root.handlePointerDown(e),\n handlePointerMove: (e) => root.handlePointerMove(e),\n handlePointerUp: (e) => root.handlePointerUp(e)\n };\n};\n\n/**\n * Groups all parts of the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaRoot]',\n exportAs: 'rdxScrollAreaRoot',\n providers: [provideScrollAreaRootContext(rootContext)],\n host: {\n role: 'presentation',\n '[style.position]': '\"relative\"',\n '[style.--scroll-area-corner-height]': 'cornerSize().height + \"px\"',\n '[style.--scroll-area-corner-width]': 'cornerSize().width + \"px\"',\n '[attr.data-scrolling]': '(scrollingX() || scrollingY()) ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'overflowEdges().yEnd ? \"\" : undefined',\n '(pointerenter)': 'onPointerEnterOrMove($event)',\n '(pointermove)': 'onPointerEnterOrMove($event)',\n '(pointerdown)': 'onTouchModalityChange($event)',\n '(pointerleave)': 'hovering.set(false)'\n }\n})\nexport class RdxScrollAreaRoot {\n private readonly destroyRef = inject(DestroyRef);\n\n readonly rootId = injectId('rdx-scroll-area-');\n\n /** Text direction of the scroll area. Affects horizontal (RTL) scroll math. */\n readonly dirInput = input<Direction | undefined>(undefined, { alias: 'dir' });\n readonly direction: Signal<Direction> = injectDirection(this.dirInput);\n\n /**\n * The threshold in pixels that must be passed before the overflow edge attributes are applied.\n * Accepts a single number for all edges or an object to configure them individually.\n */\n readonly overflowEdgeThreshold = input<OverflowEdgeThreshold>(0);\n readonly disableStyleElements = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly normalizedThreshold = computed(() => normalizeOverflowEdgeThreshold(this.overflowEdgeThreshold()));\n\n readonly hovering = signal(false);\n readonly scrollingX = signal(false);\n readonly scrollingY = signal(false);\n readonly touchModality = signal(false);\n readonly hasMeasuredScrollbar = signal(false);\n readonly cornerSize = signal<Size>(DEFAULT_SIZE);\n readonly thumbSize = signal<Size>(DEFAULT_SIZE);\n readonly hiddenState = signal<HiddenState>(DEFAULT_HIDDEN_STATE);\n readonly overflowEdges = signal<OverflowEdges>(DEFAULT_OVERFLOW_EDGES);\n\n readonly rootRef: MutableRef<HTMLElement> = { current: inject(ElementRef).nativeElement };\n readonly viewportRef: MutableRef<HTMLElement> = { current: null };\n readonly scrollbarYRef: MutableRef<HTMLElement> = { current: null };\n readonly scrollbarXRef: MutableRef<HTMLElement> = { current: null };\n readonly thumbYRef: MutableRef<HTMLElement> = { current: null };\n readonly thumbXRef: MutableRef<HTMLElement> = { current: null };\n readonly cornerRef: MutableRef<HTMLElement> = { current: null };\n\n // Imperative drag state (deliberately non-reactive).\n private thumbDragging = false;\n private startY = 0;\n private startX = 0;\n private startScrollTop = 0;\n private startScrollLeft = 0;\n private currentOrientation: 'vertical' | 'horizontal' = 'vertical';\n private scrollPosition: Coords = { x: 0, y: 0 };\n\n private scrollYTimer: ReturnType<typeof setTimeout> | undefined;\n private scrollXTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n clearTimeout(this.scrollYTimer);\n clearTimeout(this.scrollXTimer);\n });\n }\n\n setScrollingX(value: boolean): void {\n this.scrollingX.set(value);\n }\n\n setScrollingY(value: boolean): void {\n this.scrollingY.set(value);\n }\n\n setThumbSize(value: Size): void {\n const prev = this.thumbSize();\n if (prev.width !== value.width || prev.height !== value.height) {\n this.thumbSize.set(value);\n }\n }\n\n setCornerSize(value: Size): void {\n const prev = this.cornerSize();\n if (prev.width !== value.width || prev.height !== value.height) {\n this.cornerSize.set(value);\n }\n }\n\n setHiddenState(value: HiddenState): void {\n const prev = this.hiddenState();\n if (prev.x !== value.x || prev.y !== value.y || prev.corner !== value.corner) {\n this.hiddenState.set(value);\n }\n }\n\n setOverflowEdges(value: OverflowEdges): void {\n const prev = this.overflowEdges();\n if (\n prev.xStart !== value.xStart ||\n prev.xEnd !== value.xEnd ||\n prev.yStart !== value.yStart ||\n prev.yEnd !== value.yEnd\n ) {\n this.overflowEdges.set(value);\n }\n }\n\n handleScroll(scrollPosition: Coords): void {\n const offsetX = scrollPosition.x - this.scrollPosition.x;\n const offsetY = scrollPosition.y - this.scrollPosition.y;\n this.scrollPosition = scrollPosition;\n\n if (offsetY !== 0) {\n this.scrollingY.set(true);\n clearTimeout(this.scrollYTimer);\n this.scrollYTimer = setTimeout(() => this.scrollingY.set(false), SCROLL_TIMEOUT);\n }\n\n if (offsetX !== 0) {\n this.scrollingX.set(true);\n clearTimeout(this.scrollXTimer);\n this.scrollXTimer = setTimeout(() => this.scrollingX.set(false), SCROLL_TIMEOUT);\n }\n }\n\n handlePointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n\n this.thumbDragging = true;\n this.startY = event.clientY;\n this.startX = event.clientX;\n this.currentOrientation =\n ((event.currentTarget as Element | null)?.getAttribute('data-orientation') as 'vertical' | 'horizontal') ??\n 'vertical';\n\n const viewport = this.viewportRef.current;\n if (viewport) {\n this.startScrollTop = viewport.scrollTop;\n this.startScrollLeft = viewport.scrollLeft;\n }\n if (this.thumbYRef.current && this.currentOrientation === 'vertical') {\n this.thumbYRef.current.setPointerCapture(event.pointerId);\n }\n if (this.thumbXRef.current && this.currentOrientation === 'horizontal') {\n this.thumbXRef.current.setPointerCapture(event.pointerId);\n }\n }\n\n handlePointerMove(event: PointerEvent): void {\n if (!this.thumbDragging) {\n return;\n }\n\n const deltaY = event.clientY - this.startY;\n const deltaX = event.clientX - this.startX;\n\n const viewport = this.viewportRef.current;\n if (!viewport) {\n return;\n }\n\n const scrollableContentHeight = viewport.scrollHeight;\n const viewportHeight = viewport.clientHeight;\n const scrollableContentWidth = viewport.scrollWidth;\n const viewportWidth = viewport.clientWidth;\n\n if (this.thumbYRef.current && this.scrollbarYRef.current && this.currentOrientation === 'vertical') {\n const scrollbarYOffset = getOffset(this.scrollbarYRef.current, 'padding', 'y');\n const thumbYOffset = getOffset(this.thumbYRef.current, 'margin', 'y');\n const thumbHeight = this.thumbYRef.current.offsetHeight;\n const maxThumbOffsetY =\n this.scrollbarYRef.current.offsetHeight - thumbHeight - scrollbarYOffset - thumbYOffset;\n const scrollRatioY = deltaY / maxThumbOffsetY;\n\n viewport.scrollTop = this.startScrollTop + scrollRatioY * (scrollableContentHeight - viewportHeight);\n event.preventDefault();\n\n this.scrollingY.set(true);\n clearTimeout(this.scrollYTimer);\n this.scrollYTimer = setTimeout(() => this.scrollingY.set(false), SCROLL_TIMEOUT);\n }\n\n if (this.thumbXRef.current && this.scrollbarXRef.current && this.currentOrientation === 'horizontal') {\n const scrollbarXOffset = getOffset(this.scrollbarXRef.current, 'padding', 'x');\n const thumbXOffset = getOffset(this.thumbXRef.current, 'margin', 'x');\n const thumbWidth = this.thumbXRef.current.offsetWidth;\n const maxThumbOffsetX =\n this.scrollbarXRef.current.offsetWidth - thumbWidth - scrollbarXOffset - thumbXOffset;\n const scrollRatioX = deltaX / maxThumbOffsetX;\n\n viewport.scrollLeft = this.startScrollLeft + scrollRatioX * (scrollableContentWidth - viewportWidth);\n event.preventDefault();\n\n this.scrollingX.set(true);\n clearTimeout(this.scrollXTimer);\n this.scrollXTimer = setTimeout(() => this.scrollingX.set(false), SCROLL_TIMEOUT);\n }\n }\n\n handlePointerUp(event: PointerEvent): void {\n this.thumbDragging = false;\n\n // `pointercancel` releases capture implicitly, so guard against releasing a\n // capture we no longer hold (which would throw).\n if (\n this.thumbYRef.current &&\n this.currentOrientation === 'vertical' &&\n this.thumbYRef.current.hasPointerCapture(event.pointerId)\n ) {\n this.thumbYRef.current.releasePointerCapture(event.pointerId);\n }\n if (\n this.thumbXRef.current &&\n this.currentOrientation === 'horizontal' &&\n this.thumbXRef.current.hasPointerCapture(event.pointerId)\n ) {\n this.thumbXRef.current.releasePointerCapture(event.pointerId);\n }\n }\n\n onTouchModalityChange(event: PointerEvent): void {\n this.touchModality.set(event.pointerType === 'touch');\n }\n\n onPointerEnterOrMove(event: PointerEvent): void {\n this.onTouchModalityChange(event);\n\n if (event.pointerType !== 'touch') {\n const root = this.rootRef.current;\n const target = event.target as Node | null;\n this.hovering.set(!!root && !!target && root.contains(target));\n }\n }\n}\n\nfunction normalizeOverflowEdgeThreshold(threshold: OverflowEdgeThreshold | undefined): {\n xStart: number;\n xEnd: number;\n yStart: number;\n yEnd: number;\n} {\n if (typeof threshold === 'number') {\n const value = Math.max(0, threshold);\n return { xStart: value, xEnd: value, yStart: value, yEnd: value };\n }\n\n return {\n xStart: Math.max(0, threshold?.xStart || 0),\n xEnd: Math.max(0, threshold?.xEnd || 0),\n yStart: Math.max(0, threshold?.yStart || 0),\n yEnd: Math.max(0, threshold?.yEnd || 0)\n };\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n CSP_NONCE,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID\n} from '@angular/core';\nimport { clamp, createContext } from '@radix-ng/primitives/core';\nimport { MIN_THUMB_SIZE, SCROLL_END_TIMEOUT } from './constants';\nimport { HiddenState, injectScrollAreaRootContext } from './scroll-area-root';\nimport { getOffset, injectScrollbarHideStyles, normalizeScrollOffset } from './utils';\n\nexport interface ScrollAreaViewportContext {\n /** Re-measures the viewport and repositions the thumbs. Called by the content's ResizeObserver. */\n computeThumbPosition(): void;\n}\n\nexport const [injectScrollAreaViewportContext, provideScrollAreaViewportContext] =\n createContext<ScrollAreaViewportContext>('ScrollAreaViewportContext', 'components/scroll-area');\n\nconst viewportContext = (): ScrollAreaViewportContext => {\n const viewport = inject(RdxScrollAreaViewport);\n return {\n computeThumbPosition: () => viewport.computeThumbPosition()\n };\n};\n\n/**\n * The actual scrollable container of the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaViewport]',\n exportAs: 'rdxScrollAreaViewport',\n providers: [provideScrollAreaViewportContext(viewportContext)],\n host: {\n role: 'presentation',\n '[style.overflow]': '\"scroll\"',\n '[attr.tabindex]': '(rootContext.hiddenState().x && rootContext.hiddenState().y) ? -1 : 0',\n '[attr.data-id]': 'rootContext.rootId + \"-viewport\"',\n '[attr.data-scrolling]': '(rootContext.scrollingX() || rootContext.scrollingY()) ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!rootContext.hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!rootContext.hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'rootContext.overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'rootContext.overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'rootContext.overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? \"\" : undefined',\n '(scroll)': 'onScroll()',\n '(wheel)': 'onUserInteraction()',\n '(pointermove)': 'onUserInteraction()',\n '(pointerenter)': 'onUserInteraction()',\n '(keydown)': 'onUserInteraction()'\n }\n})\nexport class RdxScrollAreaViewport {\n protected readonly rootContext = injectScrollAreaRootContext();\n\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly cspNonce = inject(CSP_NONCE, { optional: true });\n\n private programmaticScroll = true;\n private lastMeasuredMetrics: [number, number, number, number] = [NaN, NaN, NaN, NaN];\n private scrollEndTimer: ReturnType<typeof setTimeout> | undefined;\n private animationsTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n this.rootContext.viewportRef.current = this.element;\n\n if (this.isBrowser) {\n effect(() => {\n if (!this.rootContext.disableStyleElements()) {\n injectScrollbarHideStyles(this.element.ownerDocument, this.cspNonce);\n }\n });\n }\n\n // Recompute after hidden-state toggles (so newly shown scrollbars get measured),\n // on direction flips, and when the overflow-edge threshold changes.\n const hiddenState = this.rootContext.hiddenState;\n const direction = this.rootContext.direction;\n const threshold = this.rootContext.overflowEdgeThreshold;\n effect(() => {\n hiddenState();\n direction();\n threshold();\n queueMicrotask(() => this.computeThumbPosition());\n });\n\n afterNextRender(() => {\n this.computeThumbPosition();\n this.observeViewport();\n\n if (this.element.matches(':hover')) {\n this.rootContext.setHovering(true);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n if (this.rootContext.viewportRef.current === this.element) {\n this.rootContext.viewportRef.current = null;\n }\n clearTimeout(this.scrollEndTimer);\n clearTimeout(this.animationsTimer);\n });\n }\n\n computeThumbPosition(): void {\n const viewportEl = this.rootContext.viewportRef.current;\n const scrollbarYEl = this.rootContext.scrollbarYRef.current;\n const scrollbarXEl = this.rootContext.scrollbarXRef.current;\n const thumbYEl = this.rootContext.thumbYRef.current;\n const thumbXEl = this.rootContext.thumbXRef.current;\n const cornerEl = this.rootContext.cornerRef.current;\n\n if (!viewportEl) {\n return;\n }\n\n const direction = this.rootContext.direction();\n const threshold = this.rootContext.overflowEdgeThreshold();\n const cornerSize = this.rootContext.cornerSize();\n\n const scrollableContentHeight = viewportEl.scrollHeight;\n const scrollableContentWidth = viewportEl.scrollWidth;\n const viewportHeight = viewportEl.clientHeight;\n const viewportWidth = viewportEl.clientWidth;\n const scrollTop = viewportEl.scrollTop;\n const scrollLeft = viewportEl.scrollLeft;\n\n const isFirstMeasurement = Number.isNaN(this.lastMeasuredMetrics[0]);\n this.lastMeasuredMetrics = [viewportHeight, scrollableContentHeight, viewportWidth, scrollableContentWidth];\n\n if (isFirstMeasurement) {\n this.rootContext.setHasMeasuredScrollbar(true);\n }\n\n if (scrollableContentHeight === 0 || scrollableContentWidth === 0) {\n return;\n }\n\n const nextHiddenState = getHiddenState(viewportEl);\n const scrollbarYHidden = nextHiddenState.y;\n const scrollbarXHidden = nextHiddenState.x;\n const ratioX = viewportWidth / scrollableContentWidth;\n const ratioY = viewportHeight / scrollableContentHeight;\n const maxScrollLeft = Math.max(0, scrollableContentWidth - viewportWidth);\n const maxScrollTop = Math.max(0, scrollableContentHeight - viewportHeight);\n\n let scrollLeftFromStart = 0;\n let scrollLeftFromEnd = 0;\n if (!scrollbarXHidden) {\n const rawScrollLeftFromStart =\n direction === 'rtl' ? clamp(-scrollLeft, 0, maxScrollLeft) : clamp(scrollLeft, 0, maxScrollLeft);\n scrollLeftFromStart = normalizeScrollOffset(rawScrollLeftFromStart, maxScrollLeft);\n scrollLeftFromEnd = maxScrollLeft - scrollLeftFromStart;\n }\n\n const rawScrollTopFromStart = !scrollbarYHidden ? clamp(scrollTop, 0, maxScrollTop) : 0;\n const scrollTopFromStart = !scrollbarYHidden ? normalizeScrollOffset(rawScrollTopFromStart, maxScrollTop) : 0;\n const scrollTopFromEnd = !scrollbarYHidden ? maxScrollTop - scrollTopFromStart : 0;\n const nextWidth = scrollbarXHidden ? 0 : viewportWidth;\n const nextHeight = scrollbarYHidden ? 0 : viewportHeight;\n\n let nextCornerWidth = 0;\n let nextCornerHeight = 0;\n if (!scrollbarXHidden && !scrollbarYHidden) {\n nextCornerWidth = scrollbarYEl?.offsetWidth || 0;\n nextCornerHeight = scrollbarXEl?.offsetHeight || 0;\n }\n\n // Only subtract corner size from scrollbar dimensions if the corner hasn't been sized yet.\n const cornerNotYetSized = cornerSize.width === 0 && cornerSize.height === 0;\n const cornerWidthOffset = cornerNotYetSized ? nextCornerWidth : 0;\n const cornerHeightOffset = cornerNotYetSized ? nextCornerHeight : 0;\n\n const scrollbarXOffset = getOffset(scrollbarXEl, 'padding', 'x');\n const scrollbarYOffset = getOffset(scrollbarYEl, 'padding', 'y');\n const thumbXOffset = getOffset(thumbXEl, 'margin', 'x');\n const thumbYOffset = getOffset(thumbYEl, 'margin', 'y');\n\n const idealNextWidth = nextWidth - scrollbarXOffset - thumbXOffset;\n const idealNextHeight = nextHeight - scrollbarYOffset - thumbYOffset;\n\n const maxNextWidth = scrollbarXEl\n ? Math.min(scrollbarXEl.offsetWidth - cornerWidthOffset, idealNextWidth)\n : idealNextWidth;\n const maxNextHeight = scrollbarYEl\n ? Math.min(scrollbarYEl.offsetHeight - cornerHeightOffset, idealNextHeight)\n : idealNextHeight;\n\n const clampedNextWidth = Math.max(MIN_THUMB_SIZE, maxNextWidth * ratioX);\n const clampedNextHeight = Math.max(MIN_THUMB_SIZE, maxNextHeight * ratioY);\n\n this.rootContext.setThumbSize({ width: clampedNextWidth, height: clampedNextHeight });\n\n // Handle Y (vertical) scroll\n if (scrollbarYEl && thumbYEl) {\n const maxThumbOffsetY = scrollbarYEl.offsetHeight - clampedNextHeight - scrollbarYOffset - thumbYOffset;\n const scrollRangeY = scrollableContentHeight - viewportHeight;\n const scrollRatioY = scrollRangeY === 0 ? 0 : scrollTop / scrollRangeY;\n // In Safari, don't allow it to go negative or too far as `scrollTop` considers the rubber band effect.\n const thumbOffsetY = Math.min(maxThumbOffsetY, Math.max(0, scrollRatioY * maxThumbOffsetY));\n thumbYEl.style.transform = `translate3d(0,${thumbOffsetY}px,0)`;\n }\n\n // Handle X (horizontal) scroll\n if (scrollbarXEl && thumbXEl) {\n const maxThumbOffsetX = scrollbarXEl.offsetWidth - clampedNextWidth - scrollbarXOffset - thumbXOffset;\n const scrollRangeX = scrollableContentWidth - viewportWidth;\n const scrollRatioX = scrollRangeX === 0 ? 0 : scrollLeft / scrollRangeX;\n const thumbOffsetX =\n direction === 'rtl'\n ? clamp(scrollRatioX * maxThumbOffsetX, -maxThumbOffsetX, 0)\n : clamp(scrollRatioX * maxThumbOffsetX, 0, maxThumbOffsetX);\n thumbXEl.style.transform = `translate3d(${thumbOffsetX}px,0,0)`;\n }\n\n viewportEl.style.setProperty('--scroll-area-overflow-x-start', `${scrollLeftFromStart}px`);\n viewportEl.style.setProperty('--scroll-area-overflow-x-end', `${scrollLeftFromEnd}px`);\n viewportEl.style.setProperty('--scroll-area-overflow-y-start', `${scrollTopFromStart}px`);\n viewportEl.style.setProperty('--scroll-area-overflow-y-end', `${scrollTopFromEnd}px`);\n\n if (cornerEl) {\n if (scrollbarXHidden || scrollbarYHidden) {\n this.rootContext.setCornerSize({ width: 0, height: 0 });\n } else {\n this.rootContext.setCornerSize({ width: nextCornerWidth, height: nextCornerHeight });\n }\n }\n\n this.rootContext.setHiddenState(nextHiddenState);\n\n this.rootContext.setOverflowEdges({\n xStart: !scrollbarXHidden && scrollLeftFromStart > threshold.xStart,\n xEnd: !scrollbarXHidden && scrollLeftFromEnd > threshold.xEnd,\n yStart: !scrollbarYHidden && scrollTopFromStart > threshold.yStart,\n yEnd: !scrollbarYHidden && scrollTopFromEnd > threshold.yEnd\n });\n }\n\n onScroll(): void {\n const viewportEl = this.rootContext.viewportRef.current;\n if (!viewportEl) {\n return;\n }\n\n this.computeThumbPosition();\n\n // WebKit consumes a touch that catches an in-flight momentum scroll or rubber-band bounce\n // without dispatching any DOM events for the whole gesture (not even `touchstart`), so such a\n // scroll can't be attributed to the user through events. Treat every scroll in touch modality\n // as user-driven instead, otherwise the scrollbar never shows on iOS (Base UI parity).\n if (this.rootContext.touchModality() || !this.programmaticScroll) {\n this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });\n }\n\n // Debounce restoring the programmatic flag so momentum scrolling (no further\n // user-interaction events) is still treated as user-driven.\n clearTimeout(this.scrollEndTimer);\n this.scrollEndTimer = setTimeout(() => {\n this.programmaticScroll = true;\n }, SCROLL_END_TIMEOUT);\n }\n\n onUserInteraction(): void {\n this.programmaticScroll = false;\n }\n\n private observeViewport(): void {\n const viewport = this.element;\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n let hasInitialized = false;\n const resizeObserver = new ResizeObserver(() => {\n if (!hasInitialized) {\n hasInitialized = true;\n const m = this.lastMeasuredMetrics;\n if (\n m[0] === viewport.clientHeight &&\n m[1] === viewport.scrollHeight &&\n m[2] === viewport.clientWidth &&\n m[3] === viewport.scrollWidth\n ) {\n return;\n }\n }\n this.computeThumbPosition();\n });\n resizeObserver.observe(viewport);\n\n // Wait for subtree animations to finish, then recompute geometry that may have\n // been affected by transform-based animations.\n this.animationsTimer = setTimeout(() => {\n const animations = viewport.getAnimations({ subtree: true });\n if (animations.length === 0) {\n return;\n }\n Promise.allSettled(animations.map((animation) => animation.finished))\n .then(() => this.computeThumbPosition())\n .catch(() => {});\n }, 0);\n\n this.destroyRef.onDestroy(() => resizeObserver.disconnect());\n }\n}\n\nfunction getHiddenState(viewport: HTMLElement): HiddenState {\n const y = viewport.clientHeight >= viewport.scrollHeight;\n const x = viewport.clientWidth >= viewport.scrollWidth;\n return { y, x, corner: y || x };\n}\n","import { afterNextRender, DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\nimport { injectScrollAreaViewportContext } from './scroll-area-viewport';\n\n/**\n * A container for the content of the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaContent]',\n exportAs: 'rdxScrollAreaContent',\n host: {\n role: 'presentation',\n '[style.min-width]': '\"fit-content\"',\n '[attr.data-scrolling]': '(rootContext.scrollingX() || rootContext.scrollingY()) ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!rootContext.hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!rootContext.hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'rootContext.overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'rootContext.overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'rootContext.overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? \"\" : undefined'\n }\n})\nexport class RdxScrollAreaContent {\n protected readonly rootContext = injectScrollAreaRootContext();\n private readonly viewportContext = injectScrollAreaViewportContext();\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n // Whether the content mounted after the viewport's first measurement; if so the\n // initial ResizeObserver fire is what brings the overflow state in sync.\n const computeOnInitialResize = this.rootContext.hasMeasuredScrollbar();\n\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n let hasInitialized = false;\n const resizeObserver = new ResizeObserver(() => {\n if (!hasInitialized) {\n hasInitialized = true;\n // ResizeObserver fires once upon observing. Skip that initial call to avoid\n // double-calculating the thumb position on mount, unless the content mounted\n // after the viewport's initial measurement.\n if (!computeOnInitialResize) {\n return;\n }\n }\n this.viewportContext.computeThumbPosition();\n });\n resizeObserver.observe(this.element);\n this.destroyRef.onDestroy(() => resizeObserver.disconnect());\n });\n }\n}\n","import { DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\n\n/**\n * A small rectangular area that appears at the intersection of horizontal and vertical scrollbars.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaCorner]',\n exportAs: 'rdxScrollAreaCorner',\n host: {\n '[style.position]': '\"absolute\"',\n '[style.bottom]': '\"0\"',\n '[style.inset-inline-end]': '\"0\"',\n '[style.width]': 'rootContext.cornerSize().width + \"px\"',\n '[style.height]': 'rootContext.cornerSize().height + \"px\"',\n '[style.display]': 'rootContext.hiddenState().corner ? \"none\" : null'\n }\n})\nexport class RdxScrollAreaCorner {\n protected readonly rootContext = injectScrollAreaRootContext();\n\n constructor() {\n const element: HTMLElement = inject(ElementRef).nativeElement;\n const destroyRef = inject(DestroyRef);\n this.rootContext.cornerRef.current = element;\n destroyRef.onDestroy(() => {\n if (this.rootContext.cornerRef.current === element) {\n this.rootContext.cornerRef.current = null;\n }\n });\n }\n}\n","import { booleanAttribute, computed, Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { BooleanInput, createContext } from '@radix-ng/primitives/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\nimport { getOffset } from './utils';\n\nexport type ScrollbarOrientation = 'vertical' | 'horizontal';\n\nexport interface ScrollAreaScrollbarContext {\n orientation: () => ScrollbarOrientation;\n}\n\nexport const [injectScrollAreaScrollbarContext, provideScrollAreaScrollbarContext] =\n createContext<ScrollAreaScrollbarContext>('ScrollAreaScrollbarContext', 'components/scroll-area');\n\nconst scrollbarContext = (): ScrollAreaScrollbarContext => {\n const scrollbar = inject(RdxScrollAreaScrollbar);\n return { orientation: () => scrollbar.orientation() };\n};\n\n/**\n * A vertical or horizontal scrollbar for the scroll area.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaScrollbar]',\n exportAs: 'rdxScrollAreaScrollbar',\n providers: [provideScrollAreaScrollbarContext(scrollbarContext)],\n host: {\n '[attr.data-id]': 'rootContext.rootId + \"-scrollbar\"',\n '[attr.data-orientation]': 'orientation()',\n '[attr.data-hovering]': 'rootContext.hovering() ? \"\" : undefined',\n '[attr.data-scrolling]': 'scrolling() ? \"\" : undefined',\n '[attr.data-has-overflow-x]': '!rootContext.hiddenState().x ? \"\" : undefined',\n '[attr.data-has-overflow-y]': '!rootContext.hiddenState().y ? \"\" : undefined',\n '[attr.data-overflow-x-start]': 'rootContext.overflowEdges().xStart ? \"\" : undefined',\n '[attr.data-overflow-x-end]': 'rootContext.overflowEdges().xEnd ? \"\" : undefined',\n '[attr.data-overflow-y-start]': 'rootContext.overflowEdges().yStart ? \"\" : undefined',\n '[attr.data-overflow-y-end]': 'rootContext.overflowEdges().yEnd ? \"\" : undefined',\n '[style.position]': '\"absolute\"',\n '[style.touch-action]': '\"none\"',\n '[style.user-select]': '\"none\"',\n '[style.display]': 'shouldRender() ? null : \"none\"',\n '[style.visibility]': 'hideTrackUntilMeasured() ? \"hidden\" : null',\n '[style.top]': 'orientation() === \"vertical\" ? \"0\" : null',\n '[style.bottom]': 'orientation() === \"vertical\" ? \"var(--scroll-area-corner-height)\" : \"0\"',\n '[style.inset-inline-start]': 'orientation() === \"horizontal\" ? \"0\" : null',\n '[style.inset-inline-end]': 'orientation() === \"vertical\" ? \"0\" : \"var(--scroll-area-corner-width)\"',\n '[style.--scroll-area-thumb-height]':\n 'orientation() === \"vertical\" ? rootContext.thumbSize().height + \"px\" : null',\n '[style.--scroll-area-thumb-width]':\n 'orientation() === \"horizontal\" ? rootContext.thumbSize().width + \"px\" : null',\n '(pointerdown)': 'onPointerDown($event)',\n '(pointerup)': 'rootContext.handlePointerUp($event)',\n '(pointercancel)': 'rootContext.handlePointerUp($event)',\n '(wheel)': 'onWheel($event)'\n }\n})\nexport class RdxScrollAreaScrollbar {\n protected readonly rootContext = injectScrollAreaRootContext();\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n\n /** Whether the scrollbar controls vertical or horizontal scroll. */\n readonly orientation = input<ScrollbarOrientation>('vertical');\n\n /** Whether to keep the element rendered when the viewport isn't scrollable. */\n readonly keepMounted = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n protected readonly scrolling = computed(() =>\n this.orientation() === 'horizontal' ? this.rootContext.scrollingX() : this.rootContext.scrollingY()\n );\n\n private readonly isHidden = computed(() =>\n this.orientation() === 'vertical' ? this.rootContext.hiddenState().y : this.rootContext.hiddenState().x\n );\n\n protected readonly shouldRender = computed(() => this.keepMounted() || !this.isHidden());\n\n protected readonly hideTrackUntilMeasured = computed(\n () => !this.rootContext.hasMeasuredScrollbar() && !this.keepMounted()\n );\n\n constructor() {\n // Register this element as the vertical or horizontal scrollbar ref.\n // Runs as an effect so the bound `orientation` input is available.\n effect((onCleanup) => {\n const ref =\n this.orientation() === 'vertical' ? this.rootContext.scrollbarYRef : this.rootContext.scrollbarXRef;\n ref.current = this.element;\n onCleanup(() => {\n if (ref.current === this.element) {\n ref.current = null;\n }\n });\n });\n }\n\n onWheel(event: WheelEvent): void {\n const viewportEl = this.rootContext.viewportRef.current;\n if (!viewportEl || event.ctrlKey) {\n return;\n }\n\n const horizontal = this.orientation() === 'horizontal';\n const delta = horizontal ? event.deltaX : event.deltaY;\n if (delta === 0) {\n return;\n }\n\n const direction = this.rootContext.direction();\n const maxScroll = horizontal\n ? viewportEl.scrollWidth - viewportEl.clientWidth\n : viewportEl.scrollHeight - viewportEl.clientHeight;\n // RTL horizontal scrolling uses a negative `scrollLeft` range, from 0 to `-maxScroll`.\n const minScroll = horizontal && direction === 'rtl' ? -maxScroll : 0;\n const maxScrollValue = horizontal && direction === 'rtl' ? 0 : maxScroll;\n const scrollValue = horizontal ? viewportEl.scrollLeft : viewportEl.scrollTop;\n\n // At an edge (or with no overflow), let the wheel chain to the parent/page.\n if ((scrollValue <= minScroll && delta < 0) || (scrollValue >= maxScrollValue && delta > 0)) {\n return;\n }\n\n event.preventDefault();\n\n const next = Math.min(maxScrollValue, Math.max(minScroll, scrollValue + delta));\n if (horizontal) {\n viewportEl.scrollLeft = next;\n } else {\n viewportEl.scrollTop = next;\n }\n\n this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });\n }\n\n onPointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n\n const orientation = this.orientation();\n const thumb =\n orientation === 'vertical' ? this.rootContext.thumbYRef.current : this.rootContext.thumbXRef.current;\n\n // Ignore clicks on the thumb itself.\n if (thumb && eventTargetsElement(event, thumb)) {\n return;\n }\n\n const viewportEl = this.rootContext.viewportRef.current;\n if (!viewportEl) {\n return;\n }\n\n const direction = this.rootContext.direction();\n\n if (\n orientation === 'vertical' &&\n this.rootContext.thumbYRef.current &&\n this.rootContext.scrollbarYRef.current\n ) {\n const thumbEl = this.rootContext.thumbYRef.current;\n const scrollbarEl = this.rootContext.scrollbarYRef.current;\n const thumbYOffset = getOffset(thumbEl, 'margin', 'y');\n const scrollbarYOffset = getOffset(scrollbarEl, 'padding', 'y');\n const thumbHeight = thumbEl.offsetHeight;\n const trackRectY = scrollbarEl.getBoundingClientRect();\n const clickY = event.clientY - trackRectY.top - thumbHeight / 2 - scrollbarYOffset + thumbYOffset / 2;\n\n const maxThumbOffsetY = scrollbarEl.offsetHeight - thumbHeight - scrollbarYOffset - thumbYOffset;\n const scrollRatioY = clickY / maxThumbOffsetY;\n viewportEl.scrollTop = scrollRatioY * (viewportEl.scrollHeight - viewportEl.clientHeight);\n }\n\n if (\n orientation === 'horizontal' &&\n this.rootContext.thumbXRef.current &&\n this.rootContext.scrollbarXRef.current\n ) {\n const thumbEl = this.rootContext.thumbXRef.current;\n const scrollbarEl = this.rootContext.scrollbarXRef.current;\n const thumbXOffset = getOffset(thumbEl, 'margin', 'x');\n const scrollbarXOffset = getOffset(scrollbarEl, 'padding', 'x');\n const thumbWidth = thumbEl.offsetWidth;\n const trackRectX = scrollbarEl.getBoundingClientRect();\n const clickX = event.clientX - trackRectX.left - thumbWidth / 2 - scrollbarXOffset + thumbXOffset / 2;\n\n const maxThumbOffsetX = scrollbarEl.offsetWidth - thumbWidth - scrollbarXOffset - thumbXOffset;\n const scrollRatioX = clickX / maxThumbOffsetX;\n const scrollRange = viewportEl.scrollWidth - viewportEl.clientWidth;\n\n let newScrollLeft: number;\n if (direction === 'rtl') {\n newScrollLeft = (1 - scrollRatioX) * scrollRange;\n // Adjust for browsers that use negative scrollLeft in RTL.\n if (viewportEl.scrollLeft <= 0) {\n newScrollLeft = -newScrollLeft;\n }\n } else {\n newScrollLeft = scrollRatioX * scrollRange;\n }\n viewportEl.scrollLeft = newScrollLeft;\n }\n\n this.rootContext.handleScroll({ x: viewportEl.scrollLeft, y: viewportEl.scrollTop });\n this.rootContext.handlePointerDown(event);\n }\n}\n\nfunction eventTargetsElement(event: Event, element: Element): boolean {\n if (event.composedPath().includes(element)) {\n return true;\n }\n\n const target = event.target;\n return isNode(target) && element.contains(target);\n}\n\nfunction isNode(value: EventTarget | null): value is Node {\n return !!value && 'nodeType' in value;\n}\n","import { Directive, effect, ElementRef, inject } from '@angular/core';\nimport { injectScrollAreaRootContext } from './scroll-area-root';\nimport { injectScrollAreaScrollbarContext } from './scroll-area-scrollbar';\n\n/**\n * The draggable part of the scrollbar that indicates the current scroll position.\n * Renders a `<div>` element.\n *\n * @group Components\n */\n@Directive({\n selector: '[rdxScrollAreaThumb]',\n exportAs: 'rdxScrollAreaThumb',\n host: {\n '[attr.data-orientation]': 'scrollbarContext.orientation()',\n '[attr.data-scrolling]':\n '(scrollbarContext.orientation() === \"horizontal\" ? rootContext.scrollingX() : rootContext.scrollingY()) ? \"\" : undefined',\n '[style.visibility]': 'rootContext.hasMeasuredScrollbar() ? null : \"hidden\"',\n '[style.height]': 'scrollbarContext.orientation() === \"vertical\" ? \"var(--scroll-area-thumb-height)\" : null',\n '[style.width]': 'scrollbarContext.orientation() === \"horizontal\" ? \"var(--scroll-area-thumb-width)\" : null',\n '(pointerdown)': 'rootContext.handlePointerDown($event)',\n '(pointermove)': 'rootContext.handlePointerMove($event)',\n '(pointerup)': 'endDrag($event)',\n '(pointercancel)': 'endDrag($event)'\n }\n})\nexport class RdxScrollAreaThumb {\n protected readonly rootContext = injectScrollAreaRootContext();\n protected readonly scrollbarContext = injectScrollAreaScrollbarContext();\n private readonly element: HTMLElement = inject(ElementRef).nativeElement;\n\n constructor() {\n effect((onCleanup) => {\n const ref =\n this.scrollbarContext.orientation() === 'vertical'\n ? this.rootContext.thumbYRef\n : this.rootContext.thumbXRef;\n ref.current = this.element;\n onCleanup(() => {\n if (ref.current === this.element) {\n ref.current = null;\n }\n });\n });\n }\n\n endDrag(event: PointerEvent): void {\n if (this.scrollbarContext.orientation() === 'vertical') {\n this.rootContext.setScrollingY(false);\n } else {\n this.rootContext.setScrollingX(false);\n }\n this.rootContext.handlePointerUp(event);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RdxScrollAreaContent } from './src/scroll-area-content';\nimport { RdxScrollAreaCorner } from './src/scroll-area-corner';\nimport { RdxScrollAreaRoot } from './src/scroll-area-root';\nimport { RdxScrollAreaScrollbar } from './src/scroll-area-scrollbar';\nimport { RdxScrollAreaThumb } from './src/scroll-area-thumb';\nimport { RdxScrollAreaViewport } from './src/scroll-area-viewport';\n\nexport * from './src/scroll-area-content';\nexport * from './src/scroll-area-corner';\nexport * from './src/scroll-area-root';\nexport * from './src/scroll-area-scrollbar';\nexport * from './src/scroll-area-thumb';\nexport * from './src/scroll-area-viewport';\n\nconst _imports = [\n RdxScrollAreaRoot,\n RdxScrollAreaViewport,\n RdxScrollAreaContent,\n RdxScrollAreaScrollbar,\n RdxScrollAreaThumb,\n RdxScrollAreaCorner\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxScrollAreaModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, model, signal, computed, ElementRef, input, booleanAttribute, output, effect, untracked, Directive, InjectionToken, Injector, DestroyRef, afterNextRender, linkedSignal, contentChild, forwardRef, isDevMode } from '@angular/core';
3
3
  import * as i3 from '@radix-ng/primitives/core';
4
- import { isEqual, getActiveElement, formUiStateContext, createContext, RdxFormUiControlBase, injectId, createFloatingRootContext, useTransitionStatus, isNullish, createCancelableChangeEventDetails, provideFloatingTree, provideFloatingRootContext, RDX_FLOATING_ROOT_CONTEXT, RDX_FLOATING_REGISTRATION, useListHighlight, useAnchoredScrollLock, RdxFloatingNodeRegistration, handleAndDispatchCustomEvent, resizeEffect, clamp, rdxDevError, setupInternalBackdrop } from '@radix-ng/primitives/core';
4
+ import { isEqual, getActiveElement, formUiStateContext, createContext, RdxFormUiControlBase, injectId, createFloatingRootContext, useTransitionStatus, isNullish, createCancelableChangeEventDetails, provideValueAccessor, provideFloatingTree, provideFloatingRootContext, RDX_FLOATING_ROOT_CONTEXT, RDX_FLOATING_REGISTRATION, useListHighlight, useAnchoredScrollLock, RdxFloatingNodeRegistration, handleAndDispatchCustomEvent, resizeEffect, clamp, rdxDevError, setupInternalBackdrop, provideExistingToken, itemToStringLabel } from '@radix-ng/primitives/core';
5
5
  import { injectDirection } from '@radix-ng/primitives/direction-provider';
6
6
  import * as i2 from '@radix-ng/primitives/floating-focus-manager';
7
7
  import { getInteractionTypeFromEvent, provideFloatingFocusManagerConfig, RdxFloatingFocusManager, createRdxTriggerInteraction } from '@radix-ng/primitives/floating-focus-manager';
8
8
  import * as i1 from '@radix-ng/primitives/popper';
9
- import { RdxPopper, RdxPopperContent, RdxPopperContentWrapper, legacyPopperVars, provideRdxPopperContentWrapper, provideRdxPopperContentConfig, RdxPopperAnchor } from '@radix-ng/primitives/popper';
9
+ import { RdxPopper, RdxPopperContent, RdxPopperContentWrapper, legacyPopperVars, provideRdxPopperContentWrapper, provideRdxPopperContentConfig, DROPDOWN_COLLISION_AVOIDANCE, RdxPopperAnchor } from '@radix-ng/primitives/popper';
10
10
  import * as i4 from '@radix-ng/primitives/composite';
11
11
  import { RdxCompositeList, RdxCompositeListItem } from '@radix-ng/primitives/composite';
12
12
  import { RdxDismiss } from '@radix-ng/primitives/dismissable-layer';
@@ -70,7 +70,7 @@ const context$2 = () => {
70
70
  openInteractionType: context.openInteractionType,
71
71
  closeInteractionType: context.closeInteractionType,
72
72
  ...formUiStateContext(context.formUi),
73
- disabled: context.disabled,
73
+ disabled: context.disabledState,
74
74
  readOnly: context.readOnly,
75
75
  required: context.required,
76
76
  modal: context.modal,
@@ -134,6 +134,10 @@ class RdxSelectRoot extends RdxFormUiControlBase {
134
134
  this.defaultOpen = input(false, { ...(ngDevMode ? { debugName: "defaultOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
135
135
  this.multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
136
136
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
137
+ this.cvaDisabled = signal(false, /* @ts-ignore */
138
+ ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
139
+ this.disabledState = computed(() => this.disabled() || this.cvaDisabled(), /* @ts-ignore */
140
+ ...(ngDevMode ? [{ debugName: "disabledState" }] : /* istanbul ignore next */ []));
137
141
  /** When `true`, the value cannot be changed by the user (the popup can still be opened to view it). */
138
142
  this.readOnly = input(false, { ...(ngDevMode ? { debugName: "readOnly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
139
143
  /** Marks the control as required — reflected on the trigger as `aria-required` / `data-required`. */
@@ -197,7 +201,9 @@ class RdxSelectRoot extends RdxFormUiControlBase {
197
201
  const defaultValue = this.defaultValue();
198
202
  if (!this.hasAppliedDefaultValue && defaultValue !== undefined) {
199
203
  this.hasAppliedDefaultValue = true;
200
- this.value.set(defaultValue);
204
+ if (untracked(this.value) === undefined) {
205
+ this.value.set(defaultValue);
206
+ }
201
207
  }
202
208
  });
203
209
  effect(() => {
@@ -237,7 +243,7 @@ class RdxSelectRoot extends RdxFormUiControlBase {
237
243
  return Array.from(this.optionsSet()).find((option) => valueComparator(value, option.value, this.isItemEqualToValue()));
238
244
  }
239
245
  setValue(value, reason = 'none', event = new Event('select.value-change')) {
240
- if (this.readOnly()) {
246
+ if (this.disabledState() || this.readOnly()) {
241
247
  return false;
242
248
  }
243
249
  const nextValue = this.multiple()
@@ -259,6 +265,7 @@ class RdxSelectRoot extends RdxFormUiControlBase {
259
265
  }
260
266
  this.value.set(nextValue);
261
267
  this.formUi.markDirty();
268
+ this.onChange?.(nextValue);
262
269
  return true;
263
270
  }
264
271
  setOpen(open, reason = 'none', event) {
@@ -279,8 +286,29 @@ class RdxSelectRoot extends RdxFormUiControlBase {
279
286
  }
280
287
  return true;
281
288
  }
289
+ /** @ignore Bridge the CVA touched callback into the shared Signal Forms UI-state path. */
290
+ formUiTouchTarget() {
291
+ return { markAsTouched: () => this.onTouched?.() };
292
+ }
293
+ /** @ignore Write a form-owned value without emitting a user change. */
294
+ writeValue(value) {
295
+ untracked(() => this.value.set(value));
296
+ }
297
+ /** @ignore Register the Reactive Forms / ngModel value callback. */
298
+ registerOnChange(fn) {
299
+ this.onChange = fn;
300
+ }
301
+ /** @ignore Register the Reactive Forms / ngModel touched callback. */
302
+ registerOnTouched(fn) {
303
+ this.onTouched = fn;
304
+ }
305
+ /** @ignore Merge form-owned disabled state with the public disabled input. */
306
+ setDisabledState(isDisabled) {
307
+ this.cvaDisabled.set(isDisabled);
308
+ }
282
309
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxSelectRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
283
310
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: RdxSelectRoot, isStandalone: true, selector: "[rdxSelectRoot]", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, defaultOpen: { classPropertyName: "defaultOpen", publicName: "defaultOpen", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readOnly: { classPropertyName: "readOnly", publicName: "readOnly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, dirInput: { classPropertyName: "dirInput", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, isItemEqualToValue: { classPropertyName: "isItemEqualToValue", publicName: "isItemEqualToValue", isSignal: true, isRequired: false, transformFunction: null }, itemToStringLabel: { classPropertyName: "itemToStringLabel", publicName: "itemToStringLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", value: "valueChange", onOpenChange: "onOpenChange", onValueChange: "onValueChange", onOpenChangeComplete: "onOpenChangeComplete" }, providers: [
311
+ provideValueAccessor(RdxSelectRoot),
284
312
  provideSelectRootContext(context$2),
285
313
  // New floating foundation (ADR 0015/0017) — the dismissal capability reads this shared context.
286
314
  provideFloatingTree(),
@@ -293,6 +321,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
293
321
  selector: '[rdxSelectRoot]',
294
322
  exportAs: 'rdxSelectRoot',
295
323
  providers: [
324
+ provideValueAccessor(RdxSelectRoot),
296
325
  provideSelectRootContext(context$2),
297
326
  // New floating foundation (ADR 0015/0017) — the dismissal capability reads this shared context.
298
327
  provideFloatingTree(),
@@ -1315,8 +1344,12 @@ class RdxSelectPositioner extends RdxPopperContentWrapper {
1315
1344
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxSelectPositioner, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1316
1345
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: RdxSelectPositioner, isStandalone: true, selector: "[rdxSelectPositioner]", host: { properties: { "style": "positionerStyle" } }, providers: [
1317
1346
  ...provideRdxPopperContentWrapper(RdxSelectPositioner),
1318
- provideRdxPopperContentConfig({ align: 'start', updatePositionStrategy: 'always' }),
1319
- { provide: RDX_SELECT_POSITIONER_TOKEN, useExisting: forwardRef(() => RdxSelectPositioner) }
1347
+ provideRdxPopperContentConfig({
1348
+ align: 'start',
1349
+ collisionAvoidance: DROPDOWN_COLLISION_AVOIDANCE,
1350
+ updatePositionStrategy: 'always'
1351
+ }),
1352
+ provideExistingToken(RDX_SELECT_POSITIONER_TOKEN, RdxSelectPositioner)
1320
1353
  ], usesInheritance: true, ngImport: i0 }); }
1321
1354
  }
1322
1355
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxSelectPositioner, decorators: [{
@@ -1325,8 +1358,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
1325
1358
  selector: '[rdxSelectPositioner]',
1326
1359
  providers: [
1327
1360
  ...provideRdxPopperContentWrapper(RdxSelectPositioner),
1328
- provideRdxPopperContentConfig({ align: 'start', updatePositionStrategy: 'always' }),
1329
- { provide: RDX_SELECT_POSITIONER_TOKEN, useExisting: forwardRef(() => RdxSelectPositioner) }
1361
+ provideRdxPopperContentConfig({
1362
+ align: 'start',
1363
+ collisionAvoidance: DROPDOWN_COLLISION_AVOIDANCE,
1364
+ updatePositionStrategy: 'always'
1365
+ }),
1366
+ provideExistingToken(RDX_SELECT_POSITIONER_TOKEN, RdxSelectPositioner)
1330
1367
  ],
1331
1368
  host: {
1332
1369
  // The unified vars + placement attrs come from the wrapper (ADR 0012); only `box-sizing` and
@@ -1506,14 +1543,12 @@ class RdxSelectTrigger {
1506
1543
  disabled: () => this.isDisabled(),
1507
1544
  contentId: () => this.rootContext.contentId
1508
1545
  });
1509
- this.invalidState = computed(() => this.rootContext.invalidState() || Boolean(this.fieldRootContext?.invalidState()), /* @ts-ignore */
1510
- ...(ngDevMode ? [{ debugName: "invalidState" }] : /* istanbul ignore next */ []));
1511
1546
  /**
1512
1547
  * Tri-state *displayed* validity: when inside a `rdxFieldRoot` the field's gated `validState` is the
1513
1548
  * single source (so the field's `validationMode` keeps the trigger neutral until revealed), otherwise
1514
1549
  * the trigger's own binary invalidity.
1515
1550
  */
1516
- this.displayValid = computed(() => this.fieldRootContext ? this.fieldRootContext.validState() : this.invalidState() ? false : true, /* @ts-ignore */
1551
+ this.displayValid = computed(() => this.fieldRootContext ? this.fieldRootContext.validState() : this.rootContext.validState(), /* @ts-ignore */
1517
1552
  ...(ngDevMode ? [{ debugName: "displayValid" }] : /* istanbul ignore next */ []));
1518
1553
  this.requiredState = computed(() => this.rootContext.required() || Boolean(this.fieldRootContext?.requiredState()), /* @ts-ignore */
1519
1554
  ...(ngDevMode ? [{ debugName: "requiredState" }] : /* istanbul ignore next */ []));
@@ -1531,10 +1566,7 @@ class RdxSelectTrigger {
1531
1566
  if (!this.fieldRootContext) {
1532
1567
  return undefined;
1533
1568
  }
1534
- const ids = [
1535
- ...this.fieldRootContext.descriptionIds(),
1536
- ...(this.fieldRootContext.invalidState() ? this.fieldRootContext.errorIds() : [])
1537
- ];
1569
+ const ids = [...this.fieldRootContext.descriptionIds(), ...this.fieldRootContext.errorIds()];
1538
1570
  return ids.length ? ids.join(' ') : undefined;
1539
1571
  }, /* @ts-ignore */
1540
1572
  ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
@@ -1672,7 +1704,7 @@ class RdxSelectValue {
1672
1704
  return customLabel(value);
1673
1705
  }
1674
1706
  const option = options.find((o) => valueComparator(value, o.value, this.rootContext.isItemEqualToValue()));
1675
- return option?.textContent ?? '';
1707
+ return option?.textContent ?? itemToStringLabel(value);
1676
1708
  };
1677
1709
  const value = this.rootContext.value();
1678
1710
  const list = Array.isArray(value) ? value.map((v) => labelFor(v)) : [labelFor(value)];