ngx-kit 7.0.1 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/angle-selector/README.md +34 -34
  2. package/box-shadow/README.md +33 -33
  3. package/color-picker/README.md +52 -52
  4. package/data-table/README.md +120 -120
  5. package/date-picker/README.md +74 -74
  6. package/dialog/README.md +92 -92
  7. package/drag-resize/README.md +55 -55
  8. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  9. package/fesm2022/ngx-kit-date-picker.mjs +7 -1
  10. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  11. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-drag-resize.mjs +76 -104
  13. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-drawer-menu.mjs +3 -3
  15. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  17. package/fesm2022/ngx-kit-form-field.mjs +9 -3
  18. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  19. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  20. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  21. package/fesm2022/ngx-kit-grid-layout.mjs +32 -30
  22. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-infinite-scroll.mjs +467 -0
  24. package/fesm2022/ngx-kit-infinite-scroll.mjs.map +1 -0
  25. package/fesm2022/ngx-kit-message.mjs +1 -1
  26. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-shared.mjs +64 -1
  28. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-virtual-scroll.mjs +2 -2
  30. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -1
  31. package/fesm2022/ngx-kit-webflow.mjs +38 -38
  32. package/fesm2022/ngx-kit-webflow.mjs.map +1 -1
  33. package/gallery/README.md +71 -71
  34. package/gradient-picker/README.md +41 -41
  35. package/grid-layout/README.md +64 -64
  36. package/image-editor/README.md +44 -44
  37. package/infinite-scroll/README.md +252 -0
  38. package/menu/README.md +85 -85
  39. package/message/README.md +70 -70
  40. package/notify/README.md +56 -56
  41. package/package.json +5 -1
  42. package/shared/README.md +117 -117
  43. package/time-picker/README.md +89 -89
  44. package/types/ngx-kit-date-picker.d.ts +14 -11
  45. package/types/ngx-kit-drag-resize.d.ts +44 -44
  46. package/types/ngx-kit-form-field.d.ts +26 -23
  47. package/types/ngx-kit-infinite-scroll.d.ts +86 -0
  48. package/types/ngx-kit-shared.d.ts +39 -1
  49. package/virtual-scroll/README.md +199 -199
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-virtual-scroll.mjs","sources":["../../../projects/libs/virtual-scroll/types/virtual-scroll-range.interface.ts","../../../projects/libs/virtual-scroll/utils/measure-layout.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.html","../../../projects/libs/virtual-scroll/public-api.ts","../../../projects/libs/virtual-scroll/ngx-kit-virtual-scroll.ts"],"sourcesContent":["/**\n * A \"line\" index range that is currently rendered.\n * A \"line\" is one item for a plain list, or one row/column of N items\n * for an auto-detected wrapping grid. `end` is exclusive.\n */\nexport interface NgxVirtualScrollRange {\n start: number;\n end: number;\n}\n\nexport function rangesEqual(a: NgxVirtualScrollRange, b: NgxVirtualScrollRange): boolean {\n return a.start === b.start && a.end === b.end;\n}\n","import { NgxVirtualScrollMeasurement } from '../types/virtual-scroll-measurement.interface';\n\nconst TOP_TOLERANCE_PX = 0.5;\n\n/**\n * Pure, framework-agnostic layout probe.\n *\n * Reads the real bounding boxes of a small batch of already-rendered\n * elements and infers, purely from actual layout:\n * - the scroll axis (vertical vs horizontal)\n * - how many items share a single line (1 for a plain list, N for a\n * wrapping grid)\n * - the real size of one line, INCLUDING margins/border/box-shadow,\n * because it is derived from the delta between two real sibling\n * positions in normal document flow rather than from a hardcoded\n * itemSize input.\n *\n * No orientation/itemSize is ever supplied by the consumer — this is the\n * single source of truth for both.\n */\nexport function measureLayout(\n probeElements: readonly Element[],\n): NgxVirtualScrollMeasurement | null {\n if (probeElements.length === 0) {\n return null;\n }\n\n const rects = probeElements.map((el) => el.getBoundingClientRect());\n\n if (rects.length === 1) {\n // Not enough siblings to infer direction yet; assume a vertical list\n // (the overwhelmingly common case) using the element's own height.\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(rects[0].height, 1) };\n }\n\n const first = rects[0];\n\n // Find the first probed item that starts a new line (its top differs\n // meaningfully from the first item's top).\n let wrapIndex = -1;\n for (let i = 1; i < rects.length; i++) {\n if (Math.abs(rects[i].top - first.top) > TOP_TOLERANCE_PX) {\n wrapIndex = i;\n break;\n }\n }\n\n if (wrapIndex === -1) {\n // Every probed item shares the same line -> a single horizontal line.\n const lineSize = rects[1].left - first.left;\n return { axis: 'horizontal', crossCount: 1, lineSize: Math.max(lineSize, 1) };\n }\n\n if (wrapIndex === 1) {\n // The very next item is already on a new line -> a plain vertical list.\n const lineSize = rects[1].top - first.top;\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(lineSize, 1) };\n }\n\n // Several items share the first line before wrapping -> a wrapping grid.\n const crossCount = wrapIndex;\n const lineSize = rects[wrapIndex].top - first.top;\n return { axis: 'vertical', crossCount, lineSize: Math.max(lineSize, 1) };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n afterRenderEffect,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\n\nimport { NgxVirtualScrollRange, rangesEqual } from '../types/virtual-scroll-range.interface';\nimport {\n NgxVirtualScrollAxis,\n NgxVirtualScrollMeasureFn,\n NgxVirtualScrollMeasurement,\n} from '../types/virtual-scroll-measurement.interface';\nimport { measureLayout } from '../utils/measure-layout';\n\n/** How many items are rendered \"in the open\" (no transform) purely to probe their real layout. */\nconst PROBE_COUNT = 24;\n\n/**\n * Browsers clamp any single element's CSS width/height (and therefore\n * `scrollWidth`/`scrollHeight`) to a hard maximum — roughly 33,554,428px in\n * Chromium and considerably less in older WebKit (historically ~8,388,608px)\n * and Gecko (~17,895,697px). Once the spacer element (used purely to give\n * the native scrollbar the right size) exceeds that ceiling, the browser\n * silently clamps it, the scrollbar stops early, and everything past that\n * point becomes unreachable — exactly the \"stuck around 524k rows\" symptom.\n *\n * To support arbitrarily large data sets we cap the spacer at this safe\n * ceiling and scroll the DOM in a *compressed* coordinate space, while all\n * index math still happens against the real, uncompressed pixel space (see\n * `scaleFactor`). Kept conservative (well under every known browser cap) so\n * it works everywhere without per-browser detection.\n */\nconst DEFAULT_MAX_AXIS_SIZE_PX = 6_000_000;\n\n/**\n * Headless, signal-based virtual scroll viewport.\n *\n * There is no `itemSize` and no `orientation` input by design: both are\n * derived by measuring the real, rendered bounding boxes of a small probe\n * batch (see `measure-layout.ts`), so margins/border/box-shadow on your own\n * item styles are always accounted for correctly, and mixed layouts\n * (vertical list of wrapping rows, i.e. a card grid) are supported out of\n * the box.\n *\n * The component does not render your items itself — it exposes reactive\n * signals (`visibleItems`, `range`, `baseIndex`, `axis`, ...) that you\n * consume with a native `@for` block in your own template. This keeps the\n * repeat/track logic entirely under your control (custom track expressions,\n * `@empty` blocks, etc.) instead of hiding it behind a structural directive.\n *\n * @example\n * ```html\n * <ngx-virtual-scroll-viewport #vs=\"ngxVirtualScrollViewport\" [items]=\"rows\" style=\"height: 480px\">\n * @for (row of vs.visibleItems(); track row.id; let i = $index) {\n * <div class=\"row\">{{ vs.baseIndex() + i }} - {{ row.name }}</div>\n * }\n * </ngx-virtual-scroll-viewport>\n * ```\n */\n@Component({\n selector: 'ngx-virtual-scroll-viewport, ngx-virtual-scroll',\n standalone: true,\n templateUrl: './virtual-scroll-viewport.component.html',\n styleUrl: './virtual-scroll-viewport.component.scss',\n exportAs: 'ngxVirtualScrollViewport',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-virtual-scroll-viewport-host',\n '[class.ngx-virtual-scroll-viewport-host--scrolling]': 'isScrolling()',\n },\n})\nexport class NgxVirtualScrollViewport<T = unknown> {\n /** The full, unvirtualized data set. */\n readonly items = input<readonly T[]>([]);\n\n /** Minimum buffer (px) left before the render range is recomputed. */\n readonly minBufferPx = input(150);\n\n /** Extra buffer (px) rendered outside the visible area on each side. */\n readonly maxBufferPx = input(300);\n\n /** Advanced escape hatch: replace the built-in layout probe entirely. */\n readonly measureFn = input<NgxVirtualScrollMeasureFn | undefined>(undefined);\n\n /**\n * Safe ceiling (px) for the scrollable axis's real DOM size. Only relevant\n * for very large data sets — see `DEFAULT_MAX_AXIS_SIZE_PX`. You should\n * not need to change this; it's exposed only for advanced cases (e.g. you\n * know your app never targets older WebKit and want to raise the ceiling).\n */\n readonly maxAxisSizePx = input(DEFAULT_MAX_AXIS_SIZE_PX);\n\n /** Emits the index of the first fully-visible item as the user scrolls. */\n readonly scrolledIndexChange = output<number>();\n\n /** Emits whenever the rendered line range changes. */\n readonly rangeChange = output<NgxVirtualScrollRange>();\n\n private readonly scrollableRef = viewChild.required<ElementRef<HTMLElement>>('scrollable');\n private readonly wrapperRef = viewChild.required<ElementRef<HTMLElement>>('wrapper');\n\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly measurement = signal<NgxVirtualScrollMeasurement | null>(null);\n private readonly scrollOffset = signal(0);\n private readonly viewportSize = signal(0);\n\n /** Whether the user is actively scrolling (used only to toggle `will-change`). */\n readonly isScrolling = signal(false);\n\n /** Currently rendered line range. */\n readonly range = signal<NgxVirtualScrollRange>({ start: 0, end: PROBE_COUNT });\n\n readonly axis = computed<NgxVirtualScrollAxis>(() => this.measurement()?.axis ?? 'vertical');\n readonly crossCount = computed(() => this.measurement()?.crossCount ?? 1);\n readonly lineSize = computed(() => this.measurement()?.lineSize ?? 0);\n readonly isMeasured = computed(() => this.measurement() !== null);\n\n readonly lineCount = computed(() => Math.ceil(this.items().length / this.crossCount()));\n\n /** Real, uncompressed total size along the scroll axis — can exceed the browser's element-size cap. */\n readonly naturalTotalSize = computed(() => this.lineCount() * this.lineSize());\n\n /**\n * Size actually applied to the spacer element, clamped to `maxAxisSizePx`.\n * Equal to `naturalTotalSize()` for any data set small enough to matter in\n * practice — the compression only ever engages for extreme list sizes.\n */\n readonly totalSize = computed(() => Math.min(this.naturalTotalSize(), this.maxAxisSizePx()));\n\n /**\n * Ratio between the (possibly capped) DOM scroll space and the real,\n * uncompressed content size. `1` unless `naturalTotalSize()` exceeds\n * `maxAxisSizePx()`, in which case it's `< 1` and the DOM scrollbar\n * represents the whole data set in a compressed coordinate space.\n */\n readonly scaleFactor = computed(() => {\n const natural = this.naturalTotalSize();\n return natural > 0 ? this.totalSize() / natural : 1;\n });\n\n /** Absolute index of the first item in `visibleItems()`, for display purposes. */\n readonly baseIndex = computed(() => this.range().start * this.crossCount());\n\n /** Slice of `items()` that should actually be rendered right now. */\n readonly visibleItems = computed<readonly T[]>(() => {\n const data = this.items();\n const { start, end } = this.range();\n const cross = this.crossCount();\n return data.slice(start * cross, Math.min(data.length, end * cross));\n });\n\n // Expressed in the same compressed DOM coordinate space as `scrollOffset`/\n // `totalSize`, so it always stays within the safe, capped range even for\n // enormous data sets — see `scaleFactor`.\n //\n // The naive `start * lineSize * scaleFactor` value is only an *ideal*\n // proportional position. It is clamped so the *real* (unscaled) rendered\n // block — `renderedBlockSize()` — can never be pushed past the end of the\n // capped spacer. Without this clamp, once `scaleFactor() < 1`, the block\n // rendered near the tail (real, unscaled size) no longer fits in the tiny\n // sliver of compressed space \"ideally\" left for it, so it gets positioned\n // partly (or entirely) past the bottom of the scrollable area — reachable\n // in the DOM, but never inside the visible/scrollable viewport. Clamping\n // guarantees the tail of the list is always flush with, and fully inside,\n // the scrollable area.\n private readonly renderedBlockSize = computed(() => {\n const { start, end } = this.range();\n return (end - start) * this.lineSize();\n });\n\n private readonly contentOffset = computed(() => {\n const ideal = this.range().start * this.lineSize() * this.scaleFactor();\n const max = Math.max(0, this.totalSize() - this.renderedBlockSize());\n return Math.min(ideal, max);\n });\n\n protected readonly wrapperTransform = computed(() =>\n this.axis() === 'horizontal'\n ? `translateX(${this.contentOffset()}px)`\n : `translateY(${this.contentOffset()}px)`,\n );\n protected readonly spacerWidth = computed(() =>\n this.axis() === 'horizontal' ? this.totalSize() : 1,\n );\n protected readonly spacerHeight = computed(() =>\n this.axis() === 'vertical' ? this.totalSize() : 1,\n );\n\n private resizeObserver?: ResizeObserver;\n private scrollingIdleTimer?: ReturnType<typeof setTimeout>;\n private scrollRaf = 0;\n\n constructor() {\n // Seed / reset the probe range whenever the data set changes and we\n // haven't measured a real layout yet.\n effect(() => {\n const length = this.items().length;\n if (!this.measurement()) {\n this.range.set({ start: 0, end: Math.min(length, PROBE_COUNT) });\n }\n });\n\n // Read the real, rendered layout of the probe batch once it has\n // painted. Runs in the `read` phase so it never interleaves with DOM\n // writes and never forces a layout thrash.\n afterRenderEffect({\n read: () => {\n if (this.measurement()) {\n return;\n }\n const children = Array.from(this.wrapperRef().nativeElement.children).slice(0, PROBE_COUNT);\n const measure = this.measureFn() ?? measureLayout;\n const result = measure(children);\n if (result) {\n this.measurement.set(result);\n }\n },\n });\n\n // Once measured (or when the buffer inputs change), recompute the\n // actual visible range from the real viewport size / scroll offset.\n // `untracked` is used because `recomputeRange` itself reads scroll/size\n // signals that are already kept in sync by the scroll/resize listeners\n // directly — we only want *this* effect to re-run for buffer/measurement\n // changes, not for every scroll frame.\n effect(() => {\n this.minBufferPx();\n this.maxBufferPx();\n const measured = this.isMeasured();\n untracked(() => {\n if (measured) {\n // The initial viewport-size read (in setupListeners) assumed the\n // default 'vertical' axis before layout was known; now that the\n // real axis is known, re-read clientWidth/clientHeight against it.\n this.measureViewportSize();\n this.recomputeRange(true);\n }\n });\n });\n\n afterNextRender(() => this.setupListeners());\n\n this.destroyRef.onDestroy(() => {\n this.resizeObserver?.disconnect();\n cancelAnimationFrame(this.scrollRaf);\n clearTimeout(this.scrollingIdleTimer);\n });\n }\n\n /** Programmatically scroll to a given item index. */\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\n const line = Math.floor(index / this.crossCount());\n this.scrollToOffset(line * this.lineSize(), behavior);\n }\n\n /**\n * Programmatically scroll to a given pixel offset along the scroll axis.\n * `offset` is expressed in real, uncompressed content px (i.e. the same\n * space as `index * lineSize()`) — internally converted to the\n * (possibly compressed) DOM scroll coordinate via `scaleFactor()`.\n */\n scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\n const el = this.scrollableRef().nativeElement;\n const domOffset = offset * this.scaleFactor();\n const options: ScrollToOptions =\n this.axis() === 'horizontal' ? { left: domOffset, behavior } : { top: domOffset, behavior };\n el.scrollTo(options);\n }\n\n /** Force a re-measure, e.g. after the container was resized by external layout logic. */\n checkViewportSize(): void {\n this.measureViewportSize();\n this.recomputeRange(true);\n }\n\n private setupListeners(): void {\n const el = this.scrollableRef().nativeElement;\n\n el.addEventListener('scroll', this.onScroll, { passive: true });\n this.destroyRef.onDestroy(() => el.removeEventListener('scroll', this.onScroll));\n\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.checkViewportSize());\n this.resizeObserver.observe(el);\n }\n\n this.measureViewportSize();\n }\n\n private readonly onScroll = (): void => {\n if (this.scrollRaf) {\n return;\n }\n this.scrollRaf = requestAnimationFrame(() => {\n this.scrollRaf = 0;\n this.markScrolling();\n\n const el = this.scrollableRef().nativeElement;\n const offset = this.axis() === 'horizontal' ? el.scrollLeft : el.scrollTop;\n this.scrollOffset.set(offset);\n this.recomputeRange(false);\n\n const size = this.lineSize();\n if (size > 0) {\n const realOffset = offset / this.scaleFactor();\n this.scrolledIndexChange.emit(Math.floor(realOffset / size) * this.crossCount());\n }\n });\n };\n\n private markScrolling(): void {\n this.isScrolling.set(true);\n clearTimeout(this.scrollingIdleTimer);\n this.scrollingIdleTimer = setTimeout(() => this.isScrolling.set(false), 150);\n }\n\n private measureViewportSize(): void {\n const el = this.scrollableRef().nativeElement;\n const size = this.axis() === 'horizontal' ? el.clientWidth : el.clientHeight;\n this.viewportSize.set(size);\n }\n\n /**\n * Recomputes the rendered line range. Mirrors the CDK \"fixed size\"\n * strategy: only recompute once the scroll offset gets within\n * `minBufferPx` of the current range's edge, instead of on every pixel.\n *\n * All math here happens in *real* (uncompressed) content px, obtained by\n * dividing the raw DOM scroll offset/viewport size by `scaleFactor()`.\n * This is what makes the very last items reachable even when the total\n * content size has been compressed into a browser-safe DOM range: as\n * `domScrollOffset` sweeps its full (capped) range, `realOffset` still\n * sweeps the entire, real `naturalTotalSize()`.\n */\n private recomputeRange(force: boolean): void {\n const lineSize = this.lineSize();\n if (lineSize <= 0) {\n return;\n }\n\n const scale = this.scaleFactor();\n const realOffset = this.scrollOffset() / scale;\n const realViewportSize = this.viewportSize() / scale;\n\n const current = this.range();\n const min = this.minBufferPx();\n const max = this.maxBufferPx();\n\n const distanceToStart = realOffset - current.start * lineSize;\n const distanceToEnd = current.end * lineSize - (realOffset + realViewportSize);\n\n if (!force && distanceToStart >= min && distanceToEnd >= min) {\n return;\n }\n\n const bufferStart = Math.max(0, realOffset - max);\n const bufferEnd = realOffset + realViewportSize + max;\n\n const start = Math.max(0, Math.floor(bufferStart / lineSize));\n const end = Math.min(this.lineCount(), Math.ceil(bufferEnd / lineSize));\n const next: NgxVirtualScrollRange = { start, end };\n\n if (!rangesEqual(next, current)) {\n this.range.set(next);\n this.rangeChange.emit(next);\n }\n }\n}\n","<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\n <div\n class=\"ngx-virtual-scroll-viewport__spacer\"\n [style.width.px]=\"spacerWidth()\"\n [style.height.px]=\"spacerHeight()\"\n aria-hidden=\"true\"></div>\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\n <ng-content></ng-content>\n </div>\n</div>\n","/*\n * Public API surface of @ngx-kit/virtual-scroll\n */\n\nexport * from './components/virtual-scroll-viewport.component';\nexport * from './utils/measure-layout';\n\nexport * from './types/virtual-scroll-range.interface';\nexport * from './types/virtual-scroll-measurement.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-virtual-scroll.mjs","sources":["../../../projects/libs/virtual-scroll/types/virtual-scroll-range.interface.ts","../../../projects/libs/virtual-scroll/utils/measure-layout.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.ts","../../../projects/libs/virtual-scroll/components/virtual-scroll-viewport.component.html","../../../projects/libs/virtual-scroll/public-api.ts","../../../projects/libs/virtual-scroll/ngx-kit-virtual-scroll.ts"],"sourcesContent":["/**\n * A \"line\" index range that is currently rendered.\n * A \"line\" is one item for a plain list, or one row/column of N items\n * for an auto-detected wrapping grid. `end` is exclusive.\n */\nexport interface NgxVirtualScrollRange {\n start: number;\n end: number;\n}\n\nexport function rangesEqual(a: NgxVirtualScrollRange, b: NgxVirtualScrollRange): boolean {\n return a.start === b.start && a.end === b.end;\n}\n","import { NgxVirtualScrollMeasurement } from '../types/virtual-scroll-measurement.interface';\r\n\r\nconst TOP_TOLERANCE_PX = 0.5;\r\n\r\n/**\r\n * Pure, framework-agnostic layout probe.\r\n *\r\n * Reads the real bounding boxes of a small batch of already-rendered\r\n * elements and infers, purely from actual layout:\r\n * - the scroll axis (vertical vs horizontal)\r\n * - how many items share a single line (1 for a plain list, N for a\r\n * wrapping grid)\r\n * - the real size of one line, INCLUDING margins/border/box-shadow,\r\n * because it is derived from the delta between two real sibling\r\n * positions in normal document flow rather than from a hardcoded\r\n * itemSize input.\r\n *\r\n * No orientation/itemSize is ever supplied by the consumer — this is the\r\n * single source of truth for both.\r\n */\r\nexport function measureLayout(\r\n probeElements: readonly Element[],\r\n): NgxVirtualScrollMeasurement | null {\r\n if (probeElements.length === 0) {\r\n return null;\r\n }\r\n\r\n const rects = probeElements.map((el) => el.getBoundingClientRect());\r\n\r\n if (rects.length === 1) {\r\n // Not enough siblings to infer direction yet; assume a vertical list\r\n // (the overwhelmingly common case) using the element's own height.\r\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(rects[0].height, 1) };\r\n }\r\n\r\n const first = rects[0];\r\n\r\n // Find the first probed item that starts a new line (its top differs\r\n // meaningfully from the first item's top).\r\n let wrapIndex = -1;\r\n for (let i = 1; i < rects.length; i++) {\r\n if (Math.abs(rects[i].top - first.top) > TOP_TOLERANCE_PX) {\r\n wrapIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (wrapIndex === -1) {\r\n // Every probed item shares the same line -> a single horizontal line.\r\n const lineSize = rects[1].left - first.left;\r\n return { axis: 'horizontal', crossCount: 1, lineSize: Math.max(lineSize, 1) };\r\n }\r\n\r\n if (wrapIndex === 1) {\r\n // The very next item is already on a new line -> a plain vertical list.\r\n const lineSize = rects[1].top - first.top;\r\n return { axis: 'vertical', crossCount: 1, lineSize: Math.max(lineSize, 1) };\r\n }\r\n\r\n // Several items share the first line before wrapping -> a wrapping grid.\r\n const crossCount = wrapIndex;\r\n const lineSize = rects[wrapIndex].top - first.top;\r\n return { axis: 'vertical', crossCount, lineSize: Math.max(lineSize, 1) };\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n ViewEncapsulation,\r\n afterNextRender,\r\n afterRenderEffect,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { NgxVirtualScrollRange, rangesEqual } from '../types/virtual-scroll-range.interface';\r\nimport {\r\n NgxVirtualScrollAxis,\r\n NgxVirtualScrollMeasureFn,\r\n NgxVirtualScrollMeasurement,\r\n} from '../types/virtual-scroll-measurement.interface';\r\nimport { measureLayout } from '../utils/measure-layout';\r\n\r\n/** How many items are rendered \"in the open\" (no transform) purely to probe their real layout. */\r\nconst PROBE_COUNT = 24;\r\n\r\n/**\r\n * Browsers clamp any single element's CSS width/height (and therefore\r\n * `scrollWidth`/`scrollHeight`) to a hard maximum — roughly 33,554,428px in\r\n * Chromium and considerably less in older WebKit (historically ~8,388,608px)\r\n * and Gecko (~17,895,697px). Once the spacer element (used purely to give\r\n * the native scrollbar the right size) exceeds that ceiling, the browser\r\n * silently clamps it, the scrollbar stops early, and everything past that\r\n * point becomes unreachable — exactly the \"stuck around 524k rows\" symptom.\r\n *\r\n * To support arbitrarily large data sets we cap the spacer at this safe\r\n * ceiling and scroll the DOM in a *compressed* coordinate space, while all\r\n * index math still happens against the real, uncompressed pixel space (see\r\n * `scaleFactor`). Kept conservative (well under every known browser cap) so\r\n * it works everywhere without per-browser detection.\r\n */\r\nconst DEFAULT_MAX_AXIS_SIZE_PX = 6_000_000;\r\n\r\n/**\r\n * Headless, signal-based virtual scroll viewport.\r\n *\r\n * There is no `itemSize` and no `orientation` input by design: both are\r\n * derived by measuring the real, rendered bounding boxes of a small probe\r\n * batch (see `measure-layout.ts`), so margins/border/box-shadow on your own\r\n * item styles are always accounted for correctly, and mixed layouts\r\n * (vertical list of wrapping rows, i.e. a card grid) are supported out of\r\n * the box.\r\n *\r\n * The component does not render your items itself — it exposes reactive\r\n * signals (`visibleItems`, `range`, `baseIndex`, `axis`, ...) that you\r\n * consume with a native `@for` block in your own template. This keeps the\r\n * repeat/track logic entirely under your control (custom track expressions,\r\n * `@empty` blocks, etc.) instead of hiding it behind a structural directive.\r\n *\r\n * @example\r\n * ```html\r\n * <ngx-virtual-scroll-viewport #vs=\"ngxVirtualScrollViewport\" [items]=\"rows\" style=\"height: 480px\">\r\n * @for (row of vs.visibleItems(); track row.id; let i = $index) {\r\n * <div class=\"row\">{{ vs.baseIndex() + i }} - {{ row.name }}</div>\r\n * }\r\n * </ngx-virtual-scroll-viewport>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'ngx-virtual-scroll-viewport, ngx-virtual-scroll',\r\n standalone: true,\r\n templateUrl: './virtual-scroll-viewport.component.html',\r\n styleUrl: './virtual-scroll-viewport.component.scss',\r\n exportAs: 'ngxVirtualScrollViewport',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'ngx-virtual-scroll-viewport-host',\r\n '[class.ngx-virtual-scroll-viewport-host--scrolling]': 'isScrolling()',\r\n },\r\n})\r\nexport class NgxVirtualScrollViewport<T = unknown> {\r\n /** The full, unvirtualized data set. */\r\n readonly items = input<readonly T[]>([]);\r\n\r\n /** Minimum buffer (px) left before the render range is recomputed. */\r\n readonly minBufferPx = input(150);\r\n\r\n /** Extra buffer (px) rendered outside the visible area on each side. */\r\n readonly maxBufferPx = input(300);\r\n\r\n /** Advanced escape hatch: replace the built-in layout probe entirely. */\r\n readonly measureFn = input<NgxVirtualScrollMeasureFn | undefined>(undefined);\r\n\r\n /**\r\n * Safe ceiling (px) for the scrollable axis's real DOM size. Only relevant\r\n * for very large data sets — see `DEFAULT_MAX_AXIS_SIZE_PX`. You should\r\n * not need to change this; it's exposed only for advanced cases (e.g. you\r\n * know your app never targets older WebKit and want to raise the ceiling).\r\n */\r\n readonly maxAxisSizePx = input(DEFAULT_MAX_AXIS_SIZE_PX);\r\n\r\n /** Emits the index of the first fully-visible item as the user scrolls. */\r\n readonly scrolledIndexChange = output<number>();\r\n\r\n /** Emits whenever the rendered line range changes. */\r\n readonly rangeChange = output<NgxVirtualScrollRange>();\r\n\r\n private readonly scrollableRef = viewChild.required<ElementRef<HTMLElement>>('scrollable');\r\n private readonly wrapperRef = viewChild.required<ElementRef<HTMLElement>>('wrapper');\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private readonly measurement = signal<NgxVirtualScrollMeasurement | null>(null);\r\n private readonly scrollOffset = signal(0);\r\n private readonly viewportSize = signal(0);\r\n\r\n /** Whether the user is actively scrolling (used only to toggle `will-change`). */\r\n readonly isScrolling = signal(false);\r\n\r\n /** Currently rendered line range. */\r\n readonly range = signal<NgxVirtualScrollRange>({ start: 0, end: PROBE_COUNT });\r\n\r\n readonly axis = computed<NgxVirtualScrollAxis>(() => this.measurement()?.axis ?? 'vertical');\r\n readonly crossCount = computed(() => this.measurement()?.crossCount ?? 1);\r\n readonly lineSize = computed(() => this.measurement()?.lineSize ?? 0);\r\n readonly isMeasured = computed(() => this.measurement() !== null);\r\n\r\n readonly lineCount = computed(() => Math.ceil(this.items().length / this.crossCount()));\r\n\r\n /** Real, uncompressed total size along the scroll axis — can exceed the browser's element-size cap. */\r\n readonly naturalTotalSize = computed(() => this.lineCount() * this.lineSize());\r\n\r\n /**\r\n * Size actually applied to the spacer element, clamped to `maxAxisSizePx`.\r\n * Equal to `naturalTotalSize()` for any data set small enough to matter in\r\n * practice — the compression only ever engages for extreme list sizes.\r\n */\r\n readonly totalSize = computed(() => Math.min(this.naturalTotalSize(), this.maxAxisSizePx()));\r\n\r\n /**\r\n * Ratio between the (possibly capped) DOM scroll space and the real,\r\n * uncompressed content size. `1` unless `naturalTotalSize()` exceeds\r\n * `maxAxisSizePx()`, in which case it's `< 1` and the DOM scrollbar\r\n * represents the whole data set in a compressed coordinate space.\r\n */\r\n readonly scaleFactor = computed(() => {\r\n const natural = this.naturalTotalSize();\r\n return natural > 0 ? this.totalSize() / natural : 1;\r\n });\r\n\r\n /** Absolute index of the first item in `visibleItems()`, for display purposes. */\r\n readonly baseIndex = computed(() => this.range().start * this.crossCount());\r\n\r\n /** Slice of `items()` that should actually be rendered right now. */\r\n readonly visibleItems = computed<readonly T[]>(() => {\r\n const data = this.items();\r\n const { start, end } = this.range();\r\n const cross = this.crossCount();\r\n return data.slice(start * cross, Math.min(data.length, end * cross));\r\n });\r\n\r\n // Expressed in the same compressed DOM coordinate space as `scrollOffset`/\r\n // `totalSize`, so it always stays within the safe, capped range even for\r\n // enormous data sets — see `scaleFactor`.\r\n //\r\n // The naive `start * lineSize * scaleFactor` value is only an *ideal*\r\n // proportional position. It is clamped so the *real* (unscaled) rendered\r\n // block — `renderedBlockSize()` — can never be pushed past the end of the\r\n // capped spacer. Without this clamp, once `scaleFactor() < 1`, the block\r\n // rendered near the tail (real, unscaled size) no longer fits in the tiny\r\n // sliver of compressed space \"ideally\" left for it, so it gets positioned\r\n // partly (or entirely) past the bottom of the scrollable area — reachable\r\n // in the DOM, but never inside the visible/scrollable viewport. Clamping\r\n // guarantees the tail of the list is always flush with, and fully inside,\r\n // the scrollable area.\r\n private readonly renderedBlockSize = computed(() => {\r\n const { start, end } = this.range();\r\n return (end - start) * this.lineSize();\r\n });\r\n\r\n private readonly contentOffset = computed(() => {\r\n const ideal = this.range().start * this.lineSize() * this.scaleFactor();\r\n const max = Math.max(0, this.totalSize() - this.renderedBlockSize());\r\n return Math.min(ideal, max);\r\n });\r\n\r\n protected readonly wrapperTransform = computed(() =>\r\n this.axis() === 'horizontal'\r\n ? `translateX(${this.contentOffset()}px)`\r\n : `translateY(${this.contentOffset()}px)`,\r\n );\r\n protected readonly spacerWidth = computed(() =>\r\n this.axis() === 'horizontal' ? this.totalSize() : 1,\r\n );\r\n protected readonly spacerHeight = computed(() =>\r\n this.axis() === 'vertical' ? this.totalSize() : 1,\r\n );\r\n\r\n private resizeObserver?: ResizeObserver;\r\n private scrollingIdleTimer?: ReturnType<typeof setTimeout>;\r\n private scrollRaf = 0;\r\n\r\n constructor() {\r\n // Seed / reset the probe range whenever the data set changes and we\r\n // haven't measured a real layout yet.\r\n effect(() => {\r\n const length = this.items().length;\r\n if (!this.measurement()) {\r\n this.range.set({ start: 0, end: Math.min(length, PROBE_COUNT) });\r\n }\r\n });\r\n\r\n // Read the real, rendered layout of the probe batch once it has\r\n // painted. Runs in the `read` phase so it never interleaves with DOM\r\n // writes and never forces a layout thrash.\r\n afterRenderEffect({\r\n read: () => {\r\n if (this.measurement()) {\r\n return;\r\n }\r\n const children = Array.from(this.wrapperRef().nativeElement.children).slice(0, PROBE_COUNT);\r\n const measure = this.measureFn() ?? measureLayout;\r\n const result = measure(children);\r\n if (result) {\r\n this.measurement.set(result);\r\n }\r\n },\r\n });\r\n\r\n // Once measured (or when the buffer inputs change), recompute the\r\n // actual visible range from the real viewport size / scroll offset.\r\n // `untracked` is used because `recomputeRange` itself reads scroll/size\r\n // signals that are already kept in sync by the scroll/resize listeners\r\n // directly — we only want *this* effect to re-run for buffer/measurement\r\n // changes, not for every scroll frame.\r\n effect(() => {\r\n this.minBufferPx();\r\n this.maxBufferPx();\r\n const measured = this.isMeasured();\r\n untracked(() => {\r\n if (measured) {\r\n // The initial viewport-size read (in setupListeners) assumed the\r\n // default 'vertical' axis before layout was known; now that the\r\n // real axis is known, re-read clientWidth/clientHeight against it.\r\n this.measureViewportSize();\r\n this.recomputeRange(true);\r\n }\r\n });\r\n });\r\n\r\n afterNextRender(() => this.setupListeners());\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n cancelAnimationFrame(this.scrollRaf);\r\n clearTimeout(this.scrollingIdleTimer);\r\n });\r\n }\r\n\r\n /** Programmatically scroll to a given item index. */\r\n scrollToIndex(index: number, behavior: ScrollBehavior = 'auto'): void {\r\n const line = Math.floor(index / this.crossCount());\r\n this.scrollToOffset(line * this.lineSize(), behavior);\r\n }\r\n\r\n /**\r\n * Programmatically scroll to a given pixel offset along the scroll axis.\r\n * `offset` is expressed in real, uncompressed content px (i.e. the same\r\n * space as `index * lineSize()`) — internally converted to the\r\n * (possibly compressed) DOM scroll coordinate via `scaleFactor()`.\r\n */\r\n scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\r\n const el = this.scrollableRef().nativeElement;\r\n const domOffset = offset * this.scaleFactor();\r\n const options: ScrollToOptions =\r\n this.axis() === 'horizontal' ? { left: domOffset, behavior } : { top: domOffset, behavior };\r\n el.scrollTo(options);\r\n }\r\n\r\n /** Force a re-measure, e.g. after the container was resized by external layout logic. */\r\n checkViewportSize(): void {\r\n this.measureViewportSize();\r\n this.recomputeRange(true);\r\n }\r\n\r\n private setupListeners(): void {\r\n const el = this.scrollableRef().nativeElement;\r\n\r\n el.addEventListener('scroll', this.onScroll, { passive: true });\r\n this.destroyRef.onDestroy(() => el.removeEventListener('scroll', this.onScroll));\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver(() => this.checkViewportSize());\r\n this.resizeObserver.observe(el);\r\n }\r\n\r\n this.measureViewportSize();\r\n }\r\n\r\n private readonly onScroll = (): void => {\r\n if (this.scrollRaf) {\r\n return;\r\n }\r\n this.scrollRaf = requestAnimationFrame(() => {\r\n this.scrollRaf = 0;\r\n this.markScrolling();\r\n\r\n const el = this.scrollableRef().nativeElement;\r\n const offset = this.axis() === 'horizontal' ? el.scrollLeft : el.scrollTop;\r\n this.scrollOffset.set(offset);\r\n this.recomputeRange(false);\r\n\r\n const size = this.lineSize();\r\n if (size > 0) {\r\n const realOffset = offset / this.scaleFactor();\r\n this.scrolledIndexChange.emit(Math.floor(realOffset / size) * this.crossCount());\r\n }\r\n });\r\n };\r\n\r\n private markScrolling(): void {\r\n this.isScrolling.set(true);\r\n clearTimeout(this.scrollingIdleTimer);\r\n this.scrollingIdleTimer = setTimeout(() => this.isScrolling.set(false), 150);\r\n }\r\n\r\n private measureViewportSize(): void {\r\n const el = this.scrollableRef().nativeElement;\r\n const size = this.axis() === 'horizontal' ? el.clientWidth : el.clientHeight;\r\n this.viewportSize.set(size);\r\n }\r\n\r\n /**\r\n * Recomputes the rendered line range. Mirrors the CDK \"fixed size\"\r\n * strategy: only recompute once the scroll offset gets within\r\n * `minBufferPx` of the current range's edge, instead of on every pixel.\r\n *\r\n * All math here happens in *real* (uncompressed) content px, obtained by\r\n * dividing the raw DOM scroll offset/viewport size by `scaleFactor()`.\r\n * This is what makes the very last items reachable even when the total\r\n * content size has been compressed into a browser-safe DOM range: as\r\n * `domScrollOffset` sweeps its full (capped) range, `realOffset` still\r\n * sweeps the entire, real `naturalTotalSize()`.\r\n */\r\n private recomputeRange(force: boolean): void {\r\n const lineSize = this.lineSize();\r\n if (lineSize <= 0) {\r\n return;\r\n }\r\n\r\n const scale = this.scaleFactor();\r\n const realOffset = this.scrollOffset() / scale;\r\n const realViewportSize = this.viewportSize() / scale;\r\n\r\n const current = this.range();\r\n const min = this.minBufferPx();\r\n const max = this.maxBufferPx();\r\n\r\n const distanceToStart = realOffset - current.start * lineSize;\r\n const distanceToEnd = current.end * lineSize - (realOffset + realViewportSize);\r\n\r\n if (!force && distanceToStart >= min && distanceToEnd >= min) {\r\n return;\r\n }\r\n\r\n const bufferStart = Math.max(0, realOffset - max);\r\n const bufferEnd = realOffset + realViewportSize + max;\r\n\r\n const start = Math.max(0, Math.floor(bufferStart / lineSize));\r\n const end = Math.min(this.lineCount(), Math.ceil(bufferEnd / lineSize));\r\n const next: NgxVirtualScrollRange = { start, end };\r\n\r\n if (!rangesEqual(next, current)) {\r\n this.range.set(next);\r\n this.rangeChange.emit(next);\r\n }\r\n }\r\n}\r\n","<div #scrollable class=\"ngx-virtual-scroll-viewport__scrollable\">\r\n <div\r\n class=\"ngx-virtual-scroll-viewport__spacer\"\r\n [style.width.px]=\"spacerWidth()\"\r\n [style.height.px]=\"spacerHeight()\"\r\n aria-hidden=\"true\"></div>\r\n <div #wrapper class=\"ngx-virtual-scroll-viewport__wrapper\" [style.transform]=\"wrapperTransform()\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n","/*\n * Public API surface of @ngx-kit/virtual-scroll\n */\n\nexport * from './components/virtual-scroll-viewport.component';\nexport * from './utils/measure-layout';\n\nexport * from './types/virtual-scroll-range.interface';\nexport * from './types/virtual-scroll-measurement.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -567,48 +567,48 @@ class FlowDropIndicatorComponent {
567
567
  indicator = computed(() => this.dropPos.indicator(), /* @ts-ignore */
568
568
  ...(ngDevMode ? [{ debugName: "indicator" }] : /* istanbul ignore next */ []));
569
569
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FlowDropIndicatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
570
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: FlowDropIndicatorComponent, isStandalone: true, selector: "flow-drop-indicator", ngImport: i0, template: `
571
- @if (indicator().visible) {
572
- @if (indicator().highlightRect; as r) {
573
- <div class="flow-nest-highlight"
574
- [style.top.px]="r.top" [style.left.px]="r.left"
575
- [style.width.px]="r.width" [style.height.px]="r.height">
576
- </div>
577
- } @else if (indicator().orientation === 'h') {
578
- <div class="flow-indicator flow-indicator--h"
579
- [style.top.px]="indicator().y" [style.left.px]="indicator().x"
580
- [style.width.px]="indicator().length">
581
- </div>
582
- } @else if (indicator().orientation === 'v') {
583
- <div class="flow-indicator flow-indicator--v"
584
- [style.top.px]="indicator().y" [style.left.px]="indicator().x"
585
- [style.height.px]="indicator().length">
586
- </div>
587
- }
588
- }
570
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: FlowDropIndicatorComponent, isStandalone: true, selector: "flow-drop-indicator", ngImport: i0, template: `
571
+ @if (indicator().visible) {
572
+ @if (indicator().highlightRect; as r) {
573
+ <div class="flow-nest-highlight"
574
+ [style.top.px]="r.top" [style.left.px]="r.left"
575
+ [style.width.px]="r.width" [style.height.px]="r.height">
576
+ </div>
577
+ } @else if (indicator().orientation === 'h') {
578
+ <div class="flow-indicator flow-indicator--h"
579
+ [style.top.px]="indicator().y" [style.left.px]="indicator().x"
580
+ [style.width.px]="indicator().length">
581
+ </div>
582
+ } @else if (indicator().orientation === 'v') {
583
+ <div class="flow-indicator flow-indicator--v"
584
+ [style.top.px]="indicator().y" [style.left.px]="indicator().x"
585
+ [style.height.px]="indicator().length">
586
+ </div>
587
+ }
588
+ }
589
589
  `, isInline: true, styles: [":host{position:fixed;inset:0;pointer-events:none;z-index:9999}.flow-indicator{position:fixed;background:var(--flow-accent, #146ef5);border-radius:2px;pointer-events:none}.flow-indicator--h{height:3px;transform:translateY(-1.5px)}.flow-indicator--v{width:3px;transform:translate(-1.5px)}.flow-nest-highlight{position:fixed;border:2px solid var(--flow-accent, #146ef5);background:color-mix(in srgb,var(--flow-accent, #146ef5) 10%,transparent);border-radius:4px;pointer-events:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
590
590
  }
591
591
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FlowDropIndicatorComponent, decorators: [{
592
592
  type: Component,
593
- args: [{ selector: 'flow-drop-indicator', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
594
- @if (indicator().visible) {
595
- @if (indicator().highlightRect; as r) {
596
- <div class="flow-nest-highlight"
597
- [style.top.px]="r.top" [style.left.px]="r.left"
598
- [style.width.px]="r.width" [style.height.px]="r.height">
599
- </div>
600
- } @else if (indicator().orientation === 'h') {
601
- <div class="flow-indicator flow-indicator--h"
602
- [style.top.px]="indicator().y" [style.left.px]="indicator().x"
603
- [style.width.px]="indicator().length">
604
- </div>
605
- } @else if (indicator().orientation === 'v') {
606
- <div class="flow-indicator flow-indicator--v"
607
- [style.top.px]="indicator().y" [style.left.px]="indicator().x"
608
- [style.height.px]="indicator().length">
609
- </div>
610
- }
611
- }
593
+ args: [{ selector: 'flow-drop-indicator', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
594
+ @if (indicator().visible) {
595
+ @if (indicator().highlightRect; as r) {
596
+ <div class="flow-nest-highlight"
597
+ [style.top.px]="r.top" [style.left.px]="r.left"
598
+ [style.width.px]="r.width" [style.height.px]="r.height">
599
+ </div>
600
+ } @else if (indicator().orientation === 'h') {
601
+ <div class="flow-indicator flow-indicator--h"
602
+ [style.top.px]="indicator().y" [style.left.px]="indicator().x"
603
+ [style.width.px]="indicator().length">
604
+ </div>
605
+ } @else if (indicator().orientation === 'v') {
606
+ <div class="flow-indicator flow-indicator--v"
607
+ [style.top.px]="indicator().y" [style.left.px]="indicator().x"
608
+ [style.height.px]="indicator().length">
609
+ </div>
610
+ }
611
+ }
612
612
  `, styles: [":host{position:fixed;inset:0;pointer-events:none;z-index:9999}.flow-indicator{position:fixed;background:var(--flow-accent, #146ef5);border-radius:2px;pointer-events:none}.flow-indicator--h{height:3px;transform:translateY(-1.5px)}.flow-indicator--v{width:3px;transform:translate(-1.5px)}.flow-nest-highlight{position:fixed;border:2px solid var(--flow-accent, #146ef5);background:color-mix(in srgb,var(--flow-accent, #146ef5) 10%,transparent);border-radius:4px;pointer-events:none}\n"] }]
613
613
  }] });
614
614
 
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-webflow.mjs","sources":["../../../projects/libs/webflow/services/drag-drop.service.ts","../../../projects/libs/webflow/services/drop-position.service.ts","../../../projects/libs/webflow/directives/draggable.directive.ts","../../../projects/libs/webflow/directives/resizable.directive.ts","../../../projects/libs/webflow/directives/dropzone-container.directive.ts","../../../projects/libs/webflow/components/drop-indicator/drop-indicator.component.ts","../../../projects/libs/webflow/services/flow-tree.service.ts","../../../projects/libs/webflow/models/types.ts","../../../projects/libs/webflow/ngx-kit-webflow.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { DropResult } from '../models/types';\n\n/**\n * DragDropService\n * -------------------------------------------------------------\n * وضعیت سراسریِ «چه چیزی الان در حال درگ است» را نگه می‌دارد.\n * فقط signal، بدون هیچ Subject/Observable اضافه — سبک و قابل‌پیش‌بینی.\n */\n@Injectable({ providedIn: 'root' })\nexport class DragDropService {\n /** id آیتمی که هم‌اکنون درگ می‌شود، یا null */\n readonly activeId = signal<string | null>(null);\n\n /** آخرین نتیجهٔ محاسبه‌شدهٔ drop توسط DropPositionService */\n readonly pendingDrop = signal<DropResult | null>(null);\n\n startDrag(id: string): void {\n this.activeId.set(id);\n this.pendingDrop.set(null);\n }\n\n setPendingDrop(result: DropResult | null): void {\n this.pendingDrop.set(result);\n }\n\n endDrag(): DropResult | null {\n const result = this.pendingDrop();\n this.activeId.set(null);\n this.pendingDrop.set(null);\n return result;\n }\n\n get isDragging(): boolean {\n return this.activeId() !== null;\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { DropZone, IndicatorState, Rect } from '../models/types';\n\n/**\n * DropPositionService\n * -------------------------------------------------------------\n * قلب الگوریتمِ «دقیقاً مثل Webflow» اینجاست.\n *\n * نکتهٔ کلیدی پرفورمنسی: این سرویس هیچ‌وقت روی همهٔ آیتم‌های لیست حلقه نمی‌زند.\n * فقط با استفاده از event delegation (یک لیستنر روی کانتینر) و event.target\n * دقیقاً همان یک المنتی که ماوس رویش است پیدا می‌شود -> O(1) صرف‌نظر از\n * تعداد آیتم‌ها (چه ۱۰ تا باشند چه ۱۰,۰۰۰ تا).\n *\n * منطق تشخیص zone (همانی که Webflow استفاده می‌کند):\n * ۱. جهت چیدمان پدرِ آیتم هدف را می‌خوانیم (row یا column؛ از flex-direction\n * یا داده‌شده به‌صورت دستی).\n * ۲. موقعیت نسبی ماوس داخل rect آیتم هدف را به درصد تبدیل می‌کنیم.\n * ۳. اگر آیتم هدف خودش یک container (قابل‌نست) باشد و ماوس در «هستهٔ\n * مرکزی» rect باشد (مثلاً ۲۵٪ تا ۷۵٪ در هر دو محور) -> zone = inside.\n * ۴. در غیر این صورت، محور اصلیِ چیدمان (که هم‌ردیفی معنی می‌دهد) با\n * نوار نازک لبه (٪ آستانه) بررسی می‌شود:\n * - چیدمان row: نزدیک لبهٔ چپ/راست -> before/after (کنار هم)\n * نزدیک لبهٔ بالا/پایین -> above/below (ردیف جدید)\n * - چیدمان column: برعکسِ بالا\n */\n\nconst EDGE_THRESHOLD = 0.33; // ۳۳٪ نزدیک هر لبه => درج در همان محور\nconst NEST_CORE = 0.25; // فاصله از هر لبه برای اینکه «هسته» حساب شود\n\n@Injectable({ providedIn: 'root' })\nexport class DropPositionService {\n private readonly _indicator = signal<IndicatorState>({\n visible: false,\n orientation: null,\n x: 0,\n y: 0,\n length: 0,\n highlightRect: null,\n });\n\n /** استیت فقط‌خواندنیِ اندیکاتور برای بایند در تمپلیت */\n readonly indicator = computed(() => this._indicator());\n\n private lastTargetId: string | null = null;\n private lastZone: DropZone | null = null;\n\n /**\n * فراخوانی در هر pointermove حین درگ.\n * targetEl باید همان element.closest('[data-flow-id]') باشد که در\n * دایرکتیو کانتینر با event delegation پیدا شده — نه یک لوپ روی آیتم‌ها.\n */\n evaluate(params: {\n targetEl: HTMLElement;\n targetId: string;\n isContainer: boolean;\n parentAxis: 'row' | 'column';\n clientX: number;\n clientY: number;\n }): { targetId: string; zone: DropZone } {\n const { targetEl, targetId, isContainer, parentAxis, clientX, clientY } = params;\n const rect = targetEl.getBoundingClientRect();\n\n const rx = clamp((clientX - rect.left) / rect.width, 0, 1);\n const ry = clamp((clientY - rect.top) / rect.height, 0, 1);\n\n let zone: DropZone;\n\n const insideCore =\n isContainer &&\n rx > NEST_CORE && rx < 1 - NEST_CORE &&\n ry > NEST_CORE && ry < 1 - NEST_CORE;\n\n if (insideCore) {\n zone = 'inside';\n } else if (parentAxis === 'row') {\n if (rx < EDGE_THRESHOLD) zone = 'before';\n else if (rx > 1 - EDGE_THRESHOLD) zone = 'after';\n else zone = ry < 0.5 ? 'above' : 'below';\n } else {\n if (ry < EDGE_THRESHOLD) zone = 'above';\n else if (ry > 1 - EDGE_THRESHOLD) zone = 'below';\n else zone = rx < 0.5 ? 'before' : 'after';\n }\n\n this.lastTargetId = targetId;\n this.lastZone = zone;\n this.paintIndicator(rect, zone);\n\n return { targetId, zone };\n }\n\n /** رسم خط/کادر راهنما - فقط نوشتن به یک signal، بدون لمس بقیهٔ DOM */\n private paintIndicator(rect: DOMRect, zone: DropZone): void {\n const asRect: Rect = {\n top: rect.top, left: rect.left, width: rect.width, height: rect.height,\n right: rect.right, bottom: rect.bottom,\n };\n\n if (zone === 'inside') {\n this._indicator.set({\n visible: true,\n orientation: null,\n x: 0, y: 0, length: 0,\n highlightRect: asRect,\n });\n return;\n }\n\n if (zone === 'above' || zone === 'below') {\n this._indicator.set({\n visible: true,\n orientation: 'h',\n x: rect.left,\n y: zone === 'above' ? rect.top : rect.bottom,\n length: rect.width,\n highlightRect: null,\n });\n } else {\n this._indicator.set({\n visible: true,\n orientation: 'v',\n x: zone === 'before' ? rect.left : rect.right,\n y: rect.top,\n length: rect.height,\n highlightRect: null,\n });\n }\n }\n\n clear(): void {\n this.lastTargetId = null;\n this.lastZone = null;\n this._indicator.set({\n visible: false, orientation: null, x: 0, y: 0, length: 0, highlightRect: null,\n });\n }\n\n get current(): { targetId: string; zone: DropZone } | null {\n if (!this.lastTargetId || !this.lastZone) return null;\n return { targetId: this.lastTargetId, zone: this.lastZone };\n }\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n","import {\n Directive, ElementRef, EventEmitter, Input, Output,\n Renderer2, effect, inject, signal, NgZone, OnDestroy, HostBinding\n} from '@angular/core';\nimport { DragDropService } from '../services/drag-drop.service';\nimport { DropPositionService } from '../services/drop-position.service';\nimport { DragStartEvent, DragEndEvent, DropZone } from '../models/types';\n\n/**\n * ngxDraggable\n * -------------------------------------------------------------\n * تنها دایرکتیو مسئول درگ. کل منطق حرکت با CSS transform (translate3d)\n * روی خودِ عنصر درگ‌شونده انجام می‌شود — نه با جابجایی واقعی در DOM لیست.\n * جابجاییِ واقعیِ داده فقط یک‌بار، در لحظهٔ drop، از طریق خروجی\n * (flowDrop) اتفاق می‌افتد و آن‌وقت مصرف‌کننده (کامپوننت کانتینر) با\n * *ngFor + trackBy مدل را آپدیت می‌کند.\n *\n * دلیل مقیاس‌پذیری با هزاران آیتم:\n * - در حین pointermove هیچ آیتم دیگری لمس/محاسبه نمی‌شود.\n * - listener مربوط به تشخیص هدف روی کانتینر (event delegation) است،\n * نه روی تک‌تک آیتم‌ها (این بخش در ContainerDropzoneDirective است).\n * - آپدیت transform با requestAnimationFrame throttle می‌شود تا از\n * چندبار layout/paint در هر فریم جلوگیری شود.\n */\n@Directive({\n selector: '[ngxDraggable]',\n standalone: true,\n exportAs: 'ngxDraggable',\n})\nexport class DraggableDirective implements OnDestroy {\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement;\n private readonly renderer = inject(Renderer2);\n private readonly zone = inject(NgZone);\n private readonly dragDrop = inject(DragDropService);\n private readonly dropPos = inject(DropPositionService);\n\n /** شناسهٔ یکتای بلاک — برای شناسایی هنگام درگ لازم است */\n @Input({ required: true }) ngxDraggableId!: string;\n\n /** غیرفعال کردن موقت درگ (مثلاً حین ادیت متن داخل بلاک) */\n @Input() ngxDraggableDisabled = false;\n\n /** هندلِ اختصاصی؛ اگر ندهی، کل عنصر هندل می‌شود */\n @Input() ngxDragHandleSelector: string | null = null;\n\n @Output() flowDragStart = new EventEmitter<DragStartEvent>();\n @Output() flowDragEnd = new EventEmitter<DragEndEvent>();\n\n readonly dragging = signal(false);\n\n @HostBinding('class.ngx-dragging')\n get draggingClass() { return this.dragging(); }\n\n @HostBinding('style.touchAction')\n get touchAction() { return 'none'; }\n\n private startX = 0;\n private startY = 0;\n private originLeft = 0;\n private originTop = 0;\n private rafId: number | null = null;\n private pendingTransform: { x: number; y: number } | null = null;\n private cleanupFns: Array<() => void> = [];\n\n constructor() {\n this.zone.runOutsideAngular(() => {\n this.cleanupFns.push(\n this.renderer.listen(this.el, 'pointerdown', (e: PointerEvent) => this.onPointerDown(e))\n );\n });\n }\n\n private onPointerDown(e: PointerEvent): void {\n if (this.ngxDraggableDisabled) return;\n if (e.button !== 0) return;\n\n if (this.ngxDragHandleSelector) {\n const handle = this.el.querySelector(this.ngxDragHandleSelector);\n if (!handle || !handle.contains(e.target as Node)) return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const rect = this.el.getBoundingClientRect();\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.originLeft = rect.left;\n this.originTop = rect.top;\n\n this.el.setPointerCapture(e.pointerId);\n this.dragging.set(true);\n this.dragDrop.startDrag(this.ngxDraggableId);\n\n this.zone.run(() => {\n this.flowDragStart.emit({\n id: this.ngxDraggableId,\n pointerId: e.pointerId,\n originRect: {\n top: rect.top, left: rect.left, width: rect.width, height: rect.height,\n right: rect.right, bottom: rect.bottom,\n },\n });\n });\n\n this.renderer.addClass(this.el, 'ngx-drag-ghost');\n\n const move = (ev: PointerEvent) => this.onPointerMove(ev);\n const up = (ev: PointerEvent) => this.onPointerUp(ev, move, up);\n\n this.el.addEventListener('pointermove', move as EventListener);\n this.el.addEventListener('pointerup', up as EventListener);\n this.el.addEventListener('pointercancel', up as EventListener);\n }\n\n private onPointerMove(e: PointerEvent): void {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n this.pendingTransform = { x: dx, y: dy };\n\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n if (!this.pendingTransform) return;\n // تنها لمسِ DOM در کل چرخهٔ درگ: نوشتن transform روی خودِ عنصر.\n this.renderer.setStyle(\n this.el,\n 'transform',\n `translate3d(${this.pendingTransform.x}px, ${this.pendingTransform.y}px, 0)`\n );\n });\n }\n\n // نتیجهٔ zone فعلی (اگر کانتینر آن را محاسبه کرده) در سرویس در دسترس است.\n }\n\n private onPointerUp(e: PointerEvent, move: (ev: PointerEvent) => void, up: (ev: PointerEvent) => void): void {\n this.el.removeEventListener('pointermove', move as EventListener);\n this.el.removeEventListener('pointerup', up as EventListener);\n this.el.removeEventListener('pointercancel', up as EventListener);\n\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n this.renderer.removeStyle(this.el, 'transform');\n this.renderer.removeClass(this.el, 'ngx-drag-ghost');\n this.dragging.set(false);\n\n const result = this.dragDrop.endDrag();\n this.dropPos.clear();\n\n this.zone.run(() => {\n this.flowDragEnd.emit({ id: this.ngxDraggableId, drop: result });\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupFns.forEach((fn) => fn());\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n }\n}\n","import {\n Directive, ElementRef, EventEmitter, Input, Output,\n Renderer2, inject, NgZone, OnDestroy, signal\n} from '@angular/core';\nimport { ResizeHandlePosition, ResizeMoveEvent } from '../models/types';\n\n/**\n * ngxResizable\n * -------------------------------------------------------------\n * تنها دایرکتیو مسئول ریسایز. مستقل از DraggableDirective.\n * روی عنصر اصلی قرار می‌گیرد و به همراه ۸ هندل (که خودت در تمپلیت با\n * class مشخص می‌کنی، مثلاً <span class=\"rz-handle\" data-handle=\"se\">)\n * کار می‌کند.\n *\n * فقط CSS width/height/left/top آپدیت می‌شود (از طریق خروجی flowResize)\n * و مصرف‌کننده تصمیم می‌گیرد این مقادیر را چطور به مدل/استایل بایند کند —\n * دایرکتیو خودش مستقیماً مدل داده را تغییر نمی‌دهد.\n */\n@Directive({\n selector: '[ngxResizable]',\n standalone: true,\n exportAs: 'ngxResizable',\n})\nexport class ResizableDirective implements OnDestroy {\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement;\n private readonly renderer = inject(Renderer2);\n private readonly zone = inject(NgZone);\n\n @Input({ required: true }) ngxResizableId!: string;\n @Input() ngxResizableMinWidth = 24;\n @Input() ngxResizableMinHeight = 24;\n @Input() ngxResizableDisabled = false;\n\n /** انتخاب‌گر هندل‌ها؛ باید attribute یا data-handle داشته باشند */\n @Input() ngxResizeHandleSelector = '[data-handle]';\n\n @Output() flowResizeStart = new EventEmitter<{ id: string; handle: ResizeHandlePosition }>();\n @Output() flowResizeMove = new EventEmitter<ResizeMoveEvent>();\n @Output() flowResizeEnd = new EventEmitter<ResizeMoveEvent>();\n\n readonly resizing = signal(false);\n\n private startX = 0;\n private startY = 0;\n private startW = 0;\n private startH = 0;\n private handle: ResizeHandlePosition = 'se';\n private rafId: number | null = null;\n private pending: { w: number; h: number; ox: number; oy: number } | null = null;\n private unlisten: (() => void) | null = null;\n\n constructor() {\n this.zone.runOutsideAngular(() => {\n this.unlisten = this.renderer.listen(this.el, 'pointerdown', (e: PointerEvent) => this.onDown(e));\n });\n }\n\n private onDown(e: PointerEvent): void {\n if (this.ngxResizableDisabled) return;\n const handleEl = (e.target as HTMLElement)?.closest<HTMLElement>(this.ngxResizeHandleSelector);\n if (!handleEl || !this.el.contains(handleEl)) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n this.handle = (handleEl.getAttribute('data-handle') as ResizeHandlePosition) || 'se';\n const rect = this.el.getBoundingClientRect();\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.startW = rect.width;\n this.startH = rect.height;\n\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n this.resizing.set(true);\n this.zone.run(() => this.flowResizeStart.emit({ id: this.ngxResizableId, handle: this.handle }));\n\n const move = (ev: PointerEvent) => this.onMove(ev);\n const up = (ev: PointerEvent) => this.onUp(ev, move, up);\n handleEl.addEventListener('pointermove', move as EventListener);\n handleEl.addEventListener('pointerup', up as EventListener);\n handleEl.addEventListener('pointercancel', up as EventListener);\n }\n\n private onMove(e: PointerEvent): void {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n const h = this.handle;\n\n let w = this.startW;\n let ht = this.startH;\n let ox = 0, oy = 0;\n\n if (h.includes('e')) w = this.startW + dx;\n if (h.includes('w')) { w = this.startW - dx; ox = dx; }\n if (h.includes('s')) ht = this.startH + dy;\n if (h.includes('n')) { ht = this.startH - dy; oy = dy; }\n\n w = Math.max(this.ngxResizableMinWidth, w);\n ht = Math.max(this.ngxResizableMinHeight, ht);\n\n this.pending = { w, h: ht, ox, oy };\n\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => {\n this.rafId = null;\n if (!this.pending) return;\n this.zone.run(() => {\n this.flowResizeMove.emit({\n id: this.ngxResizableId, handle: this.handle,\n width: this.pending!.w, height: this.pending!.h,\n offsetX: this.pending!.ox, offsetY: this.pending!.oy,\n });\n });\n });\n }\n }\n\n private onUp(e: PointerEvent, move: (ev: PointerEvent) => void, up: (ev: PointerEvent) => void): void {\n const handleEl = e.target as HTMLElement;\n handleEl.removeEventListener('pointermove', move as EventListener);\n handleEl.removeEventListener('pointerup', up as EventListener);\n handleEl.removeEventListener('pointercancel', up as EventListener);\n\n if (this.rafId !== null) { cancelAnimationFrame(this.rafId); this.rafId = null; }\n this.resizing.set(false);\n\n if (this.pending) {\n this.zone.run(() => {\n this.flowResizeEnd.emit({\n id: this.ngxResizableId, handle: this.handle,\n width: this.pending!.w, height: this.pending!.h,\n offsetX: this.pending!.ox, offsetY: this.pending!.oy,\n });\n });\n }\n this.pending = null;\n }\n\n ngOnDestroy(): void {\n this.unlisten?.();\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n }\n}\n","import {\n Directive, ElementRef, Input, NgZone, OnDestroy, OnInit, Renderer2, inject\n} from '@angular/core';\nimport { DragDropService } from '../services/drag-drop.service';\nimport { DropPositionService } from '../services/drop-position.service';\nimport { FlowAxis } from '../models/types';\n\n/**\n * ngxDropzoneContainer\n * -------------------------------------------------------------\n * روی هر کانتینری که فرزندانش قابل‌درگ‌اند‌دراپ هستند قرار می‌گیرد\n * (چه ریشهٔ صفحه، چه یک بلاک تو‌در‌تو).\n *\n * فقط یک pointermove-listener سراسری (روی document، حین یک درگ فعال)\n * دارد و با event.target.closest('[data-flow-id]') هدف را پیدا می‌کند.\n * این یعنی صرف‌نظر از اینکه چند هزار فرزند وجود دارد، هزینهٔ هر حرکتِ\n * ماوس ثابت (O(1)) است — نه O(n).\n *\n * هر فرزند مستقیمِ قابل‌درگ باید attribute زیر را داشته باشد\n * (به‌صورت خودکار توسط DraggableDirective/تمپلیت ست می‌شود):\n * [attr.data-flow-id]=\"item.id\"\n * [attr.data-flow-container]=\"isContainer ? '' : null\"\n */\n@Directive({\n selector: '[ngxDropzoneContainer]',\n standalone: true,\n exportAs: 'ngxDropzoneContainer',\n})\nexport class DropzoneContainerDirective implements OnInit, OnDestroy {\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement;\n private readonly zone = inject(NgZone);\n private readonly renderer = inject(Renderer2);\n private readonly dragDrop = inject(DragDropService);\n private readonly dropPos = inject(DropPositionService);\n\n /** جهت چیدمان فرزندان مستقیم این کانتینر */\n @Input() ngxDropzoneAxis: FlowAxis = 'row';\n\n /** آیا خودِ این کانتینر می‌تواند میزبان nest شدن باشد */\n @Input() ngxDropzoneNestable = true;\n\n private unlistenMove: (() => void) | null = null;\n private unlistenLeave: (() => void) | null = null;\n\n ngOnInit(): void {\n this.zone.runOutsideAngular(() => {\n this.unlistenMove = this.renderer.listen(this.el, 'pointermove', (e: PointerEvent) => {\n if (!this.dragDrop.isDragging) return;\n this.handleMove(e);\n });\n });\n }\n\n private handleMove(e: PointerEvent): void {\n const targetEl = (e.target as HTMLElement)?.closest<HTMLElement>('[data-flow-id]');\n if (!targetEl || !this.el.contains(targetEl) || targetEl === this.el) return;\n\n const targetId = targetEl.getAttribute('data-flow-id');\n const activeId = this.dragDrop.activeId();\n if (!targetId || targetId === activeId) return; // نمی‌توان روی خودش دراپ کرد\n\n const isContainer = this.ngxDropzoneNestable && targetEl.hasAttribute('data-flow-container');\n\n const result = this.dropPos.evaluate({\n targetEl,\n targetId,\n isContainer,\n parentAxis: this.ngxDropzoneAxis,\n clientX: e.clientX,\n clientY: e.clientY,\n });\n\n this.dragDrop.setPendingDrop(result);\n }\n\n ngOnDestroy(): void {\n this.unlistenMove?.();\n this.unlistenLeave?.();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { DropPositionService } from '../../services/drop-position.service';\n\n/**\n * FlowDropIndicatorComponent\n * -------------------------------------------------------------\n * یک‌بار در ریشهٔ صفحه‌ساز قرار می‌گیرد (position: fixed).\n * تنها المنتی است که در طول درگ مدام آپدیت می‌شود؛ بقیهٔ آیتم‌های\n * لیست دست‌نخورده باقی می‌مانند. کاملاً با computed از signal سرویس\n * تغذیه می‌شود، بدون هیچ منطق اضافه در کامپوننت.\n */\n@Component({\n selector: 'flow-drop-indicator',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (indicator().visible) {\n @if (indicator().highlightRect; as r) {\n <div class=\"flow-nest-highlight\"\n [style.top.px]=\"r.top\" [style.left.px]=\"r.left\"\n [style.width.px]=\"r.width\" [style.height.px]=\"r.height\">\n </div>\n } @else if (indicator().orientation === 'h') {\n <div class=\"flow-indicator flow-indicator--h\"\n [style.top.px]=\"indicator().y\" [style.left.px]=\"indicator().x\"\n [style.width.px]=\"indicator().length\">\n </div>\n } @else if (indicator().orientation === 'v') {\n <div class=\"flow-indicator flow-indicator--v\"\n [style.top.px]=\"indicator().y\" [style.left.px]=\"indicator().x\"\n [style.height.px]=\"indicator().length\">\n </div>\n }\n }\n `,\n styles: [`\n :host { position: fixed; inset: 0; pointer-events: none; z-index: 9999; }\n .flow-indicator {\n position: fixed;\n background: var(--flow-accent, #146ef5);\n border-radius: 2px;\n pointer-events: none;\n }\n .flow-indicator--h { height: 3px; transform: translateY(-1.5px); }\n .flow-indicator--v { width: 3px; transform: translateX(-1.5px); }\n .flow-nest-highlight {\n position: fixed;\n border: 2px solid var(--flow-accent, #146ef5);\n background: color-mix(in srgb, var(--flow-accent, #146ef5) 10%, transparent);\n border-radius: 4px;\n pointer-events: none;\n }\n `],\n})\nexport class FlowDropIndicatorComponent {\n private readonly dropPos = inject(DropPositionService);\n readonly indicator = computed(() => this.dropPos.indicator());\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { DropResult } from '../models/types';\n\nexport interface FlowNode {\n id: string;\n type: string;\n axis: 'row' | 'column';\n isContainer: boolean;\n props?: Record<string, unknown>;\n children: FlowNode[];\n}\n\n/**\n * FlowTreeService\n * -------------------------------------------------------------\n * مدل درختیِ صفحه (دقیقاً همان چیزی که Webflow \"Element Panel\" اسمش\n * می‌گذارد). تغییر مدل فقط در لحظهٔ drop رخ می‌دهد (نه در هر\n * pointermove) — به همین دلیل حتی با هزاران بلاک، re-render فقط\n * یک‌بار در پایان درگ اتفاق می‌افتد.\n *\n * پیاده‌سازی immutable-ish: فقط مسیر تغییر‌یافته کپی می‌شود، نه کل\n * درخت (structural sharing) تا با درخت‌های بزرگ هم CPU/GC اذیت نشود.\n */\n@Injectable({ providedIn: 'root' })\nexport class FlowTreeService {\n private readonly _root = signal<FlowNode>({\n id: 'root', type: 'root', axis: 'column', isContainer: true, children: [],\n });\n\n readonly root = computed(() => this._root());\n\n setRoot(node: FlowNode): void {\n this._root.set(node);\n }\n\n applyDrop(draggedId: string, drop: DropResult): void {\n const currentRoot = this._root();\n const dragged = findAndRemove(currentRoot, draggedId);\n if (!dragged.node) return;\n\n const afterRemoval = dragged.tree;\n const inserted = insertRelativeTo(afterRemoval, drop.targetId, drop.zone, dragged.node);\n if (inserted) this._root.set(inserted);\n }\n}\n\nfunction findAndRemove(node: FlowNode, id: string): { tree: FlowNode; node: FlowNode | null } {\n let removed: FlowNode | null = null;\n const idx = node.children.findIndex((c) => c.id === id);\n\n if (idx !== -1) {\n removed = node.children[idx];\n const children = [...node.children.slice(0, idx), ...node.children.slice(idx + 1)];\n return { tree: { ...node, children }, node: removed };\n }\n\n let changed = false;\n const newChildren = node.children.map((c) => {\n if (removed) return c;\n const res = findAndRemove(c, id);\n if (res.node) { removed = res.node; changed = true; return res.tree; }\n return c;\n });\n\n return { tree: changed ? { ...node, children: newChildren } : node, node: removed };\n}\n\nfunction insertRelativeTo(\n node: FlowNode, targetId: string, zone: DropResult['zone'], toInsert: FlowNode\n): FlowNode | null {\n const idx = node.children.findIndex((c) => c.id === targetId);\n\n if (idx !== -1) {\n if (zone === 'inside') {\n const target = node.children[idx];\n const updatedTarget = { ...target, children: [...target.children, toInsert] };\n const children = [...node.children];\n children[idx] = updatedTarget;\n return { ...node, children };\n }\n const insertAt = zone === 'before' || zone === 'above' ? idx : idx + 1;\n const children = [...node.children.slice(0, insertAt), toInsert, ...node.children.slice(insertAt)];\n return { ...node, children };\n }\n\n for (let i = 0; i < node.children.length; i++) {\n const res = insertRelativeTo(node.children[i], targetId, zone, toInsert);\n if (res) {\n const children = [...node.children];\n children[i] = res;\n return { ...node, children };\n }\n }\n return null;\n}\n","/**\n * ngx-flowbuilder — مدل‌های پایه\n */\n\nexport type FlowAxis = 'row' | 'column';\n\n/** موقعیت درج نسبت به آیتمی که ماوس روی آن است */\nexport type DropZone =\n | 'before' // قبل از آیتم، در همان محور چیدمان (مثلاً چپِ آیتم اگر ردیف است)\n | 'after' // بعد از آیتم، در همان محور چیدمان\n | 'above' // بالای آیتم؛ یعنی ایجاد ردیف/خط جدید قبل از آن\n | 'below' // پایین آیتم؛ ایجاد ردیف/خط جدید بعد از آن\n | 'inside'; // نِست‌شدن به‌عنوان فرزند (وقتی آیتم هدف یک container باشد)\n\nexport interface DropResult {\n targetId: string;\n zone: DropZone;\n}\n\nexport interface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n right: number;\n bottom: number;\n}\n\nexport interface IndicatorState {\n visible: boolean;\n /** خط باریک: 'h' یعنی خط افقی (جدا کردن ردیف‌ها)، 'v' یعنی خط عمودی (جدا کردن کنار هم) */\n orientation: 'h' | 'v' | null;\n x: number;\n y: number;\n length: number;\n /** حالت nest: به‌جای خط، یک کادر دور کل container هایلایت می‌شود */\n highlightRect: Rect | null;\n}\n\nexport interface DragStartEvent {\n id: string;\n pointerId: number;\n originRect: Rect;\n}\n\nexport interface DragMoveEvent {\n id: string;\n clientX: number;\n clientY: number;\n deltaX: number;\n deltaY: number;\n}\n\nexport interface DragEndEvent {\n id: string;\n drop: DropResult | null;\n}\n\nexport type ResizeHandlePosition =\n | 'n' | 's' | 'e' | 'w'\n | 'ne' | 'nw' | 'se' | 'sw';\n\nexport interface ResizeMoveEvent {\n id: string;\n handle: ResizeHandlePosition;\n width: number;\n height: number;\n /** فقط برای هندل‌های شمال/غرب که مبدأ عنصر هم جابجا می‌شود */\n offsetX: number;\n offsetY: number;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAGA;;;;;AAKG;MAEU,eAAe,CAAA;;IAEjB,QAAQ,GAAG,MAAM,CAAgB,IAAI;iFAAC;;IAGtC,WAAW,GAAG,MAAM,CAAoB,IAAI;oFAAC;AAEtD,IAAA,SAAS,CAAC,EAAU,EAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,cAAc,CAAC,MAAyB,EAAA;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9B;IAEA,OAAO,GAAA;AACL,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI;IACjC;uGAzBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACNlC;;;;;;;;;;;;;;;;;;;;;AAqBG;AAEH,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,SAAS,GAAG,IAAI,CAAC;MAGV,mBAAmB,CAAA;IACb,UAAU,GAAG,MAAM,CAAiB;AACnD,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,aAAa,EAAE,IAAI;AACpB,KAAA;mFAAC;;IAGO,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE;kFAAC;IAE9C,YAAY,GAAkB,IAAI;IAClC,QAAQ,GAAoB,IAAI;AAExC;;;;AAIG;AACH,IAAA,QAAQ,CAAC,MAOR,EAAA;AACC,QAAA,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM;AAChF,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE;QAE7C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAE1D,QAAA,IAAI,IAAc;QAElB,MAAM,UAAU,GACd,WAAW;AACX,YAAA,EAAE,GAAG,SAAS,IAAI,EAAE,GAAG,CAAC,GAAG,SAAS;YACpC,EAAE,GAAG,SAAS,IAAI,EAAE,GAAG,CAAC,GAAG,SAAS;QAEtC,IAAI,UAAU,EAAE;YACd,IAAI,GAAG,QAAQ;QACjB;AAAO,aAAA,IAAI,UAAU,KAAK,KAAK,EAAE;YAC/B,IAAI,EAAE,GAAG,cAAc;gBAAE,IAAI,GAAG,QAAQ;AACnC,iBAAA,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc;gBAAE,IAAI,GAAG,OAAO;;AAC3C,gBAAA,IAAI,GAAG,EAAE,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO;QAC1C;aAAO;YACL,IAAI,EAAE,GAAG,cAAc;gBAAE,IAAI,GAAG,OAAO;AAClC,iBAAA,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc;gBAAE,IAAI,GAAG,OAAO;;AAC3C,gBAAA,IAAI,GAAG,EAAE,GAAG,GAAG,GAAG,QAAQ,GAAG,OAAO;QAC3C;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;AAE/B,QAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3B;;IAGQ,cAAc,CAAC,IAAa,EAAE,IAAc,EAAA;AAClD,QAAA,MAAM,MAAM,GAAS;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;YACtE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;SACvC;AAED,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAClB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,WAAW,EAAE,IAAI;gBACjB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AACrB,gBAAA,aAAa,EAAE,MAAM;AACtB,aAAA,CAAC;YACF;QACF;QAEA,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAClB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,WAAW,EAAE,GAAG;gBAChB,CAAC,EAAE,IAAI,CAAC,IAAI;AACZ,gBAAA,CAAC,EAAE,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM;gBAC5C,MAAM,EAAE,IAAI,CAAC,KAAK;AAClB,gBAAA,aAAa,EAAE,IAAI;AACpB,aAAA,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAClB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,WAAW,EAAE,GAAG;AAChB,gBAAA,CAAC,EAAE,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK;gBAC7C,CAAC,EAAE,IAAI,CAAC,GAAG;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,gBAAA,aAAa,EAAE,IAAI;AACpB,aAAA,CAAC;QACJ;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAClB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI;AAC9E,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AACrD,QAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IAC7D;uGA9GW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAkHlC,SAAS,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW,EAAA;AAChD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACxC;;ACzIA;;;;;;;;;;;;;;;AAeG;MAMU,kBAAkB,CAAA;IACZ,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC,CAAC,aAAa;AAClD,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;AAClC,IAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAG3B,IAAA,cAAc;;IAGhC,oBAAoB,GAAG,KAAK;;IAG5B,qBAAqB,GAAkB,IAAI;AAE1C,IAAA,aAAa,GAAG,IAAI,YAAY,EAAkB;AAClD,IAAA,WAAW,GAAG,IAAI,YAAY,EAAgB;IAE/C,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IAEjC,IACI,aAAa,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE9C,IAAA,IACI,WAAW,GAAA,EAAK,OAAO,MAAM,CAAC,CAAC;IAE3B,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,UAAU,GAAG,CAAC;IACd,SAAS,GAAG,CAAC;IACb,KAAK,GAAkB,IAAI;IAC3B,gBAAgB,GAAoC,IAAI;IACxD,UAAU,GAAsB,EAAE;AAE1C,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAe,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACzF;AACH,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,aAAa,CAAC,CAAe,EAAA;QACnC,IAAI,IAAI,CAAC,oBAAoB;YAAE;AAC/B,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE;AAEpB,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;YAChE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC;gBAAE;QACrD;QAEA,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;QAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,qBAAqB,EAAE;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AACvB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;QAEzB,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;AAE5C,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,cAAc;gBACvB,SAAS,EAAE,CAAC,CAAC,SAAS;AACtB,gBAAA,UAAU,EAAE;oBACV,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;oBACtE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;AACvC,iBAAA;AACF,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC;AAEjD,QAAA,MAAM,IAAI,GAAG,CAAC,EAAgB,KAAK,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AACzD,QAAA,MAAM,EAAE,GAAG,CAAC,EAAgB,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;QAE/D,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAqB,CAAC;QAC9D,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAmB,CAAC;QAC1D,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,EAAmB,CAAC;IAChE;AAEQ,IAAA,aAAa,CAAC,CAAe,EAAA;QACnC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAClC,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAExC,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,MAAK;AACtC,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI;gBACjB,IAAI,CAAC,IAAI,CAAC,gBAAgB;oBAAE;;gBAE5B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,EAAE,EACP,WAAW,EACX,CAAA,YAAA,EAAe,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAA,MAAA,CAAQ,CAC7E;AACH,YAAA,CAAC,CAAC;QACJ;;IAGF;AAEQ,IAAA,WAAW,CAAC,CAAe,EAAE,IAAgC,EAAE,EAA8B,EAAA;QACnG,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAqB,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAmB,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAmB,CAAC;AAEjE,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AACvB,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACnB;QAEA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC;AACpD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAExB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACtC,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAEpB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClE,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACrC,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3D;uGApIW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,cAAc;AACzB,iBAAA;;sBASE,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAGxB;;sBAGA;;sBAEA;;sBACA;;sBAIA,WAAW;uBAAC,oBAAoB;;sBAGhC,WAAW;uBAAC,mBAAmB;;;AC/ClC;;;;;;;;;;;AAWG;MAMU,kBAAkB,CAAA;IACZ,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC,CAAC,aAAa;AAClD,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AAEX,IAAA,cAAc;IAChC,oBAAoB,GAAG,EAAE;IACzB,qBAAqB,GAAG,EAAE;IAC1B,oBAAoB,GAAG,KAAK;;IAG5B,uBAAuB,GAAG,eAAe;AAExC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAgD;AAClF,IAAA,cAAc,GAAG,IAAI,YAAY,EAAmB;AACpD,IAAA,aAAa,GAAG,IAAI,YAAY,EAAmB;IAEpD,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IAEzB,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,MAAM,GAAyB,IAAI;IACnC,KAAK,GAAkB,IAAI;IAC3B,OAAO,GAA4D,IAAI;IACvE,QAAQ,GAAwB,IAAI;AAE5C,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAe,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnG,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,MAAM,CAAC,CAAe,EAAA;QAC5B,IAAI,IAAI,CAAC,oBAAoB;YAAE;AAC/B,QAAA,MAAM,QAAQ,GAAI,CAAC,CAAC,MAAsB,EAAE,OAAO,CAAc,IAAI,CAAC,uBAAuB,CAAC;QAC9F,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE;QAE9C,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;QAEnB,IAAI,CAAC,MAAM,GAAI,QAAQ,CAAC,YAAY,CAAC,aAAa,CAA0B,IAAI,IAAI;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,qBAAqB,EAAE;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AACvB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AACvB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAExB,CAAC,CAAC,MAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAEhG,QAAA,MAAM,IAAI,GAAG,CAAC,EAAgB,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAClD,QAAA,MAAM,EAAE,GAAG,CAAC,EAAgB,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;AACxD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAqB,CAAC;AAC/D,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAmB,CAAC;AAC3D,QAAA,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,EAAmB,CAAC;IACjE;AAEQ,IAAA,MAAM,CAAC,CAAe,EAAA;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAClC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM;AAErB,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;AACnB,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM;AACpB,QAAA,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;AAElB,QAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE;AACzC,QAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAAE,YAAA,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE,EAAE,GAAG,EAAE;QAAE;AACtD,QAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE;AAC1C,QAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAAE,YAAA,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE,EAAE,GAAG,EAAE;QAAE;QAEvD,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAC1C,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;AAE7C,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAEnC,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,MAAK;AACtC,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI;gBACjB,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE;AACnB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACvB,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;AAC5C,wBAAA,KAAK,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAC;AAC/C,wBAAA,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,EAAE;AACrD,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;IACF;AAEQ,IAAA,IAAI,CAAC,CAAe,EAAE,IAAgC,EAAE,EAA8B,EAAA;AAC5F,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAqB;AACxC,QAAA,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAqB,CAAC;AAClE,QAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAmB,CAAC;AAC9D,QAAA,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAmB,CAAC;AAElE,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QAAE;AAChF,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAExB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oBACtB,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;AAC5C,oBAAA,KAAK,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAC;AAC/C,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,EAAE;AACrD,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;IACrB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,IAAI;AACjB,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3D;uGAtHW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,cAAc;AACzB,iBAAA;;sBAME,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBACA;;sBAGA;;sBAEA;;sBACA;;sBACA;;;AC/BH;;;;;;;;;;;;;;;AAeG;MAMU,0BAA0B,CAAA;IACpB,EAAE,GAAG,MAAM,EAAC,UAAuB,EAAC,CAAC,aAAa;AAClD,IAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;AAClC,IAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;;IAG7C,eAAe,GAAa,KAAK;;IAGjC,mBAAmB,GAAG,IAAI;IAE3B,YAAY,GAAwB,IAAI;IACxC,aAAa,GAAwB,IAAI;IAEjD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAe,KAAI;AACnF,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU;oBAAE;AAC/B,gBAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,CAAe,EAAA;QAChC,MAAM,QAAQ,GAAI,CAAC,CAAC,MAAsB,EAAE,OAAO,CAAc,gBAAgB,CAAC;AAClF,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI,CAAC,EAAE;YAAE;QAEtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;AACzC,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO;AAE/C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,IAAI,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC;AAE5F,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnC,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,eAAe;YAChC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;AACnB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;IACtC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,IAAI;AACrB,QAAA,IAAI,CAAC,aAAa,IAAI;IACxB;uGAlDW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;sBASE;;sBAGA;;;ACpCH;;;;;;;AAOG;MA4CU,0BAA0B,CAAA;AACpB,IAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAC7C,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;kFAAC;uGAFlD,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvC3B;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,meAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAoBU,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBA3CtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,meAAA,CAAA,EAAA;;;ACtBH;;;;;;;;;;AAUG;MAEU,eAAe,CAAA;IACT,KAAK,GAAG,MAAM,CAAW;AACxC,QAAA,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;AAC1E,KAAA;8EAAC;IAEO,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;6EAAC;AAE5C,IAAA,OAAO,CAAC,IAAc,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;IAEA,SAAS,CAAC,SAAiB,EAAE,IAAgB,EAAA;AAC3C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE;QAChC,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE;AAEnB,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI;AACjC,QAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;AACvF,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IACxC;uGAnBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAuBlC,SAAS,aAAa,CAAC,IAAc,EAAE,EAAU,EAAA;IAC/C,IAAI,OAAO,GAAoB,IAAI;AACnC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAEvD,IAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;AACd,QAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClF,QAAA,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;IACvD;IAEA,IAAI,OAAO,GAAG,KAAK;IACnB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AAC1C,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,CAAC;QACrB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC;AAChC,QAAA,IAAI,GAAG,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,GAAG,GAAG,CAAC,IAAI;YAAE,OAAO,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,IAAI;QAAE;AACrE,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;AACrF;AAEA,SAAS,gBAAgB,CACvB,IAAc,EAAE,QAAgB,EAAE,IAAwB,EAAE,QAAkB,EAAA;AAE9E,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;AAE7D,IAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;AACd,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AACjC,YAAA,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;YAC7E,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AACnC,YAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa;AAC7B,YAAA,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE;QAC9B;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACtE,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAClG,QAAA,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE;IAC9B;AAEA,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC7C,QAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC;QACxE,IAAI,GAAG,EAAE;YACP,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;AACnC,YAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG;AACjB,YAAA,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE;QAC9B;IACF;AACA,IAAA,OAAO,IAAI;AACb;;AC9FA;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-kit-webflow.mjs","sources":["../../../projects/libs/webflow/services/drag-drop.service.ts","../../../projects/libs/webflow/services/drop-position.service.ts","../../../projects/libs/webflow/directives/draggable.directive.ts","../../../projects/libs/webflow/directives/resizable.directive.ts","../../../projects/libs/webflow/directives/dropzone-container.directive.ts","../../../projects/libs/webflow/components/drop-indicator/drop-indicator.component.ts","../../../projects/libs/webflow/services/flow-tree.service.ts","../../../projects/libs/webflow/models/types.ts","../../../projects/libs/webflow/ngx-kit-webflow.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\nimport { DropResult } from '../models/types';\r\n\r\n/**\r\n * DragDropService\r\n * -------------------------------------------------------------\r\n * وضعیت سراسریِ «چه چیزی الان در حال درگ است» را نگه می‌دارد.\r\n * فقط signal، بدون هیچ Subject/Observable اضافه — سبک و قابل‌پیش‌بینی.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class DragDropService {\r\n /** id آیتمی که هم‌اکنون درگ می‌شود، یا null */\r\n readonly activeId = signal<string | null>(null);\r\n\r\n /** آخرین نتیجهٔ محاسبه‌شدهٔ drop توسط DropPositionService */\r\n readonly pendingDrop = signal<DropResult | null>(null);\r\n\r\n startDrag(id: string): void {\r\n this.activeId.set(id);\r\n this.pendingDrop.set(null);\r\n }\r\n\r\n setPendingDrop(result: DropResult | null): void {\r\n this.pendingDrop.set(result);\r\n }\r\n\r\n endDrag(): DropResult | null {\r\n const result = this.pendingDrop();\r\n this.activeId.set(null);\r\n this.pendingDrop.set(null);\r\n return result;\r\n }\r\n\r\n get isDragging(): boolean {\r\n return this.activeId() !== null;\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { DropZone, IndicatorState, Rect } from '../models/types';\r\n\r\n/**\r\n * DropPositionService\r\n * -------------------------------------------------------------\r\n * قلب الگوریتمِ «دقیقاً مثل Webflow» اینجاست.\r\n *\r\n * نکتهٔ کلیدی پرفورمنسی: این سرویس هیچ‌وقت روی همهٔ آیتم‌های لیست حلقه نمی‌زند.\r\n * فقط با استفاده از event delegation (یک لیستنر روی کانتینر) و event.target\r\n * دقیقاً همان یک المنتی که ماوس رویش است پیدا می‌شود -> O(1) صرف‌نظر از\r\n * تعداد آیتم‌ها (چه ۱۰ تا باشند چه ۱۰,۰۰۰ تا).\r\n *\r\n * منطق تشخیص zone (همانی که Webflow استفاده می‌کند):\r\n * ۱. جهت چیدمان پدرِ آیتم هدف را می‌خوانیم (row یا column؛ از flex-direction\r\n * یا داده‌شده به‌صورت دستی).\r\n * ۲. موقعیت نسبی ماوس داخل rect آیتم هدف را به درصد تبدیل می‌کنیم.\r\n * ۳. اگر آیتم هدف خودش یک container (قابل‌نست) باشد و ماوس در «هستهٔ\r\n * مرکزی» rect باشد (مثلاً ۲۵٪ تا ۷۵٪ در هر دو محور) -> zone = inside.\r\n * ۴. در غیر این صورت، محور اصلیِ چیدمان (که هم‌ردیفی معنی می‌دهد) با\r\n * نوار نازک لبه (٪ آستانه) بررسی می‌شود:\r\n * - چیدمان row: نزدیک لبهٔ چپ/راست -> before/after (کنار هم)\r\n * نزدیک لبهٔ بالا/پایین -> above/below (ردیف جدید)\r\n * - چیدمان column: برعکسِ بالا\r\n */\r\n\r\nconst EDGE_THRESHOLD = 0.33; // ۳۳٪ نزدیک هر لبه => درج در همان محور\r\nconst NEST_CORE = 0.25; // فاصله از هر لبه برای اینکه «هسته» حساب شود\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DropPositionService {\r\n private readonly _indicator = signal<IndicatorState>({\r\n visible: false,\r\n orientation: null,\r\n x: 0,\r\n y: 0,\r\n length: 0,\r\n highlightRect: null,\r\n });\r\n\r\n /** استیت فقط‌خواندنیِ اندیکاتور برای بایند در تمپلیت */\r\n readonly indicator = computed(() => this._indicator());\r\n\r\n private lastTargetId: string | null = null;\r\n private lastZone: DropZone | null = null;\r\n\r\n /**\r\n * فراخوانی در هر pointermove حین درگ.\r\n * targetEl باید همان element.closest('[data-flow-id]') باشد که در\r\n * دایرکتیو کانتینر با event delegation پیدا شده — نه یک لوپ روی آیتم‌ها.\r\n */\r\n evaluate(params: {\r\n targetEl: HTMLElement;\r\n targetId: string;\r\n isContainer: boolean;\r\n parentAxis: 'row' | 'column';\r\n clientX: number;\r\n clientY: number;\r\n }): { targetId: string; zone: DropZone } {\r\n const { targetEl, targetId, isContainer, parentAxis, clientX, clientY } = params;\r\n const rect = targetEl.getBoundingClientRect();\r\n\r\n const rx = clamp((clientX - rect.left) / rect.width, 0, 1);\r\n const ry = clamp((clientY - rect.top) / rect.height, 0, 1);\r\n\r\n let zone: DropZone;\r\n\r\n const insideCore =\r\n isContainer &&\r\n rx > NEST_CORE && rx < 1 - NEST_CORE &&\r\n ry > NEST_CORE && ry < 1 - NEST_CORE;\r\n\r\n if (insideCore) {\r\n zone = 'inside';\r\n } else if (parentAxis === 'row') {\r\n if (rx < EDGE_THRESHOLD) zone = 'before';\r\n else if (rx > 1 - EDGE_THRESHOLD) zone = 'after';\r\n else zone = ry < 0.5 ? 'above' : 'below';\r\n } else {\r\n if (ry < EDGE_THRESHOLD) zone = 'above';\r\n else if (ry > 1 - EDGE_THRESHOLD) zone = 'below';\r\n else zone = rx < 0.5 ? 'before' : 'after';\r\n }\r\n\r\n this.lastTargetId = targetId;\r\n this.lastZone = zone;\r\n this.paintIndicator(rect, zone);\r\n\r\n return { targetId, zone };\r\n }\r\n\r\n /** رسم خط/کادر راهنما - فقط نوشتن به یک signal، بدون لمس بقیهٔ DOM */\r\n private paintIndicator(rect: DOMRect, zone: DropZone): void {\r\n const asRect: Rect = {\r\n top: rect.top, left: rect.left, width: rect.width, height: rect.height,\r\n right: rect.right, bottom: rect.bottom,\r\n };\r\n\r\n if (zone === 'inside') {\r\n this._indicator.set({\r\n visible: true,\r\n orientation: null,\r\n x: 0, y: 0, length: 0,\r\n highlightRect: asRect,\r\n });\r\n return;\r\n }\r\n\r\n if (zone === 'above' || zone === 'below') {\r\n this._indicator.set({\r\n visible: true,\r\n orientation: 'h',\r\n x: rect.left,\r\n y: zone === 'above' ? rect.top : rect.bottom,\r\n length: rect.width,\r\n highlightRect: null,\r\n });\r\n } else {\r\n this._indicator.set({\r\n visible: true,\r\n orientation: 'v',\r\n x: zone === 'before' ? rect.left : rect.right,\r\n y: rect.top,\r\n length: rect.height,\r\n highlightRect: null,\r\n });\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.lastTargetId = null;\r\n this.lastZone = null;\r\n this._indicator.set({\r\n visible: false, orientation: null, x: 0, y: 0, length: 0, highlightRect: null,\r\n });\r\n }\r\n\r\n get current(): { targetId: string; zone: DropZone } | null {\r\n if (!this.lastTargetId || !this.lastZone) return null;\r\n return { targetId: this.lastTargetId, zone: this.lastZone };\r\n }\r\n}\r\n\r\nfunction clamp(v: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, v));\r\n}\r\n","import {\r\n Directive, ElementRef, EventEmitter, Input, Output,\r\n Renderer2, effect, inject, signal, NgZone, OnDestroy, HostBinding\r\n} from '@angular/core';\r\nimport { DragDropService } from '../services/drag-drop.service';\r\nimport { DropPositionService } from '../services/drop-position.service';\r\nimport { DragStartEvent, DragEndEvent, DropZone } from '../models/types';\r\n\r\n/**\r\n * ngxDraggable\r\n * -------------------------------------------------------------\r\n * تنها دایرکتیو مسئول درگ. کل منطق حرکت با CSS transform (translate3d)\r\n * روی خودِ عنصر درگ‌شونده انجام می‌شود — نه با جابجایی واقعی در DOM لیست.\r\n * جابجاییِ واقعیِ داده فقط یک‌بار، در لحظهٔ drop، از طریق خروجی\r\n * (flowDrop) اتفاق می‌افتد و آن‌وقت مصرف‌کننده (کامپوننت کانتینر) با\r\n * *ngFor + trackBy مدل را آپدیت می‌کند.\r\n *\r\n * دلیل مقیاس‌پذیری با هزاران آیتم:\r\n * - در حین pointermove هیچ آیتم دیگری لمس/محاسبه نمی‌شود.\r\n * - listener مربوط به تشخیص هدف روی کانتینر (event delegation) است،\r\n * نه روی تک‌تک آیتم‌ها (این بخش در ContainerDropzoneDirective است).\r\n * - آپدیت transform با requestAnimationFrame throttle می‌شود تا از\r\n * چندبار layout/paint در هر فریم جلوگیری شود.\r\n */\r\n@Directive({\r\n selector: '[ngxDraggable]',\r\n standalone: true,\r\n exportAs: 'ngxDraggable',\r\n})\r\nexport class DraggableDirective implements OnDestroy {\r\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement;\r\n private readonly renderer = inject(Renderer2);\r\n private readonly zone = inject(NgZone);\r\n private readonly dragDrop = inject(DragDropService);\r\n private readonly dropPos = inject(DropPositionService);\r\n\r\n /** شناسهٔ یکتای بلاک — برای شناسایی هنگام درگ لازم است */\r\n @Input({ required: true }) ngxDraggableId!: string;\r\n\r\n /** غیرفعال کردن موقت درگ (مثلاً حین ادیت متن داخل بلاک) */\r\n @Input() ngxDraggableDisabled = false;\r\n\r\n /** هندلِ اختصاصی؛ اگر ندهی، کل عنصر هندل می‌شود */\r\n @Input() ngxDragHandleSelector: string | null = null;\r\n\r\n @Output() flowDragStart = new EventEmitter<DragStartEvent>();\r\n @Output() flowDragEnd = new EventEmitter<DragEndEvent>();\r\n\r\n readonly dragging = signal(false);\r\n\r\n @HostBinding('class.ngx-dragging')\r\n get draggingClass() { return this.dragging(); }\r\n\r\n @HostBinding('style.touchAction')\r\n get touchAction() { return 'none'; }\r\n\r\n private startX = 0;\r\n private startY = 0;\r\n private originLeft = 0;\r\n private originTop = 0;\r\n private rafId: number | null = null;\r\n private pendingTransform: { x: number; y: number } | null = null;\r\n private cleanupFns: Array<() => void> = [];\r\n\r\n constructor() {\r\n this.zone.runOutsideAngular(() => {\r\n this.cleanupFns.push(\r\n this.renderer.listen(this.el, 'pointerdown', (e: PointerEvent) => this.onPointerDown(e))\r\n );\r\n });\r\n }\r\n\r\n private onPointerDown(e: PointerEvent): void {\r\n if (this.ngxDraggableDisabled) return;\r\n if (e.button !== 0) return;\r\n\r\n if (this.ngxDragHandleSelector) {\r\n const handle = this.el.querySelector(this.ngxDragHandleSelector);\r\n if (!handle || !handle.contains(e.target as Node)) return;\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const rect = this.el.getBoundingClientRect();\r\n this.startX = e.clientX;\r\n this.startY = e.clientY;\r\n this.originLeft = rect.left;\r\n this.originTop = rect.top;\r\n\r\n this.el.setPointerCapture(e.pointerId);\r\n this.dragging.set(true);\r\n this.dragDrop.startDrag(this.ngxDraggableId);\r\n\r\n this.zone.run(() => {\r\n this.flowDragStart.emit({\r\n id: this.ngxDraggableId,\r\n pointerId: e.pointerId,\r\n originRect: {\r\n top: rect.top, left: rect.left, width: rect.width, height: rect.height,\r\n right: rect.right, bottom: rect.bottom,\r\n },\r\n });\r\n });\r\n\r\n this.renderer.addClass(this.el, 'ngx-drag-ghost');\r\n\r\n const move = (ev: PointerEvent) => this.onPointerMove(ev);\r\n const up = (ev: PointerEvent) => this.onPointerUp(ev, move, up);\r\n\r\n this.el.addEventListener('pointermove', move as EventListener);\r\n this.el.addEventListener('pointerup', up as EventListener);\r\n this.el.addEventListener('pointercancel', up as EventListener);\r\n }\r\n\r\n private onPointerMove(e: PointerEvent): void {\r\n const dx = e.clientX - this.startX;\r\n const dy = e.clientY - this.startY;\r\n this.pendingTransform = { x: dx, y: dy };\r\n\r\n if (this.rafId === null) {\r\n this.rafId = requestAnimationFrame(() => {\r\n this.rafId = null;\r\n if (!this.pendingTransform) return;\r\n // تنها لمسِ DOM در کل چرخهٔ درگ: نوشتن transform روی خودِ عنصر.\r\n this.renderer.setStyle(\r\n this.el,\r\n 'transform',\r\n `translate3d(${this.pendingTransform.x}px, ${this.pendingTransform.y}px, 0)`\r\n );\r\n });\r\n }\r\n\r\n // نتیجهٔ zone فعلی (اگر کانتینر آن را محاسبه کرده) در سرویس در دسترس است.\r\n }\r\n\r\n private onPointerUp(e: PointerEvent, move: (ev: PointerEvent) => void, up: (ev: PointerEvent) => void): void {\r\n this.el.removeEventListener('pointermove', move as EventListener);\r\n this.el.removeEventListener('pointerup', up as EventListener);\r\n this.el.removeEventListener('pointercancel', up as EventListener);\r\n\r\n if (this.rafId !== null) {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n\r\n this.renderer.removeStyle(this.el, 'transform');\r\n this.renderer.removeClass(this.el, 'ngx-drag-ghost');\r\n this.dragging.set(false);\r\n\r\n const result = this.dragDrop.endDrag();\r\n this.dropPos.clear();\r\n\r\n this.zone.run(() => {\r\n this.flowDragEnd.emit({ id: this.ngxDraggableId, drop: result });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cleanupFns.forEach((fn) => fn());\r\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\r\n }\r\n}\r\n","import {\r\n Directive, ElementRef, EventEmitter, Input, Output,\r\n Renderer2, inject, NgZone, OnDestroy, signal\r\n} from '@angular/core';\r\nimport { ResizeHandlePosition, ResizeMoveEvent } from '../models/types';\r\n\r\n/**\r\n * ngxResizable\r\n * -------------------------------------------------------------\r\n * تنها دایرکتیو مسئول ریسایز. مستقل از DraggableDirective.\r\n * روی عنصر اصلی قرار می‌گیرد و به همراه ۸ هندل (که خودت در تمپلیت با\r\n * class مشخص می‌کنی، مثلاً <span class=\"rz-handle\" data-handle=\"se\">)\r\n * کار می‌کند.\r\n *\r\n * فقط CSS width/height/left/top آپدیت می‌شود (از طریق خروجی flowResize)\r\n * و مصرف‌کننده تصمیم می‌گیرد این مقادیر را چطور به مدل/استایل بایند کند —\r\n * دایرکتیو خودش مستقیماً مدل داده را تغییر نمی‌دهد.\r\n */\r\n@Directive({\r\n selector: '[ngxResizable]',\r\n standalone: true,\r\n exportAs: 'ngxResizable',\r\n})\r\nexport class ResizableDirective implements OnDestroy {\r\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement;\r\n private readonly renderer = inject(Renderer2);\r\n private readonly zone = inject(NgZone);\r\n\r\n @Input({ required: true }) ngxResizableId!: string;\r\n @Input() ngxResizableMinWidth = 24;\r\n @Input() ngxResizableMinHeight = 24;\r\n @Input() ngxResizableDisabled = false;\r\n\r\n /** انتخاب‌گر هندل‌ها؛ باید attribute یا data-handle داشته باشند */\r\n @Input() ngxResizeHandleSelector = '[data-handle]';\r\n\r\n @Output() flowResizeStart = new EventEmitter<{ id: string; handle: ResizeHandlePosition }>();\r\n @Output() flowResizeMove = new EventEmitter<ResizeMoveEvent>();\r\n @Output() flowResizeEnd = new EventEmitter<ResizeMoveEvent>();\r\n\r\n readonly resizing = signal(false);\r\n\r\n private startX = 0;\r\n private startY = 0;\r\n private startW = 0;\r\n private startH = 0;\r\n private handle: ResizeHandlePosition = 'se';\r\n private rafId: number | null = null;\r\n private pending: { w: number; h: number; ox: number; oy: number } | null = null;\r\n private unlisten: (() => void) | null = null;\r\n\r\n constructor() {\r\n this.zone.runOutsideAngular(() => {\r\n this.unlisten = this.renderer.listen(this.el, 'pointerdown', (e: PointerEvent) => this.onDown(e));\r\n });\r\n }\r\n\r\n private onDown(e: PointerEvent): void {\r\n if (this.ngxResizableDisabled) return;\r\n const handleEl = (e.target as HTMLElement)?.closest<HTMLElement>(this.ngxResizeHandleSelector);\r\n if (!handleEl || !this.el.contains(handleEl)) return;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.handle = (handleEl.getAttribute('data-handle') as ResizeHandlePosition) || 'se';\r\n const rect = this.el.getBoundingClientRect();\r\n this.startX = e.clientX;\r\n this.startY = e.clientY;\r\n this.startW = rect.width;\r\n this.startH = rect.height;\r\n\r\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\r\n this.resizing.set(true);\r\n this.zone.run(() => this.flowResizeStart.emit({ id: this.ngxResizableId, handle: this.handle }));\r\n\r\n const move = (ev: PointerEvent) => this.onMove(ev);\r\n const up = (ev: PointerEvent) => this.onUp(ev, move, up);\r\n handleEl.addEventListener('pointermove', move as EventListener);\r\n handleEl.addEventListener('pointerup', up as EventListener);\r\n handleEl.addEventListener('pointercancel', up as EventListener);\r\n }\r\n\r\n private onMove(e: PointerEvent): void {\r\n const dx = e.clientX - this.startX;\r\n const dy = e.clientY - this.startY;\r\n const h = this.handle;\r\n\r\n let w = this.startW;\r\n let ht = this.startH;\r\n let ox = 0, oy = 0;\r\n\r\n if (h.includes('e')) w = this.startW + dx;\r\n if (h.includes('w')) { w = this.startW - dx; ox = dx; }\r\n if (h.includes('s')) ht = this.startH + dy;\r\n if (h.includes('n')) { ht = this.startH - dy; oy = dy; }\r\n\r\n w = Math.max(this.ngxResizableMinWidth, w);\r\n ht = Math.max(this.ngxResizableMinHeight, ht);\r\n\r\n this.pending = { w, h: ht, ox, oy };\r\n\r\n if (this.rafId === null) {\r\n this.rafId = requestAnimationFrame(() => {\r\n this.rafId = null;\r\n if (!this.pending) return;\r\n this.zone.run(() => {\r\n this.flowResizeMove.emit({\r\n id: this.ngxResizableId, handle: this.handle,\r\n width: this.pending!.w, height: this.pending!.h,\r\n offsetX: this.pending!.ox, offsetY: this.pending!.oy,\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n private onUp(e: PointerEvent, move: (ev: PointerEvent) => void, up: (ev: PointerEvent) => void): void {\r\n const handleEl = e.target as HTMLElement;\r\n handleEl.removeEventListener('pointermove', move as EventListener);\r\n handleEl.removeEventListener('pointerup', up as EventListener);\r\n handleEl.removeEventListener('pointercancel', up as EventListener);\r\n\r\n if (this.rafId !== null) { cancelAnimationFrame(this.rafId); this.rafId = null; }\r\n this.resizing.set(false);\r\n\r\n if (this.pending) {\r\n this.zone.run(() => {\r\n this.flowResizeEnd.emit({\r\n id: this.ngxResizableId, handle: this.handle,\r\n width: this.pending!.w, height: this.pending!.h,\r\n offsetX: this.pending!.ox, offsetY: this.pending!.oy,\r\n });\r\n });\r\n }\r\n this.pending = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unlisten?.();\r\n if (this.rafId !== null) cancelAnimationFrame(this.rafId);\r\n }\r\n}\r\n","import {\r\n Directive, ElementRef, Input, NgZone, OnDestroy, OnInit, Renderer2, inject\r\n} from '@angular/core';\r\nimport { DragDropService } from '../services/drag-drop.service';\r\nimport { DropPositionService } from '../services/drop-position.service';\r\nimport { FlowAxis } from '../models/types';\r\n\r\n/**\r\n * ngxDropzoneContainer\r\n * -------------------------------------------------------------\r\n * روی هر کانتینری که فرزندانش قابل‌درگ‌اند‌دراپ هستند قرار می‌گیرد\r\n * (چه ریشهٔ صفحه، چه یک بلاک تو‌در‌تو).\r\n *\r\n * فقط یک pointermove-listener سراسری (روی document، حین یک درگ فعال)\r\n * دارد و با event.target.closest('[data-flow-id]') هدف را پیدا می‌کند.\r\n * این یعنی صرف‌نظر از اینکه چند هزار فرزند وجود دارد، هزینهٔ هر حرکتِ\r\n * ماوس ثابت (O(1)) است — نه O(n).\r\n *\r\n * هر فرزند مستقیمِ قابل‌درگ باید attribute زیر را داشته باشد\r\n * (به‌صورت خودکار توسط DraggableDirective/تمپلیت ست می‌شود):\r\n * [attr.data-flow-id]=\"item.id\"\r\n * [attr.data-flow-container]=\"isContainer ? '' : null\"\r\n */\r\n@Directive({\r\n selector: '[ngxDropzoneContainer]',\r\n standalone: true,\r\n exportAs: 'ngxDropzoneContainer',\r\n})\r\nexport class DropzoneContainerDirective implements OnInit, OnDestroy {\r\n private readonly el = inject(ElementRef<HTMLElement>).nativeElement;\r\n private readonly zone = inject(NgZone);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly dragDrop = inject(DragDropService);\r\n private readonly dropPos = inject(DropPositionService);\r\n\r\n /** جهت چیدمان فرزندان مستقیم این کانتینر */\r\n @Input() ngxDropzoneAxis: FlowAxis = 'row';\r\n\r\n /** آیا خودِ این کانتینر می‌تواند میزبان nest شدن باشد */\r\n @Input() ngxDropzoneNestable = true;\r\n\r\n private unlistenMove: (() => void) | null = null;\r\n private unlistenLeave: (() => void) | null = null;\r\n\r\n ngOnInit(): void {\r\n this.zone.runOutsideAngular(() => {\r\n this.unlistenMove = this.renderer.listen(this.el, 'pointermove', (e: PointerEvent) => {\r\n if (!this.dragDrop.isDragging) return;\r\n this.handleMove(e);\r\n });\r\n });\r\n }\r\n\r\n private handleMove(e: PointerEvent): void {\r\n const targetEl = (e.target as HTMLElement)?.closest<HTMLElement>('[data-flow-id]');\r\n if (!targetEl || !this.el.contains(targetEl) || targetEl === this.el) return;\r\n\r\n const targetId = targetEl.getAttribute('data-flow-id');\r\n const activeId = this.dragDrop.activeId();\r\n if (!targetId || targetId === activeId) return; // نمی‌توان روی خودش دراپ کرد\r\n\r\n const isContainer = this.ngxDropzoneNestable && targetEl.hasAttribute('data-flow-container');\r\n\r\n const result = this.dropPos.evaluate({\r\n targetEl,\r\n targetId,\r\n isContainer,\r\n parentAxis: this.ngxDropzoneAxis,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n });\r\n\r\n this.dragDrop.setPendingDrop(result);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unlistenMove?.();\r\n this.unlistenLeave?.();\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\r\nimport { DropPositionService } from '../../services/drop-position.service';\r\n\r\n/**\r\n * FlowDropIndicatorComponent\r\n * -------------------------------------------------------------\r\n * یک‌بار در ریشهٔ صفحه‌ساز قرار می‌گیرد (position: fixed).\r\n * تنها المنتی است که در طول درگ مدام آپدیت می‌شود؛ بقیهٔ آیتم‌های\r\n * لیست دست‌نخورده باقی می‌مانند. کاملاً با computed از signal سرویس\r\n * تغذیه می‌شود، بدون هیچ منطق اضافه در کامپوننت.\r\n */\r\n@Component({\r\n selector: 'flow-drop-indicator',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n @if (indicator().visible) {\r\n @if (indicator().highlightRect; as r) {\r\n <div class=\"flow-nest-highlight\"\r\n [style.top.px]=\"r.top\" [style.left.px]=\"r.left\"\r\n [style.width.px]=\"r.width\" [style.height.px]=\"r.height\">\r\n </div>\r\n } @else if (indicator().orientation === 'h') {\r\n <div class=\"flow-indicator flow-indicator--h\"\r\n [style.top.px]=\"indicator().y\" [style.left.px]=\"indicator().x\"\r\n [style.width.px]=\"indicator().length\">\r\n </div>\r\n } @else if (indicator().orientation === 'v') {\r\n <div class=\"flow-indicator flow-indicator--v\"\r\n [style.top.px]=\"indicator().y\" [style.left.px]=\"indicator().x\"\r\n [style.height.px]=\"indicator().length\">\r\n </div>\r\n }\r\n }\r\n `,\r\n styles: [`\r\n :host { position: fixed; inset: 0; pointer-events: none; z-index: 9999; }\r\n .flow-indicator {\r\n position: fixed;\r\n background: var(--flow-accent, #146ef5);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n }\r\n .flow-indicator--h { height: 3px; transform: translateY(-1.5px); }\r\n .flow-indicator--v { width: 3px; transform: translateX(-1.5px); }\r\n .flow-nest-highlight {\r\n position: fixed;\r\n border: 2px solid var(--flow-accent, #146ef5);\r\n background: color-mix(in srgb, var(--flow-accent, #146ef5) 10%, transparent);\r\n border-radius: 4px;\r\n pointer-events: none;\r\n }\r\n `],\r\n})\r\nexport class FlowDropIndicatorComponent {\r\n private readonly dropPos = inject(DropPositionService);\r\n readonly indicator = computed(() => this.dropPos.indicator());\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { DropResult } from '../models/types';\r\n\r\nexport interface FlowNode {\r\n id: string;\r\n type: string;\r\n axis: 'row' | 'column';\r\n isContainer: boolean;\r\n props?: Record<string, unknown>;\r\n children: FlowNode[];\r\n}\r\n\r\n/**\r\n * FlowTreeService\r\n * -------------------------------------------------------------\r\n * مدل درختیِ صفحه (دقیقاً همان چیزی که Webflow \"Element Panel\" اسمش\r\n * می‌گذارد). تغییر مدل فقط در لحظهٔ drop رخ می‌دهد (نه در هر\r\n * pointermove) — به همین دلیل حتی با هزاران بلاک، re-render فقط\r\n * یک‌بار در پایان درگ اتفاق می‌افتد.\r\n *\r\n * پیاده‌سازی immutable-ish: فقط مسیر تغییر‌یافته کپی می‌شود، نه کل\r\n * درخت (structural sharing) تا با درخت‌های بزرگ هم CPU/GC اذیت نشود.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class FlowTreeService {\r\n private readonly _root = signal<FlowNode>({\r\n id: 'root', type: 'root', axis: 'column', isContainer: true, children: [],\r\n });\r\n\r\n readonly root = computed(() => this._root());\r\n\r\n setRoot(node: FlowNode): void {\r\n this._root.set(node);\r\n }\r\n\r\n applyDrop(draggedId: string, drop: DropResult): void {\r\n const currentRoot = this._root();\r\n const dragged = findAndRemove(currentRoot, draggedId);\r\n if (!dragged.node) return;\r\n\r\n const afterRemoval = dragged.tree;\r\n const inserted = insertRelativeTo(afterRemoval, drop.targetId, drop.zone, dragged.node);\r\n if (inserted) this._root.set(inserted);\r\n }\r\n}\r\n\r\nfunction findAndRemove(node: FlowNode, id: string): { tree: FlowNode; node: FlowNode | null } {\r\n let removed: FlowNode | null = null;\r\n const idx = node.children.findIndex((c) => c.id === id);\r\n\r\n if (idx !== -1) {\r\n removed = node.children[idx];\r\n const children = [...node.children.slice(0, idx), ...node.children.slice(idx + 1)];\r\n return { tree: { ...node, children }, node: removed };\r\n }\r\n\r\n let changed = false;\r\n const newChildren = node.children.map((c) => {\r\n if (removed) return c;\r\n const res = findAndRemove(c, id);\r\n if (res.node) { removed = res.node; changed = true; return res.tree; }\r\n return c;\r\n });\r\n\r\n return { tree: changed ? { ...node, children: newChildren } : node, node: removed };\r\n}\r\n\r\nfunction insertRelativeTo(\r\n node: FlowNode, targetId: string, zone: DropResult['zone'], toInsert: FlowNode\r\n): FlowNode | null {\r\n const idx = node.children.findIndex((c) => c.id === targetId);\r\n\r\n if (idx !== -1) {\r\n if (zone === 'inside') {\r\n const target = node.children[idx];\r\n const updatedTarget = { ...target, children: [...target.children, toInsert] };\r\n const children = [...node.children];\r\n children[idx] = updatedTarget;\r\n return { ...node, children };\r\n }\r\n const insertAt = zone === 'before' || zone === 'above' ? idx : idx + 1;\r\n const children = [...node.children.slice(0, insertAt), toInsert, ...node.children.slice(insertAt)];\r\n return { ...node, children };\r\n }\r\n\r\n for (let i = 0; i < node.children.length; i++) {\r\n const res = insertRelativeTo(node.children[i], targetId, zone, toInsert);\r\n if (res) {\r\n const children = [...node.children];\r\n children[i] = res;\r\n return { ...node, children };\r\n }\r\n }\r\n return null;\r\n}\r\n","/**\r\n * ngx-flowbuilder — مدل‌های پایه\r\n */\r\n\r\nexport type FlowAxis = 'row' | 'column';\r\n\r\n/** موقعیت درج نسبت به آیتمی که ماوس روی آن است */\r\nexport type DropZone =\r\n | 'before' // قبل از آیتم، در همان محور چیدمان (مثلاً چپِ آیتم اگر ردیف است)\r\n | 'after' // بعد از آیتم، در همان محور چیدمان\r\n | 'above' // بالای آیتم؛ یعنی ایجاد ردیف/خط جدید قبل از آن\r\n | 'below' // پایین آیتم؛ ایجاد ردیف/خط جدید بعد از آن\r\n | 'inside'; // نِست‌شدن به‌عنوان فرزند (وقتی آیتم هدف یک container باشد)\r\n\r\nexport interface DropResult {\r\n targetId: string;\r\n zone: DropZone;\r\n}\r\n\r\nexport interface Rect {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n right: number;\r\n bottom: number;\r\n}\r\n\r\nexport interface IndicatorState {\r\n visible: boolean;\r\n /** خط باریک: 'h' یعنی خط افقی (جدا کردن ردیف‌ها)، 'v' یعنی خط عمودی (جدا کردن کنار هم) */\r\n orientation: 'h' | 'v' | null;\r\n x: number;\r\n y: number;\r\n length: number;\r\n /** حالت nest: به‌جای خط، یک کادر دور کل container هایلایت می‌شود */\r\n highlightRect: Rect | null;\r\n}\r\n\r\nexport interface DragStartEvent {\r\n id: string;\r\n pointerId: number;\r\n originRect: Rect;\r\n}\r\n\r\nexport interface DragMoveEvent {\r\n id: string;\r\n clientX: number;\r\n clientY: number;\r\n deltaX: number;\r\n deltaY: number;\r\n}\r\n\r\nexport interface DragEndEvent {\r\n id: string;\r\n drop: DropResult | null;\r\n}\r\n\r\nexport type ResizeHandlePosition =\r\n | 'n' | 's' | 'e' | 'w'\r\n | 'ne' | 'nw' | 'se' | 'sw';\r\n\r\nexport interface ResizeMoveEvent {\r\n id: string;\r\n handle: ResizeHandlePosition;\r\n width: number;\r\n height: number;\r\n /** فقط برای هندل‌های شمال/غرب که مبدأ عنصر هم جابجا می‌شود */\r\n offsetX: number;\r\n offsetY: number;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}