ngx-kit 7.0.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.
@@ -139,6 +139,17 @@ function moveItem(items, id, x, y, opts, depth = 0) {
139
139
  let guard = 0;
140
140
  while (guard++ < arr.length + 24) {
141
141
  const mover = arr.find((i) => i.id === id);
142
+ const staticBlocker = arr.find((i) => i.id !== id && isStatic(i) && collides(mover.config, i.config));
143
+ if (staticBlocker) {
144
+ if (opts.compact === 'horizontal') {
145
+ mover.config.x = staticBlocker.config.x + staticBlocker.config.w;
146
+ }
147
+ else {
148
+ mover.config.y = staticBlocker.config.y + staticBlocker.config.h;
149
+ }
150
+ clampToCols(mover.config, opts.cols);
151
+ continue; // the new position may collide with something else — re-check from the top.
152
+ }
142
153
  const blockers = arr
143
154
  .filter((i) => i.id !== id && !isStatic(i) && collides(mover.config, i.config))
144
155
  .sort(compareFn);
@@ -164,6 +175,8 @@ function compareForCompaction(mode) {
164
175
  * caller (service) decides when to offer this vs. falling back to `moveItem`.
165
176
  */
166
177
  function trySwap(items, id, previous, next) {
178
+ if (items.some((i) => i.id !== id && isStatic(i) && collides(i.config, next)))
179
+ return null;
167
180
  const collisions = items.filter((i) => i.id !== id && !isStatic(i) && collides(i.config, next));
168
181
  if (collisions.length !== 1)
169
182
  return null;
@@ -212,6 +225,38 @@ function compact(items, mode) {
212
225
  function maxOccupiedRow(items) {
213
226
  return items.reduce((max, i) => Math.max(max, i.config.y + i.config.h), 0);
214
227
  }
228
+ /**
229
+ * Finds a cell for `config` that doesn't collide with any existing item.
230
+ * Tries the requested (x, y) first; if that's already occupied, scans
231
+ * forward in reading order (row by row, top to bottom, left to right — the
232
+ * caller is responsible for any RTL flipping when it turns this back into
233
+ * pixels) for the first gap large enough to fit it.
234
+ *
235
+ * This is what a newly-registered item (or one whose config changes to a
236
+ * position that's no longer free) should go through instead of silently
237
+ * overlapping whatever's already there: unlike a drag/resize, registering an
238
+ * item isn't a deliberate "make room for me" gesture, so relocating the new
239
+ * item to open space reads far better than shoving already-placed items
240
+ * around to accommodate it.
241
+ */
242
+ function findFreeSpot(items, config, cols, excludeId) {
243
+ const others = excludeId ? items.filter((i) => i.id !== excludeId) : items;
244
+ const fits = (x, y) => !others.some((i) => collides(i.config, { ...config, x, y }));
245
+ const startX = Math.max(0, Math.min(config.x, cols - config.w));
246
+ const startY = Math.max(0, config.y);
247
+ if (fits(startX, startY))
248
+ return { x: startX, y: startY };
249
+ // The row just past the current bottom is always fully empty, so this loop
250
+ // is guaranteed to find a fit no later than `maxY`.
251
+ const maxY = maxOccupiedRow(others) + 1;
252
+ for (let y = 0; y <= maxY; y++) {
253
+ for (let x = 0; x <= cols - config.w; x++) {
254
+ if (fits(x, y))
255
+ return { x, y };
256
+ }
257
+ }
258
+ return { x: startX, y: maxY + 1 };
259
+ }
215
260
 
216
261
  function computeMetrics(containerWidth, options) {
217
262
  const cols = Math.max(1, Math.floor(options.cols));
@@ -269,6 +314,30 @@ function itemsEqual(a, b) {
269
314
  return (!!itemB && itemA.element === itemB.element && gridItemConfigsEqual(itemA.config, itemB.config));
270
315
  });
271
316
  }
317
+ /** Value equality for two options objects — see `setOptions` for why this matters. */
318
+ function optionsEqual(a, b) {
319
+ const bg1 = a.gridBackgroundConfig ?? {};
320
+ const bg2 = b.gridBackgroundConfig ?? {};
321
+ return (a.cols === b.cols &&
322
+ a.rowHeight === b.rowHeight &&
323
+ a.gap === b.gap &&
324
+ a.padding === b.padding &&
325
+ a.flow === b.flow &&
326
+ a.compact === b.compact &&
327
+ a.allowOverlap === b.allowOverlap &&
328
+ a.pushItems === b.pushItems &&
329
+ a.swap === b.swap &&
330
+ a.dragThreshold === b.dragThreshold &&
331
+ a.animate === b.animate &&
332
+ a.rtl === b.rtl &&
333
+ (a.maxRows ?? null) === (b.maxRows ?? null) &&
334
+ bg1.show === bg2.show &&
335
+ bg1.borderColor === bg2.borderColor &&
336
+ bg1.gapColor === bg2.gapColor &&
337
+ bg1.rowColor === bg2.rowColor &&
338
+ bg1.columnColor === bg2.columnColor &&
339
+ bg1.borderWidth === bg2.borderWidth);
340
+ }
272
341
  class GridLayoutService {
273
342
  options = signal(new GridLayoutOptions(), /* @ts-ignore */
274
343
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
@@ -286,8 +355,10 @@ class GridLayoutService {
286
355
  ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
287
356
  columns = computed(() => Math.max(1, Math.floor(this.options().cols)), /* @ts-ignore */
288
357
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
289
- /** Resolves `rtl: 'auto'` against the attached element's *actual* computed direction. */
290
- rtl = computed(() => this.resolveRtl(), /* @ts-ignore */
358
+ rtl = computed(() => {
359
+ this.rtlTick();
360
+ return this.resolveRtl();
361
+ }, /* @ts-ignore */
291
362
  ...(ngDevMode ? [{ debugName: "rtl" }] : /* istanbul ignore next */ []));
292
363
  rtlTick = signal(0, /* @ts-ignore */
293
364
  ...(ngDevMode ? [{ debugName: "rtlTick" }] : /* istanbul ignore next */ []));
@@ -313,7 +384,10 @@ class GridLayoutService {
313
384
  this.layoutListener = onLayout;
314
385
  }
315
386
  setOptions(value) {
316
- this.options.update((o) => Object.assign(new GridLayoutOptions(), o, value));
387
+ const next = Object.assign(new GridLayoutOptions(), this.options(), value);
388
+ if (optionsEqual(this.options(), next))
389
+ return;
390
+ this.options.set(next);
317
391
  }
318
392
  setEditMode(value) {
319
393
  this.editMode.set(value);
@@ -323,18 +397,14 @@ class GridLayoutService {
323
397
  this.settle();
324
398
  this.emit();
325
399
  }
326
- /**
327
- * Registers a new item, or refreshes the DOM element reference of one that's
328
- * already tracked. Adding an item can shift the whole layout (compaction /
329
- * push), so that path settles. Merely re-supplying the same element on an
330
- * already-known id has no geometric effect, so it is a deliberate no-op —
331
- * skipping it is what keeps a per-item `effect()` that calls this on every
332
- * change-detection pass from re-triggering `settle()` indefinitely.
333
- */
334
400
  registerItem(item) {
335
401
  const existing = this.items().find((x) => x.id === item.id);
336
402
  if (!existing) {
337
- this.items.update((xs) => [...xs, { ...item, config: normalizeGridItem(item.config) }]);
403
+ const normalized = normalizeGridItem(item.config);
404
+ const placed = this.options().allowOverlap
405
+ ? normalized
406
+ : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns()) };
407
+ this.items.update((xs) => [...xs, { ...item, config: placed }]);
338
408
  this.settle();
339
409
  return;
340
410
  }
@@ -342,20 +412,17 @@ class GridLayoutService {
342
412
  return;
343
413
  this.items.update((xs) => xs.map((x) => (x.id === item.id ? { ...x, element: item.element } : x)));
344
414
  }
345
- /**
346
- * Updates an item's config. Only writes the signal and re-settles the layout
347
- * when the *value* actually changed. Without this guard, any caller that
348
- * supplies a structurally-equal but referentially-new config object (e.g. a
349
- * template bound to a `computed()` layout) would cause an unconditional
350
- * `items.set()` on every run — which produces new output objects, which
351
- * feed back into that same new config reference, forever.
352
- */
353
415
  updateItemConfig(id, config) {
354
- const normalized = normalizeGridItem(config);
355
416
  const existing = this.items().find((x) => x.id === id);
356
- if (!existing || gridItemConfigsEqual(existing.config, normalized))
417
+ if (!existing)
418
+ return;
419
+ const normalized = normalizeGridItem(config);
420
+ const placed = this.options().allowOverlap
421
+ ? normalized
422
+ : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns(), id) };
423
+ if (gridItemConfigsEqual(existing.config, placed))
357
424
  return;
358
- this.items.update((xs) => xs.map((x) => (x.id === id ? { ...x, config: normalized } : x)));
425
+ this.items.update((xs) => xs.map((x) => (x.id === id ? { ...x, config: placed } : x)));
359
426
  this.settle();
360
427
  }
361
428
  unregisterItem(id) {
@@ -715,16 +782,16 @@ class NgxGridLayoutComponent {
715
782
  }
716
783
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxGridLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
717
784
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: NgxGridLayoutComponent, isStandalone: true, selector: "ngx-grid-layout", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, editMode: { classPropertyName: "editMode", publicName: "editMode", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layoutChange: "layoutChange" }, host: { properties: { "class.ngx-grid-layout--dragging": "service.isInteracting()", "class.ngx-grid-layout--view": "!editMode()", "style.height.px": "service.height()", "attr.dir": "dirOverride() ?? null" } }, ngImport: i0, template: `
718
- <div class="ngx-grid-layout__surface">
785
+ <div class="ngx-grid-layout__surface" [class.edit-mode]="editMode()">
719
786
  <div class="ngx-grid-layout__placeholder"></div>
720
787
  <ng-content />
721
788
  </div>
722
- `, isInline: true, styles: [":host{display:block;position:relative;contain:layout style;min-height:1px}.ngx-grid-layout__surface{position:relative;width:100%;height:100%;min-height:inherit}.ngx-grid-layout__placeholder{display:none;position:absolute;box-sizing:border-box;pointer-events:none;z-index:0;border:2px dashed currentColor;border-radius:inherit;opacity:.45}.ngx-grid-layout__surface:before{content:\"\";position:absolute;inset:0;pointer-events:none;opacity:var(--grid-bg-opacity);border:var(--grid-border-width) solid var(--grid-border-color);box-sizing:border-box;transition:opacity .15s ease;background-image:repeating-linear-gradient(var(--grid-border-color) 0 var(--grid-border-width),var(--grid-row-color) var(--grid-border-width) calc(var(--grid-row) - var(--grid-border-width)),var(--grid-border-color) calc(var(--grid-row) - var(--grid-border-width)) calc(var(--grid-row)),var(--grid-gap-color) calc(var(--grid-row)) calc(var(--grid-row) + var(--grid-gap))),repeating-linear-gradient(90deg,var(--grid-border-color) 0 var(--grid-border-width),var(--grid-col-color) var(--grid-border-width) calc(100% - (var(--grid-border-width) + var(--grid-gap))),var(--grid-border-color) calc(100% - (var(--grid-border-width) + var(--grid-gap))) calc(100% - var(--grid-gap)),var(--grid-gap-color) calc(100% - var(--grid-gap)) 100%);background-size:calc((100% + var(--grid-gap)) / var(--grid-cols)) calc(var(--grid-row) + var(--grid-gap));background-position:0 0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
789
+ `, isInline: true, styles: [":host{display:block;position:relative;contain:layout style;min-height:1px}.ngx-grid-layout__surface{position:relative;width:100%;height:100%;min-height:inherit}.ngx-grid-layout__placeholder{display:none;position:absolute;box-sizing:border-box;pointer-events:none;z-index:0;border:2px dashed currentColor;border-radius:inherit;opacity:.45}.ngx-grid-layout__surface.edit-mode:before{content:\"\";position:absolute;inset:0;pointer-events:none;opacity:var(--grid-bg-opacity);border:var(--grid-border-width) solid var(--grid-border-color);box-sizing:border-box;transition:opacity .15s ease;background-image:repeating-linear-gradient(var(--grid-border-color) 0 var(--grid-border-width),var(--grid-row-color) var(--grid-border-width) calc(var(--grid-row) - var(--grid-border-width)),var(--grid-border-color) calc(var(--grid-row) - var(--grid-border-width)) calc(var(--grid-row)),var(--grid-gap-color) calc(var(--grid-row)) calc(var(--grid-row) + var(--grid-gap))),repeating-linear-gradient(90deg,var(--grid-border-color) 0 var(--grid-border-width),var(--grid-col-color) var(--grid-border-width) calc(100% - (var(--grid-border-width) + var(--grid-gap))),var(--grid-border-color) calc(100% - (var(--grid-border-width) + var(--grid-gap))) calc(100% - var(--grid-gap)),var(--grid-gap-color) calc(100% - var(--grid-gap)) 100%);background-size:calc((100% + var(--grid-gap)) / var(--grid-cols)) calc(var(--grid-row) + var(--grid-gap));background-position:0 0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
723
790
  }
724
791
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxGridLayoutComponent, decorators: [{
725
792
  type: Component,
726
793
  args: [{ selector: 'ngx-grid-layout', standalone: true, template: `
727
- <div class="ngx-grid-layout__surface">
794
+ <div class="ngx-grid-layout__surface" [class.edit-mode]="editMode()">
728
795
  <div class="ngx-grid-layout__placeholder"></div>
729
796
  <ng-content />
730
797
  </div>
@@ -733,7 +800,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
733
800
  '[class.ngx-grid-layout--view]': '!editMode()',
734
801
  '[style.height.px]': 'service.height()',
735
802
  '[attr.dir]': 'dirOverride() ?? null',
736
- }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;position:relative;contain:layout style;min-height:1px}.ngx-grid-layout__surface{position:relative;width:100%;height:100%;min-height:inherit}.ngx-grid-layout__placeholder{display:none;position:absolute;box-sizing:border-box;pointer-events:none;z-index:0;border:2px dashed currentColor;border-radius:inherit;opacity:.45}.ngx-grid-layout__surface:before{content:\"\";position:absolute;inset:0;pointer-events:none;opacity:var(--grid-bg-opacity);border:var(--grid-border-width) solid var(--grid-border-color);box-sizing:border-box;transition:opacity .15s ease;background-image:repeating-linear-gradient(var(--grid-border-color) 0 var(--grid-border-width),var(--grid-row-color) var(--grid-border-width) calc(var(--grid-row) - var(--grid-border-width)),var(--grid-border-color) calc(var(--grid-row) - var(--grid-border-width)) calc(var(--grid-row)),var(--grid-gap-color) calc(var(--grid-row)) calc(var(--grid-row) + var(--grid-gap))),repeating-linear-gradient(90deg,var(--grid-border-color) 0 var(--grid-border-width),var(--grid-col-color) var(--grid-border-width) calc(100% - (var(--grid-border-width) + var(--grid-gap))),var(--grid-border-color) calc(100% - (var(--grid-border-width) + var(--grid-gap))) calc(100% - var(--grid-gap)),var(--grid-gap-color) calc(100% - var(--grid-gap)) 100%);background-size:calc((100% + var(--grid-gap)) / var(--grid-cols)) calc(var(--grid-row) + var(--grid-gap));background-position:0 0}\n"] }]
803
+ }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;position:relative;contain:layout style;min-height:1px}.ngx-grid-layout__surface{position:relative;width:100%;height:100%;min-height:inherit}.ngx-grid-layout__placeholder{display:none;position:absolute;box-sizing:border-box;pointer-events:none;z-index:0;border:2px dashed currentColor;border-radius:inherit;opacity:.45}.ngx-grid-layout__surface.edit-mode:before{content:\"\";position:absolute;inset:0;pointer-events:none;opacity:var(--grid-bg-opacity);border:var(--grid-border-width) solid var(--grid-border-color);box-sizing:border-box;transition:opacity .15s ease;background-image:repeating-linear-gradient(var(--grid-border-color) 0 var(--grid-border-width),var(--grid-row-color) var(--grid-border-width) calc(var(--grid-row) - var(--grid-border-width)),var(--grid-border-color) calc(var(--grid-row) - var(--grid-border-width)) calc(var(--grid-row)),var(--grid-gap-color) calc(var(--grid-row)) calc(var(--grid-row) + var(--grid-gap))),repeating-linear-gradient(90deg,var(--grid-border-color) 0 var(--grid-border-width),var(--grid-col-color) var(--grid-border-width) calc(100% - (var(--grid-border-width) + var(--grid-gap))),var(--grid-border-color) calc(100% - (var(--grid-border-width) + var(--grid-gap))) calc(100% - var(--grid-gap)),var(--grid-gap-color) calc(100% - var(--grid-gap)) 100%);background-size:calc((100% + var(--grid-gap)) / var(--grid-cols)) calc(var(--grid-row) + var(--grid-gap));background-position:0 0}\n"] }]
737
804
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], editMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editMode", required: false }] }], layoutChange: [{ type: i0.Output, args: ["layoutChange"] }], dir: [{ type: i0.Input, args: [{ isSignal: true, alias: "dir", required: false }] }] } });
738
805
 
739
806
  class NgxGridItemComponent {
@@ -763,7 +830,7 @@ class NgxGridItemComponent {
763
830
  drag = inject(NgxDraggable);
764
831
  resize = inject(NgxResizable);
765
832
  resizable = computed(() => {
766
- return !this.resize.disabled;
833
+ return !this.resize.disabled && this.service.editMode();
767
834
  }, /* @ts-ignore */
768
835
  ...(ngDevMode ? [{ debugName: "resizable" }] : /* istanbul ignore next */ []));
769
836
  constructor() {
@@ -923,5 +990,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
923
990
  * Generated bundle index. Do not edit.
924
991
  */
925
992
 
926
- export { GridItemConfig, GridLayoutOptions, GridLayoutService, NgxGridItemComponent, NgxGridLayoutComponent, NgxGridLayoutModule, colToLeft, collides, compact, computeMetrics, getAllCollisions, getFirstCollision, gridItemConfigsEqual, leftToCol, maxOccupiedRow, moveItem, normalizeGridItem, placeItem, rowToTop, spanToHeightPx, spanToWidthPx, topToRow, trySwap };
993
+ 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 };
927
994
  //# sourceMappingURL=ngx-kit-grid-layout.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-grid-layout.mjs","sources":["../../../projects/libs/grid-layout/options/options.ts","../../../projects/libs/grid-layout/options/grid-item-config.ts","../../../projects/libs/grid-layout/utils/collision.ts","../../../projects/libs/grid-layout/utils/compaction.ts","../../../projects/libs/grid-layout/utils/geometry.ts","../../../projects/libs/grid-layout/services/grid-layout.service.ts","../../../projects/libs/grid-layout/grid-layout/grid-layout.component.ts","../../../projects/libs/grid-layout/grid-item/grid-item.component.ts","../../../projects/libs/grid-layout/ngx-grid-layout.module.ts","../../../projects/libs/grid-layout/ngx-kit-grid-layout.ts"],"sourcesContent":["export type GridFlow = 'free' | 'horizontal' | 'vertical';\nexport type CompactMode = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport interface IGridBackgroundCfg {\n show?: 'never' | 'always' | 'whenDragging';\n borderColor?: string;\n gapColor?: string;\n rowColor?: string;\n columnColor?: string;\n borderWidth?: number;\n}\n\nexport interface IGridLayoutOptions {\n cols: number;\n rowHeight: number | 'fit';\n gap?: number;\n padding?: number;\n flow?: GridFlow;\n compact?: CompactMode;\n allowOverlap?: boolean;\n pushItems?: boolean;\n /** When two items would swap places, prefer swapping over cascading a push. */\n swap?: boolean;\n dragThreshold?: number;\n animate?: boolean;\n /**\n * `true` / `false` force a direction; `'auto'` (default) reads the host element's\n * computed `direction`, so the grid follows the surrounding page automatically.\n */\n rtl?: boolean | 'auto';\n /** Caps the number of rows the grid can grow to. `undefined` = unbounded. */\n maxRows?: number;\n gridBackgroundConfig?: IGridBackgroundCfg;\n}\n\nexport class GridLayoutOptions implements IGridLayoutOptions {\n cols = 12;\n rowHeight: number | 'fit' = 50;\n gap = 8;\n padding = 0;\n flow = 'free' as GridFlow;\n compact = 'vertical' as CompactMode;\n allowOverlap = false;\n pushItems = true;\n swap = false;\n dragThreshold = 3;\n animate = true;\n rtl = 'auto' as boolean | 'auto';\n maxRows?: number;\n gridBackgroundConfig: IGridBackgroundCfg = {\n show: 'always' as const,\n borderColor: 'rgba(128,128,128,.16)',\n gapColor: 'transparent',\n rowColor: 'rgba(128,128,128,.07)',\n columnColor: 'rgba(128,128,128,.07)',\n borderWidth: 1,\n };\n}\n","export class GridItemConfig {\n x: number;\n y: number;\n w: number;\n h: number;\n minW?: number;\n minH?: number;\n maxW?: number;\n maxH?: number;\n /** Item can't be dragged or resized, and never moves during compaction/push. */\n static?: boolean;\n /** Overrides the layout-level draggable/resizable flags for this item only. */\n isDraggable?: boolean;\n isResizable?: boolean;\n\n constructor(x: number = 0, y: number = 0, w: number = 1, h: number = 1, s?: boolean) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n this.static = s == true;\n }\n}\n\nexport const normalizeGridItem = (value?: Partial<GridItemConfig>): GridItemConfig => ({\n x: Math.max(0, Math.floor(value?.x ?? 0)),\n y: Math.max(0, Math.floor(value?.y ?? 0)),\n w: Math.max(1, Math.floor(value?.w ?? 1)),\n h: Math.max(1, Math.floor(value?.h ?? 1)),\n minW: value?.minW,\n minH: value?.minH,\n maxW: value?.maxW,\n maxH: value?.maxH,\n static: value?.static ?? false,\n isDraggable: value?.isDraggable,\n isResizable: value?.isResizable,\n});\n\n/**\n * Value equality for two (already-normalized) configs.\n *\n * This is what breaks the register -> settle -> new-object -> re-register\n * feedback loop: signals compare by *reference*, so anything that recomputes\n * a fresh config object on every change-detection pass (a `computed()` layout,\n * an inline object literal in a template, etc.) will always look \"changed\" to\n * an `effect()` even when nothing meaningful did. Callers must compare by\n * value before writing back to a signal, otherwise the write itself produces\n * a new reference that trips the same effect again — forever.\n */\nexport function gridItemConfigsEqual(a: GridItemConfig, b: GridItemConfig): boolean {\n return (\n a.x === b.x &&\n a.y === b.y &&\n a.w === b.w &&\n a.h === b.h &&\n (a.minW ?? null) === (b.minW ?? null) &&\n (a.minH ?? null) === (b.minH ?? null) &&\n (a.maxW ?? null) === (b.maxW ?? null) &&\n (a.maxH ?? null) === (b.maxH ?? null) &&\n !!a.static === !!b.static &&\n (a.isDraggable ?? null) === (b.isDraggable ?? null) &&\n (a.isResizable ?? null) === (b.isResizable ?? null)\n );\n}\n","import { GridItemConfig } from '../options/grid-item-config';\n\nexport interface LayoutNode {\n id: string;\n config: GridItemConfig;\n}\n\n/** Axis-aligned bounding-box overlap test in grid-cell space. */\nexport function collides(a: GridItemConfig, b: GridItemConfig): boolean {\n return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;\n}\n\n/** First item (other than `self`) whose cells overlap `config`, or null. */\nexport function getFirstCollision<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T | null {\n for (const item of items) {\n if (item.id === selfId) continue;\n if (collides(item.config, config)) return item;\n }\n return null;\n}\n\n/** All items whose cells overlap `config`, excluding `selfId`. */\nexport function getAllCollisions<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T[] {\n return items.filter((item) => item.id !== selfId && collides(item.config, config));\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport type { CompactMode } from '../options/options';\nimport { LayoutNode, collides, getFirstCollision } from './collision';\n\nexport interface MoveOptions {\n cols: number;\n compact: CompactMode;\n allowOverlap: boolean;\n maxRows?: number;\n}\n\nfunction isStatic(node: LayoutNode): boolean {\n return !!node.config.static;\n}\n\nfunction clampToCols(config: GridItemConfig, cols: number): void {\n config.w = Math.min(Math.max(1, config.w), cols);\n config.x = Math.max(0, Math.min(config.x, cols - config.w));\n config.y = Math.max(0, config.y);\n}\n\nfunction clone<T extends LayoutNode>(items: readonly T[]): T[] {\n return items.map((i) => ({ ...i, config: { ...i.config } })) as T[];\n}\n\n/**\n * Moves `id` to grid cell (x, y) and, unless overlap is explicitly allowed,\n * cascades any resulting collisions by pushing the colliding items out of the\n * way (downward for vertical-flow grids, rightward for horizontal-flow ones).\n * Static items are treated as fixed obstacles: they block, but never move.\n * Pure function — returns a new array, never mutates its input.\n */\nexport function moveItem<T extends LayoutNode>(\n items: readonly T[],\n id: string,\n x: number,\n y: number,\n opts: MoveOptions,\n depth = 0,\n): T[] {\n let arr = clone(items);\n const item = arr.find((i) => i.id === id);\n if (!item || isStatic(item)) return arr;\n\n item.config.x = x;\n item.config.y = y;\n clampToCols(item.config, opts.cols);\n\n if (opts.allowOverlap || depth > arr.length + 24) return arr;\n\n const compareFn = compareForCompaction(opts.compact);\n let guard = 0;\n while (guard++ < arr.length + 24) {\n const mover = arr.find((i) => i.id === id)!;\n const blockers = arr\n .filter((i) => i.id !== id && !isStatic(i) && collides(mover.config, i.config))\n .sort(compareFn);\n if (blockers.length === 0) break;\n arr = pushAway(arr, mover, blockers[0], opts, depth + 1);\n }\n return arr;\n}\n\nfunction pushAway<T extends LayoutNode>(\n items: T[],\n mover: T,\n blocked: T,\n opts: MoveOptions,\n depth: number,\n): T[] {\n const targetX =\n opts.compact === 'horizontal' ? mover.config.x + mover.config.w : blocked.config.x;\n const targetY =\n opts.compact === 'horizontal' ? blocked.config.y : mover.config.y + mover.config.h;\n return moveItem(items, blocked.id, targetX, targetY, opts, depth);\n}\n\nfunction compareForCompaction(mode: CompactMode) {\n return (a: LayoutNode, b: LayoutNode) =>\n mode === 'horizontal'\n ? a.config.x - b.config.x || a.config.y - b.config.y\n : a.config.y - b.config.y || a.config.x - b.config.x;\n}\n\n/**\n * When the actively-moved item directly overlaps exactly one same-size item,\n * exchanging their positions reads much better than a cascading push. The\n * caller (service) decides when to offer this vs. falling back to `moveItem`.\n */\nexport function trySwap<T extends LayoutNode>(\n items: readonly T[],\n id: string,\n previous: GridItemConfig,\n next: GridItemConfig,\n): T[] | null {\n const collisions = items.filter((i) => i.id !== id && !isStatic(i) && collides(i.config, next));\n if (collisions.length !== 1) return null;\n const [target] = collisions;\n if (target.config.w !== next.w || target.config.h !== next.h) return null;\n const arr = clone(items);\n const mover = arr.find((i) => i.id === id)!;\n const other = arr.find((i) => i.id === target.id)!;\n mover.config.x = next.x;\n mover.config.y = next.y;\n other.config.x = previous.x;\n other.config.y = previous.y;\n return arr;\n}\n\n/**\n * Removes gaps by pulling every non-static item as far toward the start of the\n * grid as it can go without overlapping another item, in reading order.\n */\nexport function compact<T extends LayoutNode>(items: readonly T[], mode: CompactMode): T[] {\n const arr = clone(items);\n if (mode === 'none') return arr;\n const canX = mode === 'horizontal' || mode === 'both';\n const canY = mode === 'vertical' || mode === 'both';\n const sorted = [...arr].sort((a, b) => a.config.y - b.config.y || a.config.x - b.config.x);\n for (const item of sorted) {\n if (isStatic(item)) continue;\n if (canY) {\n let y = item.config.y;\n while (y > 0 && !getFirstCollision(arr, item.id, { ...item.config, y: y - 1 })) y--;\n item.config.y = y;\n }\n if (canX) {\n let x = item.config.x;\n while (x > 0 && !getFirstCollision(arr, item.id, { ...item.config, x: x - 1 })) x--;\n item.config.x = x;\n }\n }\n return arr;\n}\n\n/** Highest occupied row (0-based, exclusive) across all items — drives the grid's auto-height. */\nexport function maxOccupiedRow(items: readonly LayoutNode[]): number {\n return items.reduce((max, i) => Math.max(max, i.config.y + i.config.h), 0);\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport { IGridLayoutOptions } from '../options/options';\n\n/**\n * All pixel <-> grid-cell math lives here, in one RTL-aware place.\n *\n * Grid coordinates are always *logical* (reading-order): x = 0 is the first\n * column in the direction text flows — the left edge in LTR, the right edge\n * in RTL. Every physical (CSS `left`/pixel) calculation goes through here so\n * the rest of the codebase never has to think about direction again.\n */\nexport interface GridMetrics {\n /** Inner content width available for columns (container width minus padding). */\n contentWidth: number;\n colWidth: number;\n rowHeight: number;\n gap: number;\n padding: number;\n}\n\nexport function computeMetrics(containerWidth: number, options: IGridLayoutOptions): GridMetrics {\n const cols = Math.max(1, Math.floor(options.cols));\n const gap = options.gap ?? 0;\n const padding = options.padding ?? 0;\n const contentWidth = Math.max(0, containerWidth - padding * 2);\n const colWidth = Math.max(1, (contentWidth - gap * (cols - 1)) / cols);\n const rowHeight = options.rowHeight === 'fit' ? Math.max(1, colWidth) : Math.max(1, options.rowHeight);\n return { contentWidth, colWidth, rowHeight, gap, padding };\n}\n\n/** Physical CSS `left` (px, relative to the grid surface's content box) for a logical column. */\nexport function colToLeft(colIndex: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\n if (!rtl) return m.padding + colIndex * (m.colWidth + m.gap);\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\n const rightEdge = m.padding + colIndex * (m.colWidth + m.gap);\n return m.contentWidth + m.padding - rightEdge - widthPx;\n}\n\nexport function rowToTop(rowIndex: number, m: GridMetrics): number {\n return m.padding + rowIndex * (m.rowHeight + m.gap);\n}\n\nexport function spanToWidthPx(spanCols: number, m: GridMetrics): number {\n return spanCols * m.colWidth + Math.max(0, spanCols - 1) * m.gap;\n}\n\nexport function spanToHeightPx(spanRows: number, m: GridMetrics): number {\n return spanRows * m.rowHeight + Math.max(0, spanRows - 1) * m.gap;\n}\n\n/** Physical left px (as above) -> nearest logical column index. Inverse of `colToLeft`. */\nexport function leftToCol(leftPx: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\n if (!rtl) return Math.round((leftPx - m.padding) / (m.colWidth + m.gap));\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\n const rightEdge = m.contentWidth + m.padding - leftPx - widthPx;\n return Math.round((rightEdge - m.padding) / (m.colWidth + m.gap));\n}\n\nexport function topToRow(topPx: number, m: GridMetrics): number {\n return Math.round((topPx - m.padding) / (m.rowHeight + m.gap));\n}\n\n/** Places an item's pixel box (left/top/width/height) inside the grid surface, RTL-aware. */\nexport function placeItem(config: GridItemConfig, m: GridMetrics, rtl: boolean): { left: number; top: number; width: number; height: number } {\n return {\n left: colToLeft(config.x, config.w, m, rtl),\n top: rowToTop(config.y, m),\n width: spanToWidthPx(config.w, m),\n height: spanToHeightPx(config.h, m),\n };\n}\n","import { Injectable, computed, effect, signal } from '@angular/core';\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\nimport {\n normalizeGridItem,\n gridItemConfigsEqual,\n GridItemConfig,\n} from '../options/grid-item-config';\nimport { LayoutOutput } from '../options/layout-output';\nimport { computeMetrics, leftToCol, placeItem, topToRow, GridMetrics } from '../utils/geometry';\nimport { compact, maxOccupiedRow, moveItem, trySwap } from '../utils/compaction';\nimport { isRtl } from 'ngx-kit/drag-resize';\n\nexport interface GridItemState {\n id: string;\n config: GridItemConfig;\n element?: HTMLElement;\n dragging?: boolean;\n resizing?: boolean;\n}\n\n/** Structural + value equality for two item-state arrays (order-independent). */\nfunction itemsEqual(a: readonly GridItemState[], b: readonly GridItemState[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((itemA) => {\n const itemB = b.find((x) => x.id === itemA.id);\n return (\n !!itemB && itemA.element === itemB.element && gridItemConfigsEqual(itemA.config, itemB.config)\n );\n });\n}\n\n@Injectable()\nexport class GridLayoutService {\n readonly options = signal<GridLayoutOptions>(new GridLayoutOptions());\n readonly items = signal<readonly GridItemState[]>([]);\n readonly editMode = signal(true);\n readonly activeId = signal<string | null>(null);\n readonly isInteracting = computed(() => this.activeId() !== null);\n readonly height = computed(() => this.calculateHeight(this.items(), this.options()));\n readonly layout = computed<LayoutOutput[]>(() =>\n this.items().map((x) => ({ id: x.id, ...x.config })),\n );\n readonly columns = computed(() => Math.max(1, Math.floor(this.options().cols)));\n /** Resolves `rtl: 'auto'` against the attached element's *actual* computed direction. */\n readonly rtl = computed(() => this.resolveRtl());\n private rtlTick = signal(0);\n\n private layoutListener?: (layout: LayoutOutput[]) => void;\n private startConfig: GridItemConfig | null = null;\n private startItems: readonly GridItemState[] | null = null;\n private previewItems = signal<readonly GridItemState[] | null>(null);\n private _element!: HTMLElement;\n private placeholder?: HTMLElement;\n\n constructor() {\n effect(() => {\n // Re-run whenever options or items change so CSS positions always reflect state.\n this.options();\n this.items();\n this.previewItems();\n this.rtlTick();\n if (this._element) this.applyCss();\n });\n }\n\n connect(onLayout: (layout: LayoutOutput[]) => void): void {\n this.layoutListener = onLayout;\n }\n setOptions(value: Partial<IGridLayoutOptions>): void {\n this.options.update((o) => Object.assign(new GridLayoutOptions(), o, value));\n }\n setEditMode(value: boolean): void {\n this.editMode.set(value);\n }\n setItems(items: GridItemState[]): void {\n this.items.set(items.map((x) => ({ ...x, config: normalizeGridItem(x.config) })));\n this.settle();\n this.emit();\n }\n /**\n * Registers a new item, or refreshes the DOM element reference of one that's\n * already tracked. Adding an item can shift the whole layout (compaction /\n * push), so that path settles. Merely re-supplying the same element on an\n * already-known id has no geometric effect, so it is a deliberate no-op —\n * skipping it is what keeps a per-item `effect()` that calls this on every\n * change-detection pass from re-triggering `settle()` indefinitely.\n */\n registerItem(item: GridItemState): void {\n const existing = this.items().find((x) => x.id === item.id);\n if (!existing) {\n this.items.update((xs) => [...xs, { ...item, config: normalizeGridItem(item.config) }]);\n this.settle();\n return;\n }\n if (existing.element === item.element) return;\n this.items.update((xs) =>\n xs.map((x) => (x.id === item.id ? { ...x, element: item.element } : x)),\n );\n }\n\n /**\n * Updates an item's config. Only writes the signal and re-settles the layout\n * when the *value* actually changed. Without this guard, any caller that\n * supplies a structurally-equal but referentially-new config object (e.g. a\n * template bound to a `computed()` layout) would cause an unconditional\n * `items.set()` on every run — which produces new output objects, which\n * feed back into that same new config reference, forever.\n */\n updateItemConfig(id: string, config: GridItemConfig): void {\n const normalized = normalizeGridItem(config);\n const existing = this.items().find((x) => x.id === id);\n if (!existing || gridItemConfigsEqual(existing.config, normalized)) return;\n this.items.update((xs) => xs.map((x) => (x.id === id ? { ...x, config: normalized } : x)));\n this.settle();\n }\n unregisterItem(id: string): void {\n this.items.update((xs) => xs.filter((x) => x.id !== id));\n this.settle();\n this.emit();\n }\n\n /** Called once the grid surface element exists (e.g. from `ngAfterViewInit`). */\n attachElement(el: HTMLElement): void {\n this._element = el;\n this.placeholder =\n (el.querySelector('.ngx-grid-layout__placeholder') as HTMLElement | null) ?? undefined;\n if (this.placeholder) {\n this.placeholder.style.position = 'absolute';\n this.placeholder.style.display = 'none';\n this.placeholder.style.pointerEvents = 'none';\n this.placeholder.setAttribute('aria-hidden', 'true');\n }\n // `rtl` reads `this._element` directly (it isn't a signal), so bump a tick\n // signal to force the `rtl` computed to re-evaluate now that the element,\n // and therefore its computed `direction`, is known.\n this.rtlTick.update((n) => n + 1);\n this.applyCss();\n }\n\n /** Recomputes pixel positions after the surface resizes. Call from a `ResizeObserver`. */\n refreshMetrics(): void {\n this.applyCss();\n }\n\n isItemDraggable(item: GridItemState): boolean {\n return this.editMode() && !item.config.static && (item.config.isDraggable ?? true);\n }\n isItemResizable(item: GridItemState): boolean {\n return this.editMode() && !item.config.static && (item.config.isResizable ?? true);\n }\n\n // ---- Pointer-driven interaction (drag / resize) ----------------------------------\n\n begin(id: string): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n\n this.startItems = this.items().map((x) => ({ ...x, config: { ...x.config } }));\n this.startConfig = { ...target.config };\n this.previewItems.set(null);\n this.activeId.set(id);\n this.applyCss();\n }\n\n move(id: string): void {\n const target = this.items().find((it) => it.id === id);\n if (!target?.element) return;\n const next = this.screenToGrid(target);\n this.preview(id, next);\n }\n\n resize(\n id: string,\n out: { width: number; height: number; moveLeft: number; moveTop: number },\n ): void {\n const target = this.items().find((x) => x.id === id);\n if (!target?.element) return;\n const next = this.screenResizeToGrid(target, out);\n this.preview(id, next);\n }\n\n end(id: string): void {\n if (this.activeId() !== id) return;\n\n const preview = this.previewItems();\n if (preview) {\n this.items.set(preview.map((x) => ({ ...x, config: { ...x.config } })));\n }\n const target = this.items().find((x) => x.id === id);\n if (target?.element) target.element.style.transform = '';\n\n this.previewItems.set(null);\n this.activeId.set(null);\n this.startConfig = null;\n this.startItems = null;\n\n // Final normalization/compaction happens only after the preview is committed.\n this.settle(id);\n this.applyCss();\n this.emit();\n }\n\n // ---- Keyboard-driven interaction (a11y) -------------------------------------------\n\n /** Moves an item by whole grid cells — used by arrow-key handling in the item component. */\n moveByCells(id: string, dCols: number, dRows: number): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n this.begin(id);\n this.preview(id, { ...target.config, x: target.config.x + dCols, y: target.config.y + dRows });\n this.end(id);\n }\n\n /** Resizes an item by whole grid cells — used by shift+arrow handling in the item component. */\n resizeByCells(id: string, dCols: number, dRows: number): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n this.begin(id);\n const w = this.clampSize(\n target.config.w + dCols,\n target.config.minW,\n target.config.maxW,\n this.columns(),\n );\n const h = this.clampSize(\n target.config.h + dRows,\n target.config.minH,\n target.config.maxH,\n Infinity,\n );\n this.preview(id, { ...target.config, w, h });\n this.end(id);\n }\n\n // ---- Internals ----------------------------------------------------------------------\n\n private preview(id: string, config: GridItemConfig): void {\n const base = this.startItems;\n if (!base) return;\n\n const clamped = this.clamp(config);\n const opt = this.options();\n\n // The placeholder is the moving item during preview. The real DOM element\n // remains under ngxDraggable's control and is never repositioned by the grid.\n let candidate: GridItemState[];\n\n if (!opt.allowOverlap && opt.swap && this.startConfig) {\n const swapped = trySwap(base, id, this.startConfig, clamped);\n candidate =\n swapped ??\n base.map((x) =>\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\n );\n } else {\n candidate = base.map((x) =>\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\n );\n }\n\n if (!opt.allowOverlap && opt.pushItems) {\n candidate = moveItem(candidate, id, clamped.x, clamped.y, {\n cols: this.columns(),\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\n allowOverlap: false,\n maxRows: opt.maxRows,\n });\n }\n if (!opt.allowOverlap && opt.compact !== 'none') {\n candidate = compact(candidate, opt.compact);\n }\n\n this.previewItems.set(candidate);\n this.applyCss();\n }\n\n private screenToGrid(item: GridItemState): GridItemConfig {\n const containerRect = this._element.getBoundingClientRect();\n const r = item.element!.getBoundingClientRect();\n const m = this.metrics();\n const rtl = this.rtl();\n const leftPx = r.left - containerRect.left;\n const topPx = r.top - containerRect.top;\n const nx = leftToCol(leftPx, item.config.w, m, rtl);\n const ny = topToRow(topPx, m);\n return this.clamp({ ...item.config, x: nx, y: ny });\n }\n\n private screenResizeToGrid(\n item: GridItemState,\n out: { width: number; height: number; moveLeft: number; moveTop: number },\n ): GridItemConfig {\n const m = this.metrics();\n const gap = m.gap;\n let w = Math.max(1, Math.round((out.width + gap) / (m.colWidth + gap)));\n let h = Math.max(1, Math.round((out.height + gap) / (m.rowHeight + gap)));\n let x = item.config.x;\n let y = item.config.y;\n // moveLeft/moveTop are physical (viewport) deltas from the resizable directive;\n // moving the item's *start* edge left/up in physical space means, in RTL, that\n // the logical column count grows from the *end* instead — handled by re-deriving\n // x from the resulting physical box rather than from moveLeft directly.\n if (this.rtl()) {\n // 'w' handle grows width to the right physically but that's the grid's logical end;\n // recompute x from the (possibly shifted) physical left edge captured via the element.\n const r = item.element!.getBoundingClientRect();\n const containerRect = this._element.getBoundingClientRect();\n const leftPx = r.left + out.moveLeft - containerRect.left;\n x = leftToCol(leftPx, w, m, true);\n } else {\n if (out.moveLeft) x += Math.round(out.moveLeft / (m.colWidth + gap));\n }\n if (out.moveTop) y += Math.round(out.moveTop / (m.rowHeight + gap));\n return this.clamp({ ...item.config, x, y, w, h });\n }\n\n private clamp(c: GridItemConfig): GridItemConfig {\n const cols = this.columns();\n const next = { ...c };\n next.w = this.clampSize(next.w, next.minW, next.maxW, cols);\n next.h = this.clampSize(next.h, next.minH, next.maxH, this.options().maxRows ?? Infinity);\n next.x = Math.max(0, Math.min(next.x, cols - next.w));\n next.y = Math.max(0, next.y);\n if (this.options().maxRows)\n next.y = Math.min(next.y, Math.max(0, this.options().maxRows! - next.h));\n return next;\n }\n\n private clampSize(\n size: number,\n min: number | undefined,\n max: number | undefined,\n hardMax: number,\n ): number {\n let v = Math.max(min ?? 1, size);\n if (max) v = Math.min(v, max);\n return Math.min(v, hardMax);\n }\n\n /** Applies pushes on drag-end and, when configured, removes gaps via compaction. */\n private settle(activeId?: string): void {\n const opt = this.options();\n const before = this.items();\n let arr = before.map((x) => ({ ...x, config: { ...x.config } }));\n if (!opt.allowOverlap) {\n if (activeId && opt.pushItems) {\n arr = moveItem(\n arr,\n activeId,\n arr.find((x) => x.id === activeId)!.config.x,\n arr.find((x) => x.id === activeId)!.config.y,\n {\n cols: this.columns(),\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\n allowOverlap: false,\n maxRows: opt.maxRows,\n },\n );\n }\n if (opt.compact !== 'none') arr = compact(arr, opt.compact);\n }\n // Compaction/push are deterministic pure functions: if they didn't change\n // anything, keep the previous array reference instead of writing an\n // equal-but-new one — that would otherwise ripple into every computed\n // derived from `items` (layout, height, per-item `interactive`, ...) for\n // no reason, and risks re-arming the same feedback loop described above.\n if (itemsEqual(before, arr)) return;\n this.items.set(arr);\n this.applyCss();\n }\n\n private applyCss(): void {\n if (!this._element) return;\n\n const source = this.previewItems() ?? this.items();\n const activeId = this.activeId();\n const m = this.metrics();\n const rtl = this.rtl();\n\n for (const item of source) {\n if (!item.element) continue;\n\n // While dragging/resizing, the real active element is moved by\n // ngxDraggable/ngxResizable. Never fight those directives by writing\n // left/top/width/height here.\n if (item.id === activeId) continue;\n\n const box = placeItem(item.config, m, rtl);\n const style = item.element.style;\n style.position = 'absolute';\n style.left = `${box.left}px`;\n style.top = `${box.top}px`;\n style.width = `${box.width}px`;\n style.height = `${box.height}px`;\n item.element.dataset['gridX'] = String(item.config.x);\n item.element.dataset['gridY'] = String(item.config.y);\n item.element.dataset['gridW'] = String(item.config.w);\n item.element.dataset['gridH'] = String(item.config.h);\n }\n\n const placeholderItem = activeId ? source.find((x) => x.id === activeId) : undefined;\n if (this.placeholder) {\n if (placeholderItem && activeId) {\n const box = placeItem(placeholderItem.config, m, rtl);\n const style = this.placeholder.style;\n style.display = 'block';\n style.left = `${box.left}px`;\n style.top = `${box.top}px`;\n style.width = `${box.width}px`;\n style.height = `${box.height}px`;\n this.placeholder.dataset['gridX'] = String(placeholderItem.config.x);\n this.placeholder.dataset['gridY'] = String(placeholderItem.config.y);\n this.placeholder.dataset['gridW'] = String(placeholderItem.config.w);\n this.placeholder.dataset['gridH'] = String(placeholderItem.config.h);\n } else {\n this.placeholder.style.display = 'none';\n }\n }\n }\n\n private metrics(): GridMetrics {\n const rect = this._element?.getBoundingClientRect() ?? ({ width: 0 } as DOMRect);\n return computeMetrics(rect.width, this.options());\n }\n\n private resolveRtl(): boolean {\n const opt = this.options().rtl;\n if (opt === true || opt === false) return opt;\n return this._element ? isRtl(this._element) : false;\n }\n\n private calculateHeight(items: readonly GridItemState[], o: GridLayoutOptions): number {\n const preview = this.previewItems();\n const source = preview ?? items;\n const rows = Math.max(1, maxOccupiedRow(source));\n const m = this._element\n ? this.metrics()\n : ({\n rowHeight: o.rowHeight === 'fit' ? 100 : o.rowHeight,\n gap: o.gap ?? 0,\n padding: o.padding ?? 0,\n } as GridMetrics);\n return m.padding * 2 + rows * m.rowHeight + Math.max(0, rows - 1) * m.gap;\n }\n\n private emit(): void {\n this.layoutListener?.(this.layout());\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { GridLayoutService, GridItemState } from '../services/grid-layout.service';\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\nimport { LayoutOutput } from '../options/layout-output';\n\n@Component({\n selector: 'ngx-grid-layout',\n standalone: true,\n template: `\n <div class=\"ngx-grid-layout__surface\">\n <div class=\"ngx-grid-layout__placeholder\"></div>\n <ng-content />\n </div>\n `,\n host: {\n '[class.ngx-grid-layout--dragging]': 'service.isInteracting()',\n '[class.ngx-grid-layout--view]': '!editMode()',\n '[style.height.px]': 'service.height()',\n '[attr.dir]': 'dirOverride() ?? null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./grid-layout.component.scss'],\n})\nexport class NgxGridLayoutComponent implements AfterViewInit, OnDestroy {\n readonly options = input<IGridLayoutOptions>(new GridLayoutOptions());\n readonly editMode = input(true);\n readonly layoutChange = output<LayoutOutput[]>();\n /** Explicit direction override. Leave unset to inherit the page/host direction automatically. */\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\n readonly dirOverride = this.dir;\n\n readonly service = inject(GridLayoutService);\n private readonly el = inject(ElementRef<HTMLElement>);\n private surface?: HTMLElement;\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n effect(() => {\n const opts = { ...this.options() };\n if (this.dir()) opts.rtl = this.dir() === 'rtl';\n this.service.setOptions(opts);\n this.service.setEditMode(this.editMode());\n });\n\n this.service.connect((layout) => this.layoutChange.emit(layout));\n }\n\n ngAfterViewInit(): void {\n this.surface = this.el.nativeElement.querySelector('.ngx-grid-layout__surface') as HTMLElement;\n this.service.attachElement(this.surface);\n this.setCss();\n\n this.resizeObserver = new ResizeObserver(() => {\n this.service.refreshMetrics();\n this.setCss();\n });\n this.resizeObserver.observe(this.surface);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n setItems(items: GridItemState[]): void {\n this.service.setItems(items);\n }\n update(options: Partial<IGridLayoutOptions>): void {\n this.service.setOptions(options);\n this.setCss();\n }\n\n private setCss(): void {\n const el = this.el.nativeElement,\n o = this.service.options();\n el.style.setProperty('--grid-cols', String(o.cols));\n el.style.setProperty('--grid-gap', `${o.gap ?? 0}px`);\n el.style.setProperty('--grid-row', `${o.rowHeight === 'fit' ? 100 : o.rowHeight}px`);\n const b = o.gridBackgroundConfig;\n el.style.setProperty('--grid-gap-color', `${b.gapColor}`);\n el.style.setProperty('--grid-border-width', `${b?.borderWidth ?? 0}px`);\n el.style.setProperty('--grid-border-color', b?.borderColor ?? 'transparent');\n el.style.setProperty('--grid-row-color', b?.rowColor ?? 'transparent');\n el.style.setProperty('--grid-col-color', b?.columnColor ?? 'transparent');\n el.style.setProperty(\n '--grid-bg-opacity',\n b?.show === 'never'\n ? '0'\n : b?.show === 'whenDragging'\n ? this.service.isInteracting()\n ? '1'\n : '0'\n : '1',\n );\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n type OnInit,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { GridLayoutService } from '../services/grid-layout.service';\nimport { GridItemConfig } from '../options/grid-item-config';\nimport { NgxDraggable, NgxResizable } from 'ngx-kit/drag-resize';\n\n@Component({\n selector: 'ngx-grid-item',\n standalone: true,\n hostDirectives: [\n { directive: NgxDraggable, inputs: ['dragHandle', 'lockAxis'], outputs: [] },\n NgxResizable,\n ],\n template: `\n <ng-content />\n `,\n host: {\n '[style.position]': '\"absolute\"',\n '[style.display]': '\"block\"',\n '[style.boxSizing]': '\"border-box\"',\n '[style.transition]': 'transitionStyle()',\n '[class.ngx-grid-item--dragging]': 'dragging()',\n '[class.ngx-grid-item--resizing]': 'resizing()',\n '[class.ngx-grid-item--static]': 'config().static',\n '[class.with-resize-handler]': 'resizable()',\n '[attr.tabindex]': 'interactive() ? 0 : null',\n '[attr.aria-grabbed]': 'dragging()',\n '[attr.data-grid-id]': 'itemId()',\n '(keydown)': 'onKeyDown($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./grid-item.component.scss'],\n})\nexport class NgxGridItemComponent implements OnDestroy, OnInit {\n /** Bound as `[id]` in templates (matches the demo app's existing usage). */\n readonly itemId = input<string | undefined>(undefined, { alias: 'id' });\n readonly config = input<GridItemConfig>({ x: 0, y: 0, w: 1, h: 1 });\n readonly layoutChange = output<GridItemConfig>();\n\n readonly dragging = signal(false);\n readonly resizing = signal(false);\n readonly active = computed(() => this.dragging() || this.resizing());\n readonly transitionStyle = computed(() =>\n !this.active() && this.service.options().animate\n ? 'left .18s ease, top .18s ease, width .18s ease, height .18s ease'\n : 'none',\n );\n readonly interactive = computed(() => {\n const id = this.itemId();\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\n return !!item && (this.service.isItemDraggable(item) || this.service.isItemResizable(item));\n });\n\n private readonly service = inject(GridLayoutService);\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly drag = inject(NgxDraggable);\n private readonly resize = inject(NgxResizable);\n\n readonly resizable = computed(() => {\n return !this.resize.disabled;\n });\n constructor() {\n // `takeUntilDestroyed()` releases these subscriptions on destroy — the\n // event for every grid item ever created (real damage in layouts where\n // items are added/removed dynamically, e.g. via *ngFor + trackBy).\n this.drag.dragStart.pipe(takeUntilDestroyed()).subscribe(() => this.onDragStart());\n this.drag.dragMove.pipe(takeUntilDestroyed()).subscribe(() => this.onDragMove());\n this.drag.dragEnd.pipe(takeUntilDestroyed()).subscribe(() => this.onDragEnd());\n this.resize.resizeStart.pipe(takeUntilDestroyed()).subscribe(() => this.onResizeStart());\n this.resize.resizeMove.pipe(takeUntilDestroyed()).subscribe((v) => this.onResizeMove(v));\n this.resize.resizeEnd.pipe(takeUntilDestroyed()).subscribe(() => this.onResizeEnd());\n\n // Keep the hosted directives in sync with per-item state: static items and\n // items explicitly marked non-draggable/non-resizable stop reacting entirely.\n effect(() => {\n const id = this.itemId();\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\n this.drag.disabled = !item || !this.service.isItemDraggable(item);\n this.resize.disabled = !item || !this.service.isItemResizable(item);\n if (item) this.applySizeConstraints(item.config);\n });\n }\n\n ngOnInit(): void {\n const id = this.itemId();\n if (!id) return;\n this.service.registerItem({\n id,\n config: this.config(),\n element: this.el.nativeElement,\n });\n }\n\n ngOnDestroy(): void {\n const id = this.itemId();\n if (id) this.service.unregisterItem(id);\n }\n\n onDragStart = (): void => {\n this.dragging.set(true);\n const id = this.itemId();\n if (id) this.service.begin(id);\n };\n onDragMove = (): void => {\n const id = this.itemId();\n if (id) this.service.move(id);\n };\n onDragEnd = (): void => {\n this.dragging.set(false);\n this.finishInteraction();\n };\n onResizeStart = (): void => {\n this.resizing.set(true);\n const id = this.itemId();\n if (id) this.service.begin(id);\n };\n onResizeMove = (v: {\n width: number;\n height: number;\n moveLeft: number;\n moveTop: number;\n }): void => {\n const id = this.itemId();\n if (id) this.service.resize(id, v);\n };\n onResizeEnd = (): void => {\n this.resizing.set(false);\n this.finishInteraction();\n };\n\n /** Arrow keys move the item by one cell; Shift+arrow resizes it by one cell. */\n onKeyDown(e: KeyboardEvent): void {\n const id = this.itemId();\n if (!id || !this.interactive()) return;\n const item = this.service.items().find((x) => x.id === id);\n if (!item) return;\n const deltas: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const delta = deltas[e.key];\n if (!delta) return;\n e.preventDefault();\n if (e.shiftKey && this.service.isItemResizable(item)) {\n this.service.resizeByCells(id, delta[0], delta[1]);\n } else if (this.service.isItemDraggable(item)) {\n this.service.moveByCells(id, delta[0], delta[1]);\n }\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\n }\n\n private finishInteraction(): void {\n const id = this.itemId();\n if (!id) return;\n this.service.end(id);\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\n }\n\n /** Converts the item's min/max cell counts (config) into px for the resize directive. */\n private applySizeConstraints(config: GridItemConfig): void {\n const cellPx = this.el.nativeElement.getBoundingClientRect();\n const cols = Math.max(1, config.w);\n const rows = Math.max(1, config.h);\n const colPx = cellPx.width / cols || 1;\n const rowPx = cellPx.height / rows || 1;\n this.resize.minWidth = (config.minW ?? 1) * colPx;\n this.resize.minHeight = (config.minH ?? 1) * rowPx;\n this.resize.maxWidth = config.maxW ? config.maxW * colPx : Infinity;\n this.resize.maxHeight = config.maxH ? config.maxH * rowPx : Infinity;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgxGridLayoutComponent } from './grid-layout/grid-layout.component';\nimport { NgxGridItemComponent } from './grid-item/grid-item.component';\nimport { GridLayoutService } from './services/grid-layout.service';\n\n@NgModule({\n imports: [NgxGridLayoutComponent, NgxGridItemComponent],\n exports: [NgxGridLayoutComponent, NgxGridItemComponent],\n providers: [GridLayoutService],\n})\nexport class NgxGridLayoutModule {}\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-grid-layout.mjs","sources":["../../../projects/libs/grid-layout/options/options.ts","../../../projects/libs/grid-layout/options/grid-item-config.ts","../../../projects/libs/grid-layout/utils/collision.ts","../../../projects/libs/grid-layout/utils/compaction.ts","../../../projects/libs/grid-layout/utils/geometry.ts","../../../projects/libs/grid-layout/services/grid-layout.service.ts","../../../projects/libs/grid-layout/grid-layout/grid-layout.component.ts","../../../projects/libs/grid-layout/grid-item/grid-item.component.ts","../../../projects/libs/grid-layout/ngx-grid-layout.module.ts","../../../projects/libs/grid-layout/ngx-kit-grid-layout.ts"],"sourcesContent":["export type GridFlow = 'free' | 'horizontal' | 'vertical';\nexport type CompactMode = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport interface IGridBackgroundCfg {\n show?: 'never' | 'always' | 'whenDragging';\n borderColor?: string;\n gapColor?: string;\n rowColor?: string;\n columnColor?: string;\n borderWidth?: number;\n}\n\nexport interface IGridLayoutOptions {\n cols: number;\n rowHeight: number | 'fit';\n gap?: number;\n padding?: number;\n flow?: GridFlow;\n compact?: CompactMode;\n allowOverlap?: boolean;\n pushItems?: boolean;\n /** When two items would swap places, prefer swapping over cascading a push. */\n swap?: boolean;\n dragThreshold?: number;\n animate?: boolean;\n /**\n * `true` / `false` force a direction; `'auto'` (default) reads the host element's\n * computed `direction`, so the grid follows the surrounding page automatically.\n */\n rtl?: boolean | 'auto';\n /** Caps the number of rows the grid can grow to. `undefined` = unbounded. */\n maxRows?: number;\n gridBackgroundConfig?: IGridBackgroundCfg;\n}\n\nexport class GridLayoutOptions implements IGridLayoutOptions {\n cols = 12;\n rowHeight: number | 'fit' = 50;\n gap = 8;\n padding = 0;\n flow = 'free' as GridFlow;\n compact = 'vertical' as CompactMode;\n allowOverlap = false;\n pushItems = true;\n swap = false;\n dragThreshold = 3;\n animate = true;\n rtl = 'auto' as boolean | 'auto';\n maxRows?: number;\n gridBackgroundConfig: IGridBackgroundCfg = {\n show: 'always' as const,\n borderColor: 'rgba(128,128,128,.16)',\n gapColor: 'transparent',\n rowColor: 'rgba(128,128,128,.07)',\n columnColor: 'rgba(128,128,128,.07)',\n borderWidth: 1,\n };\n}\n","export class GridItemConfig {\n x: number;\n y: number;\n w: number;\n h: number;\n minW?: number;\n minH?: number;\n maxW?: number;\n maxH?: number;\n /** Item can't be dragged or resized, and never moves during compaction/push. */\n static?: boolean;\n /** Overrides the layout-level draggable/resizable flags for this item only. */\n isDraggable?: boolean;\n isResizable?: boolean;\n\n constructor(x: number = 0, y: number = 0, w: number = 1, h: number = 1, s?: boolean) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n this.static = s == true;\n }\n}\n\nexport const normalizeGridItem = (value?: Partial<GridItemConfig>): GridItemConfig => ({\n x: Math.max(0, Math.floor(value?.x ?? 0)),\n y: Math.max(0, Math.floor(value?.y ?? 0)),\n w: Math.max(1, Math.floor(value?.w ?? 1)),\n h: Math.max(1, Math.floor(value?.h ?? 1)),\n minW: value?.minW,\n minH: value?.minH,\n maxW: value?.maxW,\n maxH: value?.maxH,\n static: value?.static ?? false,\n isDraggable: value?.isDraggable,\n isResizable: value?.isResizable,\n});\n\n/**\n * Value equality for two (already-normalized) configs.\n *\n * This is what breaks the register -> settle -> new-object -> re-register\n * feedback loop: signals compare by *reference*, so anything that recomputes\n * a fresh config object on every change-detection pass (a `computed()` layout,\n * an inline object literal in a template, etc.) will always look \"changed\" to\n * an `effect()` even when nothing meaningful did. Callers must compare by\n * value before writing back to a signal, otherwise the write itself produces\n * a new reference that trips the same effect again — forever.\n */\nexport function gridItemConfigsEqual(a: GridItemConfig, b: GridItemConfig): boolean {\n return (\n a.x === b.x &&\n a.y === b.y &&\n a.w === b.w &&\n a.h === b.h &&\n (a.minW ?? null) === (b.minW ?? null) &&\n (a.minH ?? null) === (b.minH ?? null) &&\n (a.maxW ?? null) === (b.maxW ?? null) &&\n (a.maxH ?? null) === (b.maxH ?? null) &&\n !!a.static === !!b.static &&\n (a.isDraggable ?? null) === (b.isDraggable ?? null) &&\n (a.isResizable ?? null) === (b.isResizable ?? null)\n );\n}\n","import { GridItemConfig } from '../options/grid-item-config';\n\nexport interface LayoutNode {\n id: string;\n config: GridItemConfig;\n}\n\n/** Axis-aligned bounding-box overlap test in grid-cell space. */\nexport function collides(a: GridItemConfig, b: GridItemConfig): boolean {\n return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;\n}\n\n/** First item (other than `self`) whose cells overlap `config`, or null. */\nexport function getFirstCollision<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T | null {\n for (const item of items) {\n if (item.id === selfId) continue;\n if (collides(item.config, config)) return item;\n }\n return null;\n}\n\n/** All items whose cells overlap `config`, excluding `selfId`. */\nexport function getAllCollisions<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T[] {\n return items.filter((item) => item.id !== selfId && collides(item.config, config));\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport type { CompactMode } from '../options/options';\nimport { LayoutNode, collides, getFirstCollision } from './collision';\n\nexport interface MoveOptions {\n cols: number;\n compact: CompactMode;\n allowOverlap: boolean;\n maxRows?: number;\n}\n\nfunction isStatic(node: LayoutNode): boolean {\n return !!node.config.static;\n}\n\nfunction clampToCols(config: GridItemConfig, cols: number): void {\n config.w = Math.min(Math.max(1, config.w), cols);\n config.x = Math.max(0, Math.min(config.x, cols - config.w));\n config.y = Math.max(0, config.y);\n}\n\nfunction clone<T extends LayoutNode>(items: readonly T[]): T[] {\n return items.map((i) => ({ ...i, config: { ...i.config } })) as T[];\n}\n\n/**\n * Moves `id` to grid cell (x, y) and, unless overlap is explicitly allowed,\n * cascades any resulting collisions by pushing the colliding items out of the\n * way (downward for vertical-flow grids, rightward for horizontal-flow ones).\n * Static items are treated as fixed obstacles: they block, but never move.\n * Pure function — returns a new array, never mutates its input.\n */\nexport function moveItem<T extends LayoutNode>(\n items: readonly T[],\n id: string,\n x: number,\n y: number,\n opts: MoveOptions,\n depth = 0,\n): T[] {\n let arr = clone(items);\n const item = arr.find((i) => i.id === id);\n if (!item || isStatic(item)) return arr;\n\n item.config.x = x;\n item.config.y = y;\n clampToCols(item.config, opts.cols);\n\n if (opts.allowOverlap || depth > arr.length + 24) return arr;\n\n const compareFn = compareForCompaction(opts.compact);\n let guard = 0;\n while (guard++ < arr.length + 24) {\n const mover = arr.find((i) => i.id === id)!;\n const staticBlocker = arr.find(\n (i) => i.id !== id && isStatic(i) && collides(mover.config, i.config),\n );\n if (staticBlocker) {\n if (opts.compact === 'horizontal') {\n mover.config.x = staticBlocker.config.x + staticBlocker.config.w;\n } else {\n mover.config.y = staticBlocker.config.y + staticBlocker.config.h;\n }\n clampToCols(mover.config, opts.cols);\n continue; // the new position may collide with something else — re-check from the top.\n }\n\n const blockers = arr\n .filter((i) => i.id !== id && !isStatic(i) && collides(mover.config, i.config))\n .sort(compareFn);\n if (blockers.length === 0) break;\n arr = pushAway(arr, mover, blockers[0], opts, depth + 1);\n }\n return arr;\n}\n\nfunction pushAway<T extends LayoutNode>(\n items: T[],\n mover: T,\n blocked: T,\n opts: MoveOptions,\n depth: number,\n): T[] {\n const targetX =\n opts.compact === 'horizontal' ? mover.config.x + mover.config.w : blocked.config.x;\n const targetY =\n opts.compact === 'horizontal' ? blocked.config.y : mover.config.y + mover.config.h;\n return moveItem(items, blocked.id, targetX, targetY, opts, depth);\n}\n\nfunction compareForCompaction(mode: CompactMode) {\n return (a: LayoutNode, b: LayoutNode) =>\n mode === 'horizontal'\n ? a.config.x - b.config.x || a.config.y - b.config.y\n : a.config.y - b.config.y || a.config.x - b.config.x;\n}\n\n/**\n * When the actively-moved item directly overlaps exactly one same-size item,\n * exchanging their positions reads much better than a cascading push. The\n * caller (service) decides when to offer this vs. falling back to `moveItem`.\n */\nexport function trySwap<T extends LayoutNode>(\n items: readonly T[],\n id: string,\n previous: GridItemConfig,\n next: GridItemConfig,\n): T[] | null {\n if (items.some((i) => i.id !== id && isStatic(i) && collides(i.config, next))) return null;\n const collisions = items.filter((i) => i.id !== id && !isStatic(i) && collides(i.config, next));\n if (collisions.length !== 1) return null;\n const [target] = collisions;\n if (target.config.w !== next.w || target.config.h !== next.h) return null;\n const arr = clone(items);\n const mover = arr.find((i) => i.id === id)!;\n const other = arr.find((i) => i.id === target.id)!;\n mover.config.x = next.x;\n mover.config.y = next.y;\n other.config.x = previous.x;\n other.config.y = previous.y;\n return arr;\n}\n\n/**\n * Removes gaps by pulling every non-static item as far toward the start of the\n * grid as it can go without overlapping another item, in reading order.\n */\nexport function compact<T extends LayoutNode>(items: readonly T[], mode: CompactMode): T[] {\n const arr = clone(items);\n if (mode === 'none') return arr;\n const canX = mode === 'horizontal' || mode === 'both';\n const canY = mode === 'vertical' || mode === 'both';\n const sorted = [...arr].sort((a, b) => a.config.y - b.config.y || a.config.x - b.config.x);\n for (const item of sorted) {\n if (isStatic(item)) continue;\n if (canY) {\n let y = item.config.y;\n while (y > 0 && !getFirstCollision(arr, item.id, { ...item.config, y: y - 1 })) y--;\n item.config.y = y;\n }\n if (canX) {\n let x = item.config.x;\n while (x > 0 && !getFirstCollision(arr, item.id, { ...item.config, x: x - 1 })) x--;\n item.config.x = x;\n }\n }\n return arr;\n}\n\n/** Highest occupied row (0-based, exclusive) across all items — drives the grid's auto-height. */\nexport function maxOccupiedRow(items: readonly LayoutNode[]): number {\n return items.reduce((max, i) => Math.max(max, i.config.y + i.config.h), 0);\n}\n\n/**\n * Finds a cell for `config` that doesn't collide with any existing item.\n * Tries the requested (x, y) first; if that's already occupied, scans\n * forward in reading order (row by row, top to bottom, left to right — the\n * caller is responsible for any RTL flipping when it turns this back into\n * pixels) for the first gap large enough to fit it.\n *\n * This is what a newly-registered item (or one whose config changes to a\n * position that's no longer free) should go through instead of silently\n * overlapping whatever's already there: unlike a drag/resize, registering an\n * item isn't a deliberate \"make room for me\" gesture, so relocating the new\n * item to open space reads far better than shoving already-placed items\n * around to accommodate it.\n */\nexport function findFreeSpot<T extends LayoutNode>(\n items: readonly T[],\n config: GridItemConfig,\n cols: number,\n excludeId?: string,\n): { x: number; y: number } {\n const others = excludeId ? items.filter((i) => i.id !== excludeId) : items;\n const fits = (x: number, y: number) => !others.some((i) => collides(i.config, { ...config, x, y }));\n\n const startX = Math.max(0, Math.min(config.x, cols - config.w));\n const startY = Math.max(0, config.y);\n if (fits(startX, startY)) return { x: startX, y: startY };\n\n // The row just past the current bottom is always fully empty, so this loop\n // is guaranteed to find a fit no later than `maxY`.\n const maxY = maxOccupiedRow(others) + 1;\n for (let y = 0; y <= maxY; y++) {\n for (let x = 0; x <= cols - config.w; x++) {\n if (fits(x, y)) return { x, y };\n }\n }\n return { x: startX, y: maxY + 1 };\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport { IGridLayoutOptions } from '../options/options';\n\n/**\n * All pixel <-> grid-cell math lives here, in one RTL-aware place.\n *\n * Grid coordinates are always *logical* (reading-order): x = 0 is the first\n * column in the direction text flows — the left edge in LTR, the right edge\n * in RTL. Every physical (CSS `left`/pixel) calculation goes through here so\n * the rest of the codebase never has to think about direction again.\n */\nexport interface GridMetrics {\n /** Inner content width available for columns (container width minus padding). */\n contentWidth: number;\n colWidth: number;\n rowHeight: number;\n gap: number;\n padding: number;\n}\n\nexport function computeMetrics(containerWidth: number, options: IGridLayoutOptions): GridMetrics {\n const cols = Math.max(1, Math.floor(options.cols));\n const gap = options.gap ?? 0;\n const padding = options.padding ?? 0;\n const contentWidth = Math.max(0, containerWidth - padding * 2);\n const colWidth = Math.max(1, (contentWidth - gap * (cols - 1)) / cols);\n const rowHeight = options.rowHeight === 'fit' ? Math.max(1, colWidth) : Math.max(1, options.rowHeight);\n return { contentWidth, colWidth, rowHeight, gap, padding };\n}\n\n/** Physical CSS `left` (px, relative to the grid surface's content box) for a logical column. */\nexport function colToLeft(colIndex: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\n if (!rtl) return m.padding + colIndex * (m.colWidth + m.gap);\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\n const rightEdge = m.padding + colIndex * (m.colWidth + m.gap);\n return m.contentWidth + m.padding - rightEdge - widthPx;\n}\n\nexport function rowToTop(rowIndex: number, m: GridMetrics): number {\n return m.padding + rowIndex * (m.rowHeight + m.gap);\n}\n\nexport function spanToWidthPx(spanCols: number, m: GridMetrics): number {\n return spanCols * m.colWidth + Math.max(0, spanCols - 1) * m.gap;\n}\n\nexport function spanToHeightPx(spanRows: number, m: GridMetrics): number {\n return spanRows * m.rowHeight + Math.max(0, spanRows - 1) * m.gap;\n}\n\n/** Physical left px (as above) -> nearest logical column index. Inverse of `colToLeft`. */\nexport function leftToCol(leftPx: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\n if (!rtl) return Math.round((leftPx - m.padding) / (m.colWidth + m.gap));\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\n const rightEdge = m.contentWidth + m.padding - leftPx - widthPx;\n return Math.round((rightEdge - m.padding) / (m.colWidth + m.gap));\n}\n\nexport function topToRow(topPx: number, m: GridMetrics): number {\n return Math.round((topPx - m.padding) / (m.rowHeight + m.gap));\n}\n\n/** Places an item's pixel box (left/top/width/height) inside the grid surface, RTL-aware. */\nexport function placeItem(config: GridItemConfig, m: GridMetrics, rtl: boolean): { left: number; top: number; width: number; height: number } {\n return {\n left: colToLeft(config.x, config.w, m, rtl),\n top: rowToTop(config.y, m),\n width: spanToWidthPx(config.w, m),\n height: spanToHeightPx(config.h, m),\n };\n}\n","import { Injectable, computed, effect, signal } from '@angular/core';\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\nimport {\n normalizeGridItem,\n gridItemConfigsEqual,\n GridItemConfig,\n} from '../options/grid-item-config';\nimport { LayoutOutput } from '../options/layout-output';\nimport { computeMetrics, leftToCol, placeItem, topToRow, GridMetrics } from '../utils/geometry';\nimport { compact, maxOccupiedRow, moveItem, trySwap, findFreeSpot } from '../utils/compaction';\nimport { isRtl } from 'ngx-kit/drag-resize';\n\nexport interface GridItemState {\n id: string;\n config: GridItemConfig;\n element?: HTMLElement;\n dragging?: boolean;\n resizing?: boolean;\n}\n\n/** Structural + value equality for two item-state arrays (order-independent). */\nfunction itemsEqual(a: readonly GridItemState[], b: readonly GridItemState[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((itemA) => {\n const itemB = b.find((x) => x.id === itemA.id);\n return (\n !!itemB && itemA.element === itemB.element && gridItemConfigsEqual(itemA.config, itemB.config)\n );\n });\n}\n\n/** Value equality for two options objects — see `setOptions` for why this matters. */\nfunction optionsEqual(a: GridLayoutOptions, b: GridLayoutOptions): boolean {\n const bg1 = a.gridBackgroundConfig ?? {};\n const bg2 = b.gridBackgroundConfig ?? {};\n return (\n a.cols === b.cols &&\n a.rowHeight === b.rowHeight &&\n a.gap === b.gap &&\n a.padding === b.padding &&\n a.flow === b.flow &&\n a.compact === b.compact &&\n a.allowOverlap === b.allowOverlap &&\n a.pushItems === b.pushItems &&\n a.swap === b.swap &&\n a.dragThreshold === b.dragThreshold &&\n a.animate === b.animate &&\n a.rtl === b.rtl &&\n (a.maxRows ?? null) === (b.maxRows ?? null) &&\n bg1.show === bg2.show &&\n bg1.borderColor === bg2.borderColor &&\n bg1.gapColor === bg2.gapColor &&\n bg1.rowColor === bg2.rowColor &&\n bg1.columnColor === bg2.columnColor &&\n bg1.borderWidth === bg2.borderWidth\n );\n}\n\n@Injectable()\nexport class GridLayoutService {\n readonly options = signal<GridLayoutOptions>(new GridLayoutOptions());\n readonly items = signal<readonly GridItemState[]>([]);\n readonly editMode = signal(true);\n readonly activeId = signal<string | null>(null);\n readonly isInteracting = computed(() => this.activeId() !== null);\n readonly height = computed(() => this.calculateHeight(this.items(), this.options()));\n readonly layout = computed<LayoutOutput[]>(() =>\n this.items().map((x) => ({ id: x.id, ...x.config })),\n );\n readonly columns = computed(() => Math.max(1, Math.floor(this.options().cols)));\n\n readonly rtl = computed(() => {\n this.rtlTick();\n return this.resolveRtl();\n });\n private rtlTick = signal(0);\n\n private layoutListener?: (layout: LayoutOutput[]) => void;\n private startConfig: GridItemConfig | null = null;\n private startItems: readonly GridItemState[] | null = null;\n private previewItems = signal<readonly GridItemState[] | null>(null);\n private _element!: HTMLElement;\n private placeholder?: HTMLElement;\n\n constructor() {\n effect(() => {\n // Re-run whenever options or items change so CSS positions always reflect state.\n this.options();\n this.items();\n this.previewItems();\n this.rtlTick();\n if (this._element) this.applyCss();\n });\n }\n\n connect(onLayout: (layout: LayoutOutput[]) => void): void {\n this.layoutListener = onLayout;\n }\n setOptions(value: Partial<IGridLayoutOptions>): void {\n const next = Object.assign(new GridLayoutOptions(), this.options(), value);\n if (optionsEqual(this.options(), next)) return;\n this.options.set(next);\n }\n setEditMode(value: boolean): void {\n this.editMode.set(value);\n }\n setItems(items: GridItemState[]): void {\n this.items.set(items.map((x) => ({ ...x, config: normalizeGridItem(x.config) })));\n this.settle();\n this.emit();\n }\n\n registerItem(item: GridItemState): void {\n const existing = this.items().find((x) => x.id === item.id);\n if (!existing) {\n const normalized = normalizeGridItem(item.config);\n const placed = this.options().allowOverlap\n ? normalized\n : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns()) };\n this.items.update((xs) => [...xs, { ...item, config: placed }]);\n this.settle();\n return;\n }\n if (existing.element === item.element) return;\n this.items.update((xs) =>\n xs.map((x) => (x.id === item.id ? { ...x, element: item.element } : x)),\n );\n }\n\n updateItemConfig(id: string, config: GridItemConfig): void {\n const existing = this.items().find((x) => x.id === id);\n if (!existing) return;\n const normalized = normalizeGridItem(config);\n const placed = this.options().allowOverlap\n ? normalized\n : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns(), id) };\n if (gridItemConfigsEqual(existing.config, placed)) return;\n this.items.update((xs) => xs.map((x) => (x.id === id ? { ...x, config: placed } : x)));\n this.settle();\n }\n unregisterItem(id: string): void {\n this.items.update((xs) => xs.filter((x) => x.id !== id));\n this.settle();\n this.emit();\n }\n\n /** Called once the grid surface element exists (e.g. from `ngAfterViewInit`). */\n attachElement(el: HTMLElement): void {\n this._element = el;\n this.placeholder =\n (el.querySelector('.ngx-grid-layout__placeholder') as HTMLElement | null) ?? undefined;\n if (this.placeholder) {\n this.placeholder.style.position = 'absolute';\n this.placeholder.style.display = 'none';\n this.placeholder.style.pointerEvents = 'none';\n this.placeholder.setAttribute('aria-hidden', 'true');\n }\n // `rtl` reads `this._element` directly (it isn't a signal), so bump a tick\n // signal to force the `rtl` computed to re-evaluate now that the element,\n // and therefore its computed `direction`, is known.\n this.rtlTick.update((n) => n + 1);\n this.applyCss();\n }\n\n /** Recomputes pixel positions after the surface resizes. Call from a `ResizeObserver`. */\n refreshMetrics(): void {\n this.applyCss();\n }\n\n isItemDraggable(item: GridItemState): boolean {\n return this.editMode() && !item.config.static && (item.config.isDraggable ?? true);\n }\n isItemResizable(item: GridItemState): boolean {\n return this.editMode() && !item.config.static && (item.config.isResizable ?? true);\n }\n\n // ---- Pointer-driven interaction (drag / resize) ----------------------------------\n\n begin(id: string): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n\n this.startItems = this.items().map((x) => ({ ...x, config: { ...x.config } }));\n this.startConfig = { ...target.config };\n this.previewItems.set(null);\n this.activeId.set(id);\n this.applyCss();\n }\n\n move(id: string): void {\n const target = this.items().find((it) => it.id === id);\n if (!target?.element) return;\n const next = this.screenToGrid(target);\n this.preview(id, next);\n }\n\n resize(\n id: string,\n out: { width: number; height: number; moveLeft: number; moveTop: number },\n ): void {\n const target = this.items().find((x) => x.id === id);\n if (!target?.element) return;\n const next = this.screenResizeToGrid(target, out);\n this.preview(id, next);\n }\n\n end(id: string): void {\n if (this.activeId() !== id) return;\n\n const preview = this.previewItems();\n if (preview) {\n this.items.set(preview.map((x) => ({ ...x, config: { ...x.config } })));\n }\n const target = this.items().find((x) => x.id === id);\n if (target?.element) target.element.style.transform = '';\n\n this.previewItems.set(null);\n this.activeId.set(null);\n this.startConfig = null;\n this.startItems = null;\n\n // Final normalization/compaction happens only after the preview is committed.\n this.settle(id);\n this.applyCss();\n this.emit();\n }\n\n // ---- Keyboard-driven interaction (a11y) -------------------------------------------\n\n /** Moves an item by whole grid cells — used by arrow-key handling in the item component. */\n moveByCells(id: string, dCols: number, dRows: number): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n this.begin(id);\n this.preview(id, { ...target.config, x: target.config.x + dCols, y: target.config.y + dRows });\n this.end(id);\n }\n\n /** Resizes an item by whole grid cells — used by shift+arrow handling in the item component. */\n resizeByCells(id: string, dCols: number, dRows: number): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n this.begin(id);\n const w = this.clampSize(\n target.config.w + dCols,\n target.config.minW,\n target.config.maxW,\n this.columns(),\n );\n const h = this.clampSize(\n target.config.h + dRows,\n target.config.minH,\n target.config.maxH,\n Infinity,\n );\n this.preview(id, { ...target.config, w, h });\n this.end(id);\n }\n\n // ---- Internals ----------------------------------------------------------------------\n\n private preview(id: string, config: GridItemConfig): void {\n const base = this.startItems;\n if (!base) return;\n\n const clamped = this.clamp(config);\n const opt = this.options();\n\n // The placeholder is the moving item during preview. The real DOM element\n // remains under ngxDraggable's control and is never repositioned by the grid.\n let candidate: GridItemState[];\n\n if (!opt.allowOverlap && opt.swap && this.startConfig) {\n const swapped = trySwap(base, id, this.startConfig, clamped);\n candidate =\n swapped ??\n base.map((x) =>\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\n );\n } else {\n candidate = base.map((x) =>\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\n );\n }\n\n if (!opt.allowOverlap && opt.pushItems) {\n candidate = moveItem(candidate, id, clamped.x, clamped.y, {\n cols: this.columns(),\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\n allowOverlap: false,\n maxRows: opt.maxRows,\n });\n }\n if (!opt.allowOverlap && opt.compact !== 'none') {\n candidate = compact(candidate, opt.compact);\n }\n\n this.previewItems.set(candidate);\n this.applyCss();\n }\n\n private screenToGrid(item: GridItemState): GridItemConfig {\n const containerRect = this._element.getBoundingClientRect();\n const r = item.element!.getBoundingClientRect();\n const m = this.metrics();\n const rtl = this.rtl();\n const leftPx = r.left - containerRect.left;\n const topPx = r.top - containerRect.top;\n const nx = leftToCol(leftPx, item.config.w, m, rtl);\n const ny = topToRow(topPx, m);\n return this.clamp({ ...item.config, x: nx, y: ny });\n }\n\n private screenResizeToGrid(\n item: GridItemState,\n out: { width: number; height: number; moveLeft: number; moveTop: number },\n ): GridItemConfig {\n const m = this.metrics();\n const gap = m.gap;\n let w = Math.max(1, Math.round((out.width + gap) / (m.colWidth + gap)));\n let h = Math.max(1, Math.round((out.height + gap) / (m.rowHeight + gap)));\n let x = item.config.x;\n let y = item.config.y;\n // moveLeft/moveTop are physical (viewport) deltas from the resizable directive;\n // moving the item's *start* edge left/up in physical space means, in RTL, that\n // the logical column count grows from the *end* instead — handled by re-deriving\n // x from the resulting physical box rather than from moveLeft directly.\n if (this.rtl()) {\n // 'w' handle grows width to the right physically but that's the grid's logical end;\n // recompute x from the (possibly shifted) physical left edge captured via the element.\n const r = item.element!.getBoundingClientRect();\n const containerRect = this._element.getBoundingClientRect();\n const leftPx = r.left + out.moveLeft - containerRect.left;\n x = leftToCol(leftPx, w, m, true);\n } else {\n if (out.moveLeft) x += Math.round(out.moveLeft / (m.colWidth + gap));\n }\n if (out.moveTop) y += Math.round(out.moveTop / (m.rowHeight + gap));\n return this.clamp({ ...item.config, x, y, w, h });\n }\n\n private clamp(c: GridItemConfig): GridItemConfig {\n const cols = this.columns();\n const next = { ...c };\n next.w = this.clampSize(next.w, next.minW, next.maxW, cols);\n next.h = this.clampSize(next.h, next.minH, next.maxH, this.options().maxRows ?? Infinity);\n next.x = Math.max(0, Math.min(next.x, cols - next.w));\n next.y = Math.max(0, next.y);\n if (this.options().maxRows)\n next.y = Math.min(next.y, Math.max(0, this.options().maxRows! - next.h));\n return next;\n }\n\n private clampSize(\n size: number,\n min: number | undefined,\n max: number | undefined,\n hardMax: number,\n ): number {\n let v = Math.max(min ?? 1, size);\n if (max) v = Math.min(v, max);\n return Math.min(v, hardMax);\n }\n\n /** Applies pushes on drag-end and, when configured, removes gaps via compaction. */\n private settle(activeId?: string): void {\n const opt = this.options();\n const before = this.items();\n let arr = before.map((x) => ({ ...x, config: { ...x.config } }));\n if (!opt.allowOverlap) {\n if (activeId && opt.pushItems) {\n arr = moveItem(\n arr,\n activeId,\n arr.find((x) => x.id === activeId)!.config.x,\n arr.find((x) => x.id === activeId)!.config.y,\n {\n cols: this.columns(),\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\n allowOverlap: false,\n maxRows: opt.maxRows,\n },\n );\n }\n if (opt.compact !== 'none') arr = compact(arr, opt.compact);\n }\n // Compaction/push are deterministic pure functions: if they didn't change\n // anything, keep the previous array reference instead of writing an\n // equal-but-new one — that would otherwise ripple into every computed\n // derived from `items` (layout, height, per-item `interactive`, ...) for\n // no reason, and risks re-arming the same feedback loop described above.\n if (itemsEqual(before, arr)) return;\n this.items.set(arr);\n this.applyCss();\n }\n\n private applyCss(): void {\n if (!this._element) return;\n\n const source = this.previewItems() ?? this.items();\n const activeId = this.activeId();\n const m = this.metrics();\n const rtl = this.rtl();\n\n for (const item of source) {\n if (!item.element) continue;\n\n // While dragging/resizing, the real active element is moved by\n // ngxDraggable/ngxResizable. Never fight those directives by writing\n // left/top/width/height here.\n if (item.id === activeId) continue;\n\n const box = placeItem(item.config, m, rtl);\n const style = item.element.style;\n style.position = 'absolute';\n style.left = `${box.left}px`;\n style.top = `${box.top}px`;\n style.width = `${box.width}px`;\n style.height = `${box.height}px`;\n item.element.dataset['gridX'] = String(item.config.x);\n item.element.dataset['gridY'] = String(item.config.y);\n item.element.dataset['gridW'] = String(item.config.w);\n item.element.dataset['gridH'] = String(item.config.h);\n }\n\n const placeholderItem = activeId ? source.find((x) => x.id === activeId) : undefined;\n if (this.placeholder) {\n if (placeholderItem && activeId) {\n const box = placeItem(placeholderItem.config, m, rtl);\n const style = this.placeholder.style;\n style.display = 'block';\n style.left = `${box.left}px`;\n style.top = `${box.top}px`;\n style.width = `${box.width}px`;\n style.height = `${box.height}px`;\n this.placeholder.dataset['gridX'] = String(placeholderItem.config.x);\n this.placeholder.dataset['gridY'] = String(placeholderItem.config.y);\n this.placeholder.dataset['gridW'] = String(placeholderItem.config.w);\n this.placeholder.dataset['gridH'] = String(placeholderItem.config.h);\n } else {\n this.placeholder.style.display = 'none';\n }\n }\n }\n\n private metrics(): GridMetrics {\n const rect = this._element?.getBoundingClientRect() ?? ({ width: 0 } as DOMRect);\n return computeMetrics(rect.width, this.options());\n }\n\n private resolveRtl(): boolean {\n const opt = this.options().rtl;\n if (opt === true || opt === false) return opt;\n return this._element ? isRtl(this._element) : false;\n }\n\n private calculateHeight(items: readonly GridItemState[], o: GridLayoutOptions): number {\n const preview = this.previewItems();\n const source = preview ?? items;\n const rows = Math.max(1, maxOccupiedRow(source));\n const m = this._element\n ? this.metrics()\n : ({\n rowHeight: o.rowHeight === 'fit' ? 100 : o.rowHeight,\n gap: o.gap ?? 0,\n padding: o.padding ?? 0,\n } as GridMetrics);\n return m.padding * 2 + rows * m.rowHeight + Math.max(0, rows - 1) * m.gap;\n }\n\n private emit(): void {\n this.layoutListener?.(this.layout());\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { GridLayoutService, GridItemState } from '../services/grid-layout.service';\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\nimport { LayoutOutput } from '../options/layout-output';\n\n@Component({\n selector: 'ngx-grid-layout',\n standalone: true,\n template: `\n <div class=\"ngx-grid-layout__surface\" [class.edit-mode]=\"editMode()\">\n <div class=\"ngx-grid-layout__placeholder\"></div>\n <ng-content />\n </div>\n `,\n host: {\n '[class.ngx-grid-layout--dragging]': 'service.isInteracting()',\n '[class.ngx-grid-layout--view]': '!editMode()',\n '[style.height.px]': 'service.height()',\n '[attr.dir]': 'dirOverride() ?? null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./grid-layout.component.scss'],\n})\nexport class NgxGridLayoutComponent implements AfterViewInit, OnDestroy {\n readonly options = input<IGridLayoutOptions>(new GridLayoutOptions());\n readonly editMode = input(true);\n readonly layoutChange = output<LayoutOutput[]>();\n /** Explicit direction override. Leave unset to inherit the page/host direction automatically. */\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\n readonly dirOverride = this.dir;\n\n readonly service = inject(GridLayoutService);\n private readonly el = inject(ElementRef<HTMLElement>);\n private surface?: HTMLElement;\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n effect(() => {\n const opts = { ...this.options() };\n if (this.dir()) opts.rtl = this.dir() === 'rtl';\n this.service.setOptions(opts);\n this.service.setEditMode(this.editMode());\n });\n\n this.service.connect((layout) => this.layoutChange.emit(layout));\n }\n\n ngAfterViewInit(): void {\n this.surface = this.el.nativeElement.querySelector('.ngx-grid-layout__surface') as HTMLElement;\n this.service.attachElement(this.surface);\n this.setCss();\n\n this.resizeObserver = new ResizeObserver(() => {\n this.service.refreshMetrics();\n this.setCss();\n });\n this.resizeObserver.observe(this.surface);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n setItems(items: GridItemState[]): void {\n this.service.setItems(items);\n }\n update(options: Partial<IGridLayoutOptions>): void {\n this.service.setOptions(options);\n this.setCss();\n }\n\n private setCss(): void {\n const el = this.el.nativeElement,\n o = this.service.options();\n el.style.setProperty('--grid-cols', String(o.cols));\n el.style.setProperty('--grid-gap', `${o.gap ?? 0}px`);\n el.style.setProperty('--grid-row', `${o.rowHeight === 'fit' ? 100 : o.rowHeight}px`);\n const b = o.gridBackgroundConfig;\n el.style.setProperty('--grid-gap-color', `${b.gapColor}`);\n el.style.setProperty('--grid-border-width', `${b?.borderWidth ?? 0}px`);\n el.style.setProperty('--grid-border-color', b?.borderColor ?? 'transparent');\n el.style.setProperty('--grid-row-color', b?.rowColor ?? 'transparent');\n el.style.setProperty('--grid-col-color', b?.columnColor ?? 'transparent');\n el.style.setProperty(\n '--grid-bg-opacity',\n b?.show === 'never'\n ? '0'\n : b?.show === 'whenDragging'\n ? this.service.isInteracting()\n ? '1'\n : '0'\n : '1',\n );\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n type OnInit,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { GridLayoutService } from '../services/grid-layout.service';\nimport { GridItemConfig } from '../options/grid-item-config';\nimport { NgxDraggable, NgxResizable } from 'ngx-kit/drag-resize';\n\n@Component({\n selector: 'ngx-grid-item',\n standalone: true,\n hostDirectives: [\n { directive: NgxDraggable, inputs: ['dragHandle', 'lockAxis'], outputs: [] },\n NgxResizable,\n ],\n template: `\n <ng-content />\n `,\n host: {\n '[style.position]': '\"absolute\"',\n '[style.display]': '\"block\"',\n '[style.boxSizing]': '\"border-box\"',\n '[style.transition]': 'transitionStyle()',\n '[class.ngx-grid-item--dragging]': 'dragging()',\n '[class.ngx-grid-item--resizing]': 'resizing()',\n '[class.ngx-grid-item--static]': 'config().static',\n '[class.with-resize-handler]': 'resizable()',\n '[attr.tabindex]': 'interactive() ? 0 : null',\n '[attr.aria-grabbed]': 'dragging()',\n '[attr.data-grid-id]': 'itemId()',\n '(keydown)': 'onKeyDown($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./grid-item.component.scss'],\n})\nexport class NgxGridItemComponent implements OnDestroy, OnInit {\n /** Bound as `[id]` in templates (matches the demo app's existing usage). */\n readonly itemId = input<string | undefined>(undefined, { alias: 'id' });\n readonly config = input<GridItemConfig>({ x: 0, y: 0, w: 1, h: 1 });\n readonly layoutChange = output<GridItemConfig>();\n\n readonly dragging = signal(false);\n readonly resizing = signal(false);\n readonly active = computed(() => this.dragging() || this.resizing());\n readonly transitionStyle = computed(() =>\n !this.active() && this.service.options().animate\n ? 'left .18s ease, top .18s ease, width .18s ease, height .18s ease'\n : 'none',\n );\n readonly interactive = computed(() => {\n const id = this.itemId();\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\n return !!item && (this.service.isItemDraggable(item) || this.service.isItemResizable(item));\n });\n\n private readonly service = inject(GridLayoutService);\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly drag = inject(NgxDraggable);\n private readonly resize = inject(NgxResizable);\n\n readonly resizable = computed(() => {\n return !this.resize.disabled && this.service.editMode();\n });\n constructor() {\n // `takeUntilDestroyed()` releases these subscriptions on destroy — the\n // event for every grid item ever created (real damage in layouts where\n // items are added/removed dynamically, e.g. via *ngFor + trackBy).\n this.drag.dragStart.pipe(takeUntilDestroyed()).subscribe(() => this.onDragStart());\n this.drag.dragMove.pipe(takeUntilDestroyed()).subscribe(() => this.onDragMove());\n this.drag.dragEnd.pipe(takeUntilDestroyed()).subscribe(() => this.onDragEnd());\n this.resize.resizeStart.pipe(takeUntilDestroyed()).subscribe(() => this.onResizeStart());\n this.resize.resizeMove.pipe(takeUntilDestroyed()).subscribe((v) => this.onResizeMove(v));\n this.resize.resizeEnd.pipe(takeUntilDestroyed()).subscribe(() => this.onResizeEnd());\n\n // Keep the hosted directives in sync with per-item state: static items and\n // items explicitly marked non-draggable/non-resizable stop reacting entirely.\n effect(() => {\n const id = this.itemId();\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\n this.drag.disabled = !item || !this.service.isItemDraggable(item);\n this.resize.disabled = !item || !this.service.isItemResizable(item);\n if (item) this.applySizeConstraints(item.config);\n });\n }\n\n ngOnInit(): void {\n const id = this.itemId();\n if (!id) return;\n this.service.registerItem({\n id,\n config: this.config(),\n element: this.el.nativeElement,\n });\n }\n\n ngOnDestroy(): void {\n const id = this.itemId();\n if (id) this.service.unregisterItem(id);\n }\n\n onDragStart = (): void => {\n this.dragging.set(true);\n const id = this.itemId();\n if (id) this.service.begin(id);\n };\n onDragMove = (): void => {\n const id = this.itemId();\n if (id) this.service.move(id);\n };\n onDragEnd = (): void => {\n this.dragging.set(false);\n this.finishInteraction();\n };\n onResizeStart = (): void => {\n this.resizing.set(true);\n const id = this.itemId();\n if (id) this.service.begin(id);\n };\n onResizeMove = (v: {\n width: number;\n height: number;\n moveLeft: number;\n moveTop: number;\n }): void => {\n const id = this.itemId();\n if (id) this.service.resize(id, v);\n };\n onResizeEnd = (): void => {\n this.resizing.set(false);\n this.finishInteraction();\n };\n\n /** Arrow keys move the item by one cell; Shift+arrow resizes it by one cell. */\n onKeyDown(e: KeyboardEvent): void {\n const id = this.itemId();\n if (!id || !this.interactive()) return;\n const item = this.service.items().find((x) => x.id === id);\n if (!item) return;\n const deltas: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const delta = deltas[e.key];\n if (!delta) return;\n e.preventDefault();\n if (e.shiftKey && this.service.isItemResizable(item)) {\n this.service.resizeByCells(id, delta[0], delta[1]);\n } else if (this.service.isItemDraggable(item)) {\n this.service.moveByCells(id, delta[0], delta[1]);\n }\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\n }\n\n private finishInteraction(): void {\n const id = this.itemId();\n if (!id) return;\n this.service.end(id);\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\n }\n\n /** Converts the item's min/max cell counts (config) into px for the resize directive. */\n private applySizeConstraints(config: GridItemConfig): void {\n const cellPx = this.el.nativeElement.getBoundingClientRect();\n const cols = Math.max(1, config.w);\n const rows = Math.max(1, config.h);\n const colPx = cellPx.width / cols || 1;\n const rowPx = cellPx.height / rows || 1;\n this.resize.minWidth = (config.minW ?? 1) * colPx;\n this.resize.minHeight = (config.minH ?? 1) * rowPx;\n this.resize.maxWidth = config.maxW ? config.maxW * colPx : Infinity;\n this.resize.maxHeight = config.maxH ? config.maxH * rowPx : Infinity;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgxGridLayoutComponent } from './grid-layout/grid-layout.component';\nimport { NgxGridItemComponent } from './grid-item/grid-item.component';\nimport { GridLayoutService } from './services/grid-layout.service';\n\n@NgModule({\n imports: [NgxGridLayoutComponent, NgxGridItemComponent],\n exports: [NgxGridLayoutComponent, NgxGridItemComponent],\n providers: [GridLayoutService],\n})\nexport class NgxGridLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-kit",
3
- "version": "7.0.0",
3
+ "version": "7.0.1",
4
4
  "description": "Angular input components",
5
5
  "author": "Mohammadreza Samani <mr.samani1368@gmail.com>",
6
6
  "license": "MIT",
@@ -123,6 +123,24 @@ declare function trySwap<T extends LayoutNode>(items: readonly T[], id: string,
123
123
  declare function compact<T extends LayoutNode>(items: readonly T[], mode: CompactMode): T[];
124
124
  /** Highest occupied row (0-based, exclusive) across all items — drives the grid's auto-height. */
125
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
+ };
126
144
 
127
145
  /**
128
146
  * All pixel <-> grid-cell math lives here, in one RTL-aware place.
@@ -173,7 +191,6 @@ declare class GridLayoutService {
173
191
  readonly height: _angular_core.Signal<number>;
174
192
  readonly layout: _angular_core.Signal<LayoutOutput[]>;
175
193
  readonly columns: _angular_core.Signal<number>;
176
- /** Resolves `rtl: 'auto'` against the attached element's *actual* computed direction. */
177
194
  readonly rtl: _angular_core.Signal<boolean>;
178
195
  private rtlTick;
179
196
  private layoutListener?;
@@ -187,23 +204,7 @@ declare class GridLayoutService {
187
204
  setOptions(value: Partial<IGridLayoutOptions>): void;
188
205
  setEditMode(value: boolean): void;
189
206
  setItems(items: GridItemState[]): void;
190
- /**
191
- * Registers a new item, or refreshes the DOM element reference of one that's
192
- * already tracked. Adding an item can shift the whole layout (compaction /
193
- * push), so that path settles. Merely re-supplying the same element on an
194
- * already-known id has no geometric effect, so it is a deliberate no-op —
195
- * skipping it is what keeps a per-item `effect()` that calls this on every
196
- * change-detection pass from re-triggering `settle()` indefinitely.
197
- */
198
207
  registerItem(item: GridItemState): void;
199
- /**
200
- * Updates an item's config. Only writes the signal and re-settles the layout
201
- * when the *value* actually changed. Without this guard, any caller that
202
- * supplies a structurally-equal but referentially-new config object (e.g. a
203
- * template bound to a `computed()` layout) would cause an unconditional
204
- * `items.set()` on every run — which produces new output objects, which
205
- * feed back into that same new config reference, forever.
206
- */
207
208
  updateItemConfig(id: string, config: GridItemConfig): void;
208
209
  unregisterItem(id: string): void;
209
210
  /** Called once the grid surface element exists (e.g. from `ngAfterViewInit`). */
@@ -246,8 +247,8 @@ declare class NgxGridLayoutComponent implements AfterViewInit, OnDestroy {
246
247
  readonly editMode: _angular_core.InputSignal<boolean>;
247
248
  readonly layoutChange: _angular_core.OutputEmitterRef<LayoutOutput[]>;
248
249
  /** Explicit direction override. Leave unset to inherit the page/host direction automatically. */
249
- readonly dir: _angular_core.InputSignal<"ltr" | "rtl" | undefined>;
250
- readonly dirOverride: _angular_core.InputSignal<"ltr" | "rtl" | undefined>;
250
+ readonly dir: _angular_core.InputSignal<"rtl" | "ltr" | undefined>;
251
+ readonly dirOverride: _angular_core.InputSignal<"rtl" | "ltr" | undefined>;
251
252
  readonly service: GridLayoutService;
252
253
  private readonly el;
253
254
  private surface?;
@@ -306,5 +307,5 @@ declare class NgxGridLayoutModule {
306
307
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<NgxGridLayoutModule>;
307
308
  }
308
309
 
309
- export { GridItemConfig, GridLayoutOptions, GridLayoutService, NgxGridItemComponent, NgxGridLayoutComponent, NgxGridLayoutModule, colToLeft, collides, compact, computeMetrics, getAllCollisions, getFirstCollision, gridItemConfigsEqual, leftToCol, maxOccupiedRow, moveItem, normalizeGridItem, placeItem, rowToTop, spanToHeightPx, spanToWidthPx, topToRow, trySwap };
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 };
310
311
  export type { CompactMode, GridFlow, GridItemState, GridMetrics, IGridBackgroundCfg, IGridLayoutOptions, LayoutNode, LayoutOutput, MoveOptions };