ngx-kit 6.2.0 → 7.0.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 (71) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +52 -49
  5. package/data-table/README.md +120 -113
  6. package/date-picker/README.md +74 -69
  7. package/dialog/README.md +92 -92
  8. package/drag-resize/README.md +55 -0
  9. package/drawer-menu/README.md +125 -77
  10. package/dropzone/README.md +422 -422
  11. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  12. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  13. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  14. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  15. package/fesm2022/ngx-kit-color-picker.mjs +265 -73
  16. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  17. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  18. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  19. package/fesm2022/ngx-kit-date-picker.mjs +11 -11
  20. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  21. package/fesm2022/ngx-kit-dialog.mjs +3 -3
  22. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-drag-resize.mjs +1664 -0
  24. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -0
  25. package/fesm2022/ngx-kit-drawer-menu.mjs +424 -158
  26. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  28. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-form-field.mjs +3 -5
  30. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  31. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  32. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-grid-layout.mjs +927 -0
  35. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -0
  36. package/fesm2022/ngx-kit-image-editor.mjs +2 -2
  37. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-menu.mjs +8 -8
  39. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-kit-message.mjs +2 -2
  41. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  42. package/fesm2022/ngx-kit-notify.mjs +2 -2
  43. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  44. package/fesm2022/ngx-kit-shared.mjs +54 -3
  45. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  46. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  47. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  48. package/fesm2022/ngx-kit-virtual-scroll.mjs +392 -0
  49. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -0
  50. package/fesm2022/ngx-kit-webflow.mjs +709 -0
  51. package/fesm2022/ngx-kit-webflow.mjs.map +1 -0
  52. package/gallery/README.md +71 -71
  53. package/gradient-picker/README.md +41 -41
  54. package/grid-layout/README.md +64 -0
  55. package/image-editor/README.md +12 -12
  56. package/menu/README.md +85 -85
  57. package/message/README.md +70 -70
  58. package/notify/README.md +56 -58
  59. package/package.json +17 -1
  60. package/shared/README.md +117 -117
  61. package/time-picker/README.md +89 -95
  62. package/types/ngx-kit-color-picker.d.ts +72 -16
  63. package/types/ngx-kit-date-picker.d.ts +2 -1
  64. package/types/ngx-kit-drag-resize.d.ts +368 -0
  65. package/types/ngx-kit-drawer-menu.d.ts +148 -88
  66. package/types/ngx-kit-grid-layout.d.ts +310 -0
  67. package/types/ngx-kit-image-editor.d.ts +1 -1
  68. package/types/ngx-kit-shared.d.ts +12 -1
  69. package/types/ngx-kit-virtual-scroll.d.ts +179 -0
  70. package/types/ngx-kit-webflow.d.ts +286 -0
  71. package/virtual-scroll/README.md +199 -0
@@ -0,0 +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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"}