@radix-ng/primitives 1.0.0-beta.1 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/radix-ng-primitives-accordion.mjs +2 -2
- package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-calendar.mjs +14 -1
- package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-checkbox.mjs +2 -2
- package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-collapsible.mjs +1 -1
- package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-combobox.mjs +1923 -0
- package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-context-menu.mjs +1 -1
- package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-core.mjs +480 -469
- package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-cropper.mjs +1 -1
- package/fesm2022/radix-ng-primitives-cropper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-date-field.mjs +11 -0
- package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-dialog.mjs +1 -1
- package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-drawer.mjs +1 -1
- package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-editable.mjs +1 -1
- package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-field.mjs +86 -6
- package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-fieldset.mjs +1 -1
- package/fesm2022/radix-ng-primitives-fieldset.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-focus-scope.mjs +1 -1
- package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-form.mjs +207 -0
- package/fesm2022/radix-ng-primitives-form.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-input.mjs +85 -4
- package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menu.mjs +4 -4
- package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-meter.mjs +1 -1
- package/fesm2022/radix-ng-primitives-meter.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs +1 -1
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-number-field.mjs +2 -2
- package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popover.mjs +1 -1
- package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popper.mjs +1 -1
- package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-preview-card.mjs +1 -1
- package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-progress.mjs +1 -1
- package/fesm2022/radix-ng-primitives-progress.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs +1 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-scroll-area.mjs +3 -3
- package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-select.mjs +421 -224
- package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-switch.mjs +3 -2
- package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tabs.mjs +1 -1
- package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-time-field.mjs +27 -3
- package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toast.mjs +1 -1
- package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toggle-group.mjs +1 -1
- package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toolbar.mjs +2 -2
- package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tooltip.mjs +2 -2
- package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
- package/package.json +9 -1
- package/schematics/ng-add/index.js +57 -0
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/schema.d.ts +1 -0
- package/schematics/ng-add/schema.json +6 -0
- package/types/radix-ng-primitives-combobox.d.ts +1265 -0
- package/types/radix-ng-primitives-core.d.ts +148 -56
- package/types/radix-ng-primitives-field.d.ts +71 -2
- package/types/radix-ng-primitives-form.d.ts +124 -0
- package/types/radix-ng-primitives-input.d.ts +75 -5
- package/types/radix-ng-primitives-select.d.ts +292 -132
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radix-ng-primitives-roving-focus.mjs","sources":["../../../packages/primitives/roving-focus/src/utils.ts","../../../packages/primitives/roving-focus/src/roving-focus-group.directive.ts","../../../packages/primitives/roving-focus/src/roving-focus-item.directive.ts","../../../packages/primitives/roving-focus/index.ts","../../../packages/primitives/roving-focus/radix-ng-primitives-roving-focus.ts"],"sourcesContent":["export type Orientation = 'horizontal' | 'vertical';\nexport type Direction = 'ltr' | 'rtl';\n\nexport const ENTRY_FOCUS = 'rovingFocusGroup.onEntryFocus';\nexport const EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\ntype FocusIntent = 'first' | 'last' | 'prev' | 'next';\n\nexport const MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: 'prev',\n ArrowUp: 'prev',\n ArrowRight: 'next',\n ArrowDown: 'next',\n PageUp: 'first',\n Home: 'first',\n PageDown: 'last',\n End: 'last'\n};\n\nexport function getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== 'rtl') return key;\n return key === 'ArrowLeft' ? 'ArrowRight' : key === 'ArrowRight' ? 'ArrowLeft' : key;\n}\n\nexport function getFocusIntent(event: KeyboardEvent, orientation?: Orientation, dir?: Direction) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === 'vertical' && ['ArrowLeft', 'ArrowRight'].includes(key)) return undefined;\n if (orientation === 'horizontal' && ['ArrowUp', 'ArrowDown'].includes(key)) return undefined;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\n\nexport function focusFirst(candidates: HTMLElement[], preventScroll = false, rootNode?: Document | ShadowRoot) {\n const PREVIOUSLY_FOCUSED_ELEMENT = rootNode?.activeElement ?? document.activeElement;\n for (const candidate of candidates) {\n // if focus is already where we want to go, we don't want to keep going through the candidates\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\n/**\n * Wraps an array around itself at a given start index\n * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`\n */\nexport function wrapArray<T>(array: T[], startIndex: number) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\n\n/**\n * Sorts elements by their position in the document, so the order matches what the user sees.\n */\nexport function sortByDocumentPosition(elements: HTMLElement[]): HTMLElement[] {\n return [...elements].sort((a, b) => (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n}\n\nlet idCounter = 0;\n\nexport function generateId(): string {\n return `rf-item-${++idCounter}`;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output,\n PLATFORM_ID,\n signal\n} from '@angular/core';\nimport { BooleanInput, createContext } from '@radix-ng/primitives/core';\nimport { Direction, ENTRY_FOCUS, EVENT_OPTIONS, focusFirst, Orientation, sortByDocumentPosition } from './utils';\n\nconst rootContext = () => {\n const rovingFocusGroup = inject(RdxRovingFocusGroupDirective);\n return {\n loop: rovingFocusGroup.loop,\n dir: rovingFocusGroup.dir,\n orientation: rovingFocusGroup.orientation,\n currentTabStopId: rovingFocusGroup.currentTabStopId,\n focusableItems: rovingFocusGroup.focusableItems,\n onItemFocus: (tabStopId: string) => {\n rovingFocusGroup.currentTabStopId.set(tabStopId);\n },\n onItemShiftTab: () => {\n rovingFocusGroup.isTabbingBackOut.set(true);\n },\n registerItem: (item: HTMLElement, tabStopId: string) => rovingFocusGroup.registerItem(item, tabStopId),\n unregisterItem: (item: HTMLElement, tabStopId: string) => rovingFocusGroup.unregisterItem(item, tabStopId)\n };\n};\n\nexport type RovingFocusGroupContext = ReturnType<typeof rootContext>;\n\nexport const [injectRovingFocusGroupContext, provideRovingFocusGroupContext] =\n createContext<RovingFocusGroupContext>('RovingFocusGroupContext');\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxRovingFocusGroup]',\n providers: [provideRovingFocusGroupContext(rootContext)],\n host: {\n '[attr.data-orientation]': 'orientation()',\n '[attr.tabindex]': 'isTabbingBackOut() || focusableItems().length === 0 ? -1 : 0',\n '[attr.dir]': 'dir()',\n '(focus)': 'handleFocus($event)',\n '(focusout)': 'isTabbingBackOut.set(false)',\n '(mouseup)': 'handleMouseUp()',\n '(mousedown)': 'isClickFocus.set(true)'\n }\n})\nexport class RdxRovingFocusGroupDirective {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly elementRef = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * The orientation of the group. Mainly so arrow navigation is done accordingly (left & right vs. up & down)\n */\n readonly orientationInput = input<Orientation>('horizontal', { alias: 'orientation' });\n\n /**\n * The direction of navigation between items.\n */\n readonly dirInput = input<Direction>('ltr', { alias: 'dir' });\n\n /**\n * Whether keyboard navigation should loop around\n */\n readonly loopInput = input<boolean, BooleanInput>(true, { transform: booleanAttribute, alias: 'loop' });\n\n /**\n * When `true`, will prevent scrolling to the focus item when focused.\n * @group Props\n */\n readonly preventScrollOnEntryFocus = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /**\n * The value of the current stop item.\n *\n * Use when you do not need to control the state of the stop item.\n * @group Props\n */\n readonly defaultCurrentTabStopId = input<string | undefined>(undefined);\n\n /**\n * The controlled value of the current stop item. Can be binded as `model`.\n * @group Props\n */\n readonly currentTabStopId = model<string | undefined>(undefined);\n\n /**\n * Event handler called when container is being focused. Can be prevented.\n * @group Emits\n */\n readonly entryFocus = output<Event>();\n\n private readonly _orientation = linkedSignal(() => this.orientationInput());\n readonly orientation = this._orientation.asReadonly();\n\n private readonly _dir = linkedSignal(() => this.dirInput());\n readonly dir = this._dir.asReadonly();\n\n private readonly _loop = linkedSignal(() => this.loopInput());\n readonly loop = this._loop.asReadonly();\n\n readonly focusableItems = signal<HTMLElement[]>([]);\n protected readonly isClickFocus = signal(false);\n readonly isTabbingBackOut = signal(false);\n private readonly itemIds = new WeakMap<HTMLElement, string>();\n private isDestroyed = false;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.isDestroyed = true;\n });\n\n effect(() => {\n if (this.currentTabStopId() === undefined) {\n const def = this.defaultCurrentTabStopId();\n if (def !== undefined) {\n this.currentTabStopId.set(def);\n }\n }\n });\n }\n\n setOrientation(value: Orientation) {\n this._orientation.set(value);\n }\n\n setDir(value: Direction) {\n this._dir.set(value);\n }\n\n setLoop(value: boolean) {\n this._loop.set(value);\n }\n\n /** @ignore */\n registerItem(item: HTMLElement, tabStopId: string) {\n this.itemIds.set(item, tabStopId);\n // Keep the registry in DOM order, so arrow navigation matches the visual order\n // regardless of the order in which items are created/registered.\n this.focusableItems.update((items) => sortByDocumentPosition([...items, item]));\n }\n\n /** @ignore */\n unregisterItem(item: HTMLElement, tabStopId: string) {\n const remainingItems = this.focusableItems().filter((el) => el !== item);\n\n this.focusableItems.set(remainingItems);\n this.itemIds.delete(item);\n\n if (!this.isDestroyed && this.currentTabStopId() === tabStopId) {\n this.currentTabStopId.set(this.itemIds.get(remainingItems[0]));\n }\n }\n\n /** @ignore */\n handleMouseUp() {\n if (!this.isBrowser) return;\n\n // reset `isClickFocus` after 1 tick because handleFocus might not triggered due to focused element\n requestAnimationFrame(() => {\n this.isClickFocus.set(false);\n });\n }\n\n /** @ignore */\n handleFocus(event: Event) {\n // We normally wouldn't need this check, because we already check\n // that the focus is on the current target and not bubbling to it.\n // We do this because Safari doesn't focus buttons when clicked, and\n // instead, the wrapper will get focused and not through a bubbling event.\n const isKeyboardFocus = !this.isClickFocus();\n\n if (\n event.currentTarget === this.elementRef.nativeElement &&\n event.target === event.currentTarget &&\n isKeyboardFocus &&\n !this.isTabbingBackOut()\n ) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n this.elementRef.nativeElement.dispatchEvent(entryFocusEvent);\n this.entryFocus.emit(entryFocusEvent);\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = this.focusableItems().filter((item) => item.dataset['disabled'] !== '');\n const activeItem = items.find((item) => item.getAttribute('data-active') === 'true');\n // The current tab stop is the only item with `tabindex=\"0\"` (driven by\n // `currentTabStopId`). We match on it instead of the DOM `id`, because consumers\n // (tabs, navigation-menu) own the element `id` and it may not equal the internal id.\n const currentItem = items.find((item) => item.getAttribute('tabindex') === '0');\n\n const candidateItems = [activeItem, currentItem, ...items].filter(Boolean) as typeof items;\n\n focusFirst(candidateItems, this.preventScrollOnEntryFocus());\n }\n }\n\n this.isClickFocus.set(false);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n PLATFORM_ID,\n untracked\n} from '@angular/core';\nimport { BooleanInput } from '@radix-ng/primitives/core';\nimport { injectRovingFocusGroupContext } from './roving-focus-group.directive';\nimport { focusFirst, generateId, getFocusIntent, wrapArray } from './utils';\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxRovingFocusItem]',\n host: {\n '[attr.tabindex]': 'tabindex()',\n '[attr.data-orientation]': 'rootContext?.orientation()',\n '[attr.data-active]': 'active() ? \"true\" : undefined',\n '[attr.data-disabled]': '!focusable() ? \"\" : undefined',\n '(mousedown)': 'handleMouseDown($event)',\n '(keydown)': 'handleKeydown($event)',\n '(focus)': 'onFocus()'\n }\n})\nexport class RdxRovingFocusItemDirective {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly elementRef = inject(ElementRef);\n\n /**\n * The enclosing roving-focus group. Optional: when the item is used outside a group\n * (e.g. a standalone Toggle), it degrades to a plain element and does not manage focus.\n */\n protected readonly rootContext = injectRovingFocusGroupContext(true);\n\n /**\n * When false, item will not be focusable.\n * @group Props\n */\n readonly focusableInput = input<boolean, BooleanInput>(true, { transform: booleanAttribute, alias: 'focusable' });\n\n /**\n * When `true`, marks the item as the active one, so it is preferred when focus enters the group.\n * @group Props\n */\n readonly activeInput = input<boolean, BooleanInput>(false, { transform: booleanAttribute, alias: 'active' });\n\n /**\n * @group Props\n */\n readonly tabStopIdInput = input<string>(undefined, { alias: 'tabStopId' });\n\n /**\n * When true, shift + arrow key will allow focusing on next/previous item.\n * @group Props\n */\n readonly allowShiftKey = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n // Stable fallback id, generated once so it never changes across recomputations of `id`.\n private readonly generatedId = generateId();\n protected readonly id = computed(() => this.tabStopId() || this.generatedId);\n protected readonly isCurrentTabStop = computed(() => this.rootContext?.currentTabStopId() === this.id());\n\n protected readonly focusable = linkedSignal(() => this.focusableInput());\n protected readonly active = linkedSignal(() => this.activeInput());\n private readonly tabStopId = linkedSignal(() => this.tabStopIdInput());\n\n /**\n * The roving tabindex. Without a group the item keeps its natural tab order (`null`); inside a\n * group exactly one focusable item is a tab stop (`0`), the rest are reachable only via arrows (`-1`).\n */\n protected readonly tabindex = computed(() => {\n if (!this.rootContext) {\n return null;\n }\n return this.focusable() && this.isCurrentTabStop() ? 0 : -1;\n });\n\n constructor() {\n // Keep the group's registry in sync with `focusable`, which can change after creation\n // (e.g. toolbar/navigation-menu toggle it via `setFocusable`). The cleanup also runs on\n // destroy, so a single effect covers register/unregister for the whole lifecycle.\n effect((onCleanup) => {\n const rootContext = this.rootContext;\n if (!rootContext || !this.focusable()) return;\n\n const element = this.elementRef.nativeElement;\n // `registerItem` reads and writes the group's `focusableItems` signal; calling it\n // untracked prevents the effect from depending on its own write and looping.\n const tabStopId = this.id();\n untracked(() => rootContext.registerItem(element, tabStopId));\n\n onCleanup(() => rootContext.unregisterItem(element, tabStopId));\n });\n }\n\n setFocusable(value: boolean) {\n this.focusable.set(value);\n }\n\n setActive(value: boolean) {\n this.active.set(value);\n }\n\n setTabStopId(value: string) {\n this.tabStopId.set(value);\n }\n\n /** @ignore */\n onFocus() {\n this.rootContext?.onItemFocus(this.id());\n }\n\n /** @ignore */\n handleMouseDown(event: Event) {\n if (!this.focusable()) {\n // We prevent focusing non-focusable items on `mousedown`.\n // Even though the item has tabIndex={-1}, that only means take it out of the tab order.\n event.preventDefault();\n } else {\n // Safari doesn't focus a button when clicked so we run our logic on mousedown also\n this.rootContext?.onItemFocus(this.id());\n }\n }\n\n /**\n * Handles the `keydown` event for keyboard navigation within the roving focus group.\n * Supports navigation based on orientation and direction, and focuses appropriate elements.\n *\n * @param event The `KeyboardEvent` object.\n * @ignore\n */\n handleKeydown(event: Event) {\n const rootContext = this.rootContext;\n if (!rootContext) return;\n\n const keyEvent = event as KeyboardEvent;\n if (keyEvent.key === 'Tab' && keyEvent.shiftKey) {\n rootContext.onItemShiftTab();\n return;\n }\n\n if (event.target !== this.elementRef.nativeElement) return;\n\n const focusIntent = getFocusIntent(keyEvent, rootContext.orientation(), rootContext.dir());\n\n if (focusIntent !== undefined) {\n if (\n keyEvent.metaKey ||\n keyEvent.ctrlKey ||\n keyEvent.altKey ||\n (this.allowShiftKey() ? false : keyEvent.shiftKey)\n ) {\n return;\n }\n\n event.preventDefault();\n\n let candidateNodes = rootContext.focusableItems().filter((item) => item.dataset['disabled'] !== '');\n\n if (focusIntent === 'last') {\n candidateNodes.reverse();\n } else if (focusIntent === 'prev' || focusIntent === 'next') {\n if (focusIntent === 'prev') candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(this.elementRef.nativeElement);\n\n candidateNodes = rootContext.loop()\n ? wrapArray(candidateNodes, currentIndex + 1)\n : candidateNodes.slice(currentIndex + 1);\n }\n\n queueMicrotask(() => {\n if (this.isBrowser) {\n const rootNode = this.elementRef.nativeElement.getRootNode() as Document | ShadowRoot;\n focusFirst(candidateNodes, false, rootNode);\n }\n });\n }\n }\n}\n","import { RdxRovingFocusGroupDirective } from './src/roving-focus-group.directive';\nimport { RdxRovingFocusItemDirective } from './src/roving-focus-item.directive';\n\nexport * from './src/roving-focus-group.directive';\nexport * from './src/roving-focus-item.directive';\n\nexport { focusFirst } from './src/utils';\nexport type { Direction, Orientation } from './src/utils';\n\nexport const rovingFocusImports = [RdxRovingFocusGroupDirective, RdxRovingFocusItemDirective];\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-roving-focus.mjs","sources":["../../../packages/primitives/roving-focus/src/utils.ts","../../../packages/primitives/roving-focus/src/roving-focus-group.directive.ts","../../../packages/primitives/roving-focus/src/roving-focus-item.directive.ts","../../../packages/primitives/roving-focus/index.ts","../../../packages/primitives/roving-focus/radix-ng-primitives-roving-focus.ts"],"sourcesContent":["export type Orientation = 'horizontal' | 'vertical';\nexport type Direction = 'ltr' | 'rtl';\n\nexport const ENTRY_FOCUS = 'rovingFocusGroup.onEntryFocus';\nexport const EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\ntype FocusIntent = 'first' | 'last' | 'prev' | 'next';\n\nexport const MAP_KEY_TO_FOCUS_INTENT: Record<string, FocusIntent> = {\n ArrowLeft: 'prev',\n ArrowUp: 'prev',\n ArrowRight: 'next',\n ArrowDown: 'next',\n PageUp: 'first',\n Home: 'first',\n PageDown: 'last',\n End: 'last'\n};\n\nexport function getDirectionAwareKey(key: string, dir?: Direction) {\n if (dir !== 'rtl') return key;\n return key === 'ArrowLeft' ? 'ArrowRight' : key === 'ArrowRight' ? 'ArrowLeft' : key;\n}\n\nexport function getFocusIntent(event: KeyboardEvent, orientation?: Orientation, dir?: Direction) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === 'vertical' && ['ArrowLeft', 'ArrowRight'].includes(key)) return undefined;\n if (orientation === 'horizontal' && ['ArrowUp', 'ArrowDown'].includes(key)) return undefined;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\n\nexport function focusFirst(candidates: HTMLElement[], preventScroll = false, rootNode?: Document | ShadowRoot) {\n const PREVIOUSLY_FOCUSED_ELEMENT = rootNode?.activeElement ?? document.activeElement;\n for (const candidate of candidates) {\n // if focus is already where we want to go, we don't want to keep going through the candidates\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\n\n/**\n * Wraps an array around itself at a given start index\n * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`\n */\nexport function wrapArray<T>(array: T[], startIndex: number) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\n\n/**\n * Sorts elements by their position in the document, so the order matches what the user sees.\n */\nexport function sortByDocumentPosition(elements: HTMLElement[]): HTMLElement[] {\n return [...elements].sort((a, b) => (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1));\n}\n\nlet idCounter = 0;\n\nexport function generateId(): string {\n return `rf-item-${++idCounter}`;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output,\n PLATFORM_ID,\n signal\n} from '@angular/core';\nimport { BooleanInput, createContext } from '@radix-ng/primitives/core';\nimport { Direction, ENTRY_FOCUS, EVENT_OPTIONS, focusFirst, Orientation, sortByDocumentPosition } from './utils';\n\nconst rootContext = () => {\n const rovingFocusGroup = inject(RdxRovingFocusGroupDirective);\n return {\n loop: rovingFocusGroup.loop,\n dir: rovingFocusGroup.dir,\n orientation: rovingFocusGroup.orientation,\n currentTabStopId: rovingFocusGroup.currentTabStopId,\n focusableItems: rovingFocusGroup.focusableItems,\n onItemFocus: (tabStopId: string) => {\n rovingFocusGroup.currentTabStopId.set(tabStopId);\n },\n onItemShiftTab: () => {\n rovingFocusGroup.isTabbingBackOut.set(true);\n },\n registerItem: (item: HTMLElement, tabStopId: string) => rovingFocusGroup.registerItem(item, tabStopId),\n unregisterItem: (item: HTMLElement, tabStopId: string) => rovingFocusGroup.unregisterItem(item, tabStopId)\n };\n};\n\nexport type RovingFocusGroupContext = ReturnType<typeof rootContext>;\n\nexport const [injectRovingFocusGroupContext, provideRovingFocusGroupContext] = createContext<RovingFocusGroupContext>(\n 'RovingFocusGroupContext',\n 'utils/roving-focus'\n);\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxRovingFocusGroup]',\n providers: [provideRovingFocusGroupContext(rootContext)],\n host: {\n '[attr.data-orientation]': 'orientation()',\n '[attr.tabindex]': 'isTabbingBackOut() || focusableItems().length === 0 ? -1 : 0',\n '[attr.dir]': 'dir()',\n '(focus)': 'handleFocus($event)',\n '(focusout)': 'isTabbingBackOut.set(false)',\n '(mouseup)': 'handleMouseUp()',\n '(mousedown)': 'isClickFocus.set(true)'\n }\n})\nexport class RdxRovingFocusGroupDirective {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly elementRef = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * The orientation of the group. Mainly so arrow navigation is done accordingly (left & right vs. up & down)\n */\n readonly orientationInput = input<Orientation>('horizontal', { alias: 'orientation' });\n\n /**\n * The direction of navigation between items.\n */\n readonly dirInput = input<Direction>('ltr', { alias: 'dir' });\n\n /**\n * Whether keyboard navigation should loop around\n */\n readonly loopInput = input<boolean, BooleanInput>(true, { transform: booleanAttribute, alias: 'loop' });\n\n /**\n * When `true`, will prevent scrolling to the focus item when focused.\n * @group Props\n */\n readonly preventScrollOnEntryFocus = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /**\n * The value of the current stop item.\n *\n * Use when you do not need to control the state of the stop item.\n * @group Props\n */\n readonly defaultCurrentTabStopId = input<string | undefined>(undefined);\n\n /**\n * The controlled value of the current stop item. Can be binded as `model`.\n * @group Props\n */\n readonly currentTabStopId = model<string | undefined>(undefined);\n\n /**\n * Event handler called when container is being focused. Can be prevented.\n * @group Emits\n */\n readonly entryFocus = output<Event>();\n\n private readonly _orientation = linkedSignal(() => this.orientationInput());\n readonly orientation = this._orientation.asReadonly();\n\n private readonly _dir = linkedSignal(() => this.dirInput());\n readonly dir = this._dir.asReadonly();\n\n private readonly _loop = linkedSignal(() => this.loopInput());\n readonly loop = this._loop.asReadonly();\n\n readonly focusableItems = signal<HTMLElement[]>([]);\n protected readonly isClickFocus = signal(false);\n readonly isTabbingBackOut = signal(false);\n private readonly itemIds = new WeakMap<HTMLElement, string>();\n private isDestroyed = false;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.isDestroyed = true;\n });\n\n effect(() => {\n if (this.currentTabStopId() === undefined) {\n const def = this.defaultCurrentTabStopId();\n if (def !== undefined) {\n this.currentTabStopId.set(def);\n }\n }\n });\n }\n\n setOrientation(value: Orientation) {\n this._orientation.set(value);\n }\n\n setDir(value: Direction) {\n this._dir.set(value);\n }\n\n setLoop(value: boolean) {\n this._loop.set(value);\n }\n\n /** @ignore */\n registerItem(item: HTMLElement, tabStopId: string) {\n this.itemIds.set(item, tabStopId);\n // Keep the registry in DOM order, so arrow navigation matches the visual order\n // regardless of the order in which items are created/registered.\n this.focusableItems.update((items) => sortByDocumentPosition([...items, item]));\n }\n\n /** @ignore */\n unregisterItem(item: HTMLElement, tabStopId: string) {\n const remainingItems = this.focusableItems().filter((el) => el !== item);\n\n this.focusableItems.set(remainingItems);\n this.itemIds.delete(item);\n\n if (!this.isDestroyed && this.currentTabStopId() === tabStopId) {\n this.currentTabStopId.set(this.itemIds.get(remainingItems[0]));\n }\n }\n\n /** @ignore */\n handleMouseUp() {\n if (!this.isBrowser) return;\n\n // reset `isClickFocus` after 1 tick because handleFocus might not triggered due to focused element\n requestAnimationFrame(() => {\n this.isClickFocus.set(false);\n });\n }\n\n /** @ignore */\n handleFocus(event: Event) {\n // We normally wouldn't need this check, because we already check\n // that the focus is on the current target and not bubbling to it.\n // We do this because Safari doesn't focus buttons when clicked, and\n // instead, the wrapper will get focused and not through a bubbling event.\n const isKeyboardFocus = !this.isClickFocus();\n\n if (\n event.currentTarget === this.elementRef.nativeElement &&\n event.target === event.currentTarget &&\n isKeyboardFocus &&\n !this.isTabbingBackOut()\n ) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n this.elementRef.nativeElement.dispatchEvent(entryFocusEvent);\n this.entryFocus.emit(entryFocusEvent);\n\n if (!entryFocusEvent.defaultPrevented) {\n const items = this.focusableItems().filter((item) => item.dataset['disabled'] !== '');\n const activeItem = items.find((item) => item.getAttribute('data-active') === 'true');\n // The current tab stop is the only item with `tabindex=\"0\"` (driven by\n // `currentTabStopId`). We match on it instead of the DOM `id`, because consumers\n // (tabs, navigation-menu) own the element `id` and it may not equal the internal id.\n const currentItem = items.find((item) => item.getAttribute('tabindex') === '0');\n\n const candidateItems = [activeItem, currentItem, ...items].filter(Boolean) as typeof items;\n\n focusFirst(candidateItems, this.preventScrollOnEntryFocus());\n }\n }\n\n this.isClickFocus.set(false);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n PLATFORM_ID,\n untracked\n} from '@angular/core';\nimport { BooleanInput } from '@radix-ng/primitives/core';\nimport { injectRovingFocusGroupContext } from './roving-focus-group.directive';\nimport { focusFirst, generateId, getFocusIntent, wrapArray } from './utils';\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxRovingFocusItem]',\n host: {\n '[attr.tabindex]': 'tabindex()',\n '[attr.data-orientation]': 'rootContext?.orientation()',\n '[attr.data-active]': 'active() ? \"true\" : undefined',\n '[attr.data-disabled]': '!focusable() ? \"\" : undefined',\n '(mousedown)': 'handleMouseDown($event)',\n '(keydown)': 'handleKeydown($event)',\n '(focus)': 'onFocus()'\n }\n})\nexport class RdxRovingFocusItemDirective {\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly elementRef = inject(ElementRef);\n\n /**\n * The enclosing roving-focus group. Optional: when the item is used outside a group\n * (e.g. a standalone Toggle), it degrades to a plain element and does not manage focus.\n */\n protected readonly rootContext = injectRovingFocusGroupContext(true);\n\n /**\n * When false, item will not be focusable.\n * @group Props\n */\n readonly focusableInput = input<boolean, BooleanInput>(true, { transform: booleanAttribute, alias: 'focusable' });\n\n /**\n * When `true`, marks the item as the active one, so it is preferred when focus enters the group.\n * @group Props\n */\n readonly activeInput = input<boolean, BooleanInput>(false, { transform: booleanAttribute, alias: 'active' });\n\n /**\n * @group Props\n */\n readonly tabStopIdInput = input<string>(undefined, { alias: 'tabStopId' });\n\n /**\n * When true, shift + arrow key will allow focusing on next/previous item.\n * @group Props\n */\n readonly allowShiftKey = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n // Stable fallback id, generated once so it never changes across recomputations of `id`.\n private readonly generatedId = generateId();\n protected readonly id = computed(() => this.tabStopId() || this.generatedId);\n protected readonly isCurrentTabStop = computed(() => this.rootContext?.currentTabStopId() === this.id());\n\n protected readonly focusable = linkedSignal(() => this.focusableInput());\n protected readonly active = linkedSignal(() => this.activeInput());\n private readonly tabStopId = linkedSignal(() => this.tabStopIdInput());\n\n /**\n * The roving tabindex. Without a group the item keeps its natural tab order (`null`); inside a\n * group exactly one focusable item is a tab stop (`0`), the rest are reachable only via arrows (`-1`).\n */\n protected readonly tabindex = computed(() => {\n if (!this.rootContext) {\n return null;\n }\n return this.focusable() && this.isCurrentTabStop() ? 0 : -1;\n });\n\n constructor() {\n // Keep the group's registry in sync with `focusable`, which can change after creation\n // (e.g. toolbar/navigation-menu toggle it via `setFocusable`). The cleanup also runs on\n // destroy, so a single effect covers register/unregister for the whole lifecycle.\n effect((onCleanup) => {\n const rootContext = this.rootContext;\n if (!rootContext || !this.focusable()) return;\n\n const element = this.elementRef.nativeElement;\n // `registerItem` reads and writes the group's `focusableItems` signal; calling it\n // untracked prevents the effect from depending on its own write and looping.\n const tabStopId = this.id();\n untracked(() => rootContext.registerItem(element, tabStopId));\n\n onCleanup(() => rootContext.unregisterItem(element, tabStopId));\n });\n }\n\n setFocusable(value: boolean) {\n this.focusable.set(value);\n }\n\n setActive(value: boolean) {\n this.active.set(value);\n }\n\n setTabStopId(value: string) {\n this.tabStopId.set(value);\n }\n\n /** @ignore */\n onFocus() {\n this.rootContext?.onItemFocus(this.id());\n }\n\n /** @ignore */\n handleMouseDown(event: Event) {\n if (!this.focusable()) {\n // We prevent focusing non-focusable items on `mousedown`.\n // Even though the item has tabIndex={-1}, that only means take it out of the tab order.\n event.preventDefault();\n } else {\n // Safari doesn't focus a button when clicked so we run our logic on mousedown also\n this.rootContext?.onItemFocus(this.id());\n }\n }\n\n /**\n * Handles the `keydown` event for keyboard navigation within the roving focus group.\n * Supports navigation based on orientation and direction, and focuses appropriate elements.\n *\n * @param event The `KeyboardEvent` object.\n * @ignore\n */\n handleKeydown(event: Event) {\n const rootContext = this.rootContext;\n if (!rootContext) return;\n\n const keyEvent = event as KeyboardEvent;\n if (keyEvent.key === 'Tab' && keyEvent.shiftKey) {\n rootContext.onItemShiftTab();\n return;\n }\n\n if (event.target !== this.elementRef.nativeElement) return;\n\n const focusIntent = getFocusIntent(keyEvent, rootContext.orientation(), rootContext.dir());\n\n if (focusIntent !== undefined) {\n if (\n keyEvent.metaKey ||\n keyEvent.ctrlKey ||\n keyEvent.altKey ||\n (this.allowShiftKey() ? false : keyEvent.shiftKey)\n ) {\n return;\n }\n\n event.preventDefault();\n\n let candidateNodes = rootContext.focusableItems().filter((item) => item.dataset['disabled'] !== '');\n\n if (focusIntent === 'last') {\n candidateNodes.reverse();\n } else if (focusIntent === 'prev' || focusIntent === 'next') {\n if (focusIntent === 'prev') candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(this.elementRef.nativeElement);\n\n candidateNodes = rootContext.loop()\n ? wrapArray(candidateNodes, currentIndex + 1)\n : candidateNodes.slice(currentIndex + 1);\n }\n\n queueMicrotask(() => {\n if (this.isBrowser) {\n const rootNode = this.elementRef.nativeElement.getRootNode() as Document | ShadowRoot;\n focusFirst(candidateNodes, false, rootNode);\n }\n });\n }\n }\n}\n","import { RdxRovingFocusGroupDirective } from './src/roving-focus-group.directive';\nimport { RdxRovingFocusItemDirective } from './src/roving-focus-item.directive';\n\nexport * from './src/roving-focus-group.directive';\nexport * from './src/roving-focus-item.directive';\n\nexport { focusFirst } from './src/utils';\nexport type { Direction, Orientation } from './src/utils';\n\nexport const rovingFocusImports = [RdxRovingFocusGroupDirective, RdxRovingFocusItemDirective];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -74,7 +74,7 @@ function injectScrollbarHideStyles(document) {
|
|
|
74
74
|
const DEFAULT_SIZE = { width: 0, height: 0 };
|
|
75
75
|
const DEFAULT_OVERFLOW_EDGES = { xStart: false, xEnd: false, yStart: false, yEnd: false };
|
|
76
76
|
const DEFAULT_HIDDEN_STATE = { x: true, y: true, corner: true };
|
|
77
|
-
const [injectScrollAreaRootContext, provideScrollAreaRootContext] = createContext('ScrollAreaRootContext');
|
|
77
|
+
const [injectScrollAreaRootContext, provideScrollAreaRootContext] = createContext('ScrollAreaRootContext', 'components/scroll-area');
|
|
78
78
|
const rootContext = () => {
|
|
79
79
|
const root = inject(RdxScrollAreaRoot);
|
|
80
80
|
return {
|
|
@@ -336,7 +336,7 @@ function normalizeOverflowEdgeThreshold(threshold) {
|
|
|
336
336
|
};
|
|
337
337
|
}
|
|
338
338
|
|
|
339
|
-
const [injectScrollAreaViewportContext, provideScrollAreaViewportContext] = createContext('ScrollAreaViewportContext');
|
|
339
|
+
const [injectScrollAreaViewportContext, provideScrollAreaViewportContext] = createContext('ScrollAreaViewportContext', 'components/scroll-area');
|
|
340
340
|
const viewportContext = () => {
|
|
341
341
|
const viewport = inject(RdxScrollAreaViewport);
|
|
342
342
|
return {
|
|
@@ -670,7 +670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
670
670
|
}]
|
|
671
671
|
}], ctorParameters: () => [] });
|
|
672
672
|
|
|
673
|
-
const [injectScrollAreaScrollbarContext, provideScrollAreaScrollbarContext] = createContext('ScrollAreaScrollbarContext');
|
|
673
|
+
const [injectScrollAreaScrollbarContext, provideScrollAreaScrollbarContext] = createContext('ScrollAreaScrollbarContext', 'components/scroll-area');
|
|
674
674
|
const scrollbarContext = () => {
|
|
675
675
|
const scrollbar = inject(RdxScrollAreaScrollbar);
|
|
676
676
|
return { orientation: () => scrollbar.orientation() };
|
|
@@ -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\nlet scrollbarHideStylesInjected = false;\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): void {\n if (scrollbarHideStylesInjected || typeof document === 'undefined') {\n return;\n }\n scrollbarHideStylesInjected = true;\n\n const style = document.createElement('style');\n style.setAttribute('data-rdx-scroll-area', '');\n style.textContent = `[rdxScrollAreaViewport]{scrollbar-width:none;-ms-overflow-style:none}[rdxScrollAreaViewport]::-webkit-scrollbar{display:none}`;\n document.head.appendChild(style);\n}\n","import { computed, DestroyRef, Directive, ElementRef, inject, input, signal, Signal } from '@angular/core';\nimport { createContext, Direction } from '@radix-ng/primitives/core';\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\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] =\n createContext<ScrollAreaRootContext>('ScrollAreaRootContext');\n\nconst rootContext = (): ScrollAreaRootContext => {\n const root = inject(RdxScrollAreaRoot);\n return {\n rootId: root.rootId,\n direction: root.direction,\n overflowEdgeThreshold: root.normalizedThreshold,\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\nlet idCounter = 0;\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 = `rdx-scroll-area-${idCounter++}`;\n\n /** Text direction of the scroll area. Affects horizontal (RTL) scroll math. */\n readonly dir = input<Direction>('ltr');\n readonly direction: Signal<Direction> = this.dir;\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\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 { afterNextRender, DestroyRef, Directive, effect, ElementRef, inject, PLATFORM_ID } 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');\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\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 injectScrollbarHideStyles(document);\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 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 { 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 this.rootContext.cornerRef.current = inject(ElementRef).nativeElement;\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');\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(() => {\n if (this.orientation() === 'vertical') {\n this.rootContext.scrollbarYRef.current = this.element;\n } else {\n this.rootContext.scrollbarXRef.current = this.element;\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 target = event.target as Node | null;\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 && target && thumb.contains(target)) {\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","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 '[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(() => {\n if (this.scrollbarContext.orientation() === 'vertical') {\n this.rootContext.thumbYRef.current = this.element;\n } else {\n this.rootContext.thumbXRef.current = this.element;\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\nlet scrollbarHideStylesInjected = false;\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): void {\n if (scrollbarHideStylesInjected || typeof document === 'undefined') {\n return;\n }\n scrollbarHideStylesInjected = true;\n\n const style = document.createElement('style');\n style.setAttribute('data-rdx-scroll-area', '');\n style.textContent = `[rdxScrollAreaViewport]{scrollbar-width:none;-ms-overflow-style:none}[rdxScrollAreaViewport]::-webkit-scrollbar{display:none}`;\n document.head.appendChild(style);\n}\n","import { computed, DestroyRef, Directive, ElementRef, inject, input, signal, Signal } from '@angular/core';\nimport { createContext, Direction } from '@radix-ng/primitives/core';\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\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 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\nlet idCounter = 0;\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 = `rdx-scroll-area-${idCounter++}`;\n\n /** Text direction of the scroll area. Affects horizontal (RTL) scroll math. */\n readonly dir = input<Direction>('ltr');\n readonly direction: Signal<Direction> = this.dir;\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\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 { afterNextRender, DestroyRef, Directive, effect, ElementRef, inject, PLATFORM_ID } 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\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 injectScrollbarHideStyles(document);\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 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 { 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 this.rootContext.cornerRef.current = inject(ElementRef).nativeElement;\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(() => {\n if (this.orientation() === 'vertical') {\n this.rootContext.scrollbarYRef.current = this.element;\n } else {\n this.rootContext.scrollbarXRef.current = this.element;\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 target = event.target as Node | null;\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 && target && thumb.contains(target)) {\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","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 '[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(() => {\n if (this.scrollbarContext.orientation() === 'vertical') {\n this.rootContext.thumbYRef.current = this.element;\n } else {\n this.rootContext.thumbXRef.current = this.element;\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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"}
|