ngx-kit 6.3.0 → 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) 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/dropzone/README.md +422 -422
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +265 -73
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +7 -9
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +3 -3
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drag-resize.mjs +1664 -0
  23. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -0
  24. package/fesm2022/ngx-kit-drawer-menu.mjs +389 -285
  25. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  27. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  28. package/fesm2022/ngx-kit-form-field.mjs +3 -5
  29. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  31. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-grid-layout.mjs +994 -0
  34. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -0
  35. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-menu.mjs +8 -8
  37. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-notify.mjs +2 -2
  40. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  41. package/fesm2022/ngx-kit-shared.mjs +54 -3
  42. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  43. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  44. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  45. package/fesm2022/ngx-kit-virtual-scroll.mjs +392 -0
  46. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -0
  47. package/fesm2022/ngx-kit-webflow.mjs +709 -0
  48. package/fesm2022/ngx-kit-webflow.mjs.map +1 -0
  49. package/gallery/README.md +71 -71
  50. package/gradient-picker/README.md +41 -41
  51. package/grid-layout/README.md +64 -0
  52. package/image-editor/README.md +12 -12
  53. package/menu/README.md +85 -85
  54. package/message/README.md +70 -70
  55. package/notify/README.md +56 -58
  56. package/package.json +17 -1
  57. package/shared/README.md +117 -117
  58. package/time-picker/README.md +89 -95
  59. package/types/ngx-kit-color-picker.d.ts +72 -16
  60. package/types/ngx-kit-drag-resize.d.ts +368 -0
  61. package/types/ngx-kit-drawer-menu.d.ts +135 -86
  62. package/types/ngx-kit-grid-layout.d.ts +311 -0
  63. package/types/ngx-kit-image-editor.d.ts +1 -1
  64. package/types/ngx-kit-shared.d.ts +12 -1
  65. package/types/ngx-kit-virtual-scroll.d.ts +179 -0
  66. package/types/ngx-kit-webflow.d.ts +286 -0
  67. package/virtual-scroll/README.md +199 -0
@@ -1,112 +1,161 @@
1
+ import * as ngx_kit_drawer_menu from 'ngx-kit/drawer-menu';
1
2
  import * as _angular_core from '@angular/core';
2
3
 
3
4
  /** Logical drawer placement. `start` is right in RTL and left in LTR. */
4
5
  type NgxDrawerSide = 'start' | 'end';
5
- /** How the drawer interacts with the application content. */
6
- type NgxDrawerMode = 'overlay' | 'push' | 'reveal';
7
- /** Desktop/mobile layout behavior when responsive mode is enabled. */
8
- type NgxDrawerResponsiveBehavior = 'overlay' | 'dock';
9
6
  /** Visual physics used by the drawer while opening/closing. */
10
- type NgxDrawerEffect = 'slide' | 'spring' | 'fabric' | 'curtain' | 'elastic' | 'reveal';
11
- type NgxDrawerResponsiveMode = 'off' | 'auto';
12
- interface NgxDrawerResponsiveConfig {
7
+ type NgxDrawerEffect = 'none' | 'fabric' | 'slide' | 'push' | 'scale';
8
+ type NgxDrawerBehavior = 'dock' | 'overlay';
9
+ type NgxDrawerResponsiveMode = 'auto' | 'desktop' | 'mobile';
10
+ interface NgxDrawerResponsive {
11
+ /**
12
+ * auto:
13
+ * breakpoint determines desktop/mobile mode
14
+ *
15
+ * desktop:
16
+ * always desktop
17
+ *
18
+ * mobile:
19
+ * always mobile
20
+ */
13
21
  mode?: NgxDrawerResponsiveMode;
22
+ /**
23
+ * Width at which the drawer switches
24
+ * between desktop and mobile.
25
+ */
14
26
  breakpoint?: number;
27
+ /**
28
+ * Initial/default state on desktop.
29
+ */
15
30
  desktopOpen?: boolean;
31
+ /**
32
+ * Initial/default state on mobile.
33
+ */
16
34
  mobileOpen?: boolean;
17
- /** Desktop layout: dock means a real sidebar; overlay means floating drawer. */
18
- desktopBehavior?: NgxDrawerResponsiveBehavior;
19
- /** Mobile layout is normally overlay. */
20
- mobileBehavior?: NgxDrawerResponsiveBehavior;
35
+ /**
36
+ * Desktop drawer behavior.
37
+ */
38
+ desktopBehavior?: NgxDrawerBehavior;
39
+ /**
40
+ * Mobile drawer behavior.
41
+ */
42
+ mobileBehavior?: NgxDrawerBehavior;
43
+ /**
44
+ * If true, pinned state is preserved
45
+ * when switching between desktop/mobile.
46
+ */
21
47
  respectPinned?: boolean;
22
48
  }
49
+ declare const DEFAULT_DRAWER_RESPONSIVE: Required<NgxDrawerResponsive>;
23
50
 
24
51
  declare class NgxDrawerMenuComponent {
52
+ private readonly elementRef;
53
+ private readonly renderer;
54
+ private readonly destroyRef;
55
+ private readonly platformId;
25
56
  readonly side: _angular_core.InputSignal<NgxDrawerSide>;
26
- readonly mode: _angular_core.InputSignal<NgxDrawerMode>;
27
- /** When responsive mode is active, desktop/mobile can use different layout behavior. */
28
- readonly desktopBehavior: _angular_core.InputSignal<NgxDrawerResponsiveBehavior>;
29
- readonly mobileBehavior: _angular_core.InputSignal<NgxDrawerResponsiveBehavior>;
30
- private readonly responsiveDesktopBehavior;
31
- private readonly responsiveMobileBehavior;
32
57
  readonly effect: _angular_core.InputSignal<NgxDrawerEffect>;
33
- readonly width: _angular_core.InputSignal<number>;
34
- readonly maxWidth: _angular_core.InputSignal<number>;
35
- readonly edgeSize: _angular_core.InputSignal<number>;
36
- readonly dragThreshold: _angular_core.InputSignal<number>;
37
- readonly velocityThreshold: _angular_core.InputSignal<number>;
38
- /** Opens/closes the panel from the edge and while the panel itself is dragged. */
39
- readonly swipeEnabled: _angular_core.InputSignal<boolean>;
40
- /** Allows closing by clicking the backdrop. */
41
- readonly backdropClose: _angular_core.InputSignal<boolean>;
42
- /** Allows Escape to close the drawer. */
43
- readonly escapeClose: _angular_core.InputSignal<boolean>;
44
- /** The drawer starts open unless explicitly configured otherwise. */
58
+ readonly width: _angular_core.InputSignal<string | number>;
59
+ /**
60
+ * Main drawer state.
61
+ *
62
+ * Usage:
63
+ *
64
+ * [(open)]="sidebarOpen"
65
+ */
45
66
  readonly open: _angular_core.ModelSignal<boolean>;
46
- /** Pinned drawers are intended for persistent desktop navigation. */
67
+ /**
68
+ * Pinned state.
69
+ *
70
+ * Useful for desktop layouts.
71
+ *
72
+ * [(pinned)]="sidebarPinned"
73
+ */
47
74
  readonly pinned: _angular_core.ModelSignal<boolean>;
48
- /** Responsive behavior. Can be overridden with individual inputs below. */
49
- readonly responsive: _angular_core.InputSignal<NgxDrawerResponsiveConfig>;
50
- /** Convenience aliases for the common responsive configuration. */
51
- readonly respondToViewport: _angular_core.InputSignal<boolean>;
52
- readonly mobileBreakpoint: _angular_core.InputSignal<number>;
53
- readonly openOnDesktop: _angular_core.InputSignal<boolean>;
54
- readonly openOnMobile: _angular_core.InputSignal<boolean>;
55
- /** Visual tuning. */
56
- readonly curtainStrips: _angular_core.InputSignal<number>;
57
- readonly backdropOpacity: _angular_core.InputSignal<number>;
58
- readonly transitionMs: _angular_core.InputSignal<number>;
59
- readonly focusOnOpen: _angular_core.InputSignal<boolean>;
60
- protected readonly dragProgress: _angular_core.WritableSignal<number | null>;
61
- protected readonly dragVelocity: _angular_core.WritableSignal<number>;
62
- protected readonly isMobile: _angular_core.WritableSignal<boolean>;
63
- protected readonly effectiveBehavior: _angular_core.Signal<NgxDrawerResponsiveBehavior>;
64
- protected readonly isDocked: _angular_core.Signal<boolean>;
65
- protected readonly usesOverlay: _angular_core.Signal<boolean>;
66
- protected readonly isDragging: _angular_core.Signal<boolean>;
67
- protected readonly progress: _angular_core.Signal<number>;
68
- protected readonly isActuallyOpen: _angular_core.Signal<boolean>;
69
- protected readonly strips: _angular_core.Signal<number[]>;
70
- /** Physical side: true means the drawer is attached to the physical left edge. */
71
- protected readonly isPhysicalLeft: _angular_core.Signal<boolean>;
72
- protected readonly physicalSign: _angular_core.Signal<1 | -1>;
73
- protected readonly effectiveMode: _angular_core.Signal<NgxDrawerMode>;
74
- protected readonly duration: _angular_core.Signal<string>;
75
- private readonly directionService;
76
- private readonly document;
77
- private readonly destroyRef;
78
- private pointerId;
79
- private dragStartX;
80
- private dragStartProgress;
81
- private dragLastX;
82
- private dragLastTime;
83
- private lastVelocity;
84
- private activePointerTarget;
85
- private resizeObserver?;
75
+ readonly responsive: _angular_core.InputSignal<NgxDrawerResponsive>;
76
+ /**
77
+ * Whether clicking backdrop closes drawer.
78
+ */
79
+ readonly closeOnBackdrop: _angular_core.InputSignal<boolean>;
80
+ /**
81
+ * Whether Escape closes drawer.
82
+ */
83
+ readonly closeOnEscape: _angular_core.InputSignal<boolean>;
84
+ /**
85
+ * Whether body scrolling should be locked
86
+ * while an overlay drawer is open.
87
+ */
88
+ readonly lockBodyScroll: _angular_core.InputSignal<boolean>;
89
+ /**
90
+ * Animation duration in milliseconds.
91
+ */
92
+ readonly animationDuration: _angular_core.InputSignal<number>;
93
+ /**
94
+ * z-index.
95
+ */
96
+ readonly zIndex: _angular_core.InputSignal<number>;
97
+ private readonly isBrowser;
98
+ readonly isMobile: _angular_core.WritableSignal<boolean>;
99
+ readonly initialized: _angular_core.WritableSignal<boolean>;
100
+ /**
101
+ * Used to avoid applying responsive defaults repeatedly.
102
+ */
103
+ private previousResponsiveMode;
86
104
  private mediaQuery?;
87
- private mediaQueryListener?;
88
- private lastManagedViewportState;
105
+ private removeMediaQueryListener?;
106
+ readonly responsiveConfig: _angular_core.Signal<{
107
+ mode: ngx_kit_drawer_menu.NgxDrawerResponsiveMode;
108
+ breakpoint: number;
109
+ desktopOpen: boolean;
110
+ mobileOpen: boolean;
111
+ desktopBehavior: NgxDrawerBehavior;
112
+ mobileBehavior: NgxDrawerBehavior;
113
+ respectPinned: boolean;
114
+ }>;
115
+ readonly currentMode: _angular_core.Signal<"desktop" | "mobile">;
116
+ readonly currentBehavior: _angular_core.Signal<NgxDrawerBehavior>;
117
+ readonly isOverlay: _angular_core.Signal<boolean>;
118
+ readonly isDocked: _angular_core.Signal<boolean>;
119
+ readonly shouldShowBackdrop: _angular_core.Signal<boolean>;
120
+ readonly drawerWidth: _angular_core.Signal<string>;
121
+ readonly drawerVisible: _angular_core.Signal<boolean>;
122
+ readonly shouldPreservePinned: _angular_core.Signal<boolean>;
123
+ readonly isPinnedAndDesktop: _angular_core.Signal<boolean>;
124
+ get drawerStart(): boolean;
125
+ get drawerEnd(): boolean;
126
+ get drawerOpen(): boolean;
127
+ get drawerMobile(): boolean;
128
+ get drawerDesktop(): boolean;
129
+ get drawerOverlay(): boolean;
130
+ get drawerDock(): boolean;
131
+ get hostWidth(): string;
132
+ get hostDuration(): string;
133
+ get hostZIndex(): number;
134
+ get effectNone(): boolean;
135
+ get effectFabric(): boolean;
136
+ get effectSlide(): boolean;
137
+ get effectPush(): boolean;
138
+ get effectScale(): boolean;
89
139
  constructor();
140
+ private setupResponsive;
141
+ private setupMediaQuery;
142
+ private updateMobileState;
143
+ private handleResponsiveModeChange;
144
+ private applyInitialResponsiveState;
145
+ private destroyResponsive;
90
146
  toggle(): void;
91
147
  openDrawer(): void;
92
- closeDrawer(): void;
148
+ close(): void;
93
149
  pin(): void;
94
150
  unpin(): void;
95
- protected onEscape(): void;
96
- protected onBackdropPointerDown(event: PointerEvent): void;
97
- protected onEdgePointerDown(event: PointerEvent): void;
98
- protected onPanelPointerDown(event: PointerEvent): void;
99
- private beginDrag;
100
- private readonly onPointerMove;
101
- private readonly onPointerUp;
102
- private readonly onPointerCancel;
103
- private disposePointer;
104
- private setupViewportSync;
105
- private disposeViewportSync;
106
- private clamp01;
151
+ togglePinned(): void;
152
+ onBackdropClick(): void;
153
+ onKeyDown(event: KeyboardEvent): void;
154
+ private lockScroll;
155
+ private unlockScroll;
107
156
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDrawerMenuComponent, never>;
108
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDrawerMenuComponent, "ngx-drawer-menu", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "desktopBehavior": { "alias": "desktopBehavior"; "required": false; "isSignal": true; }; "mobileBehavior": { "alias": "mobileBehavior"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "edgeSize": { "alias": "edgeSize"; "required": false; "isSignal": true; }; "dragThreshold": { "alias": "dragThreshold"; "required": false; "isSignal": true; }; "velocityThreshold": { "alias": "velocityThreshold"; "required": false; "isSignal": true; }; "swipeEnabled": { "alias": "swipeEnabled"; "required": false; "isSignal": true; }; "backdropClose": { "alias": "backdropClose"; "required": false; "isSignal": true; }; "escapeClose": { "alias": "escapeClose"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "pinned": { "alias": "pinned"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "respondToViewport": { "alias": "respondToViewport"; "required": false; "isSignal": true; }; "mobileBreakpoint": { "alias": "mobileBreakpoint"; "required": false; "isSignal": true; }; "openOnDesktop": { "alias": "openOnDesktop"; "required": false; "isSignal": true; }; "openOnMobile": { "alias": "openOnMobile"; "required": false; "isSignal": true; }; "curtainStrips": { "alias": "curtainStrips"; "required": false; "isSignal": true; }; "backdropOpacity": { "alias": "backdropOpacity"; "required": false; "isSignal": true; }; "transitionMs": { "alias": "transitionMs"; "required": false; "isSignal": true; }; "focusOnOpen": { "alias": "focusOnOpen"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pinned": "pinnedChange"; }, never, ["*", "[drawerContent]"], true, never>;
157
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDrawerMenuComponent, "ngx-drawer-menu", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "pinned": { "alias": "pinned"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "lockBodyScroll": { "alias": "lockBodyScroll"; "required": false; "isSignal": true; }; "animationDuration": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pinned": "pinnedChange"; }, never, ["[drawerContent]", "*"], true, never>;
109
158
  }
110
159
 
111
- export { NgxDrawerMenuComponent };
112
- export type { NgxDrawerEffect, NgxDrawerMode, NgxDrawerResponsiveBehavior, NgxDrawerResponsiveConfig, NgxDrawerResponsiveMode, NgxDrawerSide };
160
+ export { DEFAULT_DRAWER_RESPONSIVE, NgxDrawerMenuComponent };
161
+ export type { NgxDrawerBehavior, NgxDrawerEffect, NgxDrawerResponsive, NgxDrawerResponsiveMode, NgxDrawerSide };
@@ -0,0 +1,311 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { AfterViewInit, OnDestroy, OnInit } from '@angular/core';
3
+ import * as i1 from 'ngx-kit/drag-resize';
4
+
5
+ type GridFlow = 'free' | 'horizontal' | 'vertical';
6
+ type CompactMode = 'none' | 'vertical' | 'horizontal' | 'both';
7
+ interface IGridBackgroundCfg {
8
+ show?: 'never' | 'always' | 'whenDragging';
9
+ borderColor?: string;
10
+ gapColor?: string;
11
+ rowColor?: string;
12
+ columnColor?: string;
13
+ borderWidth?: number;
14
+ }
15
+ interface IGridLayoutOptions {
16
+ cols: number;
17
+ rowHeight: number | 'fit';
18
+ gap?: number;
19
+ padding?: number;
20
+ flow?: GridFlow;
21
+ compact?: CompactMode;
22
+ allowOverlap?: boolean;
23
+ pushItems?: boolean;
24
+ /** When two items would swap places, prefer swapping over cascading a push. */
25
+ swap?: boolean;
26
+ dragThreshold?: number;
27
+ animate?: boolean;
28
+ /**
29
+ * `true` / `false` force a direction; `'auto'` (default) reads the host element's
30
+ * computed `direction`, so the grid follows the surrounding page automatically.
31
+ */
32
+ rtl?: boolean | 'auto';
33
+ /** Caps the number of rows the grid can grow to. `undefined` = unbounded. */
34
+ maxRows?: number;
35
+ gridBackgroundConfig?: IGridBackgroundCfg;
36
+ }
37
+ declare class GridLayoutOptions implements IGridLayoutOptions {
38
+ cols: number;
39
+ rowHeight: number | 'fit';
40
+ gap: number;
41
+ padding: number;
42
+ flow: GridFlow;
43
+ compact: CompactMode;
44
+ allowOverlap: boolean;
45
+ pushItems: boolean;
46
+ swap: boolean;
47
+ dragThreshold: number;
48
+ animate: boolean;
49
+ rtl: boolean | "auto";
50
+ maxRows?: number;
51
+ gridBackgroundConfig: IGridBackgroundCfg;
52
+ }
53
+
54
+ declare class GridItemConfig {
55
+ x: number;
56
+ y: number;
57
+ w: number;
58
+ h: number;
59
+ minW?: number;
60
+ minH?: number;
61
+ maxW?: number;
62
+ maxH?: number;
63
+ /** Item can't be dragged or resized, and never moves during compaction/push. */
64
+ static?: boolean;
65
+ /** Overrides the layout-level draggable/resizable flags for this item only. */
66
+ isDraggable?: boolean;
67
+ isResizable?: boolean;
68
+ constructor(x?: number, y?: number, w?: number, h?: number, s?: boolean);
69
+ }
70
+ declare const normalizeGridItem: (value?: Partial<GridItemConfig>) => GridItemConfig;
71
+ /**
72
+ * Value equality for two (already-normalized) configs.
73
+ *
74
+ * This is what breaks the register -> settle -> new-object -> re-register
75
+ * feedback loop: signals compare by *reference*, so anything that recomputes
76
+ * a fresh config object on every change-detection pass (a `computed()` layout,
77
+ * an inline object literal in a template, etc.) will always look "changed" to
78
+ * an `effect()` even when nothing meaningful did. Callers must compare by
79
+ * value before writing back to a signal, otherwise the write itself produces
80
+ * a new reference that trips the same effect again — forever.
81
+ */
82
+ declare function gridItemConfigsEqual(a: GridItemConfig, b: GridItemConfig): boolean;
83
+
84
+ interface LayoutOutput extends GridItemConfig {
85
+ id?: string;
86
+ }
87
+
88
+ interface LayoutNode {
89
+ id: string;
90
+ config: GridItemConfig;
91
+ }
92
+ /** Axis-aligned bounding-box overlap test in grid-cell space. */
93
+ declare function collides(a: GridItemConfig, b: GridItemConfig): boolean;
94
+ /** First item (other than `self`) whose cells overlap `config`, or null. */
95
+ declare function getFirstCollision<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T | null;
96
+ /** All items whose cells overlap `config`, excluding `selfId`. */
97
+ declare function getAllCollisions<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T[];
98
+
99
+ interface MoveOptions {
100
+ cols: number;
101
+ compact: CompactMode;
102
+ allowOverlap: boolean;
103
+ maxRows?: number;
104
+ }
105
+ /**
106
+ * Moves `id` to grid cell (x, y) and, unless overlap is explicitly allowed,
107
+ * cascades any resulting collisions by pushing the colliding items out of the
108
+ * way (downward for vertical-flow grids, rightward for horizontal-flow ones).
109
+ * Static items are treated as fixed obstacles: they block, but never move.
110
+ * Pure function — returns a new array, never mutates its input.
111
+ */
112
+ declare function moveItem<T extends LayoutNode>(items: readonly T[], id: string, x: number, y: number, opts: MoveOptions, depth?: number): T[];
113
+ /**
114
+ * When the actively-moved item directly overlaps exactly one same-size item,
115
+ * exchanging their positions reads much better than a cascading push. The
116
+ * caller (service) decides when to offer this vs. falling back to `moveItem`.
117
+ */
118
+ declare function trySwap<T extends LayoutNode>(items: readonly T[], id: string, previous: GridItemConfig, next: GridItemConfig): T[] | null;
119
+ /**
120
+ * Removes gaps by pulling every non-static item as far toward the start of the
121
+ * grid as it can go without overlapping another item, in reading order.
122
+ */
123
+ declare function compact<T extends LayoutNode>(items: readonly T[], mode: CompactMode): T[];
124
+ /** Highest occupied row (0-based, exclusive) across all items — drives the grid's auto-height. */
125
+ declare function maxOccupiedRow(items: readonly LayoutNode[]): number;
126
+ /**
127
+ * Finds a cell for `config` that doesn't collide with any existing item.
128
+ * Tries the requested (x, y) first; if that's already occupied, scans
129
+ * forward in reading order (row by row, top to bottom, left to right — the
130
+ * caller is responsible for any RTL flipping when it turns this back into
131
+ * pixels) for the first gap large enough to fit it.
132
+ *
133
+ * This is what a newly-registered item (or one whose config changes to a
134
+ * position that's no longer free) should go through instead of silently
135
+ * overlapping whatever's already there: unlike a drag/resize, registering an
136
+ * item isn't a deliberate "make room for me" gesture, so relocating the new
137
+ * item to open space reads far better than shoving already-placed items
138
+ * around to accommodate it.
139
+ */
140
+ declare function findFreeSpot<T extends LayoutNode>(items: readonly T[], config: GridItemConfig, cols: number, excludeId?: string): {
141
+ x: number;
142
+ y: number;
143
+ };
144
+
145
+ /**
146
+ * All pixel <-> grid-cell math lives here, in one RTL-aware place.
147
+ *
148
+ * Grid coordinates are always *logical* (reading-order): x = 0 is the first
149
+ * column in the direction text flows — the left edge in LTR, the right edge
150
+ * in RTL. Every physical (CSS `left`/pixel) calculation goes through here so
151
+ * the rest of the codebase never has to think about direction again.
152
+ */
153
+ interface GridMetrics {
154
+ /** Inner content width available for columns (container width minus padding). */
155
+ contentWidth: number;
156
+ colWidth: number;
157
+ rowHeight: number;
158
+ gap: number;
159
+ padding: number;
160
+ }
161
+ declare function computeMetrics(containerWidth: number, options: IGridLayoutOptions): GridMetrics;
162
+ /** Physical CSS `left` (px, relative to the grid surface's content box) for a logical column. */
163
+ declare function colToLeft(colIndex: number, spanCols: number, m: GridMetrics, rtl: boolean): number;
164
+ declare function rowToTop(rowIndex: number, m: GridMetrics): number;
165
+ declare function spanToWidthPx(spanCols: number, m: GridMetrics): number;
166
+ declare function spanToHeightPx(spanRows: number, m: GridMetrics): number;
167
+ /** Physical left px (as above) -> nearest logical column index. Inverse of `colToLeft`. */
168
+ declare function leftToCol(leftPx: number, spanCols: number, m: GridMetrics, rtl: boolean): number;
169
+ declare function topToRow(topPx: number, m: GridMetrics): number;
170
+ /** Places an item's pixel box (left/top/width/height) inside the grid surface, RTL-aware. */
171
+ declare function placeItem(config: GridItemConfig, m: GridMetrics, rtl: boolean): {
172
+ left: number;
173
+ top: number;
174
+ width: number;
175
+ height: number;
176
+ };
177
+
178
+ interface GridItemState {
179
+ id: string;
180
+ config: GridItemConfig;
181
+ element?: HTMLElement;
182
+ dragging?: boolean;
183
+ resizing?: boolean;
184
+ }
185
+ declare class GridLayoutService {
186
+ readonly options: _angular_core.WritableSignal<GridLayoutOptions>;
187
+ readonly items: _angular_core.WritableSignal<readonly GridItemState[]>;
188
+ readonly editMode: _angular_core.WritableSignal<boolean>;
189
+ readonly activeId: _angular_core.WritableSignal<string | null>;
190
+ readonly isInteracting: _angular_core.Signal<boolean>;
191
+ readonly height: _angular_core.Signal<number>;
192
+ readonly layout: _angular_core.Signal<LayoutOutput[]>;
193
+ readonly columns: _angular_core.Signal<number>;
194
+ readonly rtl: _angular_core.Signal<boolean>;
195
+ private rtlTick;
196
+ private layoutListener?;
197
+ private startConfig;
198
+ private startItems;
199
+ private previewItems;
200
+ private _element;
201
+ private placeholder?;
202
+ constructor();
203
+ connect(onLayout: (layout: LayoutOutput[]) => void): void;
204
+ setOptions(value: Partial<IGridLayoutOptions>): void;
205
+ setEditMode(value: boolean): void;
206
+ setItems(items: GridItemState[]): void;
207
+ registerItem(item: GridItemState): void;
208
+ updateItemConfig(id: string, config: GridItemConfig): void;
209
+ unregisterItem(id: string): void;
210
+ /** Called once the grid surface element exists (e.g. from `ngAfterViewInit`). */
211
+ attachElement(el: HTMLElement): void;
212
+ /** Recomputes pixel positions after the surface resizes. Call from a `ResizeObserver`. */
213
+ refreshMetrics(): void;
214
+ isItemDraggable(item: GridItemState): boolean;
215
+ isItemResizable(item: GridItemState): boolean;
216
+ begin(id: string): void;
217
+ move(id: string): void;
218
+ resize(id: string, out: {
219
+ width: number;
220
+ height: number;
221
+ moveLeft: number;
222
+ moveTop: number;
223
+ }): void;
224
+ end(id: string): void;
225
+ /** Moves an item by whole grid cells — used by arrow-key handling in the item component. */
226
+ moveByCells(id: string, dCols: number, dRows: number): void;
227
+ /** Resizes an item by whole grid cells — used by shift+arrow handling in the item component. */
228
+ resizeByCells(id: string, dCols: number, dRows: number): void;
229
+ private preview;
230
+ private screenToGrid;
231
+ private screenResizeToGrid;
232
+ private clamp;
233
+ private clampSize;
234
+ /** Applies pushes on drag-end and, when configured, removes gaps via compaction. */
235
+ private settle;
236
+ private applyCss;
237
+ private metrics;
238
+ private resolveRtl;
239
+ private calculateHeight;
240
+ private emit;
241
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GridLayoutService, never>;
242
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<GridLayoutService>;
243
+ }
244
+
245
+ declare class NgxGridLayoutComponent implements AfterViewInit, OnDestroy {
246
+ readonly options: _angular_core.InputSignal<IGridLayoutOptions>;
247
+ readonly editMode: _angular_core.InputSignal<boolean>;
248
+ readonly layoutChange: _angular_core.OutputEmitterRef<LayoutOutput[]>;
249
+ /** Explicit direction override. Leave unset to inherit the page/host direction automatically. */
250
+ readonly dir: _angular_core.InputSignal<"rtl" | "ltr" | undefined>;
251
+ readonly dirOverride: _angular_core.InputSignal<"rtl" | "ltr" | undefined>;
252
+ readonly service: GridLayoutService;
253
+ private readonly el;
254
+ private surface?;
255
+ private resizeObserver?;
256
+ constructor();
257
+ ngAfterViewInit(): void;
258
+ ngOnDestroy(): void;
259
+ setItems(items: GridItemState[]): void;
260
+ update(options: Partial<IGridLayoutOptions>): void;
261
+ private setCss;
262
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxGridLayoutComponent, never>;
263
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxGridLayoutComponent, "ngx-grid-layout", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "editMode": { "alias": "editMode"; "required": false; "isSignal": true; }; "dir": { "alias": "dir"; "required": false; "isSignal": true; }; }, { "layoutChange": "layoutChange"; }, never, ["*"], true, never>;
264
+ }
265
+
266
+ declare class NgxGridItemComponent implements OnDestroy, OnInit {
267
+ /** Bound as `[id]` in templates (matches the demo app's existing usage). */
268
+ readonly itemId: _angular_core.InputSignal<string | undefined>;
269
+ readonly config: _angular_core.InputSignal<GridItemConfig>;
270
+ readonly layoutChange: _angular_core.OutputEmitterRef<GridItemConfig>;
271
+ readonly dragging: _angular_core.WritableSignal<boolean>;
272
+ readonly resizing: _angular_core.WritableSignal<boolean>;
273
+ readonly active: _angular_core.Signal<boolean>;
274
+ readonly transitionStyle: _angular_core.Signal<"none" | "left .18s ease, top .18s ease, width .18s ease, height .18s ease">;
275
+ readonly interactive: _angular_core.Signal<boolean>;
276
+ private readonly service;
277
+ private readonly el;
278
+ private readonly drag;
279
+ private readonly resize;
280
+ readonly resizable: _angular_core.Signal<boolean>;
281
+ constructor();
282
+ ngOnInit(): void;
283
+ ngOnDestroy(): void;
284
+ onDragStart: () => void;
285
+ onDragMove: () => void;
286
+ onDragEnd: () => void;
287
+ onResizeStart: () => void;
288
+ onResizeMove: (v: {
289
+ width: number;
290
+ height: number;
291
+ moveLeft: number;
292
+ moveTop: number;
293
+ }) => void;
294
+ onResizeEnd: () => void;
295
+ /** Arrow keys move the item by one cell; Shift+arrow resizes it by one cell. */
296
+ onKeyDown(e: KeyboardEvent): void;
297
+ private finishInteraction;
298
+ /** Converts the item's min/max cell counts (config) into px for the resize directive. */
299
+ private applySizeConstraints;
300
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxGridItemComponent, never>;
301
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxGridItemComponent, "ngx-grid-item", never, { "itemId": { "alias": "id"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; }, { "layoutChange": "layoutChange"; }, never, ["*"], true, [{ directive: typeof i1.NgxDraggable; inputs: { "dragHandle": "dragHandle"; "lockAxis": "lockAxis"; }; outputs: {}; }, { directive: typeof i1.NgxResizable; inputs: {}; outputs: {}; }]>;
302
+ }
303
+
304
+ declare class NgxGridLayoutModule {
305
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxGridLayoutModule, never>;
306
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<NgxGridLayoutModule, never, [typeof NgxGridLayoutComponent, typeof NgxGridItemComponent], [typeof NgxGridLayoutComponent, typeof NgxGridItemComponent]>;
307
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<NgxGridLayoutModule>;
308
+ }
309
+
310
+ export { GridItemConfig, GridLayoutOptions, GridLayoutService, NgxGridItemComponent, NgxGridLayoutComponent, NgxGridLayoutModule, colToLeft, collides, compact, computeMetrics, findFreeSpot, getAllCollisions, getFirstCollision, gridItemConfigsEqual, leftToCol, maxOccupiedRow, moveItem, normalizeGridItem, placeItem, rowToTop, spanToHeightPx, spanToWidthPx, topToRow, trySwap };
311
+ export type { CompactMode, GridFlow, GridItemState, GridMetrics, IGridBackgroundCfg, IGridLayoutOptions, LayoutNode, LayoutOutput, MoveOptions };
@@ -96,7 +96,7 @@ declare const DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION: NgxImageEditorLocalization;
96
96
  * شدن‌شون می‌شد).
97
97
  */
98
98
  declare class NgxImageEditorComponent {
99
- source: _angular_core.InputSignal<string | File | Blob | null>;
99
+ source: _angular_core.InputSignal<string | Blob | File | null>;
100
100
  /** قفل نسبتِ کراپ (مثلاً ۱ برای آواتار مربعی)؛ undefined یعنی آزاد */
101
101
  aspectRatio: _angular_core.InputSignal<number | undefined>;
102
102
  outputMaxWidth: _angular_core.InputSignal<number | undefined>;
@@ -210,6 +210,17 @@ declare function randomStrnig(extraLength?: number, useNumeric?: boolean): strin
210
210
 
211
211
  declare function makeConfetti(doc: Document, wrap: HTMLElement): void;
212
212
 
213
+ declare function generateSequentialGuid(): string;
214
+
215
+ /**
216
+ * Performs a deep merge of objects and returns new object. Does not modify
217
+ * objects (immutable) and merges arrays via concatenation.
218
+ *
219
+ * @param {...object} objects - Objects to merge
220
+ * @returns {object} New object with merged key/values
221
+ */
222
+ declare function mergeDeep(...objects: any[]): any;
223
+
213
224
  declare class BrowserService {
214
225
  private platformId;
215
226
  constructor(platformId: object);
@@ -331,5 +342,5 @@ interface OverlayInstance {
331
342
  cleanup: () => void;
332
343
  }
333
344
 
334
- export { BrowserService, DIALOG_OVERLAY_CLASSNAME, DirectionService, FOCUSABLE_SELECTOR, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, getOffsetPosition, makeConfetti, mergeConfig, randomStrnig, startDragSession };
345
+ export { BrowserService, DIALOG_OVERLAY_CLASSNAME, DirectionService, FOCUSABLE_SELECTOR, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, generateSequentialGuid, getOffsetPosition, makeConfetti, mergeConfig, mergeDeep, randomStrnig, startDragSession };
335
346
  export type { Alignment, BaseOverlayOptions, Direction, DragSessionCallbacks, IPosition, IValue, OverlayInstance, OverlayOptions, Placement, Point, TemplateOptions };