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.
- package/README.md +3 -3
- package/angle-selector/README.md +34 -34
- package/box-shadow/README.md +33 -33
- package/color-picker/README.md +52 -49
- package/data-table/README.md +120 -113
- package/date-picker/README.md +74 -69
- package/dialog/README.md +92 -92
- package/drag-resize/README.md +55 -0
- package/dropzone/README.md +422 -422
- package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
- package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
- package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-color-picker.mjs +265 -73
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-data-table.mjs +2 -2
- package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
- package/fesm2022/ngx-kit-date-picker.mjs +7 -9
- package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs +3 -3
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-drag-resize.mjs +1664 -0
- package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -0
- package/fesm2022/ngx-kit-drawer-menu.mjs +389 -285
- package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-dropzone.mjs +2 -2
- package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
- package/fesm2022/ngx-kit-form-field.mjs +3 -5
- package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
- package/fesm2022/ngx-kit-gallery.mjs +2 -2
- package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
- package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-grid-layout.mjs +994 -0
- package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -0
- package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
- package/fesm2022/ngx-kit-menu.mjs +8 -8
- package/fesm2022/ngx-kit-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-notify.mjs +2 -2
- package/fesm2022/ngx-kit-notify.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +54 -3
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/fesm2022/ngx-kit-time-picker.mjs +2 -2
- package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-virtual-scroll.mjs +392 -0
- package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -0
- package/fesm2022/ngx-kit-webflow.mjs +709 -0
- package/fesm2022/ngx-kit-webflow.mjs.map +1 -0
- package/gallery/README.md +71 -71
- package/gradient-picker/README.md +41 -41
- package/grid-layout/README.md +64 -0
- package/image-editor/README.md +12 -12
- package/menu/README.md +85 -85
- package/message/README.md +70 -70
- package/notify/README.md +56 -58
- package/package.json +17 -1
- package/shared/README.md +117 -117
- package/time-picker/README.md +89 -95
- package/types/ngx-kit-color-picker.d.ts +72 -16
- package/types/ngx-kit-drag-resize.d.ts +368 -0
- package/types/ngx-kit-drawer-menu.d.ts +135 -86
- package/types/ngx-kit-grid-layout.d.ts +311 -0
- package/types/ngx-kit-image-editor.d.ts +1 -1
- package/types/ngx-kit-shared.d.ts +12 -1
- package/types/ngx-kit-virtual-scroll.d.ts +179 -0
- package/types/ngx-kit-webflow.d.ts +286 -0
- 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 = '
|
|
11
|
-
type
|
|
12
|
-
|
|
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
|
-
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Pinned state.
|
|
69
|
+
*
|
|
70
|
+
* Useful for desktop layouts.
|
|
71
|
+
*
|
|
72
|
+
* [(pinned)]="sidebarPinned"
|
|
73
|
+
*/
|
|
47
74
|
readonly pinned: _angular_core.ModelSignal<boolean>;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
readonly
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
readonly
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
private
|
|
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
|
|
88
|
-
|
|
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
|
-
|
|
148
|
+
close(): void;
|
|
93
149
|
pin(): void;
|
|
94
150
|
unpin(): void;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
private
|
|
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; }; "
|
|
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 {
|
|
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 |
|
|
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 };
|