@raqm/ui 0.1.2 → 0.2.1
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/CHANGELOG.md +26 -0
- package/README.md +87 -126
- package/fesm2022/raqm-ui-badge.mjs +3 -1
- package/fesm2022/raqm-ui-badge.mjs.map +1 -1
- package/fesm2022/raqm-ui-calendar.mjs +79 -12
- package/fesm2022/raqm-ui-calendar.mjs.map +1 -1
- package/fesm2022/raqm-ui-combobox.mjs +47 -23
- package/fesm2022/raqm-ui-combobox.mjs.map +1 -1
- package/fesm2022/raqm-ui-command.mjs +60 -12
- package/fesm2022/raqm-ui-command.mjs.map +1 -1
- package/fesm2022/raqm-ui-dialog.mjs +1 -3
- package/fesm2022/raqm-ui-dialog.mjs.map +1 -1
- package/fesm2022/raqm-ui-dropdown-menu.mjs.map +1 -1
- package/fesm2022/raqm-ui-hover-card.mjs.map +1 -1
- package/fesm2022/raqm-ui-icon.mjs +160 -0
- package/fesm2022/raqm-ui-icon.mjs.map +1 -0
- package/fesm2022/raqm-ui-input-otp.mjs +7 -4
- package/fesm2022/raqm-ui-input-otp.mjs.map +1 -1
- package/fesm2022/raqm-ui-menubar.mjs.map +1 -1
- package/fesm2022/raqm-ui-overlay-internal.mjs +15 -5
- package/fesm2022/raqm-ui-overlay-internal.mjs.map +1 -1
- package/fesm2022/raqm-ui-popover.mjs +51 -19
- package/fesm2022/raqm-ui-popover.mjs.map +1 -1
- package/fesm2022/raqm-ui-resizable.mjs +14 -4
- package/fesm2022/raqm-ui-resizable.mjs.map +1 -1
- package/fesm2022/raqm-ui-scroll-area.mjs +85 -29
- package/fesm2022/raqm-ui-scroll-area.mjs.map +1 -1
- package/fesm2022/raqm-ui-select.mjs +46 -19
- package/fesm2022/raqm-ui-select.mjs.map +1 -1
- package/fesm2022/raqm-ui-sidebar.mjs +13 -3
- package/fesm2022/raqm-ui-sidebar.mjs.map +1 -1
- package/fesm2022/raqm-ui-slider.mjs +59 -12
- package/fesm2022/raqm-ui-slider.mjs.map +1 -1
- package/fesm2022/raqm-ui-toast.mjs +60 -20
- package/fesm2022/raqm-ui-toast.mjs.map +1 -1
- package/fesm2022/raqm-ui-tooltip.mjs +28 -3
- package/fesm2022/raqm-ui-tooltip.mjs.map +1 -1
- package/fesm2022/raqm-ui.mjs +1 -0
- package/package.json +52 -18
- package/styles/accordion.css +1 -0
- package/styles/alert-dialog.css +1 -0
- package/styles/alert.css +1 -0
- package/styles/attachment.css +1 -0
- package/styles/avatar.css +1 -0
- package/styles/badge.css +1 -0
- package/styles/base.css +1 -0
- package/styles/button-group.css +1 -0
- package/styles/button.css +1 -0
- package/styles/checkbox.css +1 -0
- package/styles/combobox.css +1 -0
- package/styles/command.css +1 -0
- package/styles/common.css +17 -0
- package/styles/context-menu.css +1 -0
- package/styles/dialog.css +1 -0
- package/styles/drawer.css +1 -0
- package/styles/dropdown-menu.css +1 -0
- package/styles/empty.css +1 -0
- package/styles/field-parts.css +1 -0
- package/styles/field-relationships.css +1 -0
- package/styles/input-group-button.css +1 -0
- package/styles/input-group-relationships.css +1 -0
- package/styles/input-otp.css +1 -0
- package/styles/input.css +1 -0
- package/styles/item.css +1 -0
- package/styles/kbd.css +1 -0
- package/styles/menubar.css +1 -0
- package/styles/native-select.css +1 -0
- package/styles/navigation-menu.css +1 -0
- package/styles/overlay.css +1 -0
- package/styles/pagination.css +1 -0
- package/styles/popover.css +1 -0
- package/styles/questionnaire.css +1 -0
- package/styles/radio-group.css +1 -0
- package/styles/resizable.css +1 -0
- package/styles/sheet.css +1 -0
- package/styles/sidebar.css +1 -0
- package/styles/spinner.css +1 -0
- package/styles/switch.css +1 -0
- package/styles/table.css +1 -0
- package/styles/tabs.css +1 -0
- package/styles/textarea.css +1 -0
- package/styles/theme.css +50 -4324
- package/styles/toggle-group.css +1 -0
- package/styles/toggle.css +1 -0
- package/styles/tooltip.css +1 -0
- package/types/raqm-ui-calendar.d.ts +1 -0
- package/types/raqm-ui-combobox.d.ts +8 -4
- package/types/raqm-ui-command.d.ts +4 -0
- package/types/raqm-ui-dialog.d.ts +7 -1
- package/types/raqm-ui-icon.d.ts +65 -0
- package/types/raqm-ui-input-otp.d.ts +1 -0
- package/types/raqm-ui-resizable.d.ts +4 -0
- package/types/raqm-ui-rolldown-runtime-C25Le4-w.d.ts +1 -0
- package/types/raqm-ui-scroll-area.d.ts +11 -0
- package/types/raqm-ui-slider.d.ts +1 -1
- package/types/raqm-ui-toast.d.ts +6 -0
- package/types/raqm-ui.d.ts +1 -0
- package/fesm2022/raqm-ui-carousel.mjs +0 -410
- package/fesm2022/raqm-ui-carousel.mjs.map +0 -1
- package/types/raqm-ui-carousel.d.ts +0 -81
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raqm-ui-resizable.mjs","names":[],"sources":["../../../projects/ui/resizable/resizable.ts","../../../projects/ui/resizable/public-api.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n contentChildren,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { _IdGenerator } from '@angular/cdk/a11y';\r\n\r\n/** Raqm resizable panel group — percentage-based panels with a draggable divider; the app supplies every accessible name. */\r\n@Component({\r\n selector: 'raqm-resizable-panel-group',\r\n template: '<ng-content />',\r\n styleUrl: './resizable.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-resizable-panel-group',\r\n '[attr.data-raqm-vertical]': 'vertical() ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmResizablePanelGroupComponent {\r\n /** A horizontal row by default; a bare `vertical` attribute makes a column. */\r\n readonly vertical = input(false, { transform: booleanAttribute });\r\n readonly defaultSize = input(50);\r\n readonly minSize = input(10);\r\n readonly maxSize = input(90);\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly panels = contentChildren(RaqmResizablePanelDirective);\r\n readonly handles = contentChildren(RaqmResizableHandleDirective);\r\n private readonly changed = signal<ReadonlyMap<RaqmResizablePanelDirective, number>>(new Map());\r\n readonly sizes = computed(() => {\r\n const panels = this.panels();\r\n const changes = this.changed();\r\n if (!panels.length) return [];\r\n const explicit = panels.map((p) => p.defaultSize());\r\n const missing = explicit.filter((x) => x === undefined).length;\r\n const remaining = Math.max(0, 100 - explicit.reduce<number>((a, b) => a + (b ?? 0), 0));\r\n let initial = explicit.map((v) => v ?? (missing ? remaining / missing : 0));\r\n if (panels.every((p) => changes.has(p))) initial = panels.map((p) => changes.get(p)!);\r\n else if (panels.length === 2 && explicit.every((v) => v === undefined)) {\r\n initial = [this.defaultSize(), 100 - this.defaultSize()];\r\n }\r\n const mins = panels.map((p, i) =>\r\n Math.max(0, p.minSize() ?? (panels.length === 2 && i === 0 ? this.minSize() : 0)),\r\n );\r\n const maxs = panels.map((p, i) =>\r\n Math.min(100, p.maxSize() ?? (panels.length === 2 && i === 0 ? this.maxSize() : 100)),\r\n );\r\n const values = initial.map((v, i) =>\r\n Math.min(maxs[i], Math.max(mins[i], Number.isFinite(v) ? v : 0)),\r\n );\r\n let remainingSize = 100 - values.reduce((a, b) => a + b, 0);\r\n for (let i = 0; i < values.length && Math.abs(remainingSize) > 0.000001; i++) {\r\n const change =\r\n remainingSize > 0\r\n ? Math.min(remainingSize, maxs[i] - values[i])\r\n : Math.max(remainingSize, mins[i] - values[i]);\r\n values[i] += change;\r\n remainingSize -= change;\r\n }\r\n return values;\r\n });\r\n panelIndex(panel: RaqmResizablePanelDirective): number {\r\n return this.panels().indexOf(panel);\r\n }\r\n handleIndex(handle: RaqmResizableHandleDirective): number {\r\n return this.handles().indexOf(handle);\r\n }\r\n bounds(index: number): { min: number; max: number } {\r\n const panels = this.panels(),\r\n sizes = this.sizes(),\r\n left = panels[index],\r\n right = panels[index + 1];\r\n if (!left || !right) return { min: 0, max: 0 };\r\n const total = sizes[index] + sizes[index + 1];\r\n const legacy = panels.length === 2;\r\n const leftMin = left.minSize() ?? (legacy ? this.minSize() : 0);\r\n const leftMax = left.maxSize() ?? (legacy ? this.maxSize() : 100);\r\n const rightMin = right.minSize() ?? 0;\r\n const rightMax = right.maxSize() ?? 100;\r\n return {\r\n min: Math.max(0, leftMin, total - rightMax),\r\n max: Math.min(total, leftMax, total - rightMin),\r\n };\r\n }\r\n resize(index: number, value: number): void {\r\n const panels = this.panels(),\r\n sizes = this.sizes(),\r\n bounds = this.bounds(index);\r\n if (!panels[index] || !panels[index + 1] || bounds.min > bounds.max || !Number.isFinite(value))\r\n return;\r\n const next = Math.min(bounds.max, Math.max(bounds.min, value));\r\n const total = sizes[index] + sizes[index + 1];\r\n const values = new Map(panels.map((panel, i) => [panel, sizes[i]]));\r\n values.set(panels[index], next);\r\n values.set(panels[index + 1], total - next);\r\n this.changed.set(values);\r\n }\r\n}\r\n\r\n/** Raqm resizable panel — one percentage-sized region; owns its id (the handle's `aria-controls` target) and flex-basis. */\r\n@Directive({\r\n selector: '[raqm-resizable-panel]',\r\n host: {\r\n class: 'raqm-resizable-panel',\r\n '[style.flex-basis.%]': 'basis()',\r\n '[style.flex-grow]': '0',\r\n '[id]': 'id',\r\n },\r\n})\r\nexport class RaqmResizablePanelDirective {\r\n private readonly group = inject(RaqmResizablePanelGroupComponent);\r\n readonly id = inject(_IdGenerator).getId('raqm-resizable-panel-');\r\n readonly defaultSize = input<number | undefined>(undefined);\r\n readonly minSize = input<number | undefined>(undefined);\r\n readonly maxSize = input<number | undefined>(undefined);\r\n protected readonly basis = computed(() => this.group.sizes()[this.group.panelIndex(this)] ?? 0);\r\n}\r\n\r\n/** Raqm resizable handle — draggable `role=\"separator\"`, focusable and keyboard-operable; accessible name is app-authored. */\r\n@Directive({\r\n selector: '[raqm-resizable-handle]',\r\n host: {\r\n class: 'raqm-resizable-handle',\r\n role: 'separator',\r\n tabindex: '0',\r\n '[attr.data-raqm-with-handle]': 'withHandle() ? \"\" : null',\r\n '[attr.aria-orientation]': 'group.vertical() ? \"horizontal\" : \"vertical\"',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-valuemin]': 'bounds().min',\r\n '[attr.aria-valuemax]': 'bounds().max',\r\n '[attr.aria-controls]': 'group.panels()[index()]?.id ?? null',\r\n '(keydown)': 'onKey($event)',\r\n '(pointerdown)': 'onPointer($event)',\r\n },\r\n})\r\nexport class RaqmResizableHandleDirective {\r\n readonly withHandle = input(false, { transform: booleanAttribute });\r\n protected readonly group = inject(RaqmResizablePanelGroupComponent);\r\n protected readonly index = computed(() => this.group.handleIndex(this));\r\n protected readonly value = computed(() => this.group.sizes()[this.index()] ?? 0);\r\n protected readonly bounds = computed(() => this.group.bounds(this.index()));\r\n private readonly element = inject(ElementRef<HTMLElement>);\r\n private readonly destroy = inject(DestroyRef);\r\n private cleanup: (() => void) | undefined;\r\n constructor() {\r\n this.destroy.onDestroy(() => this.cleanup?.());\r\n }\r\n protected onKey(event: KeyboardEvent): void {\r\n const horizontal = !this.group.vertical();\r\n const rtl = getComputedStyle(this.group.element.nativeElement).direction === 'rtl';\r\n let delta = 0;\r\n if (horizontal && event.key === 'ArrowRight') delta = rtl ? -1 : 1;\r\n if (horizontal && event.key === 'ArrowLeft') delta = rtl ? 1 : -1;\r\n if (!horizontal && event.key === 'ArrowDown') delta = 1;\r\n if (!horizontal && event.key === 'ArrowUp') delta = -1;\r\n if (event.key === 'Home' || event.key === 'End') {\r\n event.preventDefault();\r\n this.group.resize(this.index(), event.key === 'Home' ? this.bounds().min : this.bounds().max);\r\n } else if (delta) {\r\n event.preventDefault();\r\n this.group.resize(this.index(), this.value() + delta * (event.shiftKey ? 10 : 1));\r\n }\r\n }\r\n protected onPointer(event: PointerEvent): void {\r\n if (event.button !== 0) return;\r\n event.preventDefault();\r\n this.cleanup?.();\r\n const handle = this.element.nativeElement;\r\n const horizontal = !this.group.vertical();\r\n const rect = this.group.element.nativeElement.getBoundingClientRect();\r\n const rtl =\r\n horizontal && getComputedStyle(this.group.element.nativeElement).direction === 'rtl';\r\n const start = horizontal ? event.clientX : event.clientY;\r\n const initialSize = this.value();\r\n const move = (e: PointerEvent) => {\r\n const distance = (horizontal ? e.clientX : e.clientY) - start;\r\n const length = horizontal ? rect.width : rect.height;\r\n if (length)\r\n this.group.resize(\r\n this.index(),\r\n initialSize + ((rtl ? -distance : distance) / length) * 100,\r\n );\r\n };\r\n const end = () => this.cleanup?.();\r\n this.cleanup = () => {\r\n handle.removeEventListener('pointermove', move);\r\n handle.removeEventListener('pointerup', end);\r\n handle.removeEventListener('pointercancel', end);\r\n handle.removeEventListener('lostpointercapture', end);\r\n if (handle.hasPointerCapture(event.pointerId)) handle.releasePointerCapture(event.pointerId);\r\n this.cleanup = undefined;\r\n };\r\n handle.setPointerCapture(event.pointerId);\r\n handle.addEventListener('pointermove', move);\r\n handle.addEventListener('pointerup', end);\r\n handle.addEventListener('pointercancel', end);\r\n handle.addEventListener('lostpointercapture', end);\r\n }\r\n}\r\n","import {\r\n RaqmResizablePanelGroupComponent,\r\n RaqmResizablePanelDirective,\r\n RaqmResizableHandleDirective,\r\n} from './resizable';\r\n\r\nexport {\r\n RaqmResizablePanelGroupComponent,\r\n RaqmResizablePanelDirective,\r\n RaqmResizableHandleDirective,\r\n};\r\n\r\nexport const RaqmResizable = [\r\n RaqmResizablePanelGroupComponent,\r\n RaqmResizablePanelDirective,\r\n RaqmResizableHandleDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raqm-ui-resizable.mjs","names":[],"sources":["../../../projects/ui/resizable/resizable.ts","../../../projects/ui/resizable/public-api.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n contentChildren,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { _IdGenerator } from '@angular/cdk/a11y';\r\n\r\n/** Raqm resizable panel group — percentage-based panels with a draggable divider; the app supplies every accessible name. */\r\n@Component({\r\n selector: 'raqm-resizable-panel-group',\r\n template: '<ng-content />',\r\n styleUrl: './resizable.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-resizable-panel-group',\r\n '[attr.data-raqm-vertical]': 'vertical() ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmResizablePanelGroupComponent {\r\n /** A horizontal row by default; a bare `vertical` attribute makes a column. */\r\n readonly vertical = input(false, { transform: booleanAttribute });\r\n readonly defaultSize = input(50);\r\n readonly minSize = input(10);\r\n readonly maxSize = input(90);\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly panels = contentChildren(RaqmResizablePanelDirective);\r\n readonly handles = contentChildren(RaqmResizableHandleDirective);\r\n // Rebuilt only when the projected membership changes, not on every size update.\r\n private readonly panelIndices = computed(() => this.indexByPanel());\r\n private readonly handleIndices = computed(() => this.indexByHandle());\r\n private readonly changed = signal<ReadonlyMap<RaqmResizablePanelDirective, number>>(new Map());\r\n readonly sizes = computed(() => {\r\n const panels = this.panels();\r\n const changes = this.changed();\r\n if (!panels.length) return [];\r\n const explicit = panels.map((p) => p.defaultSize());\r\n const missing = explicit.filter((x) => x === undefined).length;\r\n const remaining = Math.max(0, 100 - explicit.reduce<number>((a, b) => a + (b ?? 0), 0));\r\n let initial = explicit.map((v) => v ?? (missing ? remaining / missing : 0));\r\n if (panels.every((p) => changes.has(p))) initial = panels.map((p) => changes.get(p)!);\r\n else if (panels.length === 2 && explicit.every((v) => v === undefined)) {\r\n initial = [this.defaultSize(), 100 - this.defaultSize()];\r\n }\r\n const mins = panels.map((p, i) =>\r\n Math.max(0, p.minSize() ?? (panels.length === 2 && i === 0 ? this.minSize() : 0)),\r\n );\r\n const maxs = panels.map((p, i) =>\r\n Math.min(100, p.maxSize() ?? (panels.length === 2 && i === 0 ? this.maxSize() : 100)),\r\n );\r\n const values = initial.map((v, i) =>\r\n Math.min(maxs[i], Math.max(mins[i], Number.isFinite(v) ? v : 0)),\r\n );\r\n let remainingSize = 100 - values.reduce((a, b) => a + b, 0);\r\n for (let i = 0; i < values.length && Math.abs(remainingSize) > 0.000001; i++) {\r\n const change =\r\n remainingSize > 0\r\n ? Math.min(remainingSize, maxs[i] - values[i])\r\n : Math.max(remainingSize, mins[i] - values[i]);\r\n values[i] += change;\r\n remainingSize -= change;\r\n }\r\n return values;\r\n });\r\n private indexByPanel(): ReadonlyMap<RaqmResizablePanelDirective, number> {\r\n return new Map(this.panels().map((panel, index) => [panel, index]));\r\n }\r\n private indexByHandle(): ReadonlyMap<RaqmResizableHandleDirective, number> {\r\n return new Map(this.handles().map((handle, index) => [handle, index]));\r\n }\r\n panelIndex(panel: RaqmResizablePanelDirective): number {\r\n return this.panelIndices().get(panel) ?? -1;\r\n }\r\n handleIndex(handle: RaqmResizableHandleDirective): number {\r\n return this.handleIndices().get(handle) ?? -1;\r\n }\r\n bounds(index: number): { min: number; max: number } {\r\n const panels = this.panels(),\r\n sizes = this.sizes(),\r\n left = panels[index],\r\n right = panels[index + 1];\r\n if (!left || !right) return { min: 0, max: 0 };\r\n const total = sizes[index] + sizes[index + 1];\r\n const legacy = panels.length === 2;\r\n const leftMin = left.minSize() ?? (legacy ? this.minSize() : 0);\r\n const leftMax = left.maxSize() ?? (legacy ? this.maxSize() : 100);\r\n const rightMin = right.minSize() ?? 0;\r\n const rightMax = right.maxSize() ?? 100;\r\n return {\r\n min: Math.max(0, leftMin, total - rightMax),\r\n max: Math.min(total, leftMax, total - rightMin),\r\n };\r\n }\r\n resize(index: number, value: number): void {\r\n const panels = this.panels(),\r\n sizes = this.sizes(),\r\n bounds = this.bounds(index);\r\n if (!panels[index] || !panels[index + 1] || bounds.min > bounds.max || !Number.isFinite(value))\r\n return;\r\n const next = Math.min(bounds.max, Math.max(bounds.min, value));\r\n const total = sizes[index] + sizes[index + 1];\r\n const right = total - next;\r\n const changes = this.changed();\r\n // Only an exact, complete snapshot can be skipped without changing what future constraints see.\r\n if (\r\n next === sizes[index] &&\r\n right === sizes[index + 1] &&\r\n changes.size === panels.length &&\r\n panels.every((panel, i) => changes.get(panel) === sizes[i])\r\n ) {\r\n return;\r\n }\r\n const values = new Map(panels.map((panel, i) => [panel, sizes[i]]));\r\n values.set(panels[index], next);\r\n values.set(panels[index + 1], right);\r\n this.changed.set(values);\r\n }\r\n}\r\n\r\n/** Raqm resizable panel — one percentage-sized region; owns its id (the handle's `aria-controls` target) and flex-basis. */\r\n@Directive({\r\n selector: '[raqm-resizable-panel]',\r\n host: {\r\n class: 'raqm-resizable-panel',\r\n '[style.flex-basis.%]': 'basis()',\r\n '[style.flex-grow]': '0',\r\n '[id]': 'id',\r\n },\r\n})\r\nexport class RaqmResizablePanelDirective {\r\n private readonly group = inject(RaqmResizablePanelGroupComponent);\r\n readonly id = inject(_IdGenerator).getId('raqm-resizable-panel-');\r\n readonly defaultSize = input<number | undefined>(undefined);\r\n readonly minSize = input<number | undefined>(undefined);\r\n readonly maxSize = input<number | undefined>(undefined);\r\n protected readonly basis = computed(() => this.group.sizes()[this.group.panelIndex(this)] ?? 0);\r\n}\r\n\r\n/** Raqm resizable handle — draggable `role=\"separator\"`, focusable and keyboard-operable; accessible name is app-authored. */\r\n@Directive({\r\n selector: '[raqm-resizable-handle]',\r\n host: {\r\n class: 'raqm-resizable-handle',\r\n role: 'separator',\r\n tabindex: '0',\r\n '[attr.data-raqm-with-handle]': 'withHandle() ? \"\" : null',\r\n '[attr.aria-orientation]': 'group.vertical() ? \"horizontal\" : \"vertical\"',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-valuemin]': 'bounds().min',\r\n '[attr.aria-valuemax]': 'bounds().max',\r\n '[attr.aria-controls]': 'group.panels()[index()]?.id ?? null',\r\n '(keydown)': 'onKey($event)',\r\n '(pointerdown)': 'onPointer($event)',\r\n },\r\n})\r\nexport class RaqmResizableHandleDirective {\r\n readonly withHandle = input(false, { transform: booleanAttribute });\r\n protected readonly group = inject(RaqmResizablePanelGroupComponent);\r\n protected readonly index = computed(() => this.group.handleIndex(this));\r\n protected readonly value = computed(() => this.group.sizes()[this.index()] ?? 0);\r\n protected readonly bounds = computed(() => this.group.bounds(this.index()));\r\n private readonly element = inject(ElementRef<HTMLElement>);\r\n private readonly destroy = inject(DestroyRef);\r\n private cleanup: (() => void) | undefined;\r\n constructor() {\r\n this.destroy.onDestroy(() => this.cleanup?.());\r\n }\r\n protected onKey(event: KeyboardEvent): void {\r\n const horizontal = !this.group.vertical();\r\n const rtl = getComputedStyle(this.group.element.nativeElement).direction === 'rtl';\r\n let delta = 0;\r\n if (horizontal && event.key === 'ArrowRight') delta = rtl ? -1 : 1;\r\n if (horizontal && event.key === 'ArrowLeft') delta = rtl ? 1 : -1;\r\n if (!horizontal && event.key === 'ArrowDown') delta = 1;\r\n if (!horizontal && event.key === 'ArrowUp') delta = -1;\r\n if (event.key === 'Home' || event.key === 'End') {\r\n event.preventDefault();\r\n this.group.resize(this.index(), event.key === 'Home' ? this.bounds().min : this.bounds().max);\r\n } else if (delta) {\r\n event.preventDefault();\r\n this.group.resize(this.index(), this.value() + delta * (event.shiftKey ? 10 : 1));\r\n }\r\n }\r\n protected onPointer(event: PointerEvent): void {\r\n if (event.button !== 0) return;\r\n event.preventDefault();\r\n this.cleanup?.();\r\n const handle = this.element.nativeElement;\r\n const horizontal = !this.group.vertical();\r\n const rect = this.group.element.nativeElement.getBoundingClientRect();\r\n const rtl =\r\n horizontal && getComputedStyle(this.group.element.nativeElement).direction === 'rtl';\r\n const start = horizontal ? event.clientX : event.clientY;\r\n const initialSize = this.value();\r\n const move = (e: PointerEvent) => {\r\n const distance = (horizontal ? e.clientX : e.clientY) - start;\r\n const length = horizontal ? rect.width : rect.height;\r\n if (length)\r\n this.group.resize(\r\n this.index(),\r\n initialSize + ((rtl ? -distance : distance) / length) * 100,\r\n );\r\n };\r\n const end = () => this.cleanup?.();\r\n this.cleanup = () => {\r\n handle.removeEventListener('pointermove', move);\r\n handle.removeEventListener('pointerup', end);\r\n handle.removeEventListener('pointercancel', end);\r\n handle.removeEventListener('lostpointercapture', end);\r\n if (handle.hasPointerCapture(event.pointerId)) handle.releasePointerCapture(event.pointerId);\r\n this.cleanup = undefined;\r\n };\r\n handle.setPointerCapture(event.pointerId);\r\n handle.addEventListener('pointermove', move);\r\n handle.addEventListener('pointerup', end);\r\n handle.addEventListener('pointercancel', end);\r\n handle.addEventListener('lostpointercapture', end);\r\n }\r\n}\r\n","import {\r\n RaqmResizablePanelGroupComponent,\r\n RaqmResizablePanelDirective,\r\n RaqmResizableHandleDirective,\r\n} from './resizable';\r\n\r\nexport {\r\n RaqmResizablePanelGroupComponent,\r\n RaqmResizablePanelDirective,\r\n RaqmResizableHandleDirective,\r\n};\r\n\r\nexport const RaqmResizable = [\r\n RaqmResizablePanelGroupComponent,\r\n RaqmResizablePanelDirective,\r\n RaqmResizableHandleDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@ var RaqmScrollBarComponent = class RaqmScrollBarComponent {
|
|
|
17
17
|
destroyRef = inject(DestroyRef);
|
|
18
18
|
trackSize = signal(0, ...ngDevMode ? [{ debugName: "trackSize" }] : /* istanbul ignore next */ []);
|
|
19
19
|
drag = null;
|
|
20
|
+
coordinates = null;
|
|
21
|
+
coordinateFrame;
|
|
20
22
|
overflow = computed(() => {
|
|
21
23
|
const m = this.area.metrics();
|
|
22
24
|
return this.vertical() ? m.scrollHeight > m.height : m.scrollWidth > m.width;
|
|
@@ -49,14 +51,14 @@ var RaqmScrollBarComponent = class RaqmScrollBarComponent {
|
|
|
49
51
|
}, ...ngDevMode ? [{ debugName: "thumbStyle" }] : /* istanbul ignore next */ []);
|
|
50
52
|
constructor() {
|
|
51
53
|
afterNextRender(() => {
|
|
52
|
-
const resize = new ResizeObserver(() => this.measure());
|
|
53
|
-
resize
|
|
54
|
+
const resize = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => this.measure());
|
|
55
|
+
resize?.observe(this.host.nativeElement);
|
|
54
56
|
this.measure();
|
|
55
57
|
const track = this.host.nativeElement;
|
|
56
58
|
const wheel = (event) => this.onTrackWheel(event);
|
|
57
59
|
track.addEventListener("wheel", wheel, { passive: false });
|
|
58
60
|
this.destroyRef.onDestroy(() => {
|
|
59
|
-
resize
|
|
61
|
+
resize?.disconnect();
|
|
60
62
|
track.removeEventListener("wheel", wheel);
|
|
61
63
|
});
|
|
62
64
|
});
|
|
@@ -84,11 +86,35 @@ var RaqmScrollBarComponent = class RaqmScrollBarComponent {
|
|
|
84
86
|
this.trackSize.set(Math.max(0, (vertical ? el.clientHeight : el.clientWidth) - parseFloat(vertical ? css.paddingTop : css.paddingLeft) - parseFloat(vertical ? css.paddingBottom : css.paddingRight)));
|
|
85
87
|
}
|
|
86
88
|
coordinate(event) {
|
|
89
|
+
const space = this.coordinates ?? this.measureCoordinates();
|
|
90
|
+
if (this.vertical()) return event.clientY - space.rect.top - space.clientTop - space.paddingTop;
|
|
91
|
+
return space.rtl ? space.rect.right - event.clientX - space.borderRightWidth - space.paddingRight : event.clientX - space.rect.left - space.clientLeft - space.paddingLeft;
|
|
92
|
+
}
|
|
93
|
+
measureCoordinates() {
|
|
87
94
|
const el = this.host.nativeElement;
|
|
88
|
-
const rect = el.getBoundingClientRect();
|
|
89
95
|
const css = getComputedStyle(el);
|
|
90
|
-
|
|
91
|
-
|
|
96
|
+
const space = {
|
|
97
|
+
rect: el.getBoundingClientRect(),
|
|
98
|
+
clientTop: el.clientTop,
|
|
99
|
+
clientLeft: el.clientLeft,
|
|
100
|
+
paddingTop: parseFloat(css.paddingTop),
|
|
101
|
+
paddingLeft: parseFloat(css.paddingLeft),
|
|
102
|
+
paddingRight: parseFloat(css.paddingRight),
|
|
103
|
+
borderRightWidth: parseFloat(css.borderRightWidth),
|
|
104
|
+
rtl: this.area.metrics().rtl
|
|
105
|
+
};
|
|
106
|
+
if (typeof requestAnimationFrame === "undefined") return space;
|
|
107
|
+
this.coordinates = space;
|
|
108
|
+
if (this.coordinateFrame === void 0) this.coordinateFrame = requestAnimationFrame(() => {
|
|
109
|
+
this.coordinateFrame = void 0;
|
|
110
|
+
this.coordinates = null;
|
|
111
|
+
});
|
|
112
|
+
return space;
|
|
113
|
+
}
|
|
114
|
+
clearCoordinates() {
|
|
115
|
+
if (this.coordinateFrame !== void 0 && typeof cancelAnimationFrame !== "undefined") cancelAnimationFrame(this.coordinateFrame);
|
|
116
|
+
this.coordinateFrame = void 0;
|
|
117
|
+
this.coordinates = null;
|
|
92
118
|
}
|
|
93
119
|
onPointerDown(event) {
|
|
94
120
|
if (!event.isPrimary || event.button !== 0 || !this.overflow() || this.drag) return;
|
|
@@ -117,6 +143,7 @@ var RaqmScrollBarComponent = class RaqmScrollBarComponent {
|
|
|
117
143
|
endDrag() {
|
|
118
144
|
const drag = this.drag;
|
|
119
145
|
this.drag = null;
|
|
146
|
+
this.clearCoordinates();
|
|
120
147
|
if (drag && this.host.nativeElement.hasPointerCapture(drag.pointer)) this.host.nativeElement.releasePointerCapture(drag.pointer);
|
|
121
148
|
}
|
|
122
149
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
@@ -261,7 +288,9 @@ var RaqmScrollAreaComponent = class RaqmScrollAreaComponent {
|
|
|
261
288
|
vertical = computed(() => this.metrics().scrollHeight > this.metrics().height, ...ngDevMode ? [{ debugName: "vertical" }] : /* istanbul ignore next */ []);
|
|
262
289
|
scrolling = signal(false, ...ngDevMode ? [{ debugName: "scrolling" }] : /* istanbul ignore next */ []);
|
|
263
290
|
hovering = signal(false, ...ngDevMode ? [{ debugName: "hovering" }] : /* istanbul ignore next */ []);
|
|
291
|
+
geometry = null;
|
|
264
292
|
scrollTimer;
|
|
293
|
+
frame;
|
|
265
294
|
edges = computed(() => {
|
|
266
295
|
const m = this.metrics();
|
|
267
296
|
const threshold = this.overflowEdgeThreshold();
|
|
@@ -274,14 +303,17 @@ var RaqmScrollAreaComponent = class RaqmScrollAreaComponent {
|
|
|
274
303
|
};
|
|
275
304
|
}, ...ngDevMode ? [{ debugName: "edges" }] : /* istanbul ignore next */ []);
|
|
276
305
|
constructor() {
|
|
277
|
-
this.destroyRef.onDestroy(() =>
|
|
306
|
+
this.destroyRef.onDestroy(() => {
|
|
307
|
+
clearTimeout(this.scrollTimer);
|
|
308
|
+
if (this.frame !== void 0 && typeof cancelAnimationFrame !== "undefined") cancelAnimationFrame(this.frame);
|
|
309
|
+
});
|
|
278
310
|
afterNextRender(() => {
|
|
279
311
|
const viewport = this.viewport().nativeElement;
|
|
280
312
|
const content = this.content().nativeElement;
|
|
281
|
-
const resize = new ResizeObserver(() => this.
|
|
282
|
-
resize
|
|
283
|
-
resize
|
|
284
|
-
const direction = new MutationObserver(() => this.
|
|
313
|
+
const resize = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => this.scheduleRefresh());
|
|
314
|
+
resize?.observe(viewport);
|
|
315
|
+
resize?.observe(content);
|
|
316
|
+
const direction = new MutationObserver(() => this.scheduleRefresh());
|
|
285
317
|
for (let element = this.host.nativeElement; element; element = element.parentElement) direction.observe(element, {
|
|
286
318
|
attributes: true,
|
|
287
319
|
attributeFilter: [
|
|
@@ -290,17 +322,17 @@ var RaqmScrollAreaComponent = class RaqmScrollAreaComponent {
|
|
|
290
322
|
"style"
|
|
291
323
|
]
|
|
292
324
|
});
|
|
293
|
-
const mutation = new MutationObserver(() => this.
|
|
325
|
+
const mutation = new MutationObserver(() => this.scheduleRefresh());
|
|
294
326
|
mutation.observe(content, {
|
|
295
327
|
subtree: true,
|
|
296
328
|
childList: true,
|
|
297
329
|
characterData: true,
|
|
298
330
|
attributes: true
|
|
299
331
|
});
|
|
300
|
-
const load = () => this.
|
|
332
|
+
const load = () => this.scheduleRefresh();
|
|
301
333
|
content.addEventListener("load", load, true);
|
|
302
334
|
this.destroyRef.onDestroy(() => {
|
|
303
|
-
resize
|
|
335
|
+
resize?.disconnect();
|
|
304
336
|
mutation.disconnect();
|
|
305
337
|
direction.disconnect();
|
|
306
338
|
content.removeEventListener("load", load, true);
|
|
@@ -309,33 +341,57 @@ var RaqmScrollAreaComponent = class RaqmScrollAreaComponent {
|
|
|
309
341
|
});
|
|
310
342
|
}
|
|
311
343
|
onScroll() {
|
|
312
|
-
this.refresh();
|
|
313
344
|
this.scrolling.set(true);
|
|
314
345
|
clearTimeout(this.scrollTimer);
|
|
315
346
|
this.scrollTimer = setTimeout(() => this.scrolling.set(false), 100);
|
|
347
|
+
this.scheduleRefresh();
|
|
348
|
+
}
|
|
349
|
+
scheduleRefresh() {
|
|
350
|
+
if (typeof requestAnimationFrame === "undefined") {
|
|
351
|
+
this.refresh();
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
if (this.frame !== void 0) return;
|
|
355
|
+
this.frame = requestAnimationFrame(() => {
|
|
356
|
+
this.frame = void 0;
|
|
357
|
+
this.refresh();
|
|
358
|
+
});
|
|
316
359
|
}
|
|
317
360
|
refresh() {
|
|
318
361
|
const viewport = this.viewport().nativeElement;
|
|
319
|
-
|
|
320
|
-
|
|
362
|
+
this.geometry = {
|
|
363
|
+
width: viewport.clientWidth,
|
|
364
|
+
height: viewport.clientHeight,
|
|
365
|
+
scrollWidth: viewport.scrollWidth,
|
|
366
|
+
scrollHeight: viewport.scrollHeight,
|
|
367
|
+
rtl: getComputedStyle(viewport).direction === "rtl"
|
|
368
|
+
};
|
|
369
|
+
this.refreshOffsets();
|
|
370
|
+
}
|
|
371
|
+
refreshOffsets() {
|
|
372
|
+
const geometry = this.geometry;
|
|
373
|
+
if (geometry === null) {
|
|
374
|
+
this.refresh();
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
const viewport = this.viewport().nativeElement;
|
|
378
|
+
const max = Math.max(0, geometry.scrollWidth - geometry.width);
|
|
321
379
|
let x = viewport.scrollLeft;
|
|
322
|
-
if (rtl) switch (getRtlScrollAxisType()) {
|
|
380
|
+
if (geometry.rtl) switch (getRtlScrollAxisType()) {
|
|
323
381
|
case RtlScrollAxisType.NEGATED:
|
|
324
382
|
x = -x;
|
|
325
383
|
break;
|
|
326
384
|
case RtlScrollAxisType.NORMAL: x = max - x;
|
|
327
385
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
height: viewport.clientHeight,
|
|
331
|
-
scrollWidth: viewport.scrollWidth,
|
|
332
|
-
scrollHeight: viewport.scrollHeight,
|
|
333
|
-
x: Math.max(0, Math.min(max, x)),
|
|
334
|
-
y: Math.max(0, viewport.scrollTop),
|
|
335
|
-
rtl
|
|
336
|
-
};
|
|
386
|
+
x = Math.max(0, Math.min(max, x));
|
|
387
|
+
const y = Math.max(0, viewport.scrollTop);
|
|
337
388
|
const previous = this.metrics();
|
|
338
|
-
if (
|
|
389
|
+
if (x === previous.x && y === previous.y && geometry.width === previous.width && geometry.height === previous.height && geometry.scrollWidth === previous.scrollWidth && geometry.scrollHeight === previous.scrollHeight && geometry.rtl === previous.rtl) return;
|
|
390
|
+
this.metrics.set({
|
|
391
|
+
...geometry,
|
|
392
|
+
x,
|
|
393
|
+
y
|
|
394
|
+
});
|
|
339
395
|
}
|
|
340
396
|
scrollTo(orientation, offset) {
|
|
341
397
|
const viewport = this.viewport().nativeElement;
|
|
@@ -353,7 +409,7 @@ var RaqmScrollAreaComponent = class RaqmScrollAreaComponent {
|
|
|
353
409
|
}
|
|
354
410
|
viewport.scrollLeft = value;
|
|
355
411
|
}
|
|
356
|
-
this.
|
|
412
|
+
this.refreshOffsets();
|
|
357
413
|
}
|
|
358
414
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
359
415
|
minVersion: "12.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raqm-ui-scroll-area.mjs","names":[],"sources":["../../../projects/ui/scroll-area/scroll-area-context.ts","../../../projects/ui/scroll-area/scroll-bar.ts","../../../projects/ui/scroll-area/scroll-bar.html","../../../projects/ui/scroll-area/scroll-area.ts","../../../projects/ui/scroll-area/scroll-area.html","../../../projects/ui/scroll-area/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\r\n\r\nexport interface ScrollAreaMetrics {\r\n width: number;\r\n height: number;\r\n scrollWidth: number;\r\n scrollHeight: number;\r\n x: number;\r\n y: number;\r\n rtl: boolean;\r\n}\r\n\r\n/** Internal root contract; the token avoids a circular component dependency. */\r\nexport const SCROLL_AREA = new InjectionToken<{\r\n metrics: Signal<ScrollAreaMetrics>;\r\n horizontal: Signal<boolean>;\r\n vertical: Signal<boolean>;\r\n scrolling: Signal<boolean>;\r\n hovering: Signal<boolean>;\r\n edges: Signal<{ xStart: boolean; xEnd: boolean; yStart: boolean; yEnd: boolean }>;\r\n refresh(): void;\r\n scrollTo(orientation: 'horizontal' | 'vertical', offset: number): void;\r\n}>('RAQM_SCROLL_AREA');\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { SCROLL_AREA } from './scroll-area-context';\r\n\r\n/** Scroll bar overlay; `aria-hidden` and not a tab stop, because the viewport handles keyboard/AT scrolling. */\r\n@Component({\r\n selector: 'raqm-scroll-bar',\r\n templateUrl: './scroll-bar.html',\r\n styleUrl: './scroll-bar.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-scroll-bar',\r\n 'data-slot': 'scroll-area-scrollbar',\r\n 'aria-hidden': 'true',\r\n '[attr.data-raqm-vertical]': 'vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow]': 'overflow() ? \"\" : null',\r\n '[attr.data-raqm-keep-mounted]': 'keepMounted() ? \"\" : null',\r\n '[attr.data-raqm-corner]': 'area.horizontal() && area.vertical() ? \"\" : null',\r\n '[attr.data-raqm-scrolling]': 'area.scrolling() ? \"\" : null',\r\n '[attr.data-raqm-hovering]': 'area.hovering() ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-x]':\r\n 'area.metrics().scrollWidth > area.metrics().width ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-y]': 'area.vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-start]': 'area.edges().xStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-end]': 'area.edges().xEnd ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-start]': 'area.edges().yStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-end]': 'area.edges().yEnd ? \"\" : null',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'endPointer($event)',\r\n '(pointercancel)': 'endPointer($event)',\r\n '(lostpointercapture)': 'endPointer($event)',\r\n },\r\n})\r\nexport class RaqmScrollBarComponent {\r\n readonly vertical = input(true, { transform: booleanAttribute });\r\n /** Keeps the internal thumb mounted without overflow; the Angular host always exists. */\r\n readonly keepMounted = input(false, { transform: booleanAttribute });\r\n protected readonly area = inject(SCROLL_AREA);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly trackSize = signal(0);\r\n private drag: { pointer: number; grab: number } | null = null;\r\n protected readonly overflow = computed(() => {\r\n const m = this.area.metrics();\r\n return this.vertical() ? m.scrollHeight > m.height : m.scrollWidth > m.width;\r\n });\r\n private readonly geometry = computed(() => {\r\n const m = this.area.metrics();\r\n const vertical = this.vertical();\r\n const viewport = vertical ? m.height : m.width;\r\n const content = vertical ? m.scrollHeight : m.scrollWidth;\r\n const track = this.trackSize();\r\n const thumb = Math.min(track, Math.max(16, content ? (track * viewport) / content : track));\r\n const max = Math.max(0, content - viewport);\r\n return { thumb, travel: track - thumb, max, offset: vertical ? m.y : m.x };\r\n });\r\n protected readonly thumbStyle = computed(() => {\r\n const g = this.geometry();\r\n const position = g.max ? (g.offset / g.max) * g.travel : 0;\r\n return this.vertical()\r\n ? { 'block-size': `${g.thumb}px`, 'inset-block-start': `${position}px` }\r\n : { 'inline-size': `${g.thumb}px`, 'inset-inline-start': `${position}px` };\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const resize = new ResizeObserver(() => this.measure());\r\n resize.observe(this.host.nativeElement);\r\n this.measure();\r\n const track = this.host.nativeElement;\r\n const wheel = (event: WheelEvent) => this.onTrackWheel(event);\r\n track.addEventListener('wheel', wheel, { passive: false });\r\n this.destroyRef.onDestroy(() => {\r\n resize.disconnect();\r\n track.removeEventListener('wheel', wheel);\r\n });\r\n });\r\n this.destroyRef.onDestroy(() => this.endDrag());\r\n }\r\n\r\n /** Bridges only overlay-track wheel input; viewport wheel/touch remain native. */\r\n private onTrackWheel(event: WheelEvent): void {\r\n if (event.ctrlKey || event.defaultPrevented || !event.cancelable) return;\r\n const vertical = this.vertical();\r\n const delta = vertical ? event.deltaY : event.deltaX;\r\n if (!Number.isFinite(delta) || delta === 0) return;\r\n this.area.refresh();\r\n const metrics = this.area.metrics();\r\n const css = getComputedStyle(this.host.nativeElement);\r\n // Computed line-height may be `normal`: use the inherited font's usual 1.2 ratio.\r\n const lineHeight = parseFloat(css.lineHeight) || parseFloat(css.fontSize) * 1.2 || 16;\r\n const unit =\r\n event.deltaMode === WheelEvent.DOM_DELTA_LINE\r\n ? lineHeight\r\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\r\n ? vertical\r\n ? metrics.height\r\n : metrics.width\r\n : 1;\r\n // Wheel deltaX is physical; the root's public offset is measured from logical start.\r\n const change = delta * unit * (!vertical && metrics.rtl ? -1 : 1);\r\n const before = vertical ? metrics.y : metrics.x;\r\n this.area.scrollTo(this.vertical() ? 'vertical' : 'horizontal', before + change);\r\n const after = this.area.metrics();\r\n if ((vertical ? after.y : after.x) !== before) event.preventDefault();\r\n }\r\n\r\n private measure(): void {\r\n const el = this.host.nativeElement;\r\n const css = getComputedStyle(el);\r\n const vertical = this.vertical();\r\n this.trackSize.set(\r\n Math.max(\r\n 0,\r\n (vertical ? el.clientHeight : el.clientWidth) -\r\n parseFloat(vertical ? css.paddingTop : css.paddingLeft) -\r\n parseFloat(vertical ? css.paddingBottom : css.paddingRight),\r\n ),\r\n );\r\n }\r\n\r\n private coordinate(event: PointerEvent): number {\r\n const el = this.host.nativeElement;\r\n const rect = el.getBoundingClientRect();\r\n const css = getComputedStyle(el);\r\n if (this.vertical())\r\n return event.clientY - rect.top - el.clientTop - parseFloat(css.paddingTop);\r\n return this.area.metrics().rtl\r\n ? rect.right - event.clientX - parseFloat(css.borderRightWidth) - parseFloat(css.paddingRight)\r\n : event.clientX - rect.left - el.clientLeft - parseFloat(css.paddingLeft);\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (!event.isPrimary || event.button !== 0 || !this.overflow() || this.drag) return;\r\n event.preventDefault();\r\n this.area.refresh();\r\n this.measure();\r\n const g = this.geometry();\r\n const position = g.max ? (g.offset / g.max) * g.travel : 0;\r\n const coordinate = this.coordinate(event);\r\n const onThumb = coordinate >= position && coordinate <= position + g.thumb;\r\n this.drag = { pointer: event.pointerId, grab: onThumb ? coordinate - position : g.thumb / 2 };\r\n this.host.nativeElement.setPointerCapture(event.pointerId);\r\n if (!onThumb) this.onPointerMove(event);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.drag?.pointer !== event.pointerId) return;\r\n const g = this.geometry();\r\n if (g.travel > 0)\r\n this.area.scrollTo(\r\n this.vertical() ? 'vertical' : 'horizontal',\r\n ((this.coordinate(event) - this.drag.grab) / g.travel) * g.max,\r\n );\r\n }\r\n\r\n protected endPointer(event: PointerEvent): void {\r\n if (event.pointerId === this.drag?.pointer) this.endDrag();\r\n }\r\n\r\n private endDrag(): void {\r\n const drag = this.drag;\r\n this.drag = null;\r\n if (drag && this.host.nativeElement.hasPointerCapture(drag.pointer))\r\n this.host.nativeElement.releasePointerCapture(drag.pointer);\r\n }\r\n}\r\n","@if (overflow() || keepMounted()) {\r\n <div\r\n class=\"raqm-scroll-bar__thumb\"\r\n data-slot=\"scroll-area-thumb\"\r\n [attr.data-raqm-vertical]=\"vertical() ? '' : null\"\r\n [attr.data-raqm-scrolling]=\"area.scrolling() ? '' : null\"\r\n [style]=\"thumbStyle()\"\r\n ></div>\r\n}\r\n","import { CdkScrollable } from '@angular/cdk/scrolling';\r\nimport { getRtlScrollAxisType, RtlScrollAxisType } from '@angular/cdk/platform';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n contentChildren,\r\n forwardRef,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { RaqmScrollBarComponent } from './scroll-bar';\r\nimport { SCROLL_AREA, ScrollAreaMetrics } from './scroll-area-context';\r\n\r\n/** Scroll area; the labelled native viewport is the sole keyboard/AT target and the overlay bars are `aria-hidden` and pointer-only. */\r\n@Component({\r\n selector: 'raqm-scroll-area',\r\n imports: [CdkScrollable, RaqmScrollBarComponent],\r\n templateUrl: './scroll-area.html',\r\n styleUrl: './scroll-area.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: SCROLL_AREA, useExisting: forwardRef(() => RaqmScrollAreaComponent) }],\r\n host: {\r\n class: 'raqm-scroll-area',\r\n 'data-slot': 'scroll-area',\r\n '[attr.data-raqm-has-overflow-x]': 'metrics().scrollWidth > metrics().width ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-y]': 'vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-start]': 'edges().xStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-end]': 'edges().xEnd ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-start]': 'edges().yStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-end]': 'edges().yEnd ? \"\" : null',\r\n '[attr.data-raqm-scrolling]': 'scrolling() ? \"\" : null',\r\n '(pointerenter)': 'hovering.set(true)',\r\n '(pointerleave)': 'hovering.set(false)',\r\n },\r\n})\r\nexport class RaqmScrollAreaComponent {\r\n /** Required accessible name for the keyboard-focusable native viewport. */\r\n readonly viewportLabel = input.required<string>();\r\n readonly overflowEdgeThreshold = input<\r\n number | Partial<Record<'xStart' | 'xEnd' | 'yStart' | 'yEnd', number>>\r\n >(0);\r\n readonly viewport = viewChild.required<ElementRef<HTMLElement>>('viewport');\r\n private readonly content = viewChild.required<ElementRef<HTMLElement>>('content');\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly bars = contentChildren(RaqmScrollBarComponent);\r\n protected readonly defaultVertical = computed(() => !this.bars().some((bar) => bar.vertical()));\r\n readonly metrics = signal<ScrollAreaMetrics>({\r\n width: 0,\r\n height: 0,\r\n scrollWidth: 0,\r\n scrollHeight: 0,\r\n x: 0,\r\n y: 0,\r\n rtl: false,\r\n });\r\n readonly horizontal = computed(\r\n () =>\r\n this.bars().some((bar) => !bar.vertical()) &&\r\n this.metrics().scrollWidth > this.metrics().width,\r\n );\r\n readonly vertical = computed(() => this.metrics().scrollHeight > this.metrics().height);\r\n readonly scrolling = signal(false);\r\n readonly hovering = signal(false);\r\n private scrollTimer: ReturnType<typeof setTimeout> | undefined;\r\n readonly edges = computed(() => {\r\n const m = this.metrics();\r\n const threshold = this.overflowEdgeThreshold();\r\n const edge = (key: 'xStart' | 'xEnd' | 'yStart' | 'yEnd') =>\r\n Math.max(0, typeof threshold === 'number' ? threshold : (threshold[key] ?? 0));\r\n return {\r\n xStart: m.x > edge('xStart'),\r\n xEnd: m.scrollWidth - m.width - m.x > edge('xEnd'),\r\n yStart: m.y > edge('yStart'),\r\n yEnd: m.scrollHeight - m.height - m.y > edge('yEnd'),\r\n };\r\n });\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => clearTimeout(this.scrollTimer));\r\n afterNextRender(() => {\r\n const viewport = this.viewport().nativeElement;\r\n const content = this.content().nativeElement;\r\n const resize = new ResizeObserver(() => this.refresh());\r\n resize.observe(viewport);\r\n resize.observe(content);\r\n // Direction can change on any ancestor without changing viewport size.\r\n const direction = new MutationObserver(() => this.refresh());\r\n for (\r\n let element: HTMLElement | null = this.host.nativeElement;\r\n element;\r\n element = element.parentElement\r\n ) {\r\n direction.observe(element, {\r\n attributes: true,\r\n attributeFilter: ['dir', 'class', 'style'],\r\n });\r\n }\r\n const mutation = new MutationObserver(() => this.refresh());\r\n mutation.observe(content, {\r\n subtree: true,\r\n childList: true,\r\n characterData: true,\r\n attributes: true,\r\n });\r\n const load = () => this.refresh();\r\n content.addEventListener('load', load, true);\r\n this.destroyRef.onDestroy(() => {\r\n resize.disconnect();\r\n mutation.disconnect();\r\n direction.disconnect();\r\n content.removeEventListener('load', load, true);\r\n });\r\n this.refresh();\r\n });\r\n }\r\n\r\n /** Tracks the native scroll lifecycle without changing wheel or touch events. */\r\n protected onScroll(): void {\r\n this.refresh();\r\n this.scrolling.set(true);\r\n clearTimeout(this.scrollTimer);\r\n this.scrollTimer = setTimeout(() => this.scrolling.set(false), 100);\r\n }\r\n\r\n refresh(): void {\r\n const viewport = this.viewport().nativeElement;\r\n const rtl = getComputedStyle(viewport).direction === 'rtl';\r\n const max = Math.max(0, viewport.scrollWidth - viewport.clientWidth);\r\n let x = viewport.scrollLeft;\r\n if (rtl) {\r\n switch (getRtlScrollAxisType()) {\r\n case RtlScrollAxisType.NEGATED:\r\n x = -x;\r\n break;\r\n case RtlScrollAxisType.NORMAL:\r\n x = max - x;\r\n break;\r\n }\r\n }\r\n const next = {\r\n width: viewport.clientWidth,\r\n height: viewport.clientHeight,\r\n scrollWidth: viewport.scrollWidth,\r\n scrollHeight: viewport.scrollHeight,\r\n x: Math.max(0, Math.min(max, x)),\r\n y: Math.max(0, viewport.scrollTop),\r\n rtl,\r\n };\r\n const previous = this.metrics();\r\n if (\r\n Object.keys(next).some(\r\n (key) => next[key as keyof ScrollAreaMetrics] !== previous[key as keyof ScrollAreaMetrics],\r\n )\r\n )\r\n this.metrics.set(next);\r\n }\r\n\r\n /** Sets a clamped native offset measured from the logical start of the chosen axis. */\r\n scrollTo(orientation: 'horizontal' | 'vertical', offset: number): void {\r\n const viewport = this.viewport().nativeElement;\r\n this.refresh();\r\n const metrics = this.metrics();\r\n const max =\r\n orientation === 'horizontal'\r\n ? metrics.scrollWidth - metrics.width\r\n : metrics.scrollHeight - metrics.height;\r\n let value = Math.max(0, Math.min(max, offset));\r\n if (orientation === 'vertical') {\r\n viewport.scrollTop = value;\r\n } else {\r\n if (metrics.rtl) {\r\n switch (getRtlScrollAxisType()) {\r\n case RtlScrollAxisType.NEGATED:\r\n value = -value;\r\n break;\r\n case RtlScrollAxisType.NORMAL:\r\n value = max - value;\r\n break;\r\n }\r\n }\r\n viewport.scrollLeft = value;\r\n }\r\n this.refresh();\r\n }\r\n}\r\n","<div\r\n #viewport\r\n cdkScrollable\r\n class=\"raqm-scroll-area__viewport\"\r\n data-slot=\"scroll-area-viewport\"\r\n tabindex=\"0\"\r\n role=\"region\"\r\n [attr.aria-label]=\"viewportLabel()\"\r\n (scroll)=\"onScroll()\"\r\n>\r\n <div #content class=\"raqm-scroll-area__content\"><ng-content /></div>\r\n</div>\r\n<ng-content select=\"raqm-scroll-bar\" />\r\n@if (defaultVertical()) {\r\n <raqm-scroll-bar />\r\n}\r\n@if (horizontal() && vertical()) {\r\n <div class=\"raqm-scroll-area__corner\" aria-hidden=\"true\"></div>\r\n}\r\n","import { RaqmScrollAreaComponent } from './scroll-area';\r\nimport { RaqmScrollBarComponent } from './scroll-bar';\r\n\r\nexport { RaqmScrollAreaComponent, RaqmScrollBarComponent };\r\n\r\nexport const RaqmScrollArea = [RaqmScrollAreaComponent, RaqmScrollBarComponent] as const;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raqm-ui-scroll-area.mjs","names":[],"sources":["../../../projects/ui/scroll-area/scroll-area-context.ts","../../../projects/ui/scroll-area/scroll-bar.ts","../../../projects/ui/scroll-area/scroll-bar.html","../../../projects/ui/scroll-area/scroll-area.ts","../../../projects/ui/scroll-area/scroll-area.html","../../../projects/ui/scroll-area/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\r\n\r\nexport interface ScrollAreaMetrics {\r\n width: number;\r\n height: number;\r\n scrollWidth: number;\r\n scrollHeight: number;\r\n x: number;\r\n y: number;\r\n rtl: boolean;\r\n}\r\n\r\n/** Internal root contract; the token avoids a circular component dependency. */\r\nexport const SCROLL_AREA = new InjectionToken<{\r\n metrics: Signal<ScrollAreaMetrics>;\r\n horizontal: Signal<boolean>;\r\n vertical: Signal<boolean>;\r\n scrolling: Signal<boolean>;\r\n hovering: Signal<boolean>;\r\n edges: Signal<{ xStart: boolean; xEnd: boolean; yStart: boolean; yEnd: boolean }>;\r\n refresh(): void;\r\n scrollTo(orientation: 'horizontal' | 'vertical', offset: number): void;\r\n}>('RAQM_SCROLL_AREA');\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { SCROLL_AREA } from './scroll-area-context';\r\n\r\ninterface ScrollBarCoordinates {\r\n rect: DOMRect;\r\n clientTop: number;\r\n clientLeft: number;\r\n paddingTop: number;\r\n paddingLeft: number;\r\n paddingRight: number;\r\n borderRightWidth: number;\r\n rtl: boolean;\r\n}\r\n\r\n/** Scroll bar overlay; `aria-hidden` and not a tab stop, because the viewport handles keyboard/AT scrolling. */\r\n@Component({\r\n selector: 'raqm-scroll-bar',\r\n templateUrl: './scroll-bar.html',\r\n styleUrl: './scroll-bar.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-scroll-bar',\r\n 'data-slot': 'scroll-area-scrollbar',\r\n 'aria-hidden': 'true',\r\n '[attr.data-raqm-vertical]': 'vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow]': 'overflow() ? \"\" : null',\r\n '[attr.data-raqm-keep-mounted]': 'keepMounted() ? \"\" : null',\r\n '[attr.data-raqm-corner]': 'area.horizontal() && area.vertical() ? \"\" : null',\r\n '[attr.data-raqm-scrolling]': 'area.scrolling() ? \"\" : null',\r\n '[attr.data-raqm-hovering]': 'area.hovering() ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-x]':\r\n 'area.metrics().scrollWidth > area.metrics().width ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-y]': 'area.vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-start]': 'area.edges().xStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-end]': 'area.edges().xEnd ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-start]': 'area.edges().yStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-end]': 'area.edges().yEnd ? \"\" : null',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'endPointer($event)',\r\n '(pointercancel)': 'endPointer($event)',\r\n '(lostpointercapture)': 'endPointer($event)',\r\n },\r\n})\r\nexport class RaqmScrollBarComponent {\r\n readonly vertical = input(true, { transform: booleanAttribute });\r\n /** Keeps the internal thumb mounted without overflow; the Angular host always exists. */\r\n readonly keepMounted = input(false, { transform: booleanAttribute });\r\n protected readonly area = inject(SCROLL_AREA);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly trackSize = signal(0);\r\n private drag: { pointer: number; grab: number } | null = null;\r\n // Reused within one frame only; the track can move between frames while scrolling or resizing.\r\n private coordinates: ScrollBarCoordinates | null = null;\r\n private coordinateFrame: number | undefined;\r\n protected readonly overflow = computed(() => {\r\n const m = this.area.metrics();\r\n return this.vertical() ? m.scrollHeight > m.height : m.scrollWidth > m.width;\r\n });\r\n private readonly geometry = computed(() => {\r\n const m = this.area.metrics();\r\n const vertical = this.vertical();\r\n const viewport = vertical ? m.height : m.width;\r\n const content = vertical ? m.scrollHeight : m.scrollWidth;\r\n const track = this.trackSize();\r\n const thumb = Math.min(track, Math.max(16, content ? (track * viewport) / content : track));\r\n const max = Math.max(0, content - viewport);\r\n return { thumb, travel: track - thumb, max, offset: vertical ? m.y : m.x };\r\n });\r\n protected readonly thumbStyle = computed(() => {\r\n const g = this.geometry();\r\n const position = g.max ? (g.offset / g.max) * g.travel : 0;\r\n return this.vertical()\r\n ? { 'block-size': `${g.thumb}px`, 'inset-block-start': `${position}px` }\r\n : { 'inline-size': `${g.thumb}px`, 'inset-inline-start': `${position}px` };\r\n });\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const resize =\r\n typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(() => this.measure());\r\n resize?.observe(this.host.nativeElement);\r\n this.measure();\r\n const track = this.host.nativeElement;\r\n const wheel = (event: WheelEvent) => this.onTrackWheel(event);\r\n track.addEventListener('wheel', wheel, { passive: false });\r\n this.destroyRef.onDestroy(() => {\r\n resize?.disconnect();\r\n track.removeEventListener('wheel', wheel);\r\n });\r\n });\r\n this.destroyRef.onDestroy(() => this.endDrag());\r\n }\r\n\r\n /** Bridges only overlay-track wheel input; viewport wheel/touch remain native. */\r\n private onTrackWheel(event: WheelEvent): void {\r\n if (event.ctrlKey || event.defaultPrevented || !event.cancelable) return;\r\n const vertical = this.vertical();\r\n const delta = vertical ? event.deltaY : event.deltaX;\r\n if (!Number.isFinite(delta) || delta === 0) return;\r\n this.area.refresh();\r\n const metrics = this.area.metrics();\r\n const css = getComputedStyle(this.host.nativeElement);\r\n // Computed line-height may be `normal`: use the inherited font's usual 1.2 ratio.\r\n const lineHeight = parseFloat(css.lineHeight) || parseFloat(css.fontSize) * 1.2 || 16;\r\n const unit =\r\n event.deltaMode === WheelEvent.DOM_DELTA_LINE\r\n ? lineHeight\r\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE\r\n ? vertical\r\n ? metrics.height\r\n : metrics.width\r\n : 1;\r\n // Wheel deltaX is physical; the root's public offset is measured from logical start.\r\n const change = delta * unit * (!vertical && metrics.rtl ? -1 : 1);\r\n const before = vertical ? metrics.y : metrics.x;\r\n this.area.scrollTo(this.vertical() ? 'vertical' : 'horizontal', before + change);\r\n const after = this.area.metrics();\r\n if ((vertical ? after.y : after.x) !== before) event.preventDefault();\r\n }\r\n\r\n private measure(): void {\r\n const el = this.host.nativeElement;\r\n const css = getComputedStyle(el);\r\n const vertical = this.vertical();\r\n this.trackSize.set(\r\n Math.max(\r\n 0,\r\n (vertical ? el.clientHeight : el.clientWidth) -\r\n parseFloat(vertical ? css.paddingTop : css.paddingLeft) -\r\n parseFloat(vertical ? css.paddingBottom : css.paddingRight),\r\n ),\r\n );\r\n }\r\n\r\n private coordinate(event: PointerEvent): number {\r\n const space = this.coordinates ?? this.measureCoordinates();\r\n if (this.vertical()) return event.clientY - space.rect.top - space.clientTop - space.paddingTop;\r\n return space.rtl\r\n ? space.rect.right - event.clientX - space.borderRightWidth - space.paddingRight\r\n : event.clientX - space.rect.left - space.clientLeft - space.paddingLeft;\r\n }\r\n\r\n private measureCoordinates(): ScrollBarCoordinates {\r\n const el = this.host.nativeElement;\r\n const css = getComputedStyle(el);\r\n const space: ScrollBarCoordinates = {\r\n rect: el.getBoundingClientRect(),\r\n clientTop: el.clientTop,\r\n clientLeft: el.clientLeft,\r\n paddingTop: parseFloat(css.paddingTop),\r\n paddingLeft: parseFloat(css.paddingLeft),\r\n paddingRight: parseFloat(css.paddingRight),\r\n borderRightWidth: parseFloat(css.borderRightWidth),\r\n rtl: this.area.metrics().rtl,\r\n };\r\n // Without frames, measure every call rather than risk a stale drag coordinate.\r\n if (typeof requestAnimationFrame === 'undefined') return space;\r\n this.coordinates = space;\r\n if (this.coordinateFrame === undefined) {\r\n this.coordinateFrame = requestAnimationFrame(() => {\r\n this.coordinateFrame = undefined;\r\n this.coordinates = null;\r\n });\r\n }\r\n return space;\r\n }\r\n\r\n private clearCoordinates(): void {\r\n if (this.coordinateFrame !== undefined && typeof cancelAnimationFrame !== 'undefined') {\r\n cancelAnimationFrame(this.coordinateFrame);\r\n }\r\n this.coordinateFrame = undefined;\r\n this.coordinates = null;\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (!event.isPrimary || event.button !== 0 || !this.overflow() || this.drag) return;\r\n event.preventDefault();\r\n this.area.refresh();\r\n this.measure();\r\n const g = this.geometry();\r\n const position = g.max ? (g.offset / g.max) * g.travel : 0;\r\n const coordinate = this.coordinate(event);\r\n const onThumb = coordinate >= position && coordinate <= position + g.thumb;\r\n this.drag = { pointer: event.pointerId, grab: onThumb ? coordinate - position : g.thumb / 2 };\r\n this.host.nativeElement.setPointerCapture(event.pointerId);\r\n if (!onThumb) this.onPointerMove(event);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (this.drag?.pointer !== event.pointerId) return;\r\n const g = this.geometry();\r\n if (g.travel > 0)\r\n this.area.scrollTo(\r\n this.vertical() ? 'vertical' : 'horizontal',\r\n ((this.coordinate(event) - this.drag.grab) / g.travel) * g.max,\r\n );\r\n }\r\n\r\n protected endPointer(event: PointerEvent): void {\r\n if (event.pointerId === this.drag?.pointer) this.endDrag();\r\n }\r\n\r\n private endDrag(): void {\r\n const drag = this.drag;\r\n this.drag = null;\r\n this.clearCoordinates();\r\n if (drag && this.host.nativeElement.hasPointerCapture(drag.pointer))\r\n this.host.nativeElement.releasePointerCapture(drag.pointer);\r\n }\r\n}\r\n","@if (overflow() || keepMounted()) {\r\n <div\r\n class=\"raqm-scroll-bar__thumb\"\r\n data-slot=\"scroll-area-thumb\"\r\n [attr.data-raqm-vertical]=\"vertical() ? '' : null\"\r\n [attr.data-raqm-scrolling]=\"area.scrolling() ? '' : null\"\r\n [style]=\"thumbStyle()\"\r\n ></div>\r\n}\r\n","import { CdkScrollable } from '@angular/cdk/scrolling';\r\nimport { getRtlScrollAxisType, RtlScrollAxisType } from '@angular/cdk/platform';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n contentChildren,\r\n forwardRef,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { RaqmScrollBarComponent } from './scroll-bar';\r\nimport { SCROLL_AREA, ScrollAreaMetrics } from './scroll-area-context';\r\n\r\n/** Layout-derived state; scrolling only changes offsets, so this survives scroll events. */\r\ninterface ScrollAreaGeometry {\r\n width: number;\r\n height: number;\r\n scrollWidth: number;\r\n scrollHeight: number;\r\n rtl: boolean;\r\n}\r\n\r\n/** Scroll area; the labelled native viewport is the sole keyboard/AT target and the overlay bars are `aria-hidden` and pointer-only. */\r\n@Component({\r\n selector: 'raqm-scroll-area',\r\n imports: [CdkScrollable, RaqmScrollBarComponent],\r\n templateUrl: './scroll-area.html',\r\n styleUrl: './scroll-area.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: SCROLL_AREA, useExisting: forwardRef(() => RaqmScrollAreaComponent) }],\r\n host: {\r\n class: 'raqm-scroll-area',\r\n 'data-slot': 'scroll-area',\r\n '[attr.data-raqm-has-overflow-x]': 'metrics().scrollWidth > metrics().width ? \"\" : null',\r\n '[attr.data-raqm-has-overflow-y]': 'vertical() ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-start]': 'edges().xStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-x-end]': 'edges().xEnd ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-start]': 'edges().yStart ? \"\" : null',\r\n '[attr.data-raqm-overflow-y-end]': 'edges().yEnd ? \"\" : null',\r\n '[attr.data-raqm-scrolling]': 'scrolling() ? \"\" : null',\r\n '(pointerenter)': 'hovering.set(true)',\r\n '(pointerleave)': 'hovering.set(false)',\r\n },\r\n})\r\nexport class RaqmScrollAreaComponent {\r\n /** Required accessible name for the keyboard-focusable native viewport. */\r\n readonly viewportLabel = input.required<string>();\r\n readonly overflowEdgeThreshold = input<\r\n number | Partial<Record<'xStart' | 'xEnd' | 'yStart' | 'yEnd', number>>\r\n >(0);\r\n readonly viewport = viewChild.required<ElementRef<HTMLElement>>('viewport');\r\n private readonly content = viewChild.required<ElementRef<HTMLElement>>('content');\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly bars = contentChildren(RaqmScrollBarComponent);\r\n protected readonly defaultVertical = computed(() => !this.bars().some((bar) => bar.vertical()));\r\n readonly metrics = signal<ScrollAreaMetrics>({\r\n width: 0,\r\n height: 0,\r\n scrollWidth: 0,\r\n scrollHeight: 0,\r\n x: 0,\r\n y: 0,\r\n rtl: false,\r\n });\r\n readonly horizontal = computed(\r\n () =>\r\n this.bars().some((bar) => !bar.vertical()) &&\r\n this.metrics().scrollWidth > this.metrics().width,\r\n );\r\n readonly vertical = computed(() => this.metrics().scrollHeight > this.metrics().height);\r\n readonly scrolling = signal(false);\r\n readonly hovering = signal(false);\r\n private geometry: ScrollAreaGeometry | null = null;\r\n private scrollTimer: ReturnType<typeof setTimeout> | undefined;\r\n private frame: number | undefined;\r\n readonly edges = computed(() => {\r\n const m = this.metrics();\r\n const threshold = this.overflowEdgeThreshold();\r\n const edge = (key: 'xStart' | 'xEnd' | 'yStart' | 'yEnd') =>\r\n Math.max(0, typeof threshold === 'number' ? threshold : (threshold[key] ?? 0));\r\n return {\r\n xStart: m.x > edge('xStart'),\r\n xEnd: m.scrollWidth - m.width - m.x > edge('xEnd'),\r\n yStart: m.y > edge('yStart'),\r\n yEnd: m.scrollHeight - m.height - m.y > edge('yEnd'),\r\n };\r\n });\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => {\r\n clearTimeout(this.scrollTimer);\r\n if (this.frame !== undefined && typeof cancelAnimationFrame !== 'undefined') {\r\n cancelAnimationFrame(this.frame);\r\n }\r\n });\r\n afterNextRender(() => {\r\n const viewport = this.viewport().nativeElement;\r\n const content = this.content().nativeElement;\r\n const resize =\r\n typeof ResizeObserver === 'undefined'\r\n ? null\r\n : new ResizeObserver(() => this.scheduleRefresh());\r\n resize?.observe(viewport);\r\n resize?.observe(content);\r\n // Direction can change on any ancestor without changing viewport size.\r\n const direction = new MutationObserver(() => this.scheduleRefresh());\r\n for (\r\n let element: HTMLElement | null = this.host.nativeElement;\r\n element;\r\n element = element.parentElement\r\n ) {\r\n direction.observe(element, {\r\n attributes: true,\r\n attributeFilter: ['dir', 'class', 'style'],\r\n });\r\n }\r\n const mutation = new MutationObserver(() => this.scheduleRefresh());\r\n mutation.observe(content, {\r\n subtree: true,\r\n childList: true,\r\n characterData: true,\r\n attributes: true,\r\n });\r\n const load = () => this.scheduleRefresh();\r\n content.addEventListener('load', load, true);\r\n this.destroyRef.onDestroy(() => {\r\n resize?.disconnect();\r\n mutation.disconnect();\r\n direction.disconnect();\r\n content.removeEventListener('load', load, true);\r\n });\r\n this.refresh();\r\n });\r\n }\r\n\r\n /** Tracks the native scroll lifecycle without changing wheel or touch events. */\r\n protected onScroll(): void {\r\n this.scrolling.set(true);\r\n clearTimeout(this.scrollTimer);\r\n this.scrollTimer = setTimeout(() => this.scrolling.set(false), 100);\r\n // Native scrolling can follow layout that no observer reports, so revalidate per frame.\r\n this.scheduleRefresh();\r\n }\r\n\r\n /** Coalesces scroll and observer notifications; callers that need fresh data call `refresh` directly. */\r\n private scheduleRefresh(): void {\r\n if (typeof requestAnimationFrame === 'undefined') {\r\n this.refresh();\r\n return;\r\n }\r\n if (this.frame !== undefined) return;\r\n this.frame = requestAnimationFrame(() => {\r\n this.frame = undefined;\r\n this.refresh();\r\n });\r\n }\r\n\r\n /** Re-reads layout and direction, then publishes the current offsets. */\r\n refresh(): void {\r\n const viewport = this.viewport().nativeElement;\r\n this.geometry = {\r\n width: viewport.clientWidth,\r\n height: viewport.clientHeight,\r\n scrollWidth: viewport.scrollWidth,\r\n scrollHeight: viewport.scrollHeight,\r\n rtl: getComputedStyle(viewport).direction === 'rtl',\r\n };\r\n this.refreshOffsets();\r\n }\r\n\r\n /** Reads only the offsets, reusing the last measured layout. */\r\n private refreshOffsets(): void {\r\n const geometry = this.geometry;\r\n if (geometry === null) {\r\n this.refresh();\r\n return;\r\n }\r\n const viewport = this.viewport().nativeElement;\r\n const max = Math.max(0, geometry.scrollWidth - geometry.width);\r\n let x = viewport.scrollLeft;\r\n if (geometry.rtl) {\r\n switch (getRtlScrollAxisType()) {\r\n case RtlScrollAxisType.NEGATED:\r\n x = -x;\r\n break;\r\n case RtlScrollAxisType.NORMAL:\r\n x = max - x;\r\n break;\r\n }\r\n }\r\n x = Math.max(0, Math.min(max, x));\r\n const y = Math.max(0, viewport.scrollTop);\r\n const previous = this.metrics();\r\n if (\r\n x === previous.x &&\r\n y === previous.y &&\r\n geometry.width === previous.width &&\r\n geometry.height === previous.height &&\r\n geometry.scrollWidth === previous.scrollWidth &&\r\n geometry.scrollHeight === previous.scrollHeight &&\r\n geometry.rtl === previous.rtl\r\n ) {\r\n return;\r\n }\r\n this.metrics.set({ ...geometry, x, y });\r\n }\r\n\r\n /** Sets a clamped native offset measured from the logical start of the chosen axis. */\r\n scrollTo(orientation: 'horizontal' | 'vertical', offset: number): void {\r\n const viewport = this.viewport().nativeElement;\r\n this.refresh();\r\n const metrics = this.metrics();\r\n const max =\r\n orientation === 'horizontal'\r\n ? metrics.scrollWidth - metrics.width\r\n : metrics.scrollHeight - metrics.height;\r\n let value = Math.max(0, Math.min(max, offset));\r\n if (orientation === 'vertical') {\r\n viewport.scrollTop = value;\r\n } else {\r\n if (metrics.rtl) {\r\n switch (getRtlScrollAxisType()) {\r\n case RtlScrollAxisType.NEGATED:\r\n value = -value;\r\n break;\r\n case RtlScrollAxisType.NORMAL:\r\n value = max - value;\r\n break;\r\n }\r\n }\r\n viewport.scrollLeft = value;\r\n }\r\n this.refreshOffsets();\r\n }\r\n}\r\n","<div\r\n #viewport\r\n cdkScrollable\r\n class=\"raqm-scroll-area__viewport\"\r\n data-slot=\"scroll-area-viewport\"\r\n tabindex=\"0\"\r\n role=\"region\"\r\n [attr.aria-label]=\"viewportLabel()\"\r\n (scroll)=\"onScroll()\"\r\n>\r\n <div #content class=\"raqm-scroll-area__content\"><ng-content /></div>\r\n</div>\r\n<ng-content select=\"raqm-scroll-bar\" />\r\n@if (defaultVertical()) {\r\n <raqm-scroll-bar />\r\n}\r\n@if (horizontal() && vertical()) {\r\n <div class=\"raqm-scroll-area__corner\" aria-hidden=\"true\"></div>\r\n}\r\n","import { RaqmScrollAreaComponent } from './scroll-area';\r\nimport { RaqmScrollBarComponent } from './scroll-bar';\r\n\r\nexport { RaqmScrollAreaComponent, RaqmScrollBarComponent };\r\n\r\nexport const RaqmScrollArea = [RaqmScrollAreaComponent, RaqmScrollBarComponent] as const;\r\n"],"mappings":"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"}
|
|
@@ -142,9 +142,8 @@ var RaqmSelectKeyboard = class {
|
|
|
142
142
|
onOptionPointerMove(view) {
|
|
143
143
|
if (view.option.disabled === true) return;
|
|
144
144
|
if (this.host.activeId() === view.id) return;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
this.keyManager?.setActiveItem(index);
|
|
145
|
+
if (this.host.optionViews()[view.index]?.id !== view.id) return;
|
|
146
|
+
this.keyManager?.setActiveItem(view.index);
|
|
148
147
|
}
|
|
149
148
|
onOptionPointerLeave(event) {
|
|
150
149
|
if (event.pointerType === "touch") return;
|
|
@@ -276,6 +275,7 @@ var RaqmSelectPosition = class {
|
|
|
276
275
|
positionSubscription;
|
|
277
276
|
appliedAligned;
|
|
278
277
|
alignmentDeactivated = false;
|
|
278
|
+
popupElementRef = null;
|
|
279
279
|
constructor(viewportRuler, host) {
|
|
280
280
|
this.viewportRuler = viewportRuler;
|
|
281
281
|
this.host = host;
|
|
@@ -323,10 +323,18 @@ var RaqmSelectPosition = class {
|
|
|
323
323
|
this.positionStrategy = void 0;
|
|
324
324
|
this.appliedAligned = void 0;
|
|
325
325
|
this.alignmentDeactivated = false;
|
|
326
|
+
this.popupElementRef = null;
|
|
326
327
|
}
|
|
327
328
|
resetAfterDetach() {
|
|
328
329
|
this.positionStrategy = void 0;
|
|
329
330
|
this.appliedAligned = void 0;
|
|
331
|
+
this.popupElementRef = null;
|
|
332
|
+
}
|
|
333
|
+
popupElement() {
|
|
334
|
+
const cached = this.popupElementRef;
|
|
335
|
+
if (cached?.isConnected) return cached;
|
|
336
|
+
this.popupElementRef = this.host.overlayRef()?.overlayElement.querySelector(".raqm-select-popup") ?? null;
|
|
337
|
+
return this.popupElementRef;
|
|
330
338
|
}
|
|
331
339
|
reactToAlignmentChange() {
|
|
332
340
|
const aligned = this.host.alignItemWithTrigger();
|
|
@@ -337,7 +345,7 @@ var RaqmSelectPosition = class {
|
|
|
337
345
|
const overlayRef = this.host.overlayRef();
|
|
338
346
|
const strategy = this.positionStrategy;
|
|
339
347
|
if (!overlayRef || !strategy) return;
|
|
340
|
-
const popupElement =
|
|
348
|
+
const popupElement = this.popupElement();
|
|
341
349
|
this.configureStrategy(strategy, aligned);
|
|
342
350
|
this.appliedAligned = aligned;
|
|
343
351
|
if (aligned) {
|
|
@@ -357,7 +365,7 @@ var RaqmSelectPosition = class {
|
|
|
357
365
|
const strategy = this.positionStrategy;
|
|
358
366
|
if (!overlayRef || !strategy || !this.host.alignItemWithTrigger() || this.alignmentDeactivated) return;
|
|
359
367
|
const triggerElement = this.host.trigger();
|
|
360
|
-
const popupElement =
|
|
368
|
+
const popupElement = this.popupElement();
|
|
361
369
|
const activeId = this.host.activeId();
|
|
362
370
|
const rowElement = activeId ? overlayRef.overlayElement.querySelector(`[id="${activeId}"]`) : null;
|
|
363
371
|
if (!popupElement || !rowElement) {
|
|
@@ -396,7 +404,7 @@ var RaqmSelectPosition = class {
|
|
|
396
404
|
if (heightReduced) this.host.updateScrollAffordances();
|
|
397
405
|
}
|
|
398
406
|
boundPopupHeight() {
|
|
399
|
-
const popupElement = this.
|
|
407
|
+
const popupElement = this.popupElement();
|
|
400
408
|
if (!popupElement) return;
|
|
401
409
|
const triggerRect = this.host.trigger().getBoundingClientRect();
|
|
402
410
|
const viewport = this.viewportRuler.getViewportSize();
|
|
@@ -417,7 +425,7 @@ var RaqmSelectPosition = class {
|
|
|
417
425
|
if (!overlayRef || !strategy) return;
|
|
418
426
|
this.alignmentDeactivated = true;
|
|
419
427
|
this.appliedAligned = false;
|
|
420
|
-
const popupElement =
|
|
428
|
+
const popupElement = this.popupElement();
|
|
421
429
|
if (popupElement) popupElement.style.maxHeight = "";
|
|
422
430
|
strategy.withDefaultOffsetY(0);
|
|
423
431
|
this.configureStrategy(strategy, false);
|
|
@@ -432,16 +440,17 @@ var RaqmSelectScrolling = class {
|
|
|
432
440
|
autoScrollDirection = null;
|
|
433
441
|
scrollCleanup;
|
|
434
442
|
viewportSubscription;
|
|
443
|
+
popupElementRef = null;
|
|
444
|
+
arrowElementRefs = null;
|
|
435
445
|
constructor(viewportRuler, host) {
|
|
436
446
|
this.viewportRuler = viewportRuler;
|
|
437
447
|
this.host = host;
|
|
438
448
|
}
|
|
439
449
|
scrollOptionIntoView(id) {
|
|
440
|
-
const
|
|
441
|
-
if (!
|
|
442
|
-
const
|
|
443
|
-
|
|
444
|
-
if (!popupElement || !rowElement) return;
|
|
450
|
+
const popupElement = this.popupElement();
|
|
451
|
+
if (!popupElement || !id) return;
|
|
452
|
+
const rowElement = popupElement.querySelector(`[id="${id}"]`);
|
|
453
|
+
if (!rowElement) return;
|
|
445
454
|
const rowTop = rowElement.offsetTop;
|
|
446
455
|
const rowBottom = rowTop + rowElement.offsetHeight;
|
|
447
456
|
const viewTop = popupElement.scrollTop;
|
|
@@ -450,7 +459,7 @@ var RaqmSelectScrolling = class {
|
|
|
450
459
|
else if (rowBottom > viewBottom) popupElement.scrollTop = rowBottom - popupElement.clientHeight;
|
|
451
460
|
}
|
|
452
461
|
attach() {
|
|
453
|
-
const popupElement = this.
|
|
462
|
+
const popupElement = this.popupElement();
|
|
454
463
|
if (popupElement) {
|
|
455
464
|
const handler = () => this.updateAffordances();
|
|
456
465
|
popupElement.addEventListener("scroll", handler, { passive: true });
|
|
@@ -464,9 +473,11 @@ var RaqmSelectScrolling = class {
|
|
|
464
473
|
this.scrollCleanup = void 0;
|
|
465
474
|
this.viewportSubscription?.unsubscribe();
|
|
466
475
|
this.viewportSubscription = void 0;
|
|
476
|
+
this.popupElementRef = null;
|
|
477
|
+
this.arrowElementRefs = null;
|
|
467
478
|
}
|
|
468
479
|
updateAffordances() {
|
|
469
|
-
const popupElement = this.
|
|
480
|
+
const popupElement = this.popupElement();
|
|
470
481
|
if (!popupElement) {
|
|
471
482
|
this.host.setCanScrollUp(false);
|
|
472
483
|
this.host.setCanScrollDown(false);
|
|
@@ -477,13 +488,29 @@ var RaqmSelectScrolling = class {
|
|
|
477
488
|
this.host.setCanScrollDown(scrollTop + clientHeight < scrollHeight - 1);
|
|
478
489
|
}
|
|
479
490
|
scrollByStep(direction) {
|
|
480
|
-
const popupElement = this.
|
|
491
|
+
const popupElement = this.popupElement();
|
|
481
492
|
if (!popupElement) return;
|
|
482
493
|
popupElement.scrollTop += direction === "up" ? -120 : 120;
|
|
483
494
|
this.updateAffordances();
|
|
484
495
|
}
|
|
485
496
|
popupScrollElement() {
|
|
486
|
-
return this.
|
|
497
|
+
return this.popupElement();
|
|
498
|
+
}
|
|
499
|
+
popupElement() {
|
|
500
|
+
const cached = this.popupElementRef;
|
|
501
|
+
if (cached?.isConnected) return cached;
|
|
502
|
+
this.popupElementRef = this.host.overlayRef()?.overlayElement.querySelector(".raqm-select-popup") ?? null;
|
|
503
|
+
this.arrowElementRefs = null;
|
|
504
|
+
return this.popupElementRef;
|
|
505
|
+
}
|
|
506
|
+
arrowElement(direction) {
|
|
507
|
+
const popupElement = this.popupElement();
|
|
508
|
+
if (!popupElement) return null;
|
|
509
|
+
if (this.arrowElementRefs === null) this.arrowElementRefs = {
|
|
510
|
+
up: popupElement.querySelector(".raqm-select-scroll-button--up"),
|
|
511
|
+
down: popupElement.querySelector(".raqm-select-scroll-button--down")
|
|
512
|
+
};
|
|
513
|
+
return this.arrowElementRefs[direction];
|
|
487
514
|
}
|
|
488
515
|
normalizeScrollOffset(value, max) {
|
|
489
516
|
if (max <= 0) return 0;
|
|
@@ -497,14 +524,14 @@ var RaqmSelectScrolling = class {
|
|
|
497
524
|
}
|
|
498
525
|
scrollArrowStep(direction) {
|
|
499
526
|
this.host.resetActive();
|
|
500
|
-
const popupElement = this.
|
|
527
|
+
const popupElement = this.popupElement();
|
|
501
528
|
if (!popupElement) {
|
|
502
529
|
this.stopAutoScroll();
|
|
503
530
|
return;
|
|
504
531
|
}
|
|
505
532
|
const isUp = direction === "up";
|
|
506
|
-
const arrowHeight =
|
|
507
|
-
const rows =
|
|
533
|
+
const arrowHeight = this.arrowElement(direction)?.offsetHeight ?? 0;
|
|
534
|
+
const rows = popupElement.getElementsByClassName("raqm-select-option");
|
|
508
535
|
const maxScrollTop = Math.max(0, popupElement.scrollHeight - popupElement.clientHeight);
|
|
509
536
|
const scrollTop = this.normalizeScrollOffset(popupElement.scrollTop, maxScrollTop);
|
|
510
537
|
if (scrollTop !== popupElement.scrollTop) popupElement.scrollTop = scrollTop;
|