ngx-kit 7.2.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/angle-selector/README.md +34 -34
  2. package/box-shadow/README.md +33 -33
  3. package/color-picker/README.md +52 -52
  4. package/{shared → core}/README.md +117 -117
  5. package/data-table/README.md +120 -120
  6. package/date-picker/README.md +74 -74
  7. package/dialog/README.md +122 -92
  8. package/drag-resize/README.md +53 -55
  9. package/fesm2022/ngx-kit-angle-selector.mjs +9 -26
  10. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  11. package/fesm2022/ngx-kit-box-shadow.mjs +330 -356
  12. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  13. package/fesm2022/ngx-kit-color-picker.mjs +132 -272
  14. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  15. package/fesm2022/{ngx-kit-shared.mjs → ngx-kit-core.mjs} +845 -277
  16. package/fesm2022/ngx-kit-core.mjs.map +1 -0
  17. package/fesm2022/ngx-kit-data-table.mjs +1 -1
  18. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  19. package/fesm2022/ngx-kit-date-picker.mjs +27 -21
  20. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  21. package/fesm2022/ngx-kit-dialog.mjs +430 -331
  22. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-drag-resize.mjs +126 -45
  24. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -1
  25. package/fesm2022/ngx-kit-drawer-menu.mjs +2 -2
  26. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  28. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gallery.mjs +3 -3
  30. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  31. package/fesm2022/ngx-kit-gradient-picker.mjs +20 -38
  32. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-grid-layout.mjs +14 -14
  34. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -1
  35. package/fesm2022/ngx-kit-image-editor.mjs +3 -3
  36. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  37. package/fesm2022/ngx-kit-menu.mjs +1 -1
  38. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-message.mjs +1 -1
  40. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  41. package/fesm2022/ngx-kit-notify.mjs +1 -1
  42. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  43. package/fesm2022/ngx-kit-time-picker.mjs +1 -1
  44. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  45. package/fesm2022/ngx-kit-virtual-scroll.mjs +2 -2
  46. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -1
  47. package/gallery/README.md +71 -71
  48. package/gradient-picker/README.md +41 -41
  49. package/grid-layout/README.md +64 -64
  50. package/image-editor/README.md +44 -44
  51. package/menu/README.md +85 -85
  52. package/message/README.md +70 -70
  53. package/notify/README.md +56 -56
  54. package/package.json +5 -9
  55. package/time-picker/README.md +89 -89
  56. package/types/ngx-kit-angle-selector.d.ts +13 -16
  57. package/types/ngx-kit-box-shadow.d.ts +37 -95
  58. package/types/ngx-kit-color-picker.d.ts +61 -58
  59. package/types/{ngx-kit-shared.d.ts → ngx-kit-core.d.ts} +156 -34
  60. package/types/ngx-kit-data-table.d.ts +2 -2
  61. package/types/ngx-kit-date-picker.d.ts +1 -1
  62. package/types/ngx-kit-dialog.d.ts +208 -107
  63. package/types/ngx-kit-drag-resize.d.ts +33 -6
  64. package/types/ngx-kit-gradient-picker.d.ts +4 -7
  65. package/types/ngx-kit-menu.d.ts +1 -1
  66. package/types/ngx-kit-time-picker.d.ts +1 -1
  67. package/virtual-scroll/README.md +199 -199
  68. package/fesm2022/ngx-kit-shared.mjs.map +0 -1
  69. package/fesm2022/ngx-kit-webflow.mjs +0 -709
  70. package/fesm2022/ngx-kit-webflow.mjs.map +0 -1
  71. package/types/ngx-kit-webflow.d.ts +0 -286
@@ -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';\r\nexport type CompactMode = 'none' | 'vertical' | 'horizontal' | 'both';\r\n\r\nexport interface IGridBackgroundCfg {\r\n show?: 'never' | 'always' | 'whenDragging';\r\n borderColor?: string;\r\n gapColor?: string;\r\n rowColor?: string;\r\n columnColor?: string;\r\n borderWidth?: number;\r\n}\r\n\r\nexport interface IGridLayoutOptions {\r\n cols: number;\r\n rowHeight: number | 'fit';\r\n gap?: number;\r\n padding?: number;\r\n flow?: GridFlow;\r\n compact?: CompactMode;\r\n allowOverlap?: boolean;\r\n pushItems?: boolean;\r\n /** When two items would swap places, prefer swapping over cascading a push. */\r\n swap?: boolean;\r\n dragThreshold?: number;\r\n animate?: boolean;\r\n /**\r\n * `true` / `false` force a direction; `'auto'` (default) reads the host element's\r\n * computed `direction`, so the grid follows the surrounding page automatically.\r\n */\r\n rtl?: boolean | 'auto';\r\n /** Caps the number of rows the grid can grow to. `undefined` = unbounded. */\r\n maxRows?: number;\r\n gridBackgroundConfig?: IGridBackgroundCfg;\r\n}\r\n\r\nexport class GridLayoutOptions implements IGridLayoutOptions {\r\n cols = 12;\r\n rowHeight: number | 'fit' = 50;\r\n gap = 8;\r\n padding = 0;\r\n flow = 'free' as GridFlow;\r\n compact = 'vertical' as CompactMode;\r\n allowOverlap = false;\r\n pushItems = true;\r\n swap = false;\r\n dragThreshold = 3;\r\n animate = true;\r\n rtl = 'auto' as boolean | 'auto';\r\n maxRows?: number;\r\n gridBackgroundConfig: IGridBackgroundCfg = {\r\n show: 'always' as const,\r\n borderColor: 'rgba(128,128,128,.16)',\r\n gapColor: 'transparent',\r\n rowColor: 'rgba(128,128,128,.07)',\r\n columnColor: 'rgba(128,128,128,.07)',\r\n borderWidth: 1,\r\n };\r\n}\r\n","export class GridItemConfig {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n minW?: number;\r\n minH?: number;\r\n maxW?: number;\r\n maxH?: number;\r\n /** Item can't be dragged or resized, and never moves during compaction/push. */\r\n static?: boolean;\r\n /** Overrides the layout-level draggable/resizable flags for this item only. */\r\n isDraggable?: boolean;\r\n isResizable?: boolean;\r\n\r\n constructor(x: number = 0, y: number = 0, w: number = 1, h: number = 1, s?: boolean) {\r\n this.x = x;\r\n this.y = y;\r\n this.w = w;\r\n this.h = h;\r\n this.static = s == true;\r\n }\r\n}\r\n\r\nexport const normalizeGridItem = (value?: Partial<GridItemConfig>): GridItemConfig => ({\r\n x: Math.max(0, Math.floor(value?.x ?? 0)),\r\n y: Math.max(0, Math.floor(value?.y ?? 0)),\r\n w: Math.max(1, Math.floor(value?.w ?? 1)),\r\n h: Math.max(1, Math.floor(value?.h ?? 1)),\r\n minW: value?.minW,\r\n minH: value?.minH,\r\n maxW: value?.maxW,\r\n maxH: value?.maxH,\r\n static: value?.static ?? false,\r\n isDraggable: value?.isDraggable,\r\n isResizable: value?.isResizable,\r\n});\r\n\r\n/**\r\n * Value equality for two (already-normalized) configs.\r\n *\r\n * This is what breaks the register -> settle -> new-object -> re-register\r\n * feedback loop: signals compare by *reference*, so anything that recomputes\r\n * a fresh config object on every change-detection pass (a `computed()` layout,\r\n * an inline object literal in a template, etc.) will always look \"changed\" to\r\n * an `effect()` even when nothing meaningful did. Callers must compare by\r\n * value before writing back to a signal, otherwise the write itself produces\r\n * a new reference that trips the same effect again — forever.\r\n */\r\nexport function gridItemConfigsEqual(a: GridItemConfig, b: GridItemConfig): boolean {\r\n return (\r\n a.x === b.x &&\r\n a.y === b.y &&\r\n a.w === b.w &&\r\n a.h === b.h &&\r\n (a.minW ?? null) === (b.minW ?? null) &&\r\n (a.minH ?? null) === (b.minH ?? null) &&\r\n (a.maxW ?? null) === (b.maxW ?? null) &&\r\n (a.maxH ?? null) === (b.maxH ?? null) &&\r\n !!a.static === !!b.static &&\r\n (a.isDraggable ?? null) === (b.isDraggable ?? null) &&\r\n (a.isResizable ?? null) === (b.isResizable ?? null)\r\n );\r\n}\r\n","import { GridItemConfig } from '../options/grid-item-config';\r\n\r\nexport interface LayoutNode {\r\n id: string;\r\n config: GridItemConfig;\r\n}\r\n\r\n/** Axis-aligned bounding-box overlap test in grid-cell space. */\r\nexport function collides(a: GridItemConfig, b: GridItemConfig): boolean {\r\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;\r\n}\r\n\r\n/** First item (other than `self`) whose cells overlap `config`, or null. */\r\nexport function getFirstCollision<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T | null {\r\n for (const item of items) {\r\n if (item.id === selfId) continue;\r\n if (collides(item.config, config)) return item;\r\n }\r\n return null;\r\n}\r\n\r\n/** All items whose cells overlap `config`, excluding `selfId`. */\r\nexport function getAllCollisions<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T[] {\r\n return items.filter((item) => item.id !== selfId && collides(item.config, config));\r\n}\r\n","import { GridItemConfig } from '../options/grid-item-config';\r\nimport type { CompactMode } from '../options/options';\r\nimport { LayoutNode, collides, getFirstCollision } from './collision';\r\n\r\nexport interface MoveOptions {\r\n cols: number;\r\n compact: CompactMode;\r\n allowOverlap: boolean;\r\n maxRows?: number;\r\n}\r\n\r\nfunction isStatic(node: LayoutNode): boolean {\r\n return !!node.config.static;\r\n}\r\n\r\nfunction clampToCols(config: GridItemConfig, cols: number): void {\r\n config.w = Math.min(Math.max(1, config.w), cols);\r\n config.x = Math.max(0, Math.min(config.x, cols - config.w));\r\n config.y = Math.max(0, config.y);\r\n}\r\n\r\nfunction clone<T extends LayoutNode>(items: readonly T[]): T[] {\r\n return items.map((i) => ({ ...i, config: { ...i.config } })) as T[];\r\n}\r\n\r\n/**\r\n * Moves `id` to grid cell (x, y) and, unless overlap is explicitly allowed,\r\n * cascades any resulting collisions by pushing the colliding items out of the\r\n * way (downward for vertical-flow grids, rightward for horizontal-flow ones).\r\n * Static items are treated as fixed obstacles: they block, but never move.\r\n * Pure function — returns a new array, never mutates its input.\r\n */\r\nexport function moveItem<T extends LayoutNode>(\r\n items: readonly T[],\r\n id: string,\r\n x: number,\r\n y: number,\r\n opts: MoveOptions,\r\n depth = 0,\r\n): T[] {\r\n let arr = clone(items);\r\n const item = arr.find((i) => i.id === id);\r\n if (!item || isStatic(item)) return arr;\r\n\r\n item.config.x = x;\r\n item.config.y = y;\r\n clampToCols(item.config, opts.cols);\r\n\r\n if (opts.allowOverlap || depth > arr.length + 24) return arr;\r\n\r\n const compareFn = compareForCompaction(opts.compact);\r\n let guard = 0;\r\n while (guard++ < arr.length + 24) {\r\n const mover = arr.find((i) => i.id === id)!;\r\n const staticBlocker = arr.find(\r\n (i) => i.id !== id && isStatic(i) && collides(mover.config, i.config),\r\n );\r\n if (staticBlocker) {\r\n if (opts.compact === 'horizontal') {\r\n mover.config.x = staticBlocker.config.x + staticBlocker.config.w;\r\n } else {\r\n mover.config.y = staticBlocker.config.y + staticBlocker.config.h;\r\n }\r\n clampToCols(mover.config, opts.cols);\r\n continue; // the new position may collide with something else — re-check from the top.\r\n }\r\n\r\n const blockers = arr\r\n .filter((i) => i.id !== id && !isStatic(i) && collides(mover.config, i.config))\r\n .sort(compareFn);\r\n if (blockers.length === 0) break;\r\n arr = pushAway(arr, mover, blockers[0], opts, depth + 1);\r\n }\r\n return arr;\r\n}\r\n\r\nfunction pushAway<T extends LayoutNode>(\r\n items: T[],\r\n mover: T,\r\n blocked: T,\r\n opts: MoveOptions,\r\n depth: number,\r\n): T[] {\r\n const targetX =\r\n opts.compact === 'horizontal' ? mover.config.x + mover.config.w : blocked.config.x;\r\n const targetY =\r\n opts.compact === 'horizontal' ? blocked.config.y : mover.config.y + mover.config.h;\r\n return moveItem(items, blocked.id, targetX, targetY, opts, depth);\r\n}\r\n\r\nfunction compareForCompaction(mode: CompactMode) {\r\n return (a: LayoutNode, b: LayoutNode) =>\r\n mode === 'horizontal'\r\n ? a.config.x - b.config.x || a.config.y - b.config.y\r\n : a.config.y - b.config.y || a.config.x - b.config.x;\r\n}\r\n\r\n/**\r\n * When the actively-moved item directly overlaps exactly one same-size item,\r\n * exchanging their positions reads much better than a cascading push. The\r\n * caller (service) decides when to offer this vs. falling back to `moveItem`.\r\n */\r\nexport function trySwap<T extends LayoutNode>(\r\n items: readonly T[],\r\n id: string,\r\n previous: GridItemConfig,\r\n next: GridItemConfig,\r\n): T[] | null {\r\n if (items.some((i) => i.id !== id && isStatic(i) && collides(i.config, next))) return null;\r\n const collisions = items.filter((i) => i.id !== id && !isStatic(i) && collides(i.config, next));\r\n if (collisions.length !== 1) return null;\r\n const [target] = collisions;\r\n if (target.config.w !== next.w || target.config.h !== next.h) return null;\r\n const arr = clone(items);\r\n const mover = arr.find((i) => i.id === id)!;\r\n const other = arr.find((i) => i.id === target.id)!;\r\n mover.config.x = next.x;\r\n mover.config.y = next.y;\r\n other.config.x = previous.x;\r\n other.config.y = previous.y;\r\n return arr;\r\n}\r\n\r\n/**\r\n * Removes gaps by pulling every non-static item as far toward the start of the\r\n * grid as it can go without overlapping another item, in reading order.\r\n */\r\nexport function compact<T extends LayoutNode>(items: readonly T[], mode: CompactMode): T[] {\r\n const arr = clone(items);\r\n if (mode === 'none') return arr;\r\n const canX = mode === 'horizontal' || mode === 'both';\r\n const canY = mode === 'vertical' || mode === 'both';\r\n const sorted = [...arr].sort((a, b) => a.config.y - b.config.y || a.config.x - b.config.x);\r\n for (const item of sorted) {\r\n if (isStatic(item)) continue;\r\n if (canY) {\r\n let y = item.config.y;\r\n while (y > 0 && !getFirstCollision(arr, item.id, { ...item.config, y: y - 1 })) y--;\r\n item.config.y = y;\r\n }\r\n if (canX) {\r\n let x = item.config.x;\r\n while (x > 0 && !getFirstCollision(arr, item.id, { ...item.config, x: x - 1 })) x--;\r\n item.config.x = x;\r\n }\r\n }\r\n return arr;\r\n}\r\n\r\n/** Highest occupied row (0-based, exclusive) across all items — drives the grid's auto-height. */\r\nexport function maxOccupiedRow(items: readonly LayoutNode[]): number {\r\n return items.reduce((max, i) => Math.max(max, i.config.y + i.config.h), 0);\r\n}\r\n\r\n/**\r\n * Finds a cell for `config` that doesn't collide with any existing item.\r\n * Tries the requested (x, y) first; if that's already occupied, scans\r\n * forward in reading order (row by row, top to bottom, left to right — the\r\n * caller is responsible for any RTL flipping when it turns this back into\r\n * pixels) for the first gap large enough to fit it.\r\n *\r\n * This is what a newly-registered item (or one whose config changes to a\r\n * position that's no longer free) should go through instead of silently\r\n * overlapping whatever's already there: unlike a drag/resize, registering an\r\n * item isn't a deliberate \"make room for me\" gesture, so relocating the new\r\n * item to open space reads far better than shoving already-placed items\r\n * around to accommodate it.\r\n */\r\nexport function findFreeSpot<T extends LayoutNode>(\r\n items: readonly T[],\r\n config: GridItemConfig,\r\n cols: number,\r\n excludeId?: string,\r\n): { x: number; y: number } {\r\n const others = excludeId ? items.filter((i) => i.id !== excludeId) : items;\r\n const fits = (x: number, y: number) => !others.some((i) => collides(i.config, { ...config, x, y }));\r\n\r\n const startX = Math.max(0, Math.min(config.x, cols - config.w));\r\n const startY = Math.max(0, config.y);\r\n if (fits(startX, startY)) return { x: startX, y: startY };\r\n\r\n // The row just past the current bottom is always fully empty, so this loop\r\n // is guaranteed to find a fit no later than `maxY`.\r\n const maxY = maxOccupiedRow(others) + 1;\r\n for (let y = 0; y <= maxY; y++) {\r\n for (let x = 0; x <= cols - config.w; x++) {\r\n if (fits(x, y)) return { x, y };\r\n }\r\n }\r\n return { x: startX, y: maxY + 1 };\r\n}\r\n","import { GridItemConfig } from '../options/grid-item-config';\r\nimport { IGridLayoutOptions } from '../options/options';\r\n\r\n/**\r\n * All pixel <-> grid-cell math lives here, in one RTL-aware place.\r\n *\r\n * Grid coordinates are always *logical* (reading-order): x = 0 is the first\r\n * column in the direction text flows — the left edge in LTR, the right edge\r\n * in RTL. Every physical (CSS `left`/pixel) calculation goes through here so\r\n * the rest of the codebase never has to think about direction again.\r\n */\r\nexport interface GridMetrics {\r\n /** Inner content width available for columns (container width minus padding). */\r\n contentWidth: number;\r\n colWidth: number;\r\n rowHeight: number;\r\n gap: number;\r\n padding: number;\r\n}\r\n\r\nexport function computeMetrics(containerWidth: number, options: IGridLayoutOptions): GridMetrics {\r\n const cols = Math.max(1, Math.floor(options.cols));\r\n const gap = options.gap ?? 0;\r\n const padding = options.padding ?? 0;\r\n const contentWidth = Math.max(0, containerWidth - padding * 2);\r\n const colWidth = Math.max(1, (contentWidth - gap * (cols - 1)) / cols);\r\n const rowHeight = options.rowHeight === 'fit' ? Math.max(1, colWidth) : Math.max(1, options.rowHeight);\r\n return { contentWidth, colWidth, rowHeight, gap, padding };\r\n}\r\n\r\n/** Physical CSS `left` (px, relative to the grid surface's content box) for a logical column. */\r\nexport function colToLeft(colIndex: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\r\n if (!rtl) return m.padding + colIndex * (m.colWidth + m.gap);\r\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\r\n const rightEdge = m.padding + colIndex * (m.colWidth + m.gap);\r\n return m.contentWidth + m.padding - rightEdge - widthPx;\r\n}\r\n\r\nexport function rowToTop(rowIndex: number, m: GridMetrics): number {\r\n return m.padding + rowIndex * (m.rowHeight + m.gap);\r\n}\r\n\r\nexport function spanToWidthPx(spanCols: number, m: GridMetrics): number {\r\n return spanCols * m.colWidth + Math.max(0, spanCols - 1) * m.gap;\r\n}\r\n\r\nexport function spanToHeightPx(spanRows: number, m: GridMetrics): number {\r\n return spanRows * m.rowHeight + Math.max(0, spanRows - 1) * m.gap;\r\n}\r\n\r\n/** Physical left px (as above) -> nearest logical column index. Inverse of `colToLeft`. */\r\nexport function leftToCol(leftPx: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\r\n if (!rtl) return Math.round((leftPx - m.padding) / (m.colWidth + m.gap));\r\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\r\n const rightEdge = m.contentWidth + m.padding - leftPx - widthPx;\r\n return Math.round((rightEdge - m.padding) / (m.colWidth + m.gap));\r\n}\r\n\r\nexport function topToRow(topPx: number, m: GridMetrics): number {\r\n return Math.round((topPx - m.padding) / (m.rowHeight + m.gap));\r\n}\r\n\r\n/** Places an item's pixel box (left/top/width/height) inside the grid surface, RTL-aware. */\r\nexport function placeItem(config: GridItemConfig, m: GridMetrics, rtl: boolean): { left: number; top: number; width: number; height: number } {\r\n return {\r\n left: colToLeft(config.x, config.w, m, rtl),\r\n top: rowToTop(config.y, m),\r\n width: spanToWidthPx(config.w, m),\r\n height: spanToHeightPx(config.h, m),\r\n };\r\n}\r\n","import { Injectable, computed, effect, signal } from '@angular/core';\r\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\r\nimport {\r\n normalizeGridItem,\r\n gridItemConfigsEqual,\r\n GridItemConfig,\r\n} from '../options/grid-item-config';\r\nimport { LayoutOutput } from '../options/layout-output';\r\nimport { computeMetrics, leftToCol, placeItem, topToRow, GridMetrics } from '../utils/geometry';\r\nimport { compact, maxOccupiedRow, moveItem, trySwap, findFreeSpot } from '../utils/compaction';\r\nimport { isRtl } from 'ngx-kit/drag-resize';\r\n\r\nexport interface GridItemState {\r\n id: string;\r\n config: GridItemConfig;\r\n element?: HTMLElement;\r\n dragging?: boolean;\r\n resizing?: boolean;\r\n}\r\n\r\n/** Structural + value equality for two item-state arrays (order-independent). */\r\nfunction itemsEqual(a: readonly GridItemState[], b: readonly GridItemState[]): boolean {\r\n if (a.length !== b.length) return false;\r\n return a.every((itemA) => {\r\n const itemB = b.find((x) => x.id === itemA.id);\r\n return (\r\n !!itemB && itemA.element === itemB.element && gridItemConfigsEqual(itemA.config, itemB.config)\r\n );\r\n });\r\n}\r\n\r\n/** Value equality for two options objects — see `setOptions` for why this matters. */\r\nfunction optionsEqual(a: GridLayoutOptions, b: GridLayoutOptions): boolean {\r\n const bg1 = a.gridBackgroundConfig ?? {};\r\n const bg2 = b.gridBackgroundConfig ?? {};\r\n return (\r\n a.cols === b.cols &&\r\n a.rowHeight === b.rowHeight &&\r\n a.gap === b.gap &&\r\n a.padding === b.padding &&\r\n a.flow === b.flow &&\r\n a.compact === b.compact &&\r\n a.allowOverlap === b.allowOverlap &&\r\n a.pushItems === b.pushItems &&\r\n a.swap === b.swap &&\r\n a.dragThreshold === b.dragThreshold &&\r\n a.animate === b.animate &&\r\n a.rtl === b.rtl &&\r\n (a.maxRows ?? null) === (b.maxRows ?? null) &&\r\n bg1.show === bg2.show &&\r\n bg1.borderColor === bg2.borderColor &&\r\n bg1.gapColor === bg2.gapColor &&\r\n bg1.rowColor === bg2.rowColor &&\r\n bg1.columnColor === bg2.columnColor &&\r\n bg1.borderWidth === bg2.borderWidth\r\n );\r\n}\r\n\r\n@Injectable()\r\nexport class GridLayoutService {\r\n readonly options = signal<GridLayoutOptions>(new GridLayoutOptions());\r\n readonly items = signal<readonly GridItemState[]>([]);\r\n readonly editMode = signal(true);\r\n readonly activeId = signal<string | null>(null);\r\n readonly isInteracting = computed(() => this.activeId() !== null);\r\n readonly height = computed(() => this.calculateHeight(this.items(), this.options()));\r\n readonly layout = computed<LayoutOutput[]>(() =>\r\n this.items().map((x) => ({ id: x.id, ...x.config })),\r\n );\r\n readonly columns = computed(() => Math.max(1, Math.floor(this.options().cols)));\r\n\r\n readonly rtl = computed(() => {\r\n this.rtlTick();\r\n return this.resolveRtl();\r\n });\r\n private rtlTick = signal(0);\r\n\r\n private layoutListener?: (layout: LayoutOutput[]) => void;\r\n private startConfig: GridItemConfig | null = null;\r\n private startItems: readonly GridItemState[] | null = null;\r\n private previewItems = signal<readonly GridItemState[] | null>(null);\r\n private _element!: HTMLElement;\r\n private placeholder?: HTMLElement;\r\n\r\n constructor() {\r\n effect(() => {\r\n // Re-run whenever options or items change so CSS positions always reflect state.\r\n this.options();\r\n this.items();\r\n this.previewItems();\r\n this.rtlTick();\r\n if (this._element) this.applyCss();\r\n });\r\n }\r\n\r\n connect(onLayout: (layout: LayoutOutput[]) => void): void {\r\n this.layoutListener = onLayout;\r\n }\r\n setOptions(value: Partial<IGridLayoutOptions>): void {\r\n const next = Object.assign(new GridLayoutOptions(), this.options(), value);\r\n if (optionsEqual(this.options(), next)) return;\r\n this.options.set(next);\r\n }\r\n setEditMode(value: boolean): void {\r\n this.editMode.set(value);\r\n }\r\n setItems(items: GridItemState[]): void {\r\n this.items.set(items.map((x) => ({ ...x, config: normalizeGridItem(x.config) })));\r\n this.settle();\r\n this.emit();\r\n }\r\n\r\n registerItem(item: GridItemState): void {\r\n const existing = this.items().find((x) => x.id === item.id);\r\n if (!existing) {\r\n const normalized = normalizeGridItem(item.config);\r\n const placed = this.options().allowOverlap\r\n ? normalized\r\n : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns()) };\r\n this.items.update((xs) => [...xs, { ...item, config: placed }]);\r\n this.settle();\r\n return;\r\n }\r\n if (existing.element === item.element) return;\r\n this.items.update((xs) =>\r\n xs.map((x) => (x.id === item.id ? { ...x, element: item.element } : x)),\r\n );\r\n }\r\n\r\n updateItemConfig(id: string, config: GridItemConfig): void {\r\n const existing = this.items().find((x) => x.id === id);\r\n if (!existing) return;\r\n const normalized = normalizeGridItem(config);\r\n const placed = this.options().allowOverlap\r\n ? normalized\r\n : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns(), id) };\r\n if (gridItemConfigsEqual(existing.config, placed)) return;\r\n this.items.update((xs) => xs.map((x) => (x.id === id ? { ...x, config: placed } : x)));\r\n this.settle();\r\n }\r\n unregisterItem(id: string): void {\r\n this.items.update((xs) => xs.filter((x) => x.id !== id));\r\n this.settle();\r\n this.emit();\r\n }\r\n\r\n /** Called once the grid surface element exists (e.g. from `ngAfterViewInit`). */\r\n attachElement(el: HTMLElement): void {\r\n this._element = el;\r\n this.placeholder =\r\n (el.querySelector('.ngx-grid-layout__placeholder') as HTMLElement | null) ?? undefined;\r\n if (this.placeholder) {\r\n this.placeholder.style.position = 'absolute';\r\n this.placeholder.style.display = 'none';\r\n this.placeholder.style.pointerEvents = 'none';\r\n this.placeholder.setAttribute('aria-hidden', 'true');\r\n }\r\n // `rtl` reads `this._element` directly (it isn't a signal), so bump a tick\r\n // signal to force the `rtl` computed to re-evaluate now that the element,\r\n // and therefore its computed `direction`, is known.\r\n this.rtlTick.update((n) => n + 1);\r\n this.applyCss();\r\n }\r\n\r\n /** Recomputes pixel positions after the surface resizes. Call from a `ResizeObserver`. */\r\n refreshMetrics(): void {\r\n this.applyCss();\r\n }\r\n\r\n isItemDraggable(item: GridItemState): boolean {\r\n return this.editMode() && !item.config.static && (item.config.isDraggable ?? true);\r\n }\r\n isItemResizable(item: GridItemState): boolean {\r\n return this.editMode() && !item.config.static && (item.config.isResizable ?? true);\r\n }\r\n\r\n // ---- Pointer-driven interaction (drag / resize) ----------------------------------\r\n\r\n begin(id: string): void {\r\n const target = this.items().find((x) => x.id === id);\r\n if (!target) return;\r\n\r\n this.startItems = this.items().map((x) => ({ ...x, config: { ...x.config } }));\r\n this.startConfig = { ...target.config };\r\n this.previewItems.set(null);\r\n this.activeId.set(id);\r\n this.applyCss();\r\n }\r\n\r\n move(id: string): void {\r\n const target = this.items().find((it) => it.id === id);\r\n if (!target?.element) return;\r\n const next = this.screenToGrid(target);\r\n this.preview(id, next);\r\n }\r\n\r\n resize(\r\n id: string,\r\n out: { width: number; height: number; moveLeft: number; moveTop: number },\r\n ): void {\r\n const target = this.items().find((x) => x.id === id);\r\n if (!target?.element) return;\r\n const next = this.screenResizeToGrid(target, out);\r\n this.preview(id, next);\r\n }\r\n\r\n end(id: string): void {\r\n if (this.activeId() !== id) return;\r\n\r\n const preview = this.previewItems();\r\n if (preview) {\r\n this.items.set(preview.map((x) => ({ ...x, config: { ...x.config } })));\r\n }\r\n const target = this.items().find((x) => x.id === id);\r\n if (target?.element) target.element.style.transform = '';\r\n\r\n this.previewItems.set(null);\r\n this.activeId.set(null);\r\n this.startConfig = null;\r\n this.startItems = null;\r\n\r\n // Final normalization/compaction happens only after the preview is committed.\r\n this.settle(id);\r\n this.applyCss();\r\n this.emit();\r\n }\r\n\r\n // ---- Keyboard-driven interaction (a11y) -------------------------------------------\r\n\r\n /** Moves an item by whole grid cells — used by arrow-key handling in the item component. */\r\n moveByCells(id: string, dCols: number, dRows: number): void {\r\n const target = this.items().find((x) => x.id === id);\r\n if (!target) return;\r\n this.begin(id);\r\n this.preview(id, { ...target.config, x: target.config.x + dCols, y: target.config.y + dRows });\r\n this.end(id);\r\n }\r\n\r\n /** Resizes an item by whole grid cells — used by shift+arrow handling in the item component. */\r\n resizeByCells(id: string, dCols: number, dRows: number): void {\r\n const target = this.items().find((x) => x.id === id);\r\n if (!target) return;\r\n this.begin(id);\r\n const w = this.clampSize(\r\n target.config.w + dCols,\r\n target.config.minW,\r\n target.config.maxW,\r\n this.columns(),\r\n );\r\n const h = this.clampSize(\r\n target.config.h + dRows,\r\n target.config.minH,\r\n target.config.maxH,\r\n Infinity,\r\n );\r\n this.preview(id, { ...target.config, w, h });\r\n this.end(id);\r\n }\r\n\r\n // ---- Internals ----------------------------------------------------------------------\r\n\r\n private preview(id: string, config: GridItemConfig): void {\r\n const base = this.startItems;\r\n if (!base) return;\r\n\r\n const clamped = this.clamp(config);\r\n const opt = this.options();\r\n\r\n // The placeholder is the moving item during preview. The real DOM element\r\n // remains under ngxDraggable's control and is never repositioned by the grid.\r\n let candidate: GridItemState[];\r\n\r\n if (!opt.allowOverlap && opt.swap && this.startConfig) {\r\n const swapped = trySwap(base, id, this.startConfig, clamped);\r\n candidate =\r\n swapped ??\r\n base.map((x) =>\r\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\r\n );\r\n } else {\r\n candidate = base.map((x) =>\r\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\r\n );\r\n }\r\n\r\n if (!opt.allowOverlap && opt.pushItems) {\r\n candidate = moveItem(candidate, id, clamped.x, clamped.y, {\r\n cols: this.columns(),\r\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\r\n allowOverlap: false,\r\n maxRows: opt.maxRows,\r\n });\r\n }\r\n if (!opt.allowOverlap && opt.compact !== 'none') {\r\n candidate = compact(candidate, opt.compact);\r\n }\r\n\r\n this.previewItems.set(candidate);\r\n this.applyCss();\r\n }\r\n\r\n private screenToGrid(item: GridItemState): GridItemConfig {\r\n const containerRect = this._element.getBoundingClientRect();\r\n const r = item.element!.getBoundingClientRect();\r\n const m = this.metrics();\r\n const rtl = this.rtl();\r\n const leftPx = r.left - containerRect.left;\r\n const topPx = r.top - containerRect.top;\r\n const nx = leftToCol(leftPx, item.config.w, m, rtl);\r\n const ny = topToRow(topPx, m);\r\n return this.clamp({ ...item.config, x: nx, y: ny });\r\n }\r\n\r\n private screenResizeToGrid(\r\n item: GridItemState,\r\n out: { width: number; height: number; moveLeft: number; moveTop: number },\r\n ): GridItemConfig {\r\n const m = this.metrics();\r\n const gap = m.gap;\r\n let w = Math.max(1, Math.round((out.width + gap) / (m.colWidth + gap)));\r\n let h = Math.max(1, Math.round((out.height + gap) / (m.rowHeight + gap)));\r\n let x = item.config.x;\r\n let y = item.config.y;\r\n // moveLeft/moveTop are physical (viewport) deltas from the resizable directive;\r\n // moving the item's *start* edge left/up in physical space means, in RTL, that\r\n // the logical column count grows from the *end* instead — handled by re-deriving\r\n // x from the resulting physical box rather than from moveLeft directly.\r\n if (this.rtl()) {\r\n // 'w' handle grows width to the right physically but that's the grid's logical end;\r\n // recompute x from the (possibly shifted) physical left edge captured via the element.\r\n const r = item.element!.getBoundingClientRect();\r\n const containerRect = this._element.getBoundingClientRect();\r\n const leftPx = r.left + out.moveLeft - containerRect.left;\r\n x = leftToCol(leftPx, w, m, true);\r\n } else {\r\n //if (out.moveLeft) x += Math.round(out.moveLeft / (m.colWidth + gap));\r\n if (out.moveLeft) {\r\n const rightEdge = item.config.x + item.config.w;\r\n x = rightEdge - w;\r\n }\r\n }\r\n if (out.moveTop) y += Math.round(out.moveTop / (m.rowHeight + gap));\r\n return this.clamp({ ...item.config, x, y, w, h });\r\n }\r\n\r\n private clamp(c: GridItemConfig): GridItemConfig {\r\n const cols = this.columns();\r\n const next = { ...c };\r\n next.w = this.clampSize(next.w, next.minW, next.maxW, cols);\r\n next.h = this.clampSize(next.h, next.minH, next.maxH, this.options().maxRows ?? Infinity);\r\n next.x = Math.max(0, Math.min(next.x, cols - next.w));\r\n next.y = Math.max(0, next.y);\r\n if (this.options().maxRows)\r\n next.y = Math.min(next.y, Math.max(0, this.options().maxRows! - next.h));\r\n return next;\r\n }\r\n\r\n private clampSize(\r\n size: number,\r\n min: number | undefined,\r\n max: number | undefined,\r\n hardMax: number,\r\n ): number {\r\n let v = Math.max(min ?? 1, size);\r\n if (max) v = Math.min(v, max);\r\n return Math.min(v, hardMax);\r\n }\r\n\r\n /** Applies pushes on drag-end and, when configured, removes gaps via compaction. */\r\n private settle(activeId?: string): void {\r\n const opt = this.options();\r\n const before = this.items();\r\n let arr = before.map((x) => ({ ...x, config: { ...x.config } }));\r\n if (!opt.allowOverlap) {\r\n if (activeId && opt.pushItems) {\r\n arr = moveItem(\r\n arr,\r\n activeId,\r\n arr.find((x) => x.id === activeId)!.config.x,\r\n arr.find((x) => x.id === activeId)!.config.y,\r\n {\r\n cols: this.columns(),\r\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\r\n allowOverlap: false,\r\n maxRows: opt.maxRows,\r\n },\r\n );\r\n }\r\n if (opt.compact !== 'none') arr = compact(arr, opt.compact);\r\n }\r\n // Compaction/push are deterministic pure functions: if they didn't change\r\n // anything, keep the previous array reference instead of writing an\r\n // equal-but-new one — that would otherwise ripple into every computed\r\n // derived from `items` (layout, height, per-item `interactive`, ...) for\r\n // no reason, and risks re-arming the same feedback loop described above.\r\n if (itemsEqual(before, arr)) return;\r\n this.items.set(arr);\r\n this.applyCss();\r\n }\r\n\r\n private applyCss(): void {\r\n if (!this._element) return;\r\n\r\n const source = this.previewItems() ?? this.items();\r\n const activeId = this.activeId();\r\n const m = this.metrics();\r\n const rtl = this.rtl();\r\n\r\n for (const item of source) {\r\n if (!item.element) continue;\r\n\r\n // While dragging/resizing, the real active element is moved by\r\n // ngxDraggable/ngxResizable. Never fight those directives by writing\r\n // left/top/width/height here.\r\n if (item.id === activeId) continue;\r\n\r\n const box = placeItem(item.config, m, rtl);\r\n const style = item.element.style;\r\n style.position = 'absolute';\r\n style.left = `${box.left}px`;\r\n style.top = `${box.top}px`;\r\n style.width = `${box.width}px`;\r\n style.height = `${box.height}px`;\r\n item.element.dataset['gridX'] = String(item.config.x);\r\n item.element.dataset['gridY'] = String(item.config.y);\r\n item.element.dataset['gridW'] = String(item.config.w);\r\n item.element.dataset['gridH'] = String(item.config.h);\r\n }\r\n\r\n const placeholderItem = activeId ? source.find((x) => x.id === activeId) : undefined;\r\n if (this.placeholder) {\r\n if (placeholderItem && activeId) {\r\n const box = placeItem(placeholderItem.config, m, rtl);\r\n const style = this.placeholder.style;\r\n style.display = 'block';\r\n style.left = `${box.left}px`;\r\n style.top = `${box.top}px`;\r\n style.width = `${box.width}px`;\r\n style.height = `${box.height}px`;\r\n this.placeholder.dataset['gridX'] = String(placeholderItem.config.x);\r\n this.placeholder.dataset['gridY'] = String(placeholderItem.config.y);\r\n this.placeholder.dataset['gridW'] = String(placeholderItem.config.w);\r\n this.placeholder.dataset['gridH'] = String(placeholderItem.config.h);\r\n } else {\r\n this.placeholder.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n private metrics(): GridMetrics {\r\n const rect = this._element?.getBoundingClientRect() ?? ({ width: 0 } as DOMRect);\r\n return computeMetrics(rect.width, this.options());\r\n }\r\n\r\n private resolveRtl(): boolean {\r\n const opt = this.options().rtl;\r\n if (opt === true || opt === false) return opt;\r\n return this._element ? isRtl(this._element) : false;\r\n }\r\n\r\n private calculateHeight(items: readonly GridItemState[], o: GridLayoutOptions): number {\r\n const preview = this.previewItems();\r\n const source = preview ?? items;\r\n const rows = Math.max(1, maxOccupiedRow(source));\r\n const m = this._element\r\n ? this.metrics()\r\n : ({\r\n rowHeight: o.rowHeight === 'fit' ? 100 : o.rowHeight,\r\n gap: o.gap ?? 0,\r\n padding: o.padding ?? 0,\r\n } as GridMetrics);\r\n return m.padding * 2 + rows * m.rowHeight + Math.max(0, rows - 1) * m.gap;\r\n }\r\n\r\n private emit(): void {\r\n this.layoutListener?.(this.layout());\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { GridLayoutService, GridItemState } from '../services/grid-layout.service';\r\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\r\nimport { LayoutOutput } from '../options/layout-output';\r\n\r\n@Component({\r\n selector: 'ngx-grid-layout',\r\n standalone: true,\r\n template: `\r\n <div class=\"ngx-grid-layout__surface\" [class.edit-mode]=\"editMode()\">\r\n <div class=\"ngx-grid-layout__placeholder\"></div>\r\n <ng-content />\r\n </div>\r\n `,\r\n host: {\r\n '[class.ngx-grid-layout--dragging]': 'service.isInteracting()',\r\n '[class.ngx-grid-layout--view]': '!editMode()',\r\n '[style.height.px]': 'service.height()',\r\n '[attr.dir]': 'dirOverride() ?? null',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./grid-layout.component.scss'],\r\n})\r\nexport class NgxGridLayoutComponent implements AfterViewInit, OnDestroy {\r\n readonly options = input<IGridLayoutOptions>(new GridLayoutOptions());\r\n readonly editMode = input(true);\r\n readonly layoutChange = output<LayoutOutput[]>();\r\n /** Explicit direction override. Leave unset to inherit the page/host direction automatically. */\r\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\r\n readonly dirOverride = this.dir;\r\n\r\n readonly service = inject(GridLayoutService);\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n private surface?: HTMLElement;\r\n private resizeObserver?: ResizeObserver;\r\n\r\n constructor() {\r\n effect(() => {\r\n const opts = { ...this.options() };\r\n if (this.dir()) opts.rtl = this.dir() === 'rtl';\r\n this.service.setOptions(opts);\r\n this.service.setEditMode(this.editMode());\r\n });\r\n\r\n this.service.connect((layout) => this.layoutChange.emit(layout));\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.surface = this.el.nativeElement.querySelector('.ngx-grid-layout__surface') as HTMLElement;\r\n this.service.attachElement(this.surface);\r\n this.setCss();\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.service.refreshMetrics();\r\n this.setCss();\r\n });\r\n this.resizeObserver.observe(this.surface);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resizeObserver?.disconnect();\r\n }\r\n\r\n setItems(items: GridItemState[]): void {\r\n this.service.setItems(items);\r\n }\r\n update(options: Partial<IGridLayoutOptions>): void {\r\n this.service.setOptions(options);\r\n this.setCss();\r\n }\r\n\r\n private setCss(): void {\r\n const el = this.el.nativeElement,\r\n o = this.service.options();\r\n el.style.setProperty('--grid-cols', String(o.cols));\r\n el.style.setProperty('--grid-gap', `${o.gap ?? 0}px`);\r\n el.style.setProperty('--grid-row', `${o.rowHeight === 'fit' ? 100 : o.rowHeight}px`);\r\n const b = o.gridBackgroundConfig;\r\n el.style.setProperty('--grid-gap-color', `${b.gapColor}`);\r\n el.style.setProperty('--grid-border-width', `${b?.borderWidth ?? 0}px`);\r\n el.style.setProperty('--grid-border-color', b?.borderColor ?? 'transparent');\r\n el.style.setProperty('--grid-row-color', b?.rowColor ?? 'transparent');\r\n el.style.setProperty('--grid-col-color', b?.columnColor ?? 'transparent');\r\n el.style.setProperty(\r\n '--grid-bg-opacity',\r\n b?.show === 'never'\r\n ? '0'\r\n : b?.show === 'whenDragging'\r\n ? this.service.isInteracting()\r\n ? '1'\r\n : '0'\r\n : '1',\r\n );\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { GridLayoutService } from '../services/grid-layout.service';\r\nimport { GridItemConfig } from '../options/grid-item-config';\r\nimport { NgxDraggable, NgxResizable } from 'ngx-kit/drag-resize';\r\n\r\n@Component({\r\n selector: 'ngx-grid-item',\r\n standalone: true,\r\n hostDirectives: [\r\n { directive: NgxDraggable, inputs: ['dragHandle', 'lockAxis'], outputs: [] },\r\n NgxResizable,\r\n ],\r\n template: `\r\n <ng-content />\r\n `,\r\n host: {\r\n '[style.position]': '\"absolute\"',\r\n '[style.display]': '\"block\"',\r\n '[style.boxSizing]': '\"border-box\"',\r\n '[style.transition]': 'transitionStyle()',\r\n '[class.ngx-grid-item--dragging]': 'dragging()',\r\n '[class.ngx-grid-item--resizing]': 'resizing()',\r\n '[class.ngx-grid-item--static]': 'config().static',\r\n '[class.with-resize-handler]': 'resizable()',\r\n '[attr.tabindex]': 'interactive() ? 0 : null',\r\n '[attr.aria-grabbed]': 'dragging()',\r\n '[attr.data-grid-id]': 'itemId()',\r\n '(keydown)': 'onKeyDown($event)',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./grid-item.component.scss'],\r\n})\r\nexport class NgxGridItemComponent implements OnDestroy, OnInit {\r\n /** Bound as `[id]` in templates (matches the demo app's existing usage). */\r\n readonly itemId = input<string | undefined>(undefined, { alias: 'id' });\r\n readonly config = input<GridItemConfig>({ x: 0, y: 0, w: 1, h: 1 });\r\n readonly layoutChange = output<GridItemConfig>();\r\n\r\n readonly dragging = signal(false);\r\n readonly resizing = signal(false);\r\n readonly active = computed(() => this.dragging() || this.resizing());\r\n readonly transitionStyle = computed(() =>\r\n !this.active() && this.service.options().animate\r\n ? 'left .18s ease, top .18s ease, width .18s ease, height .18s ease'\r\n : 'none',\r\n );\r\n readonly interactive = computed(() => {\r\n const id = this.itemId();\r\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\r\n return !!item && (this.service.isItemDraggable(item) || this.service.isItemResizable(item));\r\n });\r\n\r\n private readonly service = inject(GridLayoutService);\r\n private readonly el = inject(ElementRef<HTMLElement>);\r\n private readonly drag = inject(NgxDraggable);\r\n private readonly resize = inject(NgxResizable);\r\n\r\n readonly resizable = computed(() => {\r\n return !this.resize.disabled() && this.service.editMode();\r\n });\r\n constructor() {\r\n // `takeUntilDestroyed()` releases these subscriptions on destroy — the\r\n // event for every grid item ever created (real damage in layouts where\r\n // items are added/removed dynamically, e.g. via *ngFor + trackBy).\r\n this.drag.dragStart.subscribe(() => this.onDragStart());\r\n this.drag.dragMove.subscribe(() => this.onDragMove());\r\n this.drag.dragEnd.subscribe(() => this.onDragEnd());\r\n this.resize.resizeStart.subscribe(() => this.onResizeStart());\r\n this.resize.resizeMove.subscribe((v) => this.onResizeMove(v));\r\n this.resize.resizeEnd.subscribe(() => this.onResizeEnd());\r\n\r\n // Keep the hosted directives in sync with per-item state: static items and\r\n // items explicitly marked non-draggable/non-resizable stop reacting entirely.\r\n effect(() => {\r\n const id = this.itemId();\r\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\r\n this.drag.disabled.set(!item || !this.service.isItemDraggable(item));\r\n this.resize.disabled.set(!item || !this.service.isItemResizable(item));\r\n if (item) this.applySizeConstraints(item.config);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n const id = this.itemId();\r\n if (!id) return;\r\n this.service.registerItem({\r\n id,\r\n config: this.config(),\r\n element: this.el.nativeElement,\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n const id = this.itemId();\r\n if (id) this.service.unregisterItem(id);\r\n }\r\n\r\n onDragStart = (): void => {\r\n this.dragging.set(true);\r\n const id = this.itemId();\r\n if (id) this.service.begin(id);\r\n };\r\n onDragMove = (): void => {\r\n const id = this.itemId();\r\n if (id) this.service.move(id);\r\n };\r\n onDragEnd = (): void => {\r\n this.dragging.set(false);\r\n this.finishInteraction();\r\n };\r\n onResizeStart = (): void => {\r\n this.resizing.set(true);\r\n const id = this.itemId();\r\n if (id) this.service.begin(id);\r\n };\r\n onResizeMove = (v: {\r\n width: number;\r\n height: number;\r\n moveLeft: number;\r\n moveTop: number;\r\n }): void => {\r\n const id = this.itemId();\r\n if (id) this.service.resize(id, v);\r\n };\r\n onResizeEnd = (): void => {\r\n this.resizing.set(false);\r\n this.finishInteraction();\r\n };\r\n\r\n /** Arrow keys move the item by one cell; Shift+arrow resizes it by one cell. */\r\n onKeyDown(e: KeyboardEvent): void {\r\n const id = this.itemId();\r\n if (!id || !this.interactive()) return;\r\n const item = this.service.items().find((x) => x.id === id);\r\n if (!item) return;\r\n const deltas: Record<string, [number, number]> = {\r\n ArrowLeft: [-1, 0],\r\n ArrowRight: [1, 0],\r\n ArrowUp: [0, -1],\r\n ArrowDown: [0, 1],\r\n };\r\n const delta = deltas[e.key];\r\n if (!delta) return;\r\n e.preventDefault();\r\n if (e.shiftKey && this.service.isItemResizable(item)) {\r\n this.service.resizeByCells(id, delta[0], delta[1]);\r\n } else if (this.service.isItemDraggable(item)) {\r\n this.service.moveByCells(id, delta[0], delta[1]);\r\n }\r\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\r\n }\r\n\r\n private finishInteraction(): void {\r\n const id = this.itemId();\r\n if (!id) return;\r\n this.service.end(id);\r\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\r\n }\r\n\r\n /** Converts the item's min/max cell counts (config) into px for the resize directive. */\r\n private applySizeConstraints(config: GridItemConfig): void {\r\n const cellPx = this.el.nativeElement.getBoundingClientRect();\r\n const cols = Math.max(1, config.w);\r\n const rows = Math.max(1, config.h);\r\n const colPx = cellPx.width / cols || 1;\r\n const rowPx = cellPx.height / rows || 1;\r\n this.resize.minWidth.set((config.minW ?? 1) * colPx);\r\n this.resize.minHeight.set((config.minH ?? 1) * rowPx);\r\n this.resize.maxWidth.set(config.maxW ? config.maxW * colPx : Infinity);\r\n this.resize.maxHeight.set(config.maxH ? config.maxH * rowPx : Infinity);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxGridLayoutComponent } from './grid-layout/grid-layout.component';\r\nimport { NgxGridItemComponent } from './grid-item/grid-item.component';\r\nimport { GridLayoutService } from './services/grid-layout.service';\r\n\r\n@NgModule({\r\n imports: [NgxGridLayoutComponent, NgxGridItemComponent],\r\n exports: [NgxGridLayoutComponent, NgxGridItemComponent],\r\n providers: [GridLayoutService],\r\n})\r\nexport class NgxGridLayoutModule {}\r\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>(\n items: readonly T[],\n selfId: string,\n config: GridItemConfig,\n): 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>(\n items: readonly T[],\n selfId: string,\n config: GridItemConfig,\n): T[] {\n return items.filter((item) => item.id !== selfId && collides(item.config, config));\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport { 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) =>\n !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 =\n 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(\n colIndex: number,\n spanCols: number,\n m: GridMetrics,\n rtl: boolean,\n): 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(\n config: GridItemConfig,\n m: GridMetrics,\n rtl: boolean,\n): { 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 if (out.moveLeft) {\n const rightEdge = item.config.x + item.config.w;\n x = rightEdge - w;\n }\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 OnInit,\n} from '@angular/core';\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.subscribe(() => this.onDragStart());\n this.drag.dragMove.subscribe(() => this.onDragMove());\n this.drag.dragEnd.subscribe(() => this.onDragEnd());\n this.resize.resizeStart.subscribe(() => this.onResizeStart());\n this.resize.resizeMove.subscribe((v) => this.onResizeMove(v));\n this.resize.resizeEnd.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.set(!item || !this.service.isItemDraggable(item));\n this.resize.disabled.set(!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.set((config.minW ?? 1) * colPx);\n this.resize.minHeight.set((config.minH ?? 1) * rowPx);\n this.resize.maxWidth.set(config.maxW ? config.maxW * colPx : Infinity);\n this.resize.maxHeight.set(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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"}
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { output, HostListener, Directive, InjectionToken, input, inject, signal, viewChild, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormsModule } from '@angular/forms';
5
- import { SliderComponent } from 'ngx-kit/shared';
5
+ import { SliderComponent } from 'ngx-kit/core';
6
6
 
7
7
  /**
8
8
  * درگ عمومی روی پایه‌ی Pointer Events + setPointerCapture (دقیقاً همون
@@ -573,11 +573,11 @@ class NgxImageEditorComponent {
573
573
  }
574
574
  }
575
575
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxImageEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
576
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxImageEditorComponent, isStandalone: true, selector: "ngx-image-editor", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, outputMaxWidth: { classPropertyName: "outputMaxWidth", publicName: "outputMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, outputMaxHeight: { classPropertyName: "outputMaxHeight", publicName: "outputMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, outputType: { classPropertyName: "outputType", publicName: "outputType", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, quality: { classPropertyName: "quality", publicName: "quality", isSignal: true, isRequired: false, transformFunction: null }, localize: { classPropertyName: "localize", publicName: "localize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", cancelled: "cancelled" }, host: { classAttribute: "ngx-image-editor-host" }, viewQueries: [{ propertyName: "stageWrapEl", first: true, predicate: ["stageWrap"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (loading()) {\r\n <div class=\"ngx-ie-state\">{{ localize().LoadingImage }}</div>\r\n} @else if (loadError()) {\r\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\r\n} @else if (stageImageUrl()) {\r\n <div class=\"ngx-ie-layout\">\r\n <div class=\"ngx-ie-stage-wrap\" #stageWrap>\r\n <div\r\n class=\"ngx-ie-stage\"\r\n [style.width.px]=\"stageSize().width\"\r\n [style.height.px]=\"stageSize().height\">\r\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\r\n\r\n <div\r\n class=\"ngx-ie-crop-box\"\r\n [style.left]=\"cropOverlayStyle().left\"\r\n [style.top]=\"cropOverlayStyle().top\"\r\n [style.width]=\"cropOverlayStyle().width\"\r\n [style.height]=\"cropOverlayStyle().height\"\r\n ngxPointerDrag\r\n (dragStart)=\"onMoveDragStart()\"\r\n (dragMove)=\"onMoveDragMove($event)\">\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--se\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"ngx-ie-panel-row\">\r\n <div class=\"ngx-ie-panel\">\r\n <div class=\"ngx-ie-preview\">\r\n @if (previewUrl(); as url) {\r\n <img [src]=\"url\" alt=\"Preview\" />\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\r\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\r\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"rotation()\"\r\n (ngModelChange)=\"rotation.set($event)\"\r\n [min]=\"-180\"\r\n [max]=\"180\">\r\n <span>{{ localize().Rotation }} ({{ rotation() }}\u00B0)</span>\r\n </slider>\r\n\r\n <button\r\n type=\"button\"\r\n (click)=\"rotation.set(0)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"brightness()\"\r\n (ngModelChange)=\"brightness.set($event)\"\r\n [min]=\"0\"\r\n [max]=\"200\">\r\n <span>{{ localize().Brightness }} ({{ brightness() }}%)</span>\r\n </slider>\r\n <button\r\n type=\"button\"\r\n (click)=\"brightness.set(100)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"contrast()\"\r\n (ngModelChange)=\"contrast.set($event)\"\r\n [min]=\"0\"\r\n [max]=\"200\">\r\n <span>{{ localize().Contrast }} ({{ contrast() }}%)</span>\r\n </slider>\r\n <button\r\n type=\"button\"\r\n (click)=\"contrast.set(100)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"saturation()\"\r\n (ngModelChange)=\"saturation.set($event)\"\r\n [min]=\"0\"\r\n [max]=\"200\">\r\n <span>{{ localize().Saturation }} ({{ saturation() }}%)</span>\r\n </slider>\r\n <button\r\n type=\"button\"\r\n (click)=\"saturation.set(100)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n @if (filters().length) {\r\n <div>\r\n <span>{{ localize().Filter }}</span>\r\n <div class=\"ngx-ie-filter-row\">\r\n @for (f of filters(); track f) {\r\n <button type=\"button\" [class.active]=\"filterPreset() === f\" (click)=\"setFilter(f)\">\r\n {{ filterLabels()[f] }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"ngx-ie-row ngx-ie-actions\">\r\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">\r\n {{ localize().Cancel }}\r\n </button>\r\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\r\n {{ saving() ? localize().Saving : localize().Save }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block;min-height:70dvh;--ngx-image-editor-panel-width: 25%}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:grid;grid-template-columns:1fr var(--ngx-image-editor-panel-width, 30%);gap:1.25rem;height:100%}.ngx-ie-stage-wrap{width:100%;display:flex;align-items:center;justify-content:center;background:light-dark(#f3f4f6,#18181b);border-radius:10px;overflow:hidden;flex-shrink:0}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-panel-row{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-field{display:flex;gap:.3rem;align-items:flex-end}.ngx-ie-field slider{flex:1}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}@media(max-width:768px){:host{height:unset!important}.ngx-ie-layout{display:flex;flex-direction:column}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }, { kind: "directive", type: NgxPointerDragDirective, selector: "[ngxPointerDrag]", outputs: ["dragStart", "dragMove", "dragEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
576
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxImageEditorComponent, isStandalone: true, selector: "ngx-image-editor", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, outputMaxWidth: { classPropertyName: "outputMaxWidth", publicName: "outputMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, outputMaxHeight: { classPropertyName: "outputMaxHeight", publicName: "outputMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, outputType: { classPropertyName: "outputType", publicName: "outputType", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, quality: { classPropertyName: "quality", publicName: "quality", isSignal: true, isRequired: false, transformFunction: null }, localize: { classPropertyName: "localize", publicName: "localize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", cancelled: "cancelled" }, host: { classAttribute: "ngx-image-editor-host" }, viewQueries: [{ propertyName: "stageWrapEl", first: true, predicate: ["stageWrap"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (loading()) {\n <div class=\"ngx-ie-state\">{{ localize().LoadingImage }}</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\" #stageWrap>\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel-row\">\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"Preview\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\">\n <span>{{ localize().Rotation }} ({{ rotation() }}\u00B0)</span>\n </slider>\n\n <button\n type=\"button\"\n (click)=\"rotation.set(0)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Brightness }} ({{ brightness() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"brightness.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Contrast }} ({{ contrast() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"contrast.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Saturation }} ({{ saturation() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"saturation.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n @if (filters().length) {\n <div>\n <span>{{ localize().Filter }}</span>\n <div class=\"ngx-ie-filter-row\">\n @for (f of filters(); track f) {\n <button type=\"button\" [class.active]=\"filterPreset() === f\" (click)=\"setFilter(f)\">\n {{ filterLabels()[f] }}\n </button>\n }\n </div>\n </div>\n }\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">\n {{ localize().Cancel }}\n </button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? localize().Saving : localize().Save }}\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;min-height:70dvh;--ngx-image-editor-panel-width: 25%}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:grid;grid-template-columns:1fr var(--ngx-image-editor-panel-width, 30%);gap:1.25rem;height:100%}.ngx-ie-stage-wrap{width:100%;display:flex;align-items:center;justify-content:center;background:light-dark(#f3f4f6,#18181b);border-radius:10px;overflow:hidden;flex-shrink:0}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-panel-row{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-field{display:flex;gap:.3rem;align-items:flex-end}.ngx-ie-field slider{flex:1}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}@media(max-width:768px){:host{height:unset!important}.ngx-ie-layout{display:flex;flex-direction:column}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }, { kind: "directive", type: NgxPointerDragDirective, selector: "[ngxPointerDrag]", outputs: ["dragStart", "dragMove", "dragEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
577
577
  }
578
578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxImageEditorComponent, decorators: [{
579
579
  type: Component,
580
- args: [{ selector: 'ngx-image-editor', standalone: true, imports: [FormsModule, SliderComponent, NgxPointerDragDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-image-editor-host' }, template: "@if (loading()) {\r\n <div class=\"ngx-ie-state\">{{ localize().LoadingImage }}</div>\r\n} @else if (loadError()) {\r\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\r\n} @else if (stageImageUrl()) {\r\n <div class=\"ngx-ie-layout\">\r\n <div class=\"ngx-ie-stage-wrap\" #stageWrap>\r\n <div\r\n class=\"ngx-ie-stage\"\r\n [style.width.px]=\"stageSize().width\"\r\n [style.height.px]=\"stageSize().height\">\r\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\r\n\r\n <div\r\n class=\"ngx-ie-crop-box\"\r\n [style.left]=\"cropOverlayStyle().left\"\r\n [style.top]=\"cropOverlayStyle().top\"\r\n [style.width]=\"cropOverlayStyle().width\"\r\n [style.height]=\"cropOverlayStyle().height\"\r\n ngxPointerDrag\r\n (dragStart)=\"onMoveDragStart()\"\r\n (dragMove)=\"onMoveDragMove($event)\">\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\r\n <span\r\n class=\"ngx-ie-handle ngx-ie-handle--se\"\r\n ngxPointerDrag\r\n (dragStart)=\"onResizeDragStart()\"\r\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"ngx-ie-panel-row\">\r\n <div class=\"ngx-ie-panel\">\r\n <div class=\"ngx-ie-preview\">\r\n @if (previewUrl(); as url) {\r\n <img [src]=\"url\" alt=\"Preview\" />\r\n }\r\n </div>\r\n\r\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\r\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\r\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"rotation()\"\r\n (ngModelChange)=\"rotation.set($event)\"\r\n [min]=\"-180\"\r\n [max]=\"180\">\r\n <span>{{ localize().Rotation }} ({{ rotation() }}\u00B0)</span>\r\n </slider>\r\n\r\n <button\r\n type=\"button\"\r\n (click)=\"rotation.set(0)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"brightness()\"\r\n (ngModelChange)=\"brightness.set($event)\"\r\n [min]=\"0\"\r\n [max]=\"200\">\r\n <span>{{ localize().Brightness }} ({{ brightness() }}%)</span>\r\n </slider>\r\n <button\r\n type=\"button\"\r\n (click)=\"brightness.set(100)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"contrast()\"\r\n (ngModelChange)=\"contrast.set($event)\"\r\n [min]=\"0\"\r\n [max]=\"200\">\r\n <span>{{ localize().Contrast }} ({{ contrast() }}%)</span>\r\n </slider>\r\n <button\r\n type=\"button\"\r\n (click)=\"contrast.set(100)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n <div class=\"ngx-ie-field\">\r\n <slider\r\n [ngModel]=\"saturation()\"\r\n (ngModelChange)=\"saturation.set($event)\"\r\n [min]=\"0\"\r\n [max]=\"200\">\r\n <span>{{ localize().Saturation }} ({{ saturation() }}%)</span>\r\n </slider>\r\n <button\r\n type=\"button\"\r\n (click)=\"saturation.set(100)\"\r\n class=\"ngx-ie-btn-secondary\"\r\n [title]=\"localize().Reset\">\r\n x\r\n </button>\r\n </div>\r\n\r\n @if (filters().length) {\r\n <div>\r\n <span>{{ localize().Filter }}</span>\r\n <div class=\"ngx-ie-filter-row\">\r\n @for (f of filters(); track f) {\r\n <button type=\"button\" [class.active]=\"filterPreset() === f\" (click)=\"setFilter(f)\">\r\n {{ filterLabels()[f] }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"ngx-ie-row ngx-ie-actions\">\r\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">\r\n {{ localize().Cancel }}\r\n </button>\r\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\r\n {{ saving() ? localize().Saving : localize().Save }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block;min-height:70dvh;--ngx-image-editor-panel-width: 25%}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:grid;grid-template-columns:1fr var(--ngx-image-editor-panel-width, 30%);gap:1.25rem;height:100%}.ngx-ie-stage-wrap{width:100%;display:flex;align-items:center;justify-content:center;background:light-dark(#f3f4f6,#18181b);border-radius:10px;overflow:hidden;flex-shrink:0}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-panel-row{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-field{display:flex;gap:.3rem;align-items:flex-end}.ngx-ie-field slider{flex:1}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}@media(max-width:768px){:host{height:unset!important}.ngx-ie-layout{display:flex;flex-direction:column}}\n"] }]
580
+ args: [{ selector: 'ngx-image-editor', standalone: true, imports: [FormsModule, SliderComponent, NgxPointerDragDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-image-editor-host' }, template: "@if (loading()) {\n <div class=\"ngx-ie-state\">{{ localize().LoadingImage }}</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\" #stageWrap>\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel-row\">\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"Preview\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\">\n <span>{{ localize().Rotation }} ({{ rotation() }}\u00B0)</span>\n </slider>\n\n <button\n type=\"button\"\n (click)=\"rotation.set(0)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Brightness }} ({{ brightness() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"brightness.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Contrast }} ({{ contrast() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"contrast.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n <div class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Saturation }} ({{ saturation() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"saturation.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </div>\n\n @if (filters().length) {\n <div>\n <span>{{ localize().Filter }}</span>\n <div class=\"ngx-ie-filter-row\">\n @for (f of filters(); track f) {\n <button type=\"button\" [class.active]=\"filterPreset() === f\" (click)=\"setFilter(f)\">\n {{ filterLabels()[f] }}\n </button>\n }\n </div>\n </div>\n }\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">\n {{ localize().Cancel }}\n </button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? localize().Saving : localize().Save }}\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;min-height:70dvh;--ngx-image-editor-panel-width: 25%}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:grid;grid-template-columns:1fr var(--ngx-image-editor-panel-width, 30%);gap:1.25rem;height:100%}.ngx-ie-stage-wrap{width:100%;display:flex;align-items:center;justify-content:center;background:light-dark(#f3f4f6,#18181b);border-radius:10px;overflow:hidden;flex-shrink:0}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-panel-row{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-field{display:flex;gap:.3rem;align-items:flex-end}.ngx-ie-field slider{flex:1}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}@media(max-width:768px){:host{height:unset!important}.ngx-ie-layout{display:flex;flex-direction:column}}\n"] }]
581
581
  }], ctorParameters: () => [], propDecorators: { source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], aspectRatio: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspectRatio", required: false }] }], outputMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputMaxWidth", required: false }] }], outputMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputMaxHeight", required: false }] }], outputType: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputType", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }], quality: [{ type: i0.Input, args: [{ isSignal: true, alias: "quality", required: false }] }], localize: [{ type: i0.Input, args: [{ isSignal: true, alias: "localize", required: false }] }], saved: [{ type: i0.Output, args: ["saved"] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }], stageWrapEl: [{ type: i0.ViewChild, args: ['stageWrap', { isSignal: true }] }] } });
582
582
 
583
583
  /**