@raintonic/formaui 0.3.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -35
- package/README.md +22 -26
- package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs +39 -41
- package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-cdk-form-field.mjs +207 -3
- package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs +27 -2
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +5 -12
- package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-accordion.mjs +8 -5
- package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-alert.mjs +16 -2
- package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs +255 -462
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-avatar.mjs +34 -59
- package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button.mjs +15 -20
- package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-card.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-chip.mjs +97 -0
- package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-data-table.mjs +69 -29
- package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-date-picker.mjs +223 -144
- package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-drawer.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +888 -0
- package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +774 -0
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-form-field.mjs +81 -50
- package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-icon.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-input.mjs +47 -12
- package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-number-input.mjs +20 -12
- package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-password-input.mjs +35 -110
- package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-popover.mjs +3 -2
- package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-progressbar.mjs +3 -2
- package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-radio.mjs +5 -6
- package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-select.mjs +257 -412
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +525 -0
- package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-stepper.mjs +50 -45
- package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-strength-meter.mjs +149 -0
- package/fesm2022/raintonic-formaui-components-strength-meter.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-time-picker.mjs +194 -154
- package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs +302 -0
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-toggle.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tooltip.mjs +10 -4
- package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-topbar.mjs +60 -0
- package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-components-tree-select.mjs +59 -69
- package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree.mjs +31 -5
- package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-core.mjs +279 -1
- package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-breakpoint.mjs +93 -0
- package/fesm2022/raintonic-formaui-services-breakpoint.mjs.map +1 -0
- package/fesm2022/raintonic-formaui-services-dialog.mjs +314 -16
- package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-notification.mjs +93 -29
- package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-theme.mjs +46 -196
- package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
- package/fesm2022/raintonic-formaui.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/llms-full.txt +2329 -450
- package/llms.txt +36 -33
- package/package.json +42 -19
- package/styles/fonts/Geist-Bold.woff2 +0 -0
- package/styles/fonts/Geist-Italic.woff2 +0 -0
- package/styles/fonts/Geist-Light.woff2 +0 -0
- package/styles/fonts/Geist-Medium.woff2 +0 -0
- package/styles/fonts/Geist-Regular.woff2 +0 -0
- package/styles/fonts/Geist-SemiBold.woff2 +0 -0
- package/styles/fonts/GeistMono-Regular.woff2 +0 -0
- package/styles/generated/_tokens.scss +906 -0
- package/styles/index.scss +11 -10
- package/styles/partials/_brand.scss +46 -0
- package/styles/partials/_constants.scss +22 -20
- package/styles/partials/_fonts.scss +54 -10
- package/styles/partials/_grid.scss +29 -18
- package/styles/partials/_mixins.scss +69 -27
- package/styles/partials/_motion.scss +28 -33
- package/styles/partials/_theme.scss +28 -255
- package/styles/partials/_type.scss +117 -0
- package/styles/partials/_typography.scss +45 -45
- package/styles/partials/_utilities.scss +198 -98
- package/styles/partials/components/_button.scss +144 -75
- package/styles/partials/components/_dialog.scss +181 -180
- package/styles/partials/components/_overlay.scss +87 -87
- package/styles/partials/themes/_dark.scss +3 -268
- package/styles/partials/themes/_light.scss +4 -268
- package/styles/styles.css +7744 -0
- package/styles/styles.entry.scss +3 -0
- package/styles/utilities.css +4802 -0
- package/styles/utilities.entry.scss +3 -0
- package/types/raintonic-formaui-cdk-drag-drop.d.ts +0 -1
- package/types/raintonic-formaui-cdk-drag-drop.d.ts.map +1 -1
- package/types/raintonic-formaui-cdk-form-field.d.ts +118 -2
- package/types/raintonic-formaui-cdk-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-cdk-overlay.d.ts +2 -0
- package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
- package/types/raintonic-formaui-cdk-virtual-scroll.d.ts +0 -1
- package/types/raintonic-formaui-cdk-virtual-scroll.d.ts.map +1 -1
- package/types/raintonic-formaui-components-accordion.d.ts +1 -1
- package/types/raintonic-formaui-components-accordion.d.ts.map +1 -1
- package/types/raintonic-formaui-components-alert.d.ts +6 -1
- package/types/raintonic-formaui-components-alert.d.ts.map +1 -1
- package/types/raintonic-formaui-components-autocomplete.d.ts +73 -116
- package/types/raintonic-formaui-components-autocomplete.d.ts.map +1 -1
- package/types/raintonic-formaui-components-avatar.d.ts +13 -31
- package/types/raintonic-formaui-components-avatar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-button.d.ts +4 -10
- package/types/raintonic-formaui-components-button.d.ts.map +1 -1
- package/types/raintonic-formaui-components-chip.d.ts +43 -0
- package/types/raintonic-formaui-components-chip.d.ts.map +1 -0
- package/types/raintonic-formaui-components-data-table.d.ts +48 -11
- package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
- package/types/raintonic-formaui-components-date-picker.d.ts +59 -23
- package/types/raintonic-formaui-components-date-picker.d.ts.map +1 -1
- package/types/raintonic-formaui-components-dropdown-menu.d.ts +394 -0
- package/types/raintonic-formaui-components-dropdown-menu.d.ts.map +1 -0
- package/types/raintonic-formaui-components-dual-tier-navigation.d.ts +87 -0
- package/types/raintonic-formaui-components-dual-tier-navigation.d.ts.map +1 -0
- package/types/raintonic-formaui-components-form-field.d.ts +51 -21
- package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-components-input.d.ts +20 -11
- package/types/raintonic-formaui-components-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-number-input.d.ts +5 -3
- package/types/raintonic-formaui-components-number-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-password-input.d.ts +18 -32
- package/types/raintonic-formaui-components-password-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-popover.d.ts.map +1 -1
- package/types/raintonic-formaui-components-progressbar.d.ts +1 -1
- package/types/raintonic-formaui-components-progressbar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-radio.d.ts +1 -2
- package/types/raintonic-formaui-components-radio.d.ts.map +1 -1
- package/types/raintonic-formaui-components-select.d.ts +107 -76
- package/types/raintonic-formaui-components-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts +223 -0
- package/types/raintonic-formaui-components-sidebar-nav-menu.d.ts.map +1 -0
- package/types/raintonic-formaui-components-stepper.d.ts +4 -2
- package/types/raintonic-formaui-components-stepper.d.ts.map +1 -1
- package/types/raintonic-formaui-components-strength-meter.d.ts +78 -0
- package/types/raintonic-formaui-components-strength-meter.d.ts.map +1 -0
- package/types/raintonic-formaui-components-time-picker.d.ts +44 -24
- package/types/raintonic-formaui-components-time-picker.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toggle-group.d.ts +100 -0
- package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tooltip.d.ts +2 -1
- package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
- package/types/raintonic-formaui-components-topbar.d.ts +48 -0
- package/types/raintonic-formaui-components-topbar.d.ts.map +1 -0
- package/types/raintonic-formaui-components-tree-select.d.ts +25 -9
- package/types/raintonic-formaui-components-tree-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tree.d.ts +12 -1
- package/types/raintonic-formaui-components-tree.d.ts.map +1 -1
- package/types/raintonic-formaui-core.d.ts +243 -5
- package/types/raintonic-formaui-core.d.ts.map +1 -1
- package/types/raintonic-formaui-services-breakpoint.d.ts +44 -0
- package/types/raintonic-formaui-services-breakpoint.d.ts.map +1 -0
- package/types/raintonic-formaui-services-dialog.d.ts +141 -2
- package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
- package/types/raintonic-formaui-services-notification.d.ts +24 -2
- package/types/raintonic-formaui-services-notification.d.ts.map +1 -1
- package/types/raintonic-formaui-services-theme.d.ts +13 -103
- package/types/raintonic-formaui-services-theme.d.ts.map +1 -1
- package/types/raintonic-formaui.d.ts +1 -1
- package/fesm2022/raintonic-formaui-components-big-menu.mjs +0 -86
- package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +0 -1
- package/fesm2022/raintonic-formaui-components-menu.mjs +0 -896
- package/fesm2022/raintonic-formaui-components-menu.mjs.map +0 -1
- package/fesm2022/raintonic-formaui-components-sidebar.mjs +0 -275
- package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +0 -1
- package/fesm2022/raintonic-formaui-components-tag.mjs +0 -95
- package/fesm2022/raintonic-formaui-components-tag.mjs.map +0 -1
- package/styles/_fonts-entry.scss +0 -3
- package/styles/fonts/inter-tight-latin-italic.woff2 +0 -0
- package/styles/fonts/inter-tight-latin.woff2 +0 -0
- package/types/raintonic-formaui-components-big-menu.d.ts +0 -73
- package/types/raintonic-formaui-components-big-menu.d.ts.map +0 -1
- package/types/raintonic-formaui-components-menu.d.ts +0 -403
- package/types/raintonic-formaui-components-menu.d.ts.map +0 -1
- package/types/raintonic-formaui-components-sidebar.d.ts +0 -185
- package/types/raintonic-formaui-components-sidebar.d.ts.map +0 -1
- package/types/raintonic-formaui-components-tag.d.ts +0 -43
- package/types/raintonic-formaui-components-tag.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-cdk-drag-drop.mjs","sources":["../../../lib/cdk/drag-drop/drag-registry.service.ts","../../../lib/cdk/drag-drop/auto-scroller.ts","../../../lib/cdk/drag-drop/drag-ref.ts","../../../lib/cdk/drag-drop/fui-drag.directive.ts","../../../lib/cdk/drag-drop/fui-drop-zone.directive.ts","../../../lib/cdk/drag-drop/fui-sortable.directive.ts","../../../lib/cdk/drag-drop/raintonic-formaui-cdk-drag-drop.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\nimport { FuiActiveDrag, FuiDropZoneRef, FuiPoint, FuiSortableRef } from './drag-drop.types';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiDragRegistryService {\r\n readonly activeDrag = signal<FuiActiveDrag | null>(null);\r\n\r\n private _dropZones = new Set<FuiDropZoneRef>();\r\n private _sortables = new Set<FuiSortableRef>();\r\n\r\n registerDropZone(zone: FuiDropZoneRef): void {\r\n this._dropZones.add(zone);\r\n }\r\n\r\n unregisterDropZone(zone: FuiDropZoneRef): void {\r\n this._dropZones.delete(zone);\r\n }\r\n\r\n registerSortable(sortable: FuiSortableRef): void {\r\n this._sortables.add(sortable);\r\n }\r\n\r\n unregisterSortable(sortable: FuiSortableRef): void {\r\n this._sortables.delete(sortable);\r\n }\r\n\r\n startDrag(drag: FuiActiveDrag): void {\r\n this.activeDrag.set(drag);\r\n }\r\n\r\n updateDrag(position: FuiPoint, _event: PointerEvent): void {\r\n const active = this.activeDrag();\r\n if (active) {\r\n active.currentPosition = position;\r\n this.activeDrag.set({ ...active });\r\n }\r\n }\r\n\r\n endDrag(_event: PointerEvent): void {\r\n this.activeDrag.set(null);\r\n }\r\n\r\n cancelDrag(): void {\r\n this.activeDrag.set(null);\r\n }\r\n\r\n getDropZoneAtPoint(point: FuiPoint): FuiDropZoneRef | null {\r\n const preview = this.activeDrag()?.previewElement;\r\n if (preview) {\r\n preview.style.pointerEvents = 'none';\r\n }\r\n const elementAtPoint =\r\n typeof document.elementFromPoint === 'function' ? document.elementFromPoint(point.x, point.y) : null;\r\n if (preview) {\r\n preview.style.pointerEvents = '';\r\n }\r\n if (!elementAtPoint) {\r\n return null;\r\n }\r\n for (const zone of this._dropZones) {\r\n if (zone.element.nativeElement.contains(elementAtPoint)) {\r\n return zone;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getSortableAtPoint(point: FuiPoint): FuiSortableRef | null {\r\n const preview = this.activeDrag()?.previewElement;\r\n if (preview) {\r\n preview.style.pointerEvents = 'none';\r\n }\r\n const elementAtPoint =\r\n typeof document.elementFromPoint === 'function' ? document.elementFromPoint(point.x, point.y) : null;\r\n if (preview) {\r\n preview.style.pointerEvents = '';\r\n }\r\n if (!elementAtPoint) {\r\n return null;\r\n }\r\n for (const sortable of this._sortables) {\r\n if (sortable.element.nativeElement.contains(elementAtPoint)) {\r\n return sortable;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { FuiPoint } from './drag-drop.types';\r\n\r\nexport class FuiAutoScroller {\r\n private _rafId: number | null = null;\r\n private _scrollNode: HTMLElement | null = null;\r\n private readonly SCROLL_PROXIMITY_THRESHOLD = 30;\r\n private readonly MAX_SCROLL_SPEED = 15;\r\n\r\n checkAutoScroll(pointerPosition: FuiPoint): void {\r\n const scrollNode = this._getScrollableAtPoint(pointerPosition);\r\n if (!scrollNode) {\r\n this._stopAutoScroll();\r\n return;\r\n }\r\n this._scrollNode = scrollNode;\r\n const rect = scrollNode.getBoundingClientRect();\r\n let speedX = 0;\r\n let speedY = 0;\r\n\r\n if (pointerPosition.y - rect.top < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedY = -this._calculateSpeed(pointerPosition.y - rect.top);\r\n }\r\n if (rect.bottom - pointerPosition.y < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedY = this._calculateSpeed(rect.bottom - pointerPosition.y);\r\n }\r\n if (pointerPosition.x - rect.left < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedX = -this._calculateSpeed(pointerPosition.x - rect.left);\r\n }\r\n if (rect.right - pointerPosition.x < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedX = this._calculateSpeed(rect.right - pointerPosition.x);\r\n }\r\n\r\n if (speedX !== 0 || speedY !== 0) {\r\n this._startAutoScroll(speedX, speedY);\r\n } else {\r\n this._stopAutoScroll();\r\n }\r\n }\r\n\r\n stop(): void {\r\n this._stopAutoScroll();\r\n }\r\n\r\n destroy(): void {\r\n this._stopAutoScroll();\r\n }\r\n\r\n private _calculateSpeed(distanceFromEdge: number): number {\r\n const ratio = 1 - distanceFromEdge / this.SCROLL_PROXIMITY_THRESHOLD;\r\n return Math.ceil(ratio * this.MAX_SCROLL_SPEED);\r\n }\r\n\r\n private _startAutoScroll(speedX: number, speedY: number): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId);\r\n }\r\n const scroll = (): void => {\r\n if (this._scrollNode) {\r\n this._scrollNode.scrollTop += speedY;\r\n this._scrollNode.scrollLeft += speedX;\r\n }\r\n this._rafId = requestAnimationFrame(scroll);\r\n };\r\n this._rafId = requestAnimationFrame(scroll);\r\n }\r\n\r\n private _stopAutoScroll(): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId);\r\n this._rafId = null;\r\n }\r\n }\r\n\r\n private _getScrollableAtPoint(point: FuiPoint): HTMLElement | null {\r\n if (typeof document.elementFromPoint !== 'function') {\r\n return null;\r\n }\r\n let element = document.elementFromPoint(point.x, point.y) as HTMLElement | null;\r\n while (element) {\r\n const style = window.getComputedStyle(element);\r\n if ((style.overflowY === 'auto' || style.overflowY === 'scroll') && element.scrollHeight > element.clientHeight) {\r\n return element;\r\n }\r\n if ((style.overflowX === 'auto' || style.overflowX === 'scroll') && element.scrollWidth > element.clientWidth) {\r\n return element;\r\n }\r\n element = element.parentElement;\r\n }\r\n return null;\r\n }\r\n}\r\n","import { FuiPoint } from './drag-drop.types';\r\n\r\n/**\r\n * Internal helper that tracks positional state for a single drag operation.\r\n * Used by FuiDragDirective to keep the directive itself cleaner.\r\n */\r\nexport class FuiDragRef {\r\n startPosition: FuiPoint = { x: 0, y: 0 };\r\n currentPosition: FuiPoint = { x: 0, y: 0 };\r\n private _active = false;\r\n\r\n get active(): boolean {\r\n return this._active;\r\n }\r\n\r\n start(x: number, y: number): void {\r\n this.startPosition = { x, y };\r\n this.currentPosition = { x, y };\r\n this._active = true;\r\n }\r\n\r\n move(x: number, y: number): void {\r\n this.currentPosition = { x, y };\r\n }\r\n\r\n get distance(): FuiPoint {\r\n return {\r\n x: this.currentPosition.x - this.startPosition.x,\r\n y: this.currentPosition.y - this.startPosition.y,\r\n };\r\n }\r\n\r\n reset(): void {\r\n this.startPosition = { x: 0, y: 0 };\r\n this.currentPosition = { x: 0, y: 0 };\r\n this._active = false;\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n Renderer2,\r\n signal,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { FuiDragRegistryService } from './drag-registry.service';\r\nimport { FuiAutoScroller } from './auto-scroller';\r\nimport { FuiDragRef } from './drag-ref';\r\nimport { FuiDragAxis, FuiDragEvent, FuiDropEvent, FuiPoint } from './drag-drop.types';\r\n\r\n@Directive({\r\n selector: '[fuiDrag]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-drag',\r\n '[class.fui-drag--dragging]': '_isDragging()',\r\n '[attr.aria-grabbed]': '_isDragging()',\r\n '[attr.aria-roledescription]': '\"draggable item\"',\r\n tabindex: '0',\r\n '(pointerdown)': '_onPointerDown($event)',\r\n '(keydown)': '_onKeydown($event)',\r\n },\r\n})\r\nexport class FuiDragDirective implements OnDestroy {\r\n readonly fuiDragData = input<any>(null);\r\n readonly fuiDragDisabled = input(false);\r\n readonly fuiDragLockAxis = input<FuiDragAxis>('free');\r\n readonly fuiDragPreviewTemplate = input<TemplateRef<any> | null>(null);\r\n readonly fuiDragPlaceholderTemplate = input<TemplateRef<any> | null>(null);\r\n readonly fuiDragBoundary = input<string | ElementRef | null>(null);\r\n\r\n readonly fuiDragStarted = output<FuiDragEvent>();\r\n readonly fuiDragMoved = output<FuiDragEvent>();\r\n readonly fuiDragEnded = output<FuiDragEvent>();\r\n readonly fuiDragDropped = output<FuiDropEvent>();\r\n\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly _isDragging = signal(false);\r\n\r\n private readonly _registry = inject(FuiDragRegistryService);\r\n private readonly _renderer = inject(Renderer2);\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _ngZone = inject(NgZone);\r\n private readonly _autoScroller = new FuiAutoScroller();\r\n private readonly _dragRef = new FuiDragRef();\r\n\r\n private _previewElement: HTMLElement | null = null;\r\n private _placeholderElement: HTMLElement | null = null;\r\n private _pointerMoveHandler: ((e: PointerEvent) => void) | null = null;\r\n private _pointerUpHandler: ((e: PointerEvent) => void) | null = null;\r\n private _boundaryRect: DOMRect | null = null;\r\n\r\n // Keyboard drag state\r\n private _keyboardDragging = false;\r\n private _keyboardPosition: FuiPoint = { x: 0, y: 0 };\r\n private readonly KEYBOARD_STEP = 10;\r\n\r\n _onPointerDown(event: PointerEvent): void {\r\n if (this.fuiDragDisabled() || event.button !== 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const startPosition: FuiPoint = { x: event.clientX, y: event.clientY };\r\n this._dragRef.start(startPosition.x, startPosition.y);\r\n this._resolveBoundary();\r\n\r\n this._previewElement = this._createPreview();\r\n this._updatePreviewPosition(startPosition);\r\n this._document.body.appendChild(this._previewElement);\r\n\r\n // Create placeholder at source location\r\n this._placeholderElement = this._createPlaceholder();\r\n this.element.nativeElement.parentNode?.insertBefore(\r\n this._placeholderElement,\r\n this.element.nativeElement.nextSibling,\r\n );\r\n\r\n this._isDragging.set(true);\r\n\r\n this._registry.startDrag({\r\n source: this,\r\n previewElement: this._previewElement,\r\n placeholderElement: this._placeholderElement,\r\n startPosition,\r\n currentPosition: { ...startPosition },\r\n data: this.fuiDragData(),\r\n });\r\n\r\n this.fuiDragStarted.emit({\r\n source: this,\r\n data: this.fuiDragData(),\r\n pointerPosition: startPosition,\r\n distance: { x: 0, y: 0 },\r\n event,\r\n });\r\n\r\n this._ngZone.runOutsideAngular(() => {\r\n this._pointerMoveHandler = (e: PointerEvent): void => {\r\n this._onPointerMove(e);\r\n };\r\n this._pointerUpHandler = (e: PointerEvent): void => {\r\n this._onPointerUp(e);\r\n };\r\n this._document.addEventListener('pointermove', this._pointerMoveHandler);\r\n this._document.addEventListener('pointerup', this._pointerUpHandler);\r\n });\r\n }\r\n\r\n private _onPointerMove(event: PointerEvent): void {\r\n const position = this._applyConstraints({ x: event.clientX, y: event.clientY });\r\n this._dragRef.move(position.x, position.y);\r\n\r\n if (this._previewElement) {\r\n this._updatePreviewPosition(position);\r\n }\r\n\r\n this._autoScroller.checkAutoScroll(position);\r\n this._registry.updateDrag(position, event);\r\n\r\n this._ngZone.run(() => {\r\n this.fuiDragMoved.emit({\r\n source: this,\r\n data: this.fuiDragData(),\r\n pointerPosition: position,\r\n distance: this._dragRef.distance,\r\n event,\r\n });\r\n });\r\n }\r\n\r\n private _onPointerUp(event: PointerEvent): void {\r\n this._removeListeners();\r\n this._autoScroller.stop();\r\n\r\n const position: FuiPoint = { x: event.clientX, y: event.clientY };\r\n const dropZone = this._registry.getDropZoneAtPoint(position);\r\n\r\n if (dropZone && !dropZone.fuiDropZoneDisabled()) {\r\n const predicate = dropZone.fuiDropZonePredicate();\r\n const accepted = !predicate || predicate(this);\r\n\r\n if (accepted) {\r\n this._ngZone.run(() => {\r\n const dropEvent: FuiDropEvent = {\r\n source: this,\r\n dragData: this.fuiDragData(),\r\n dropZoneData: dropZone.fuiDropZoneData(),\r\n dropZone,\r\n isPointerOverContainer: true,\r\n };\r\n this.fuiDragDropped.emit(dropEvent);\r\n dropZone.fuiDropped.emit(dropEvent);\r\n });\r\n }\r\n }\r\n\r\n this._cleanupDrag();\r\n\r\n this._ngZone.run(() => {\r\n this._registry.endDrag(event);\r\n this.fuiDragEnded.emit({\r\n source: this,\r\n data: this.fuiDragData(),\r\n pointerPosition: position,\r\n distance: this._dragRef.distance,\r\n event,\r\n });\r\n this._isDragging.set(false);\r\n });\r\n\r\n this._dragRef.reset();\r\n }\r\n\r\n _onKeydown(event: KeyboardEvent): void {\r\n if (this.fuiDragDisabled()) {\r\n return;\r\n }\r\n\r\n if (!this._keyboardDragging) {\r\n if (event.key === ' ' || event.key === 'Enter') {\r\n event.preventDefault();\r\n this._startKeyboardDrag();\r\n }\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._moveKeyboard(0, -this.KEYBOARD_STEP);\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._moveKeyboard(0, this.KEYBOARD_STEP);\r\n break;\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this._moveKeyboard(-this.KEYBOARD_STEP, 0);\r\n break;\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this._moveKeyboard(this.KEYBOARD_STEP, 0);\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this._cancelKeyboardDrag();\r\n break;\r\n case ' ':\r\n case 'Enter':\r\n event.preventDefault();\r\n this._endKeyboardDrag();\r\n break;\r\n }\r\n }\r\n\r\n private _startKeyboardDrag(): void {\r\n const rect = (this.element.nativeElement as HTMLElement).getBoundingClientRect();\r\n const startPosition: FuiPoint = {\r\n x: rect.left + rect.width / 2,\r\n y: rect.top + rect.height / 2,\r\n };\r\n\r\n this._keyboardDragging = true;\r\n this._keyboardPosition = { ...startPosition };\r\n this._dragRef.start(startPosition.x, startPosition.y);\r\n\r\n this._previewElement = this._createPreview();\r\n this._updatePreviewPosition(startPosition);\r\n this._document.body.appendChild(this._previewElement);\r\n\r\n this._isDragging.set(true);\r\n this._registry.startDrag({\r\n source: this,\r\n previewElement: this._previewElement,\r\n startPosition,\r\n currentPosition: { ...startPosition },\r\n data: this.fuiDragData(),\r\n });\r\n }\r\n\r\n private _moveKeyboard(dx: number, dy: number): void {\r\n const axis = this.fuiDragLockAxis();\r\n if (axis === 'x') {\r\n dy = 0;\r\n }\r\n if (axis === 'y') {\r\n dx = 0;\r\n }\r\n\r\n this._keyboardPosition.x += dx;\r\n this._keyboardPosition.y += dy;\r\n this._dragRef.move(this._keyboardPosition.x, this._keyboardPosition.y);\r\n\r\n if (this._previewElement) {\r\n this._updatePreviewPosition(this._keyboardPosition);\r\n }\r\n }\r\n\r\n private _endKeyboardDrag(): void {\r\n const position = this._keyboardPosition;\r\n const dropZone = this._registry.getDropZoneAtPoint(position);\r\n\r\n if (dropZone && !dropZone.fuiDropZoneDisabled()) {\r\n const predicate = dropZone.fuiDropZonePredicate();\r\n const accepted = !predicate || predicate(this);\r\n\r\n if (accepted) {\r\n const dropEvent: FuiDropEvent = {\r\n source: this,\r\n dragData: this.fuiDragData(),\r\n dropZoneData: dropZone.fuiDropZoneData(),\r\n dropZone,\r\n isPointerOverContainer: true,\r\n };\r\n this.fuiDragDropped.emit(dropEvent);\r\n dropZone.fuiDropped.emit(dropEvent);\r\n }\r\n }\r\n\r\n this._cleanupDrag();\r\n this._registry.cancelDrag();\r\n this._isDragging.set(false);\r\n this._keyboardDragging = false;\r\n this._dragRef.reset();\r\n }\r\n\r\n private _cancelKeyboardDrag(): void {\r\n this._cleanupDrag();\r\n this._registry.cancelDrag();\r\n this._isDragging.set(false);\r\n this._keyboardDragging = false;\r\n this._dragRef.reset();\r\n }\r\n\r\n private _createPreview(): HTMLElement {\r\n const sourceEl = this.element.nativeElement;\r\n const rect = sourceEl.getBoundingClientRect();\r\n const preview = sourceEl.cloneNode(true) as HTMLElement;\r\n\r\n preview.classList.add('fui-drag-preview');\r\n preview.style.position = 'fixed';\r\n preview.style.width = `${rect.width}px`;\r\n preview.style.height = `${rect.height}px`;\r\n preview.style.zIndex = '10000';\r\n preview.style.pointerEvents = 'none';\r\n preview.style.margin = '0';\r\n\r\n return preview;\r\n }\r\n\r\n private _createPlaceholder(): HTMLElement {\r\n const sourceEl = this.element.nativeElement;\r\n const rect = sourceEl.getBoundingClientRect();\r\n const placeholder = this._document.createElement('div');\r\n\r\n placeholder.classList.add('fui-drag-placeholder');\r\n placeholder.style.width = `${rect.width}px`;\r\n placeholder.style.height = `${rect.height}px`;\r\n placeholder.style.boxSizing = 'border-box';\r\n\r\n return placeholder;\r\n }\r\n\r\n private _updatePreviewPosition(position: FuiPoint): void {\r\n if (!this._previewElement) {\r\n return;\r\n }\r\n const sourceRect = this.element.nativeElement.getBoundingClientRect();\r\n const offsetX = sourceRect.width / 2;\r\n const offsetY = sourceRect.height / 2;\r\n\r\n this._previewElement.style.left = `${position.x - offsetX}px`;\r\n this._previewElement.style.top = `${position.y - offsetY}px`;\r\n }\r\n\r\n private _applyConstraints(position: FuiPoint): FuiPoint {\r\n const axis = this.fuiDragLockAxis();\r\n const start = this._dragRef.startPosition;\r\n let { x, y } = position;\r\n\r\n if (axis === 'x') {\r\n y = start.y;\r\n } else if (axis === 'y') {\r\n x = start.x;\r\n }\r\n\r\n if (this._boundaryRect) {\r\n const rect = this._boundaryRect;\r\n x = Math.max(rect.left, Math.min(x, rect.right));\r\n y = Math.max(rect.top, Math.min(y, rect.bottom));\r\n }\r\n\r\n return { x, y };\r\n }\r\n\r\n /** Pattern allowing simple CSS selectors (tag, class, id, attribute selectors) */\r\n private static readonly _SAFE_SELECTOR_PATTERN = /^[a-zA-Z0-9\\-_.#\\[\\]=~|^$*:\" >,+()]+$/;\r\n\r\n private _resolveBoundary(): void {\r\n const boundary = this.fuiDragBoundary();\r\n if (!boundary) {\r\n this._boundaryRect = null;\r\n return;\r\n }\r\n\r\n let boundaryElement: HTMLElement | null = null;\r\n if (typeof boundary === 'string') {\r\n // Validate selector to prevent injection of malicious strings\r\n if (!FuiDragDirective._SAFE_SELECTOR_PATTERN.test(boundary)) {\r\n console.warn(`[FormaUI] Invalid drag boundary selector: \"${boundary}\"`);\r\n this._boundaryRect = null;\r\n return;\r\n }\r\n boundaryElement = this._document.querySelector(boundary);\r\n } else {\r\n boundaryElement = boundary.nativeElement;\r\n }\r\n\r\n this._boundaryRect = boundaryElement ? boundaryElement.getBoundingClientRect() : null;\r\n }\r\n\r\n private _cleanupDrag(): void {\r\n if (this._previewElement?.parentNode) {\r\n this._previewElement.parentNode.removeChild(this._previewElement);\r\n }\r\n this._previewElement = null;\r\n\r\n if (this._placeholderElement?.parentNode) {\r\n this._placeholderElement.parentNode.removeChild(this._placeholderElement);\r\n }\r\n this._placeholderElement = null;\r\n }\r\n\r\n private _removeListeners(): void {\r\n if (this._pointerMoveHandler) {\r\n this._document.removeEventListener('pointermove', this._pointerMoveHandler);\r\n this._pointerMoveHandler = null;\r\n }\r\n if (this._pointerUpHandler) {\r\n this._document.removeEventListener('pointerup', this._pointerUpHandler);\r\n this._pointerUpHandler = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._removeListeners();\r\n this._cleanupDrag();\r\n this._autoScroller.destroy();\r\n this._dragRef.reset();\r\n }\r\n}\r\n","import { Directive, effect, ElementRef, inject, input, OnDestroy, OnInit, output, signal } from '@angular/core';\r\nimport { FuiDragRegistryService } from './drag-registry.service';\r\nimport { FuiDragEvent, FuiDragSource, FuiDropEvent } from './drag-drop.types';\r\n\r\n@Directive({\r\n selector: '[fuiDropZone]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-drop-zone',\r\n '[class.fui-drop-zone--active]': '_isActive()',\r\n '[class.fui-drop-zone--over]': '_isOver()',\r\n '[attr.aria-dropeffect]': '\"move\"',\r\n },\r\n})\r\nexport class FuiDropZoneDirective implements OnInit, OnDestroy {\r\n readonly fuiDropZoneData = input<any>(null);\r\n readonly fuiDropZoneDisabled = input(false);\r\n readonly fuiDropZonePredicate = input<((drag: FuiDragSource) => boolean) | null>(null);\r\n\r\n readonly fuiDropZoneEntered = output<FuiDragEvent>();\r\n readonly fuiDropZoneExited = output<FuiDragEvent>();\r\n readonly fuiDropped = output<FuiDropEvent>();\r\n\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly _isActive = signal(false);\r\n readonly _isOver = signal(false);\r\n\r\n private readonly _registry = inject(FuiDragRegistryService);\r\n private _wasOver = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const activeDrag = this._registry.activeDrag();\r\n if (this.fuiDropZoneDisabled()) {\r\n this._isActive.set(false);\r\n this._isOver.set(false);\r\n return;\r\n }\r\n\r\n if (activeDrag) {\r\n this._isActive.set(true);\r\n\r\n // Check if pointer is over this drop zone\r\n const rect = this.element.nativeElement.getBoundingClientRect();\r\n const pos = activeDrag.currentPosition;\r\n const isOver = pos.x >= rect.left && pos.x <= rect.right && pos.y >= rect.top && pos.y <= rect.bottom;\r\n\r\n this._isOver.set(isOver);\r\n\r\n if (isOver && !this._wasOver) {\r\n this.fuiDropZoneEntered.emit({\r\n source: activeDrag.source,\r\n data: activeDrag.data,\r\n pointerPosition: activeDrag.currentPosition,\r\n distance: {\r\n x: activeDrag.currentPosition.x - activeDrag.startPosition.x,\r\n y: activeDrag.currentPosition.y - activeDrag.startPosition.y,\r\n },\r\n dropZone: this,\r\n event: null!,\r\n });\r\n } else if (!isOver && this._wasOver) {\r\n this.fuiDropZoneExited.emit({\r\n source: activeDrag.source,\r\n data: activeDrag.data,\r\n pointerPosition: activeDrag.currentPosition,\r\n distance: {\r\n x: activeDrag.currentPosition.x - activeDrag.startPosition.x,\r\n y: activeDrag.currentPosition.y - activeDrag.startPosition.y,\r\n },\r\n dropZone: this,\r\n event: null!,\r\n });\r\n }\r\n\r\n this._wasOver = isOver;\r\n } else {\r\n this._isActive.set(false);\r\n this._isOver.set(false);\r\n this._wasOver = false;\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this._registry.registerDropZone(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._registry.unregisterDropZone(this);\r\n }\r\n}\r\n","import {\r\n contentChildren,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FuiDragRegistryService } from './drag-registry.service';\r\nimport { FuiDragDirective } from './fui-drag.directive';\r\nimport { FuiSortEvent, FuiSortableRef, FuiTransferEvent } from './drag-drop.types';\r\n\r\n@Directive({\r\n selector: '[fuiSortable]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-sortable',\r\n '[class.fui-sortable--dragging]': '_hasDragging()',\r\n },\r\n})\r\nexport class FuiSortableDirective implements OnInit, OnDestroy {\r\n readonly fuiSortableData = input.required<any[]>();\r\n readonly fuiSortableDisabled = input(false);\r\n readonly fuiSortableOrientation = input<'vertical' | 'horizontal'>('vertical');\r\n readonly fuiSortableConnectedTo = input<FuiSortableDirective[]>([]);\r\n\r\n readonly fuiSortableSorted = output<FuiSortEvent>();\r\n readonly fuiSortableTransferred = output<FuiTransferEvent>();\r\n\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly _hasDragging = signal(false);\r\n\r\n readonly _dragItems = contentChildren(FuiDragDirective);\r\n\r\n private readonly _registry = inject(FuiDragRegistryService);\r\n private _activeDragStartIndex = -1;\r\n private _currentHoverIndex = -1;\r\n private _siblingRects: DOMRect[] = [];\r\n\r\n constructor() {\r\n effect(() => {\r\n const activeDrag = this._registry.activeDrag();\r\n if (this.fuiSortableDisabled()) {\r\n this._hasDragging.set(false);\r\n return;\r\n }\r\n\r\n if (activeDrag) {\r\n const dragItems = this._dragItems();\r\n const sourceIndex = dragItems.indexOf(activeDrag.source as FuiDragDirective);\r\n\r\n if (sourceIndex >= 0) {\r\n // Drag originated from this container\r\n this._hasDragging.set(true);\r\n\r\n if (this._activeDragStartIndex === -1) {\r\n this._activeDragStartIndex = sourceIndex;\r\n this._captureRects();\r\n }\r\n\r\n const insertIndex = this._getInsertionIndex(activeDrag.currentPosition);\r\n if (insertIndex !== this._currentHoverIndex) {\r\n this._currentHoverIndex = insertIndex;\r\n this._applyTransforms(sourceIndex, insertIndex);\r\n }\r\n } else {\r\n // Check if drag is over this container (cross-container)\r\n const rect = this.element.nativeElement.getBoundingClientRect();\r\n const pos = activeDrag.currentPosition;\r\n const isOver = pos.x >= rect.left && pos.x <= rect.right && pos.y >= rect.top && pos.y <= rect.bottom;\r\n\r\n if (isOver) {\r\n this._hasDragging.set(true);\r\n } else {\r\n this._hasDragging.set(false);\r\n }\r\n }\r\n } else {\r\n // Drag ended - check if we need to emit sort/transfer events\r\n if (this._hasDragging() && this._activeDragStartIndex >= 0) {\r\n this._finalizeDrop();\r\n }\r\n this._hasDragging.set(false);\r\n this._activeDragStartIndex = -1;\r\n this._currentHoverIndex = -1;\r\n this._clearTransforms();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this._registry.registerSortable(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._registry.unregisterSortable(this);\r\n }\r\n\r\n private _captureRects(): void {\r\n const items = this._dragItems();\r\n this._siblingRects = items.map((item) => item.element.nativeElement.getBoundingClientRect());\r\n }\r\n\r\n private _getInsertionIndex(position: { x: number; y: number }): number {\r\n const orientation = this.fuiSortableOrientation();\r\n\r\n for (let i = 0; i < this._siblingRects.length; i++) {\r\n const rect = this._siblingRects[i];\r\n if (orientation === 'vertical') {\r\n const midY = rect.top + rect.height / 2;\r\n if (position.y < midY) {\r\n return i;\r\n }\r\n } else {\r\n const midX = rect.left + rect.width / 2;\r\n if (position.x < midX) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n return this._siblingRects.length;\r\n }\r\n\r\n private _applyTransforms(sourceIndex: number, insertIndex: number): void {\r\n const items = this._dragItems();\r\n const orientation = this.fuiSortableOrientation();\r\n\r\n items.forEach((item, i) => {\r\n if (i === sourceIndex) {\r\n return; // Skip the dragged item\r\n }\r\n\r\n const el = item.element.nativeElement as HTMLElement;\r\n let offset = 0;\r\n\r\n if (sourceIndex < insertIndex) {\r\n // Dragging down/right: shift items between source+1..insert up/left\r\n if (i > sourceIndex && i < insertIndex) {\r\n const rect = this._siblingRects[sourceIndex];\r\n offset = orientation === 'vertical' ? -rect.height : -rect.width;\r\n }\r\n } else if (sourceIndex > insertIndex) {\r\n // Dragging up/left: shift items between insert..source-1 down/right\r\n if (i >= insertIndex && i < sourceIndex) {\r\n const rect = this._siblingRects[sourceIndex];\r\n offset = orientation === 'vertical' ? rect.height : rect.width;\r\n }\r\n }\r\n\r\n if (orientation === 'vertical') {\r\n el.style.transform = offset ? `translateY(${offset}px)` : '';\r\n } else {\r\n el.style.transform = offset ? `translateX(${offset}px)` : '';\r\n }\r\n el.style.transition = 'transform 150ms ease';\r\n });\r\n }\r\n\r\n private _clearTransforms(): void {\r\n const items = this._dragItems();\r\n items.forEach((item) => {\r\n const el = item.element.nativeElement as HTMLElement;\r\n el.style.transform = '';\r\n el.style.transition = '';\r\n });\r\n }\r\n\r\n private _finalizeDrop(): void {\r\n if (this._currentHoverIndex >= 0 && this._currentHoverIndex !== this._activeDragStartIndex) {\r\n const data = [...this.fuiSortableData()];\r\n const [moved] = data.splice(this._activeDragStartIndex, 1);\r\n const adjustedIndex =\r\n this._currentHoverIndex > this._activeDragStartIndex ? this._currentHoverIndex - 1 : this._currentHoverIndex;\r\n data.splice(adjustedIndex, 0, moved);\r\n\r\n this.fuiSortableSorted.emit({\r\n data,\r\n previousIndex: this._activeDragStartIndex,\r\n currentIndex: adjustedIndex,\r\n container: this,\r\n });\r\n }\r\n this._clearTransforms();\r\n }\r\n\r\n /** Called by external sortables for cross-container transfers. */\r\n emitTransfer(item: any, previousContainer: FuiSortableRef, previousIndex: number, currentIndex: number): void {\r\n this.fuiSortableTransferred.emit({\r\n item,\r\n previousContainer,\r\n container: this,\r\n previousIndex,\r\n currentIndex,\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-cdk-drag-drop.mjs","sources":["../../../lib/cdk/drag-drop/drag-registry.service.ts","../../../lib/cdk/drag-drop/auto-scroller.ts","../../../lib/cdk/drag-drop/drag-ref.ts","../../../lib/cdk/drag-drop/fui-drag.directive.ts","../../../lib/cdk/drag-drop/fui-drop-zone.directive.ts","../../../lib/cdk/drag-drop/fui-sortable.directive.ts","../../../lib/cdk/drag-drop/raintonic-formaui-cdk-drag-drop.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\nimport { FuiActiveDrag, FuiDropZoneRef, FuiPoint, FuiSortableRef } from './drag-drop.types';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiDragRegistryService {\r\n readonly activeDrag = signal<FuiActiveDrag | null>(null);\r\n\r\n private _dropZones = new Set<FuiDropZoneRef>();\r\n private _sortables = new Set<FuiSortableRef>();\r\n\r\n registerDropZone(zone: FuiDropZoneRef): void {\r\n this._dropZones.add(zone);\r\n }\r\n\r\n unregisterDropZone(zone: FuiDropZoneRef): void {\r\n this._dropZones.delete(zone);\r\n }\r\n\r\n registerSortable(sortable: FuiSortableRef): void {\r\n this._sortables.add(sortable);\r\n }\r\n\r\n unregisterSortable(sortable: FuiSortableRef): void {\r\n this._sortables.delete(sortable);\r\n }\r\n\r\n startDrag(drag: FuiActiveDrag): void {\r\n this.activeDrag.set(drag);\r\n }\r\n\r\n updateDrag(position: FuiPoint, _event: PointerEvent): void {\r\n const active = this.activeDrag();\r\n if (active) {\r\n active.currentPosition = position;\r\n this.activeDrag.set({ ...active });\r\n }\r\n }\r\n\r\n endDrag(_event: PointerEvent): void {\r\n this.activeDrag.set(null);\r\n }\r\n\r\n cancelDrag(): void {\r\n this.activeDrag.set(null);\r\n }\r\n\r\n getDropZoneAtPoint(point: FuiPoint): FuiDropZoneRef | null {\r\n const preview = this.activeDrag()?.previewElement;\r\n if (preview) {\r\n preview.style.pointerEvents = 'none';\r\n }\r\n const elementAtPoint =\r\n typeof document.elementFromPoint === 'function' ? document.elementFromPoint(point.x, point.y) : null;\r\n if (preview) {\r\n preview.style.pointerEvents = '';\r\n }\r\n if (!elementAtPoint) {\r\n return null;\r\n }\r\n for (const zone of this._dropZones) {\r\n if (zone.element.nativeElement.contains(elementAtPoint)) {\r\n return zone;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getSortableAtPoint(point: FuiPoint): FuiSortableRef | null {\r\n const preview = this.activeDrag()?.previewElement;\r\n if (preview) {\r\n preview.style.pointerEvents = 'none';\r\n }\r\n const elementAtPoint =\r\n typeof document.elementFromPoint === 'function' ? document.elementFromPoint(point.x, point.y) : null;\r\n if (preview) {\r\n preview.style.pointerEvents = '';\r\n }\r\n if (!elementAtPoint) {\r\n return null;\r\n }\r\n for (const sortable of this._sortables) {\r\n if (sortable.element.nativeElement.contains(elementAtPoint)) {\r\n return sortable;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { FuiPoint } from './drag-drop.types';\r\n\r\nexport class FuiAutoScroller {\r\n private _rafId: number | null = null;\r\n private _scrollNode: HTMLElement | null = null;\r\n private readonly SCROLL_PROXIMITY_THRESHOLD = 30;\r\n private readonly MAX_SCROLL_SPEED = 15;\r\n\r\n checkAutoScroll(pointerPosition: FuiPoint): void {\r\n const scrollNode = this._getScrollableAtPoint(pointerPosition);\r\n if (!scrollNode) {\r\n this._stopAutoScroll();\r\n return;\r\n }\r\n this._scrollNode = scrollNode;\r\n const rect = scrollNode.getBoundingClientRect();\r\n let speedX = 0;\r\n let speedY = 0;\r\n\r\n if (pointerPosition.y - rect.top < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedY = -this._calculateSpeed(pointerPosition.y - rect.top);\r\n }\r\n if (rect.bottom - pointerPosition.y < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedY = this._calculateSpeed(rect.bottom - pointerPosition.y);\r\n }\r\n if (pointerPosition.x - rect.left < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedX = -this._calculateSpeed(pointerPosition.x - rect.left);\r\n }\r\n if (rect.right - pointerPosition.x < this.SCROLL_PROXIMITY_THRESHOLD) {\r\n speedX = this._calculateSpeed(rect.right - pointerPosition.x);\r\n }\r\n\r\n if (speedX !== 0 || speedY !== 0) {\r\n this._startAutoScroll(speedX, speedY);\r\n } else {\r\n this._stopAutoScroll();\r\n }\r\n }\r\n\r\n stop(): void {\r\n this._stopAutoScroll();\r\n }\r\n\r\n destroy(): void {\r\n this._stopAutoScroll();\r\n }\r\n\r\n private _calculateSpeed(distanceFromEdge: number): number {\r\n const ratio = 1 - distanceFromEdge / this.SCROLL_PROXIMITY_THRESHOLD;\r\n return Math.ceil(ratio * this.MAX_SCROLL_SPEED);\r\n }\r\n\r\n private _startAutoScroll(speedX: number, speedY: number): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId);\r\n }\r\n const scroll = (): void => {\r\n if (this._scrollNode) {\r\n this._scrollNode.scrollTop += speedY;\r\n this._scrollNode.scrollLeft += speedX;\r\n }\r\n this._rafId = requestAnimationFrame(scroll);\r\n };\r\n this._rafId = requestAnimationFrame(scroll);\r\n }\r\n\r\n private _stopAutoScroll(): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId);\r\n this._rafId = null;\r\n }\r\n }\r\n\r\n private _getScrollableAtPoint(point: FuiPoint): HTMLElement | null {\r\n if (typeof document.elementFromPoint !== 'function') {\r\n return null;\r\n }\r\n let element = document.elementFromPoint(point.x, point.y) as HTMLElement | null;\r\n while (element) {\r\n const style = window.getComputedStyle(element);\r\n if ((style.overflowY === 'auto' || style.overflowY === 'scroll') && element.scrollHeight > element.clientHeight) {\r\n return element;\r\n }\r\n if ((style.overflowX === 'auto' || style.overflowX === 'scroll') && element.scrollWidth > element.clientWidth) {\r\n return element;\r\n }\r\n element = element.parentElement;\r\n }\r\n return null;\r\n }\r\n}\r\n","import { FuiPoint } from './drag-drop.types';\r\n\r\n/**\r\n * Internal helper that tracks positional state for a single drag operation.\r\n * Used by FuiDragDirective to keep the directive itself cleaner.\r\n */\r\nexport class FuiDragRef {\r\n startPosition: FuiPoint = { x: 0, y: 0 };\r\n currentPosition: FuiPoint = { x: 0, y: 0 };\r\n private _active = false;\r\n\r\n get active(): boolean {\r\n return this._active;\r\n }\r\n\r\n start(x: number, y: number): void {\r\n this.startPosition = { x, y };\r\n this.currentPosition = { x, y };\r\n this._active = true;\r\n }\r\n\r\n move(x: number, y: number): void {\r\n this.currentPosition = { x, y };\r\n }\r\n\r\n get distance(): FuiPoint {\r\n return {\r\n x: this.currentPosition.x - this.startPosition.x,\r\n y: this.currentPosition.y - this.startPosition.y,\r\n };\r\n }\r\n\r\n reset(): void {\r\n this.startPosition = { x: 0, y: 0 };\r\n this.currentPosition = { x: 0, y: 0 };\r\n this._active = false;\r\n }\r\n}\r\n","import { Directive, ElementRef, inject, input, OnDestroy, output, Renderer2, signal, TemplateRef } from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { FuiDragRegistryService } from './drag-registry.service';\r\nimport { FuiAutoScroller } from './auto-scroller';\r\nimport { FuiDragRef } from './drag-ref';\r\nimport { FuiDragAxis, FuiDragEvent, FuiDropEvent, FuiPoint } from './drag-drop.types';\r\n\r\n@Directive({\r\n selector: '[fuiDrag]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-drag',\r\n '[class.fui-drag--dragging]': '_isDragging()',\r\n '[attr.aria-grabbed]': '_isDragging()',\r\n '[attr.aria-roledescription]': '\"draggable item\"',\r\n tabindex: '0',\r\n '(pointerdown)': '_onPointerDown($event)',\r\n '(keydown)': '_onKeydown($event)',\r\n },\r\n})\r\nexport class FuiDragDirective implements OnDestroy {\r\n readonly fuiDragData = input<any>(null);\r\n readonly fuiDragDisabled = input(false);\r\n readonly fuiDragLockAxis = input<FuiDragAxis>('free');\r\n readonly fuiDragPreviewTemplate = input<TemplateRef<any> | null>(null);\r\n readonly fuiDragPlaceholderTemplate = input<TemplateRef<any> | null>(null);\r\n readonly fuiDragBoundary = input<string | ElementRef | null>(null);\r\n\r\n readonly fuiDragStarted = output<FuiDragEvent>();\r\n readonly fuiDragMoved = output<FuiDragEvent>();\r\n readonly fuiDragEnded = output<FuiDragEvent>();\r\n readonly fuiDragDropped = output<FuiDropEvent>();\r\n\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly _isDragging = signal(false);\r\n\r\n private readonly _registry = inject(FuiDragRegistryService);\r\n private readonly _renderer = inject(Renderer2);\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _autoScroller = new FuiAutoScroller();\r\n private readonly _dragRef = new FuiDragRef();\r\n\r\n private _previewElement: HTMLElement | null = null;\r\n private _placeholderElement: HTMLElement | null = null;\r\n private _pointerMoveHandler: ((e: PointerEvent) => void) | null = null;\r\n private _pointerUpHandler: ((e: PointerEvent) => void) | null = null;\r\n private _boundaryRect: DOMRect | null = null;\r\n\r\n // Keyboard drag state\r\n private _keyboardDragging = false;\r\n private _keyboardPosition: FuiPoint = { x: 0, y: 0 };\r\n private readonly KEYBOARD_STEP = 10;\r\n\r\n _onPointerDown(event: PointerEvent): void {\r\n if (this.fuiDragDisabled() || event.button !== 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const startPosition: FuiPoint = { x: event.clientX, y: event.clientY };\r\n this._dragRef.start(startPosition.x, startPosition.y);\r\n this._resolveBoundary();\r\n\r\n this._previewElement = this._createPreview();\r\n this._updatePreviewPosition(startPosition);\r\n this._document.body.appendChild(this._previewElement);\r\n\r\n // Create placeholder at source location\r\n this._placeholderElement = this._createPlaceholder();\r\n this.element.nativeElement.parentNode?.insertBefore(\r\n this._placeholderElement,\r\n this.element.nativeElement.nextSibling,\r\n );\r\n\r\n this._isDragging.set(true);\r\n\r\n this._registry.startDrag({\r\n source: this,\r\n previewElement: this._previewElement,\r\n placeholderElement: this._placeholderElement,\r\n startPosition,\r\n currentPosition: { ...startPosition },\r\n data: this.fuiDragData(),\r\n });\r\n\r\n this.fuiDragStarted.emit({\r\n source: this,\r\n data: this.fuiDragData(),\r\n pointerPosition: startPosition,\r\n distance: { x: 0, y: 0 },\r\n event,\r\n });\r\n\r\n this._pointerMoveHandler = (e: PointerEvent): void => {\r\n this._onPointerMove(e);\r\n };\r\n this._pointerUpHandler = (e: PointerEvent): void => {\r\n this._onPointerUp(e);\r\n };\r\n this._document.addEventListener('pointermove', this._pointerMoveHandler);\r\n this._document.addEventListener('pointerup', this._pointerUpHandler);\r\n }\r\n\r\n private _onPointerMove(event: PointerEvent): void {\r\n const position = this._applyConstraints({ x: event.clientX, y: event.clientY });\r\n this._dragRef.move(position.x, position.y);\r\n\r\n if (this._previewElement) {\r\n this._updatePreviewPosition(position);\r\n }\r\n\r\n this._autoScroller.checkAutoScroll(position);\r\n this._registry.updateDrag(position, event);\r\n\r\n this.fuiDragMoved.emit({\r\n source: this,\r\n data: this.fuiDragData(),\r\n pointerPosition: position,\r\n distance: this._dragRef.distance,\r\n event,\r\n });\r\n }\r\n\r\n private _onPointerUp(event: PointerEvent): void {\r\n this._removeListeners();\r\n this._autoScroller.stop();\r\n\r\n const position: FuiPoint = { x: event.clientX, y: event.clientY };\r\n const dropZone = this._registry.getDropZoneAtPoint(position);\r\n\r\n if (dropZone && !dropZone.fuiDropZoneDisabled()) {\r\n const predicate = dropZone.fuiDropZonePredicate();\r\n const accepted = !predicate || predicate(this);\r\n\r\n if (accepted) {\r\n const dropEvent: FuiDropEvent = {\r\n source: this,\r\n dragData: this.fuiDragData(),\r\n dropZoneData: dropZone.fuiDropZoneData(),\r\n dropZone,\r\n isPointerOverContainer: true,\r\n };\r\n this.fuiDragDropped.emit(dropEvent);\r\n dropZone.fuiDropped.emit(dropEvent);\r\n }\r\n }\r\n\r\n this._cleanupDrag();\r\n\r\n this._registry.endDrag(event);\r\n this.fuiDragEnded.emit({\r\n source: this,\r\n data: this.fuiDragData(),\r\n pointerPosition: position,\r\n distance: this._dragRef.distance,\r\n event,\r\n });\r\n this._isDragging.set(false);\r\n\r\n this._dragRef.reset();\r\n }\r\n\r\n _onKeydown(event: KeyboardEvent): void {\r\n if (this.fuiDragDisabled()) {\r\n return;\r\n }\r\n\r\n if (!this._keyboardDragging) {\r\n if (event.key === ' ' || event.key === 'Enter') {\r\n event.preventDefault();\r\n this._startKeyboardDrag();\r\n }\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._moveKeyboard(0, -this.KEYBOARD_STEP);\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._moveKeyboard(0, this.KEYBOARD_STEP);\r\n break;\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this._moveKeyboard(-this.KEYBOARD_STEP, 0);\r\n break;\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this._moveKeyboard(this.KEYBOARD_STEP, 0);\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this._cancelKeyboardDrag();\r\n break;\r\n case ' ':\r\n case 'Enter':\r\n event.preventDefault();\r\n this._endKeyboardDrag();\r\n break;\r\n }\r\n }\r\n\r\n private _startKeyboardDrag(): void {\r\n const rect = (this.element.nativeElement as HTMLElement).getBoundingClientRect();\r\n const startPosition: FuiPoint = {\r\n x: rect.left + rect.width / 2,\r\n y: rect.top + rect.height / 2,\r\n };\r\n\r\n this._keyboardDragging = true;\r\n this._keyboardPosition = { ...startPosition };\r\n this._dragRef.start(startPosition.x, startPosition.y);\r\n\r\n this._previewElement = this._createPreview();\r\n this._updatePreviewPosition(startPosition);\r\n this._document.body.appendChild(this._previewElement);\r\n\r\n this._isDragging.set(true);\r\n this._registry.startDrag({\r\n source: this,\r\n previewElement: this._previewElement,\r\n startPosition,\r\n currentPosition: { ...startPosition },\r\n data: this.fuiDragData(),\r\n });\r\n }\r\n\r\n private _moveKeyboard(dx: number, dy: number): void {\r\n const axis = this.fuiDragLockAxis();\r\n if (axis === 'x') {\r\n dy = 0;\r\n }\r\n if (axis === 'y') {\r\n dx = 0;\r\n }\r\n\r\n this._keyboardPosition.x += dx;\r\n this._keyboardPosition.y += dy;\r\n this._dragRef.move(this._keyboardPosition.x, this._keyboardPosition.y);\r\n\r\n if (this._previewElement) {\r\n this._updatePreviewPosition(this._keyboardPosition);\r\n }\r\n }\r\n\r\n private _endKeyboardDrag(): void {\r\n const position = this._keyboardPosition;\r\n const dropZone = this._registry.getDropZoneAtPoint(position);\r\n\r\n if (dropZone && !dropZone.fuiDropZoneDisabled()) {\r\n const predicate = dropZone.fuiDropZonePredicate();\r\n const accepted = !predicate || predicate(this);\r\n\r\n if (accepted) {\r\n const dropEvent: FuiDropEvent = {\r\n source: this,\r\n dragData: this.fuiDragData(),\r\n dropZoneData: dropZone.fuiDropZoneData(),\r\n dropZone,\r\n isPointerOverContainer: true,\r\n };\r\n this.fuiDragDropped.emit(dropEvent);\r\n dropZone.fuiDropped.emit(dropEvent);\r\n }\r\n }\r\n\r\n this._cleanupDrag();\r\n this._registry.cancelDrag();\r\n this._isDragging.set(false);\r\n this._keyboardDragging = false;\r\n this._dragRef.reset();\r\n }\r\n\r\n private _cancelKeyboardDrag(): void {\r\n this._cleanupDrag();\r\n this._registry.cancelDrag();\r\n this._isDragging.set(false);\r\n this._keyboardDragging = false;\r\n this._dragRef.reset();\r\n }\r\n\r\n private _createPreview(): HTMLElement {\r\n const sourceEl = this.element.nativeElement;\r\n const rect = sourceEl.getBoundingClientRect();\r\n const preview = sourceEl.cloneNode(true) as HTMLElement;\r\n\r\n preview.classList.add('fui-drag-preview');\r\n preview.style.position = 'fixed';\r\n preview.style.width = `${rect.width}px`;\r\n preview.style.height = `${rect.height}px`;\r\n preview.style.zIndex = '10000';\r\n preview.style.pointerEvents = 'none';\r\n preview.style.margin = '0';\r\n\r\n return preview;\r\n }\r\n\r\n private _createPlaceholder(): HTMLElement {\r\n const sourceEl = this.element.nativeElement;\r\n const rect = sourceEl.getBoundingClientRect();\r\n const placeholder = this._document.createElement('div');\r\n\r\n placeholder.classList.add('fui-drag-placeholder');\r\n placeholder.style.width = `${rect.width}px`;\r\n placeholder.style.height = `${rect.height}px`;\r\n placeholder.style.boxSizing = 'border-box';\r\n\r\n return placeholder;\r\n }\r\n\r\n private _updatePreviewPosition(position: FuiPoint): void {\r\n if (!this._previewElement) {\r\n return;\r\n }\r\n const sourceRect = this.element.nativeElement.getBoundingClientRect();\r\n const offsetX = sourceRect.width / 2;\r\n const offsetY = sourceRect.height / 2;\r\n\r\n this._previewElement.style.left = `${position.x - offsetX}px`;\r\n this._previewElement.style.top = `${position.y - offsetY}px`;\r\n }\r\n\r\n private _applyConstraints(position: FuiPoint): FuiPoint {\r\n const axis = this.fuiDragLockAxis();\r\n const start = this._dragRef.startPosition;\r\n let { x, y } = position;\r\n\r\n if (axis === 'x') {\r\n y = start.y;\r\n } else if (axis === 'y') {\r\n x = start.x;\r\n }\r\n\r\n if (this._boundaryRect) {\r\n const rect = this._boundaryRect;\r\n x = Math.max(rect.left, Math.min(x, rect.right));\r\n y = Math.max(rect.top, Math.min(y, rect.bottom));\r\n }\r\n\r\n return { x, y };\r\n }\r\n\r\n /** Pattern allowing simple CSS selectors (tag, class, id, attribute selectors) */\r\n private static readonly _SAFE_SELECTOR_PATTERN = /^[a-zA-Z0-9\\-_.#\\[\\]=~|^$*:\" >,+()]+$/;\r\n\r\n private _resolveBoundary(): void {\r\n const boundary = this.fuiDragBoundary();\r\n if (!boundary) {\r\n this._boundaryRect = null;\r\n return;\r\n }\r\n\r\n let boundaryElement: HTMLElement | null = null;\r\n if (typeof boundary === 'string') {\r\n // Validate selector to prevent injection of malicious strings\r\n if (!FuiDragDirective._SAFE_SELECTOR_PATTERN.test(boundary)) {\r\n console.warn(`[FormaUI] Invalid drag boundary selector: \"${boundary}\"`);\r\n this._boundaryRect = null;\r\n return;\r\n }\r\n boundaryElement = this._document.querySelector(boundary);\r\n } else {\r\n boundaryElement = boundary.nativeElement;\r\n }\r\n\r\n this._boundaryRect = boundaryElement ? boundaryElement.getBoundingClientRect() : null;\r\n }\r\n\r\n private _cleanupDrag(): void {\r\n if (this._previewElement?.parentNode) {\r\n this._previewElement.parentNode.removeChild(this._previewElement);\r\n }\r\n this._previewElement = null;\r\n\r\n if (this._placeholderElement?.parentNode) {\r\n this._placeholderElement.parentNode.removeChild(this._placeholderElement);\r\n }\r\n this._placeholderElement = null;\r\n }\r\n\r\n private _removeListeners(): void {\r\n if (this._pointerMoveHandler) {\r\n this._document.removeEventListener('pointermove', this._pointerMoveHandler);\r\n this._pointerMoveHandler = null;\r\n }\r\n if (this._pointerUpHandler) {\r\n this._document.removeEventListener('pointerup', this._pointerUpHandler);\r\n this._pointerUpHandler = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // If the component is destroyed mid-drag, clear the registry first so its\r\n // activeDrag signal doesn't keep a strong reference to this directive (memory\r\n // leak until next drag overwrites) and so getDropZoneAtPoint doesn't return\r\n // stale results in the window between destroy and next drag start.\r\n if (this._isDragging()) {\r\n this._registry.cancelDrag();\r\n }\r\n this._removeListeners();\r\n this._cleanupDrag();\r\n this._autoScroller.destroy();\r\n this._dragRef.reset();\r\n }\r\n}\r\n","import { Directive, effect, ElementRef, inject, input, OnDestroy, OnInit, output, signal } from '@angular/core';\r\nimport { FuiDragRegistryService } from './drag-registry.service';\r\nimport { FuiDragEvent, FuiDragSource, FuiDropEvent } from './drag-drop.types';\r\n\r\n@Directive({\r\n selector: '[fuiDropZone]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-drop-zone',\r\n '[class.fui-drop-zone--active]': '_isActive()',\r\n '[class.fui-drop-zone--over]': '_isOver()',\r\n '[attr.aria-dropeffect]': '\"move\"',\r\n },\r\n})\r\nexport class FuiDropZoneDirective implements OnInit, OnDestroy {\r\n readonly fuiDropZoneData = input<any>(null);\r\n readonly fuiDropZoneDisabled = input(false);\r\n readonly fuiDropZonePredicate = input<((drag: FuiDragSource) => boolean) | null>(null);\r\n\r\n readonly fuiDropZoneEntered = output<FuiDragEvent>();\r\n readonly fuiDropZoneExited = output<FuiDragEvent>();\r\n readonly fuiDropped = output<FuiDropEvent>();\r\n\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly _isActive = signal(false);\r\n readonly _isOver = signal(false);\r\n\r\n private readonly _registry = inject(FuiDragRegistryService);\r\n private _wasOver = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n const activeDrag = this._registry.activeDrag();\r\n if (this.fuiDropZoneDisabled()) {\r\n this._isActive.set(false);\r\n this._isOver.set(false);\r\n return;\r\n }\r\n\r\n if (activeDrag) {\r\n this._isActive.set(true);\r\n\r\n // Check if pointer is over this drop zone\r\n const rect = this.element.nativeElement.getBoundingClientRect();\r\n const pos = activeDrag.currentPosition;\r\n const isOver = pos.x >= rect.left && pos.x <= rect.right && pos.y >= rect.top && pos.y <= rect.bottom;\r\n\r\n this._isOver.set(isOver);\r\n\r\n if (isOver && !this._wasOver) {\r\n this.fuiDropZoneEntered.emit({\r\n source: activeDrag.source,\r\n data: activeDrag.data,\r\n pointerPosition: activeDrag.currentPosition,\r\n distance: {\r\n x: activeDrag.currentPosition.x - activeDrag.startPosition.x,\r\n y: activeDrag.currentPosition.y - activeDrag.startPosition.y,\r\n },\r\n dropZone: this,\r\n event: null!,\r\n });\r\n } else if (!isOver && this._wasOver) {\r\n this.fuiDropZoneExited.emit({\r\n source: activeDrag.source,\r\n data: activeDrag.data,\r\n pointerPosition: activeDrag.currentPosition,\r\n distance: {\r\n x: activeDrag.currentPosition.x - activeDrag.startPosition.x,\r\n y: activeDrag.currentPosition.y - activeDrag.startPosition.y,\r\n },\r\n dropZone: this,\r\n event: null!,\r\n });\r\n }\r\n\r\n this._wasOver = isOver;\r\n } else {\r\n this._isActive.set(false);\r\n this._isOver.set(false);\r\n this._wasOver = false;\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this._registry.registerDropZone(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._registry.unregisterDropZone(this);\r\n }\r\n}\r\n","import {\r\n contentChildren,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FuiDragRegistryService } from './drag-registry.service';\r\nimport { FuiDragDirective } from './fui-drag.directive';\r\nimport { FuiSortEvent, FuiSortableRef, FuiTransferEvent } from './drag-drop.types';\r\n\r\n@Directive({\r\n selector: '[fuiSortable]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-sortable',\r\n '[class.fui-sortable--dragging]': '_hasDragging()',\r\n },\r\n})\r\nexport class FuiSortableDirective implements OnInit, OnDestroy {\r\n readonly fuiSortableData = input.required<any[]>();\r\n readonly fuiSortableDisabled = input(false);\r\n readonly fuiSortableOrientation = input<'vertical' | 'horizontal'>('vertical');\r\n readonly fuiSortableConnectedTo = input<FuiSortableDirective[]>([]);\r\n\r\n readonly fuiSortableSorted = output<FuiSortEvent>();\r\n readonly fuiSortableTransferred = output<FuiTransferEvent>();\r\n\r\n readonly element = inject(ElementRef<HTMLElement>);\r\n readonly _hasDragging = signal(false);\r\n\r\n readonly _dragItems = contentChildren(FuiDragDirective);\r\n\r\n private readonly _registry = inject(FuiDragRegistryService);\r\n private _activeDragStartIndex = -1;\r\n private _currentHoverIndex = -1;\r\n private _siblingRects: DOMRect[] = [];\r\n\r\n constructor() {\r\n effect(() => {\r\n const activeDrag = this._registry.activeDrag();\r\n if (this.fuiSortableDisabled()) {\r\n this._hasDragging.set(false);\r\n return;\r\n }\r\n\r\n if (activeDrag) {\r\n const dragItems = this._dragItems();\r\n const sourceIndex = dragItems.indexOf(activeDrag.source as FuiDragDirective);\r\n\r\n if (sourceIndex >= 0) {\r\n // Drag originated from this container\r\n this._hasDragging.set(true);\r\n\r\n if (this._activeDragStartIndex === -1) {\r\n this._activeDragStartIndex = sourceIndex;\r\n this._captureRects();\r\n }\r\n\r\n const insertIndex = this._getInsertionIndex(activeDrag.currentPosition);\r\n if (insertIndex !== this._currentHoverIndex) {\r\n this._currentHoverIndex = insertIndex;\r\n this._applyTransforms(sourceIndex, insertIndex);\r\n }\r\n } else {\r\n // Check if drag is over this container (cross-container)\r\n const rect = this.element.nativeElement.getBoundingClientRect();\r\n const pos = activeDrag.currentPosition;\r\n const isOver = pos.x >= rect.left && pos.x <= rect.right && pos.y >= rect.top && pos.y <= rect.bottom;\r\n\r\n if (isOver) {\r\n this._hasDragging.set(true);\r\n } else {\r\n this._hasDragging.set(false);\r\n }\r\n }\r\n } else {\r\n // Drag ended - check if we need to emit sort/transfer events\r\n if (this._hasDragging() && this._activeDragStartIndex >= 0) {\r\n this._finalizeDrop();\r\n }\r\n this._hasDragging.set(false);\r\n this._activeDragStartIndex = -1;\r\n this._currentHoverIndex = -1;\r\n this._clearTransforms();\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this._registry.registerSortable(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._registry.unregisterSortable(this);\r\n }\r\n\r\n private _captureRects(): void {\r\n const items = this._dragItems();\r\n this._siblingRects = items.map((item) => item.element.nativeElement.getBoundingClientRect());\r\n }\r\n\r\n private _getInsertionIndex(position: { x: number; y: number }): number {\r\n const orientation = this.fuiSortableOrientation();\r\n\r\n for (let i = 0; i < this._siblingRects.length; i++) {\r\n const rect = this._siblingRects[i];\r\n if (orientation === 'vertical') {\r\n const midY = rect.top + rect.height / 2;\r\n if (position.y < midY) {\r\n return i;\r\n }\r\n } else {\r\n const midX = rect.left + rect.width / 2;\r\n if (position.x < midX) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n return this._siblingRects.length;\r\n }\r\n\r\n private _applyTransforms(sourceIndex: number, insertIndex: number): void {\r\n const items = this._dragItems();\r\n const orientation = this.fuiSortableOrientation();\r\n\r\n items.forEach((item, i) => {\r\n if (i === sourceIndex) {\r\n return; // Skip the dragged item\r\n }\r\n\r\n const el = item.element.nativeElement as HTMLElement;\r\n let offset = 0;\r\n\r\n if (sourceIndex < insertIndex) {\r\n // Dragging down/right: shift items between source+1..insert up/left\r\n if (i > sourceIndex && i < insertIndex) {\r\n const rect = this._siblingRects[sourceIndex];\r\n offset = orientation === 'vertical' ? -rect.height : -rect.width;\r\n }\r\n } else if (sourceIndex > insertIndex) {\r\n // Dragging up/left: shift items between insert..source-1 down/right\r\n if (i >= insertIndex && i < sourceIndex) {\r\n const rect = this._siblingRects[sourceIndex];\r\n offset = orientation === 'vertical' ? rect.height : rect.width;\r\n }\r\n }\r\n\r\n if (orientation === 'vertical') {\r\n el.style.transform = offset ? `translateY(${offset}px)` : '';\r\n } else {\r\n el.style.transform = offset ? `translateX(${offset}px)` : '';\r\n }\r\n el.style.transition = 'transform 150ms ease';\r\n });\r\n }\r\n\r\n private _clearTransforms(): void {\r\n const items = this._dragItems();\r\n items.forEach((item) => {\r\n const el = item.element.nativeElement as HTMLElement;\r\n el.style.transform = '';\r\n el.style.transition = '';\r\n });\r\n }\r\n\r\n private _finalizeDrop(): void {\r\n if (this._currentHoverIndex >= 0 && this._currentHoverIndex !== this._activeDragStartIndex) {\r\n const data = [...this.fuiSortableData()];\r\n const [moved] = data.splice(this._activeDragStartIndex, 1);\r\n const adjustedIndex =\r\n this._currentHoverIndex > this._activeDragStartIndex ? this._currentHoverIndex - 1 : this._currentHoverIndex;\r\n data.splice(adjustedIndex, 0, moved);\r\n\r\n this.fuiSortableSorted.emit({\r\n data,\r\n previousIndex: this._activeDragStartIndex,\r\n currentIndex: adjustedIndex,\r\n container: this,\r\n });\r\n }\r\n this._clearTransforms();\r\n }\r\n\r\n /** Called by external sortables for cross-container transfers. */\r\n emitTransfer(item: any, previousContainer: FuiSortableRef, previousIndex: number, currentIndex: number): void {\r\n this.fuiSortableTransferred.emit({\r\n item,\r\n previousContainer,\r\n container: this,\r\n previousIndex,\r\n currentIndex,\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injector, model, input, signal, output, Directive } from '@angular/core';
|
|
3
|
+
import { NgControl, Validators, NgForm, FormGroupDirective } from '@angular/forms';
|
|
4
|
+
import { FuiOverlayService } from '@raintonic/formaui/cdk/overlay';
|
|
5
|
+
import { Subscription } from 'rxjs';
|
|
6
|
+
import { DefaultErrorStateMatcher } from '@raintonic/formaui/core';
|
|
3
7
|
|
|
4
8
|
/**
|
|
5
9
|
* Injects NgControl via the deferred `Promise.resolve()` pattern used throughout FormaUI.
|
|
@@ -78,9 +82,209 @@ function syncNgControlDisabled(ngControl, ngControlDisabled, stateChanges) {
|
|
|
78
82
|
}
|
|
79
83
|
}
|
|
80
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Default connected-position fallbacks used by popup form-field components.
|
|
87
|
+
*
|
|
88
|
+
* Order: prefer "below the trigger, anchored to start", fall back to "above the trigger".
|
|
89
|
+
* Both with 4px offset away from the trigger.
|
|
90
|
+
*/
|
|
91
|
+
const DEFAULT_POPUP_POSITIONS = [
|
|
92
|
+
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },
|
|
93
|
+
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Host directive that encapsulates popup-overlay lifecycle for form-field-like components
|
|
98
|
+
* (autocomplete, select, tree-select, date-picker, time-picker).
|
|
99
|
+
*
|
|
100
|
+
* Consumers wire trigger and panel via `setTrigger()` / `setPanel()` (typically in
|
|
101
|
+
* `ngAfterViewInit`) and then call `open()`, `close()`, or `toggle()`.
|
|
102
|
+
*
|
|
103
|
+
* Public outputs: `openedChange`, `backdropClick`, `escapeKey`.
|
|
104
|
+
*
|
|
105
|
+
* Public signals: `panelOpen()`, `overlayRef()`.
|
|
106
|
+
*/
|
|
107
|
+
class FuiPopupOverlayDirective {
|
|
108
|
+
_overlayService = inject(FuiOverlayService);
|
|
109
|
+
_trigger = null;
|
|
110
|
+
_panel = null;
|
|
111
|
+
_subs = new Subscription();
|
|
112
|
+
positions = model([...DEFAULT_POPUP_POSITIONS], ...(ngDevMode ? [{ debugName: "positions" }] : /* istanbul ignore next */ []));
|
|
113
|
+
panelClass = model([], ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
114
|
+
backdropClass = model('fui-popup-backdrop', ...(ngDevMode ? [{ debugName: "backdropClass" }] : /* istanbul ignore next */ []));
|
|
115
|
+
scrollStrategy = input('reposition', ...(ngDevMode ? [{ debugName: "scrollStrategy" }] : /* istanbul ignore next */ []));
|
|
116
|
+
widthElement = model(null, ...(ngDevMode ? [{ debugName: "widthElement" }] : /* istanbul ignore next */ []));
|
|
117
|
+
minWidthFromTrigger = input(true, ...(ngDevMode ? [{ debugName: "minWidthFromTrigger" }] : /* istanbul ignore next */ []));
|
|
118
|
+
viewportMargin = input(8, ...(ngDevMode ? [{ debugName: "viewportMargin" }] : /* istanbul ignore next */ []));
|
|
119
|
+
closeOnEscape = model(true, ...(ngDevMode ? [{ debugName: "closeOnEscape" }] : /* istanbul ignore next */ []));
|
|
120
|
+
closeOnBackdrop = model(true, ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : /* istanbul ignore next */ []));
|
|
121
|
+
panelOpen = signal(false, ...(ngDevMode ? [{ debugName: "panelOpen" }] : /* istanbul ignore next */ []));
|
|
122
|
+
overlayRef = signal(null, ...(ngDevMode ? [{ debugName: "overlayRef" }] : /* istanbul ignore next */ []));
|
|
123
|
+
openedChange = output();
|
|
124
|
+
backdropClick = output();
|
|
125
|
+
escapeKey = output();
|
|
126
|
+
/**
|
|
127
|
+
* Registers the trigger element. Call in `ngAfterViewInit` of the consumer.
|
|
128
|
+
* Passing `null` clears the wiring and makes subsequent `open()` calls a no-op
|
|
129
|
+
* until a valid ref is provided.
|
|
130
|
+
*/
|
|
131
|
+
setTrigger(ref) {
|
|
132
|
+
this._trigger = ref;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Registers the panel element (the content to attach to the overlay). Call in
|
|
136
|
+
* `ngAfterViewInit` of the consumer. Passing `null` clears the wiring and makes
|
|
137
|
+
* subsequent `open()` calls a no-op until a valid ref is provided.
|
|
138
|
+
*/
|
|
139
|
+
setPanel(ref) {
|
|
140
|
+
this._panel = ref;
|
|
141
|
+
}
|
|
142
|
+
open() {
|
|
143
|
+
if (this.panelOpen())
|
|
144
|
+
return;
|
|
145
|
+
if (!this._trigger || !this._panel)
|
|
146
|
+
return;
|
|
147
|
+
const triggerEl = this._trigger.nativeElement;
|
|
148
|
+
// Use the explicitly-provided width element when available (e.g. the form-field
|
|
149
|
+
// wrapper element passed by select/autocomplete) so the overlay matches the full
|
|
150
|
+
// form-field width including prefix/suffix areas. Falls back to the trigger width.
|
|
151
|
+
const widthSourceEl = this.widthElement()?.nativeElement ?? triggerEl;
|
|
152
|
+
const overlayWidth = widthSourceEl.getBoundingClientRect().width;
|
|
153
|
+
const positionStrategy = this._overlayService
|
|
154
|
+
.position()
|
|
155
|
+
.connectedTo(triggerEl, this.positions())
|
|
156
|
+
.withPush(true)
|
|
157
|
+
.withViewportMargin(this.viewportMargin());
|
|
158
|
+
const scrollStrategyFactory = this._overlayService.scrollStrategies[this.scrollStrategy()];
|
|
159
|
+
const ref = this._overlayService.create({
|
|
160
|
+
positionStrategy,
|
|
161
|
+
scrollStrategy: scrollStrategyFactory(),
|
|
162
|
+
hasBackdrop: true,
|
|
163
|
+
backdropClass: this.backdropClass(),
|
|
164
|
+
backdropClickBehavior: 'close',
|
|
165
|
+
panelClass: this.panelClass(),
|
|
166
|
+
...(this.minWidthFromTrigger() ? { minWidth: overlayWidth } : {}),
|
|
167
|
+
});
|
|
168
|
+
this._subs.unsubscribe();
|
|
169
|
+
this._subs = new Subscription();
|
|
170
|
+
this._subs.add(ref.backdropClick.subscribe(() => {
|
|
171
|
+
this.backdropClick.emit();
|
|
172
|
+
if (this.closeOnBackdrop())
|
|
173
|
+
this.close();
|
|
174
|
+
}));
|
|
175
|
+
this._subs.add(ref.keydownEvents.subscribe((event) => {
|
|
176
|
+
if (event.key === 'Escape') {
|
|
177
|
+
this.escapeKey.emit();
|
|
178
|
+
if (this.closeOnEscape())
|
|
179
|
+
this.close();
|
|
180
|
+
}
|
|
181
|
+
}));
|
|
182
|
+
ref.attach(this._panel.nativeElement);
|
|
183
|
+
this.overlayRef.set(ref);
|
|
184
|
+
this.panelOpen.set(true);
|
|
185
|
+
this.openedChange.emit(true);
|
|
186
|
+
}
|
|
187
|
+
close() {
|
|
188
|
+
if (!this.panelOpen())
|
|
189
|
+
return;
|
|
190
|
+
this._subs.unsubscribe();
|
|
191
|
+
const ref = this.overlayRef();
|
|
192
|
+
if (ref) {
|
|
193
|
+
ref.dispose();
|
|
194
|
+
}
|
|
195
|
+
this.overlayRef.set(null);
|
|
196
|
+
this.panelOpen.set(false);
|
|
197
|
+
this.openedChange.emit(false);
|
|
198
|
+
}
|
|
199
|
+
toggle() {
|
|
200
|
+
if (this.panelOpen()) {
|
|
201
|
+
this.close();
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.open();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
ngOnDestroy() {
|
|
208
|
+
this.close();
|
|
209
|
+
}
|
|
210
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiPopupOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
211
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.6", type: FuiPopupOverlayDirective, isStandalone: true, selector: "[fuiPopupOverlay]", inputs: { positions: { classPropertyName: "positions", publicName: "positions", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, scrollStrategy: { classPropertyName: "scrollStrategy", publicName: "scrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, widthElement: { classPropertyName: "widthElement", publicName: "widthElement", isSignal: true, isRequired: false, transformFunction: null }, minWidthFromTrigger: { classPropertyName: "minWidthFromTrigger", publicName: "minWidthFromTrigger", isSignal: true, isRequired: false, transformFunction: null }, viewportMargin: { classPropertyName: "viewportMargin", publicName: "viewportMargin", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { positions: "positionsChange", panelClass: "panelClassChange", backdropClass: "backdropClassChange", widthElement: "widthElementChange", closeOnEscape: "closeOnEscapeChange", closeOnBackdrop: "closeOnBackdropChange", openedChange: "openedChange", backdropClick: "backdropClick", escapeKey: "escapeKey" }, exportAs: ["fuiPopupOverlay"], ngImport: i0 });
|
|
212
|
+
}
|
|
213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiPopupOverlayDirective, decorators: [{
|
|
214
|
+
type: Directive,
|
|
215
|
+
args: [{
|
|
216
|
+
standalone: true,
|
|
217
|
+
selector: '[fuiPopupOverlay]',
|
|
218
|
+
exportAs: 'fuiPopupOverlay',
|
|
219
|
+
}]
|
|
220
|
+
}], propDecorators: { positions: [{ type: i0.Input, args: [{ isSignal: true, alias: "positions", required: false }] }, { type: i0.Output, args: ["positionsChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }, { type: i0.Output, args: ["panelClassChange"] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }, { type: i0.Output, args: ["backdropClassChange"] }], scrollStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollStrategy", required: false }] }], widthElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "widthElement", required: false }] }, { type: i0.Output, args: ["widthElementChange"] }], minWidthFromTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidthFromTrigger", required: false }] }], viewportMargin: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewportMargin", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }, { type: i0.Output, args: ["closeOnEscapeChange"] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }, { type: i0.Output, args: ["closeOnBackdropChange"] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }], backdropClick: [{ type: i0.Output, args: ["backdropClick"] }], escapeKey: [{ type: i0.Output, args: ["escapeKey"] }] } });
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Host directive that delegates the `ngDoCheck` state-sync work shared across
|
|
224
|
+
* popup form-field components: error-state, required-state, and disabled mirror.
|
|
225
|
+
*
|
|
226
|
+
* Consumers wire the four signals/subjects via the setters and let the directive
|
|
227
|
+
* call `updateErrorState`, `syncRequiredState`, `syncNgControlDisabled` on every check.
|
|
228
|
+
*
|
|
229
|
+
* Wiring uses imperative `signal().set(...)` calls (typically from the consumer's
|
|
230
|
+
* constructor or `ngAfterViewInit`). Template-bound `input()` was considered but
|
|
231
|
+
* intentionally rejected here: each component already owns the writable signals it
|
|
232
|
+
* holds for required/disabled/errorState, and passing them by reference is cleaner
|
|
233
|
+
* than re-projecting them through Angular host-directive input bindings.
|
|
234
|
+
*
|
|
235
|
+
* The directive injects `NgControl` lazily via `injectNgControl()` (deferred Promise
|
|
236
|
+
* pattern) to avoid the DI cycle that arises when consumers provide
|
|
237
|
+
* `NG_VALUE_ACCESSOR: useExisting: forwardRef(self)` (i.e., all popup-form-field
|
|
238
|
+
* components). The helper uses `Promise.resolve()` so the NgControl reference is
|
|
239
|
+
* populated asynchronously after the current microtask queue drains.
|
|
240
|
+
*/
|
|
241
|
+
class FuiFormControlSyncDirective {
|
|
242
|
+
_ngControlRef = injectNgControl();
|
|
243
|
+
_parentForm = inject(NgForm, { optional: true });
|
|
244
|
+
_parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
245
|
+
_defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);
|
|
246
|
+
/** Writable signal holding the consumer's current error state. Set once at wiring time. */
|
|
247
|
+
errorState = signal(null, ...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
|
|
248
|
+
/** Optional consumer-provided ErrorStateMatcher. `null` means use the injected `DefaultErrorStateMatcher`. */
|
|
249
|
+
errorStateMatcher = signal(null, ...(ngDevMode ? [{ debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
|
|
250
|
+
/** Writable signal holding the consumer's mirrored `required` state. */
|
|
251
|
+
required = signal(null, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
252
|
+
/** Writable signal holding the consumer's mirrored `disabled` state (driven by NgControl). */
|
|
253
|
+
ngControlDisabled = signal(null, ...(ngDevMode ? [{ debugName: "ngControlDisabled" }] : /* istanbul ignore next */ []));
|
|
254
|
+
/** Subject the consumer notifies when its state changes (consumed by `fui-form-field`). */
|
|
255
|
+
stateChanges = signal(null, ...(ngDevMode ? [{ debugName: "stateChanges" }] : /* istanbul ignore next */ []));
|
|
256
|
+
ngDoCheck() {
|
|
257
|
+
const ngControl = this._ngControlRef.ngControl;
|
|
258
|
+
if (!ngControl)
|
|
259
|
+
return;
|
|
260
|
+
const es = this.errorState();
|
|
261
|
+
const rq = this.required();
|
|
262
|
+
const nd = this.ngControlDisabled();
|
|
263
|
+
const sc = this.stateChanges();
|
|
264
|
+
if (es && sc) {
|
|
265
|
+
updateErrorState(ngControl, es, this.errorStateMatcher(), this._defaultErrorStateMatcher, this._parentForm, this._parentFormGroup, sc);
|
|
266
|
+
}
|
|
267
|
+
if (rq && sc) {
|
|
268
|
+
syncRequiredState(ngControl, rq, sc);
|
|
269
|
+
}
|
|
270
|
+
if (nd && sc) {
|
|
271
|
+
syncNgControlDisabled(ngControl, nd, sc);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormControlSyncDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
275
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.6", type: FuiFormControlSyncDirective, isStandalone: true, selector: "[fuiFormControlSync]", ngImport: i0 });
|
|
276
|
+
}
|
|
277
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiFormControlSyncDirective, decorators: [{
|
|
278
|
+
type: Directive,
|
|
279
|
+
args: [{
|
|
280
|
+
standalone: true,
|
|
281
|
+
selector: '[fuiFormControlSync]',
|
|
282
|
+
}]
|
|
283
|
+
}] });
|
|
284
|
+
|
|
81
285
|
/**
|
|
82
286
|
* Generated bundle index. Do not edit.
|
|
83
287
|
*/
|
|
84
288
|
|
|
85
|
-
export { injectNgControl, syncNgControlDisabled, syncRequiredState, updateErrorState };
|
|
289
|
+
export { DEFAULT_POPUP_POSITIONS, FuiFormControlSyncDirective, FuiPopupOverlayDirective, injectNgControl, syncNgControlDisabled, syncRequiredState, updateErrorState };
|
|
86
290
|
//# sourceMappingURL=raintonic-formaui-cdk-form-field.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-cdk-form-field.mjs","sources":["../../../lib/cdk/form-field/form-control-base.ts","../../../lib/cdk/form-field/raintonic-formaui-cdk-form-field.ts"],"sourcesContent":["import { inject, Injector } from '@angular/core';\r\nimport { NgControl, Validators } from '@angular/forms';\r\nimport { FormControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\n\r\n/**\r\n * Reference holder for NgControl resolved via the deferred Promise.resolve() pattern.\r\n * This avoids circular DI when a component provides both NG_VALUE_ACCESSOR and injects NgControl.\r\n */\r\nexport interface NgControlRef {\r\n ngControl: NgControl | null;\r\n}\r\n\r\n/**\r\n * Injects NgControl via the deferred `Promise.resolve()` pattern used throughout FormaUI.\r\n * Must be called inside a constructor (injection context).\r\n *\r\n * @returns A ref object whose `ngControl` property is populated asynchronously.\r\n */\r\nexport function injectNgControl(): NgControlRef {\r\n const injector = inject(Injector);\r\n const ref: NgControlRef = { ngControl: null };\r\n\r\n void Promise.resolve().then(() => {\r\n ref.ngControl = injector.get(NgControl, null, { self: true, optional: true });\r\n if (ref.ngControl != null) {\r\n ref.ngControl.valueAccessor = null; // Will be set by the component\r\n }\r\n });\r\n\r\n return ref;\r\n}\r\n\r\n/**\r\n * Updates the error state by comparing current control validity against the error-state matcher.\r\n * Call this in `ngDoCheck`.\r\n *\r\n * @param ngControl - The NgControl instance (may be null).\r\n * @param errorState - Writable signal holding the current error state.\r\n * @param errorStateMatcher - Consumer-provided matcher, or null to use the default.\r\n * @param defaultErrorStateMatcher - The injected DefaultErrorStateMatcher.\r\n * @param parentForm - The parent NgForm, if any.\r\n * @param parentFormGroup - The parent FormGroupDirective, if any.\r\n * @param stateChanges - Subject to notify of state changes.\r\n */\r\nexport function updateErrorState(\r\n ngControl: NgControl | null,\r\n errorState: { (): boolean; set: (v: boolean) => void },\r\n errorStateMatcher: ErrorStateMatcher | null,\r\n defaultErrorStateMatcher: DefaultErrorStateMatcher,\r\n parentForm: NgForm | null,\r\n parentFormGroup: FormGroupDirective | null,\r\n stateChanges: Subject<void>,\r\n): void {\r\n if (!ngControl?.control) return;\r\n\r\n const isOldState = errorState();\r\n const parent = parentFormGroup ?? parentForm;\r\n const matcher = errorStateMatcher ?? defaultErrorStateMatcher;\r\n const control = ngControl.control as FormControl;\r\n const isNewState = control ? matcher.isErrorState(control, parent) : false;\r\n\r\n if (isNewState !== isOldState) {\r\n errorState.set(isNewState);\r\n stateChanges.next();\r\n }\r\n}\r\n\r\n/**\r\n * Syncs the `required` signal from the form control's validators.\r\n * Call this in `ngDoCheck`.\r\n *\r\n * @param ngControl - The NgControl instance (may be null).\r\n * @param required - Writable signal holding the current required state.\r\n * @param stateChanges - Subject to notify of state changes.\r\n */\r\nexport function syncRequiredState(\r\n ngControl: NgControl | null,\r\n required: { (): boolean; set: (v: boolean) => void },\r\n stateChanges: Subject<void>,\r\n): void {\r\n if (!ngControl?.control) return;\r\n\r\n const req = ngControl.control.hasValidator(Validators.required) ?? false;\r\n if (req !== required()) {\r\n required.set(req);\r\n stateChanges.next();\r\n }\r\n}\r\n\r\n/**\r\n * Syncs the NgControl's disabled state into a local signal.\r\n * Call this in `ngDoCheck`.\r\n *\r\n * @param ngControl - The NgControl instance (may be null).\r\n * @param ngControlDisabled - Writable signal holding the mirrored disabled state.\r\n * @param stateChanges - Subject to notify of state changes.\r\n */\r\nexport function syncNgControlDisabled(\r\n ngControl: NgControl | null,\r\n ngControlDisabled: { (): boolean; set: (v: boolean) => void },\r\n stateChanges: Subject<void>,\r\n): void {\r\n if (!ngControl) return;\r\n\r\n const ncd = ngControl.disabled ?? false;\r\n if (ncd !== ngControlDisabled()) {\r\n ngControlDisabled.set(ncd);\r\n stateChanges.next();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAcA;;;;;AAKG;SACa,eAAe,GAAA;AAC7B,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,MAAM,GAAG,GAAiB,EAAE,SAAS,EAAE,IAAI,EAAE;IAE7C,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;QAC/B,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC7E,QAAA,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE;YACzB,GAAG,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC;QACrC;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,GAAG;AACZ;AAEA;;;;;;;;;;;AAWG;AACG,SAAU,gBAAgB,CAC9B,SAA2B,EAC3B,UAAsD,EACtD,iBAA2C,EAC3C,wBAAkD,EAClD,UAAyB,EACzB,eAA0C,EAC1C,YAA2B,EAAA;IAE3B,IAAI,CAAC,SAAS,EAAE,OAAO;QAAE;AAEzB,IAAA,MAAM,UAAU,GAAG,UAAU,EAAE;AAC/B,IAAA,MAAM,MAAM,GAAG,eAAe,IAAI,UAAU;AAC5C,IAAA,MAAM,OAAO,GAAG,iBAAiB,IAAI,wBAAwB;AAC7D,IAAA,MAAM,OAAO,GAAG,SAAS,CAAC,OAAsB;AAChD,IAAA,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK;AAE1E,IAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,QAAA,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;QAC1B,YAAY,CAAC,IAAI,EAAE;IACrB;AACF;AAEA;;;;;;;AAOG;SACa,iBAAiB,CAC/B,SAA2B,EAC3B,QAAoD,EACpD,YAA2B,EAAA;IAE3B,IAAI,CAAC,SAAS,EAAE,OAAO;QAAE;AAEzB,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK;AACxE,IAAA,IAAI,GAAG,KAAK,QAAQ,EAAE,EAAE;AACtB,QAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QACjB,YAAY,CAAC,IAAI,EAAE;IACrB;AACF;AAEA;;;;;;;AAOG;SACa,qBAAqB,CACnC,SAA2B,EAC3B,iBAA6D,EAC7D,YAA2B,EAAA;AAE3B,IAAA,IAAI,CAAC,SAAS;QAAE;AAEhB,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,IAAI,KAAK;AACvC,IAAA,IAAI,GAAG,KAAK,iBAAiB,EAAE,EAAE;AAC/B,QAAA,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B,YAAY,CAAC,IAAI,EAAE;IACrB;AACF;;AC/GA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-cdk-form-field.mjs","sources":["../../../lib/cdk/form-field/form-control-base.ts","../../../lib/cdk/form-field/popup-overlay.types.ts","../../../lib/cdk/form-field/popup-overlay.directive.ts","../../../lib/cdk/form-field/form-control-sync.directive.ts","../../../lib/cdk/form-field/raintonic-formaui-cdk-form-field.ts"],"sourcesContent":["import { inject, Injector } from '@angular/core';\r\nimport { NgControl, Validators } from '@angular/forms';\r\nimport { FormControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\n\r\n/**\r\n * Reference holder for NgControl resolved via the deferred Promise.resolve() pattern.\r\n * This avoids circular DI when a component provides both NG_VALUE_ACCESSOR and injects NgControl.\r\n */\r\nexport interface NgControlRef {\r\n ngControl: NgControl | null;\r\n}\r\n\r\n/**\r\n * Injects NgControl via the deferred `Promise.resolve()` pattern used throughout FormaUI.\r\n * Must be called inside a constructor (injection context).\r\n *\r\n * @returns A ref object whose `ngControl` property is populated asynchronously.\r\n */\r\nexport function injectNgControl(): NgControlRef {\r\n const injector = inject(Injector);\r\n const ref: NgControlRef = { ngControl: null };\r\n\r\n void Promise.resolve().then(() => {\r\n ref.ngControl = injector.get(NgControl, null, { self: true, optional: true });\r\n if (ref.ngControl != null) {\r\n ref.ngControl.valueAccessor = null; // Will be set by the component\r\n }\r\n });\r\n\r\n return ref;\r\n}\r\n\r\n/**\r\n * Updates the error state by comparing current control validity against the error-state matcher.\r\n * Call this in `ngDoCheck`.\r\n *\r\n * @param ngControl - The NgControl instance (may be null).\r\n * @param errorState - Writable signal holding the current error state.\r\n * @param errorStateMatcher - Consumer-provided matcher, or null to use the default.\r\n * @param defaultErrorStateMatcher - The injected DefaultErrorStateMatcher.\r\n * @param parentForm - The parent NgForm, if any.\r\n * @param parentFormGroup - The parent FormGroupDirective, if any.\r\n * @param stateChanges - Subject to notify of state changes.\r\n */\r\nexport function updateErrorState(\r\n ngControl: NgControl | null,\r\n errorState: { (): boolean; set: (v: boolean) => void },\r\n errorStateMatcher: ErrorStateMatcher | null,\r\n defaultErrorStateMatcher: DefaultErrorStateMatcher,\r\n parentForm: NgForm | null,\r\n parentFormGroup: FormGroupDirective | null,\r\n stateChanges: Subject<void>,\r\n): void {\r\n if (!ngControl?.control) return;\r\n\r\n const isOldState = errorState();\r\n const parent = parentFormGroup ?? parentForm;\r\n const matcher = errorStateMatcher ?? defaultErrorStateMatcher;\r\n const control = ngControl.control as FormControl;\r\n const isNewState = control ? matcher.isErrorState(control, parent) : false;\r\n\r\n if (isNewState !== isOldState) {\r\n errorState.set(isNewState);\r\n stateChanges.next();\r\n }\r\n}\r\n\r\n/**\r\n * Syncs the `required` signal from the form control's validators.\r\n * Call this in `ngDoCheck`.\r\n *\r\n * @param ngControl - The NgControl instance (may be null).\r\n * @param required - Writable signal holding the current required state.\r\n * @param stateChanges - Subject to notify of state changes.\r\n */\r\nexport function syncRequiredState(\r\n ngControl: NgControl | null,\r\n required: { (): boolean; set: (v: boolean) => void },\r\n stateChanges: Subject<void>,\r\n): void {\r\n if (!ngControl?.control) return;\r\n\r\n const req = ngControl.control.hasValidator(Validators.required) ?? false;\r\n if (req !== required()) {\r\n required.set(req);\r\n stateChanges.next();\r\n }\r\n}\r\n\r\n/**\r\n * Syncs the NgControl's disabled state into a local signal.\r\n * Call this in `ngDoCheck`.\r\n *\r\n * @param ngControl - The NgControl instance (may be null).\r\n * @param ngControlDisabled - Writable signal holding the mirrored disabled state.\r\n * @param stateChanges - Subject to notify of state changes.\r\n */\r\nexport function syncNgControlDisabled(\r\n ngControl: NgControl | null,\r\n ngControlDisabled: { (): boolean; set: (v: boolean) => void },\r\n stateChanges: Subject<void>,\r\n): void {\r\n if (!ngControl) return;\r\n\r\n const ncd = ngControl.disabled ?? false;\r\n if (ncd !== ngControlDisabled()) {\r\n ngControlDisabled.set(ncd);\r\n stateChanges.next();\r\n }\r\n}\r\n","import { ElementRef } from '@angular/core';\r\nimport { FuiConnectedPosition } from '@raintonic/formaui/cdk/overlay';\r\n\r\n/**\r\n * Default connected-position fallbacks used by popup form-field components.\r\n *\r\n * Order: prefer \"below the trigger, anchored to start\", fall back to \"above the trigger\".\r\n * Both with 4px offset away from the trigger.\r\n */\r\nexport const DEFAULT_POPUP_POSITIONS: readonly FuiConnectedPosition[] = [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n] as const;\r\n\r\n/**\r\n * Scroll strategy options exposed via the popup-overlay directive.\r\n * Maps to `FuiOverlayService.scrollStrategies`.\r\n *\r\n * `'noop'` is intentionally excluded — a popup form-field must respond to scroll\r\n * events to avoid its panel visually detaching from the trigger.\r\n */\r\nexport type FuiPopupScrollStrategy = 'reposition' | 'close' | 'block';\r\n\r\n/**\r\n * Public configuration shape for elements consumed by the popup-overlay directive.\r\n * Used by tests and consumers that build the config manually.\r\n */\r\nexport interface FuiPopupOverlayWiring {\r\n trigger: ElementRef<HTMLElement>;\r\n panel: ElementRef<HTMLElement>;\r\n}\r\n","import { Directive, OnDestroy, signal, inject, ElementRef, model, output, input } from '@angular/core';\r\nimport { FuiConnectedPosition, FuiOverlayRef, FuiOverlayService } from '@raintonic/formaui/cdk/overlay';\r\nimport { DEFAULT_POPUP_POSITIONS, FuiPopupScrollStrategy } from './popup-overlay.types';\r\nimport { Subscription } from 'rxjs';\r\n\r\n/**\r\n * Host directive that encapsulates popup-overlay lifecycle for form-field-like components\r\n * (autocomplete, select, tree-select, date-picker, time-picker).\r\n *\r\n * Consumers wire trigger and panel via `setTrigger()` / `setPanel()` (typically in\r\n * `ngAfterViewInit`) and then call `open()`, `close()`, or `toggle()`.\r\n *\r\n * Public outputs: `openedChange`, `backdropClick`, `escapeKey`.\r\n *\r\n * Public signals: `panelOpen()`, `overlayRef()`.\r\n */\r\n@Directive({\r\n standalone: true,\r\n selector: '[fuiPopupOverlay]',\r\n exportAs: 'fuiPopupOverlay',\r\n})\r\nexport class FuiPopupOverlayDirective implements OnDestroy {\r\n private readonly _overlayService = inject(FuiOverlayService);\r\n\r\n private _trigger: ElementRef<HTMLElement> | null = null;\r\n private _panel: ElementRef<HTMLElement> | null = null;\r\n private _subs = new Subscription();\r\n\r\n readonly positions = model([...DEFAULT_POPUP_POSITIONS]);\r\n readonly panelClass = model<string | string[]>([]);\r\n readonly backdropClass = model('fui-popup-backdrop');\r\n readonly scrollStrategy = input<FuiPopupScrollStrategy>('reposition');\r\n readonly widthElement = model<ElementRef<HTMLElement> | null>(null);\r\n readonly minWidthFromTrigger = input(true);\r\n readonly viewportMargin = input(8);\r\n readonly closeOnEscape = model(true);\r\n readonly closeOnBackdrop = model(true);\r\n\r\n readonly panelOpen = signal(false);\r\n readonly overlayRef = signal<FuiOverlayRef | null>(null);\r\n\r\n readonly openedChange = output<boolean>();\r\n readonly backdropClick = output();\r\n readonly escapeKey = output();\r\n\r\n /**\r\n * Registers the trigger element. Call in `ngAfterViewInit` of the consumer.\r\n * Passing `null` clears the wiring and makes subsequent `open()` calls a no-op\r\n * until a valid ref is provided.\r\n */\r\n setTrigger(ref: ElementRef<HTMLElement> | null): void {\r\n this._trigger = ref;\r\n }\r\n\r\n /**\r\n * Registers the panel element (the content to attach to the overlay). Call in\r\n * `ngAfterViewInit` of the consumer. Passing `null` clears the wiring and makes\r\n * subsequent `open()` calls a no-op until a valid ref is provided.\r\n */\r\n setPanel(ref: ElementRef<HTMLElement> | null): void {\r\n this._panel = ref;\r\n }\r\n\r\n open(): void {\r\n if (this.panelOpen()) return;\r\n if (!this._trigger || !this._panel) return;\r\n\r\n const triggerEl = this._trigger.nativeElement;\r\n\r\n // Use the explicitly-provided width element when available (e.g. the form-field\r\n // wrapper element passed by select/autocomplete) so the overlay matches the full\r\n // form-field width including prefix/suffix areas. Falls back to the trigger width.\r\n const widthSourceEl = this.widthElement()?.nativeElement ?? triggerEl;\r\n const overlayWidth = widthSourceEl.getBoundingClientRect().width;\r\n\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(triggerEl, this.positions())\r\n .withPush(true)\r\n .withViewportMargin(this.viewportMargin());\r\n\r\n const scrollStrategyFactory = this._overlayService.scrollStrategies[this.scrollStrategy()];\r\n\r\n const ref = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: scrollStrategyFactory(),\r\n hasBackdrop: true,\r\n backdropClass: this.backdropClass(),\r\n backdropClickBehavior: 'close',\r\n panelClass: this.panelClass(),\r\n ...(this.minWidthFromTrigger() ? { minWidth: overlayWidth } : {}),\r\n });\r\n\r\n this._subs.unsubscribe();\r\n this._subs = new Subscription();\r\n\r\n this._subs.add(\r\n ref.backdropClick.subscribe(() => {\r\n this.backdropClick.emit();\r\n if (this.closeOnBackdrop()) this.close();\r\n }),\r\n );\r\n\r\n this._subs.add(\r\n ref.keydownEvents.subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n this.escapeKey.emit();\r\n if (this.closeOnEscape()) this.close();\r\n }\r\n }),\r\n );\r\n\r\n ref.attach(this._panel.nativeElement);\r\n\r\n this.overlayRef.set(ref);\r\n this.panelOpen.set(true);\r\n this.openedChange.emit(true);\r\n }\r\n\r\n close(): void {\r\n if (!this.panelOpen()) return;\r\n\r\n this._subs.unsubscribe();\r\n\r\n const ref = this.overlayRef();\r\n if (ref) {\r\n ref.dispose();\r\n }\r\n\r\n this.overlayRef.set(null);\r\n this.panelOpen.set(false);\r\n this.openedChange.emit(false);\r\n }\r\n\r\n toggle(): void {\r\n if (this.panelOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.close();\r\n }\r\n}\r\n","import { Directive, DoCheck, inject, signal, WritableSignal } from '@angular/core';\r\nimport { FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport { injectNgControl, syncNgControlDisabled, syncRequiredState, updateErrorState } from './form-control-base';\r\n\r\n/**\r\n * Host directive that delegates the `ngDoCheck` state-sync work shared across\r\n * popup form-field components: error-state, required-state, and disabled mirror.\r\n *\r\n * Consumers wire the four signals/subjects via the setters and let the directive\r\n * call `updateErrorState`, `syncRequiredState`, `syncNgControlDisabled` on every check.\r\n *\r\n * Wiring uses imperative `signal().set(...)` calls (typically from the consumer's\r\n * constructor or `ngAfterViewInit`). Template-bound `input()` was considered but\r\n * intentionally rejected here: each component already owns the writable signals it\r\n * holds for required/disabled/errorState, and passing them by reference is cleaner\r\n * than re-projecting them through Angular host-directive input bindings.\r\n *\r\n * The directive injects `NgControl` lazily via `injectNgControl()` (deferred Promise\r\n * pattern) to avoid the DI cycle that arises when consumers provide\r\n * `NG_VALUE_ACCESSOR: useExisting: forwardRef(self)` (i.e., all popup-form-field\r\n * components). The helper uses `Promise.resolve()` so the NgControl reference is\r\n * populated asynchronously after the current microtask queue drains.\r\n */\r\n@Directive({\r\n standalone: true,\r\n selector: '[fuiFormControlSync]',\r\n})\r\nexport class FuiFormControlSyncDirective implements DoCheck {\r\n private readonly _ngControlRef = injectNgControl();\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n\r\n /** Writable signal holding the consumer's current error state. Set once at wiring time. */\r\n readonly errorState = signal<WritableSignal<boolean> | null>(null);\r\n\r\n /** Optional consumer-provided ErrorStateMatcher. `null` means use the injected `DefaultErrorStateMatcher`. */\r\n readonly errorStateMatcher = signal<ErrorStateMatcher | null>(null);\r\n\r\n /** Writable signal holding the consumer's mirrored `required` state. */\r\n readonly required = signal<WritableSignal<boolean> | null>(null);\r\n\r\n /** Writable signal holding the consumer's mirrored `disabled` state (driven by NgControl). */\r\n readonly ngControlDisabled = signal<WritableSignal<boolean> | null>(null);\r\n\r\n /** Subject the consumer notifies when its state changes (consumed by `fui-form-field`). */\r\n readonly stateChanges = signal<Subject<void> | null>(null);\r\n\r\n ngDoCheck(): void {\r\n const ngControl = this._ngControlRef.ngControl;\r\n if (!ngControl) return;\r\n\r\n const es = this.errorState();\r\n const rq = this.required();\r\n const nd = this.ngControlDisabled();\r\n const sc = this.stateChanges();\r\n\r\n if (es && sc) {\r\n updateErrorState(\r\n ngControl,\r\n es,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n sc,\r\n );\r\n }\r\n if (rq && sc) {\r\n syncRequiredState(ngControl, rq, sc);\r\n }\r\n if (nd && sc) {\r\n syncNgControlDisabled(ngControl, nd, sc);\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|