ngx-kit 6.3.0 → 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +52 -49
  5. package/data-table/README.md +120 -113
  6. package/date-picker/README.md +74 -69
  7. package/dialog/README.md +92 -92
  8. package/drag-resize/README.md +55 -0
  9. package/dropzone/README.md +422 -422
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +265 -73
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +7 -9
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +3 -3
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drag-resize.mjs +1664 -0
  23. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -0
  24. package/fesm2022/ngx-kit-drawer-menu.mjs +389 -285
  25. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  27. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  28. package/fesm2022/ngx-kit-form-field.mjs +3 -5
  29. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  31. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-grid-layout.mjs +994 -0
  34. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -0
  35. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-menu.mjs +8 -8
  37. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-notify.mjs +2 -2
  40. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  41. package/fesm2022/ngx-kit-shared.mjs +54 -3
  42. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  43. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  44. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  45. package/fesm2022/ngx-kit-virtual-scroll.mjs +392 -0
  46. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -0
  47. package/fesm2022/ngx-kit-webflow.mjs +709 -0
  48. package/fesm2022/ngx-kit-webflow.mjs.map +1 -0
  49. package/gallery/README.md +71 -71
  50. package/gradient-picker/README.md +41 -41
  51. package/grid-layout/README.md +64 -0
  52. package/image-editor/README.md +12 -12
  53. package/menu/README.md +85 -85
  54. package/message/README.md +70 -70
  55. package/notify/README.md +56 -58
  56. package/package.json +17 -1
  57. package/shared/README.md +117 -117
  58. package/time-picker/README.md +89 -95
  59. package/types/ngx-kit-color-picker.d.ts +72 -16
  60. package/types/ngx-kit-drag-resize.d.ts +368 -0
  61. package/types/ngx-kit-drawer-menu.d.ts +135 -86
  62. package/types/ngx-kit-grid-layout.d.ts +311 -0
  63. package/types/ngx-kit-image-editor.d.ts +1 -1
  64. package/types/ngx-kit-shared.d.ts +12 -1
  65. package/types/ngx-kit-virtual-scroll.d.ts +179 -0
  66. package/types/ngx-kit-webflow.d.ts +286 -0
  67. package/virtual-scroll/README.md +199 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-kit-grid-layout.mjs","sources":["../../../projects/libs/grid-layout/options/options.ts","../../../projects/libs/grid-layout/options/grid-item-config.ts","../../../projects/libs/grid-layout/utils/collision.ts","../../../projects/libs/grid-layout/utils/compaction.ts","../../../projects/libs/grid-layout/utils/geometry.ts","../../../projects/libs/grid-layout/services/grid-layout.service.ts","../../../projects/libs/grid-layout/grid-layout/grid-layout.component.ts","../../../projects/libs/grid-layout/grid-item/grid-item.component.ts","../../../projects/libs/grid-layout/ngx-grid-layout.module.ts","../../../projects/libs/grid-layout/ngx-kit-grid-layout.ts"],"sourcesContent":["export type GridFlow = 'free' | 'horizontal' | 'vertical';\nexport type CompactMode = 'none' | 'vertical' | 'horizontal' | 'both';\n\nexport interface IGridBackgroundCfg {\n show?: 'never' | 'always' | 'whenDragging';\n borderColor?: string;\n gapColor?: string;\n rowColor?: string;\n columnColor?: string;\n borderWidth?: number;\n}\n\nexport interface IGridLayoutOptions {\n cols: number;\n rowHeight: number | 'fit';\n gap?: number;\n padding?: number;\n flow?: GridFlow;\n compact?: CompactMode;\n allowOverlap?: boolean;\n pushItems?: boolean;\n /** When two items would swap places, prefer swapping over cascading a push. */\n swap?: boolean;\n dragThreshold?: number;\n animate?: boolean;\n /**\n * `true` / `false` force a direction; `'auto'` (default) reads the host element's\n * computed `direction`, so the grid follows the surrounding page automatically.\n */\n rtl?: boolean | 'auto';\n /** Caps the number of rows the grid can grow to. `undefined` = unbounded. */\n maxRows?: number;\n gridBackgroundConfig?: IGridBackgroundCfg;\n}\n\nexport class GridLayoutOptions implements IGridLayoutOptions {\n cols = 12;\n rowHeight: number | 'fit' = 50;\n gap = 8;\n padding = 0;\n flow = 'free' as GridFlow;\n compact = 'vertical' as CompactMode;\n allowOverlap = false;\n pushItems = true;\n swap = false;\n dragThreshold = 3;\n animate = true;\n rtl = 'auto' as boolean | 'auto';\n maxRows?: number;\n gridBackgroundConfig: IGridBackgroundCfg = {\n show: 'always' as const,\n borderColor: 'rgba(128,128,128,.16)',\n gapColor: 'transparent',\n rowColor: 'rgba(128,128,128,.07)',\n columnColor: 'rgba(128,128,128,.07)',\n borderWidth: 1,\n };\n}\n","export class GridItemConfig {\n x: number;\n y: number;\n w: number;\n h: number;\n minW?: number;\n minH?: number;\n maxW?: number;\n maxH?: number;\n /** Item can't be dragged or resized, and never moves during compaction/push. */\n static?: boolean;\n /** Overrides the layout-level draggable/resizable flags for this item only. */\n isDraggable?: boolean;\n isResizable?: boolean;\n\n constructor(x: number = 0, y: number = 0, w: number = 1, h: number = 1, s?: boolean) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n this.static = s == true;\n }\n}\n\nexport const normalizeGridItem = (value?: Partial<GridItemConfig>): GridItemConfig => ({\n x: Math.max(0, Math.floor(value?.x ?? 0)),\n y: Math.max(0, Math.floor(value?.y ?? 0)),\n w: Math.max(1, Math.floor(value?.w ?? 1)),\n h: Math.max(1, Math.floor(value?.h ?? 1)),\n minW: value?.minW,\n minH: value?.minH,\n maxW: value?.maxW,\n maxH: value?.maxH,\n static: value?.static ?? false,\n isDraggable: value?.isDraggable,\n isResizable: value?.isResizable,\n});\n\n/**\n * Value equality for two (already-normalized) configs.\n *\n * This is what breaks the register -> settle -> new-object -> re-register\n * feedback loop: signals compare by *reference*, so anything that recomputes\n * a fresh config object on every change-detection pass (a `computed()` layout,\n * an inline object literal in a template, etc.) will always look \"changed\" to\n * an `effect()` even when nothing meaningful did. Callers must compare by\n * value before writing back to a signal, otherwise the write itself produces\n * a new reference that trips the same effect again — forever.\n */\nexport function gridItemConfigsEqual(a: GridItemConfig, b: GridItemConfig): boolean {\n return (\n a.x === b.x &&\n a.y === b.y &&\n a.w === b.w &&\n a.h === b.h &&\n (a.minW ?? null) === (b.minW ?? null) &&\n (a.minH ?? null) === (b.minH ?? null) &&\n (a.maxW ?? null) === (b.maxW ?? null) &&\n (a.maxH ?? null) === (b.maxH ?? null) &&\n !!a.static === !!b.static &&\n (a.isDraggable ?? null) === (b.isDraggable ?? null) &&\n (a.isResizable ?? null) === (b.isResizable ?? null)\n );\n}\n","import { GridItemConfig } from '../options/grid-item-config';\n\nexport interface LayoutNode {\n id: string;\n config: GridItemConfig;\n}\n\n/** Axis-aligned bounding-box overlap test in grid-cell space. */\nexport function collides(a: GridItemConfig, b: GridItemConfig): boolean {\n return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;\n}\n\n/** First item (other than `self`) whose cells overlap `config`, or null. */\nexport function getFirstCollision<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T | null {\n for (const item of items) {\n if (item.id === selfId) continue;\n if (collides(item.config, config)) return item;\n }\n return null;\n}\n\n/** All items whose cells overlap `config`, excluding `selfId`. */\nexport function getAllCollisions<T extends LayoutNode>(items: readonly T[], selfId: string, config: GridItemConfig): T[] {\n return items.filter((item) => item.id !== selfId && collides(item.config, config));\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport type { CompactMode } from '../options/options';\nimport { LayoutNode, collides, getFirstCollision } from './collision';\n\nexport interface MoveOptions {\n cols: number;\n compact: CompactMode;\n allowOverlap: boolean;\n maxRows?: number;\n}\n\nfunction isStatic(node: LayoutNode): boolean {\n return !!node.config.static;\n}\n\nfunction clampToCols(config: GridItemConfig, cols: number): void {\n config.w = Math.min(Math.max(1, config.w), cols);\n config.x = Math.max(0, Math.min(config.x, cols - config.w));\n config.y = Math.max(0, config.y);\n}\n\nfunction clone<T extends LayoutNode>(items: readonly T[]): T[] {\n return items.map((i) => ({ ...i, config: { ...i.config } })) as T[];\n}\n\n/**\n * Moves `id` to grid cell (x, y) and, unless overlap is explicitly allowed,\n * cascades any resulting collisions by pushing the colliding items out of the\n * way (downward for vertical-flow grids, rightward for horizontal-flow ones).\n * Static items are treated as fixed obstacles: they block, but never move.\n * Pure function — returns a new array, never mutates its input.\n */\nexport function moveItem<T extends LayoutNode>(\n items: readonly T[],\n id: string,\n x: number,\n y: number,\n opts: MoveOptions,\n depth = 0,\n): T[] {\n let arr = clone(items);\n const item = arr.find((i) => i.id === id);\n if (!item || isStatic(item)) return arr;\n\n item.config.x = x;\n item.config.y = y;\n clampToCols(item.config, opts.cols);\n\n if (opts.allowOverlap || depth > arr.length + 24) return arr;\n\n const compareFn = compareForCompaction(opts.compact);\n let guard = 0;\n while (guard++ < arr.length + 24) {\n const mover = arr.find((i) => i.id === id)!;\n const staticBlocker = arr.find(\n (i) => i.id !== id && isStatic(i) && collides(mover.config, i.config),\n );\n if (staticBlocker) {\n if (opts.compact === 'horizontal') {\n mover.config.x = staticBlocker.config.x + staticBlocker.config.w;\n } else {\n mover.config.y = staticBlocker.config.y + staticBlocker.config.h;\n }\n clampToCols(mover.config, opts.cols);\n continue; // the new position may collide with something else — re-check from the top.\n }\n\n const blockers = arr\n .filter((i) => i.id !== id && !isStatic(i) && collides(mover.config, i.config))\n .sort(compareFn);\n if (blockers.length === 0) break;\n arr = pushAway(arr, mover, blockers[0], opts, depth + 1);\n }\n return arr;\n}\n\nfunction pushAway<T extends LayoutNode>(\n items: T[],\n mover: T,\n blocked: T,\n opts: MoveOptions,\n depth: number,\n): T[] {\n const targetX =\n opts.compact === 'horizontal' ? mover.config.x + mover.config.w : blocked.config.x;\n const targetY =\n opts.compact === 'horizontal' ? blocked.config.y : mover.config.y + mover.config.h;\n return moveItem(items, blocked.id, targetX, targetY, opts, depth);\n}\n\nfunction compareForCompaction(mode: CompactMode) {\n return (a: LayoutNode, b: LayoutNode) =>\n mode === 'horizontal'\n ? a.config.x - b.config.x || a.config.y - b.config.y\n : a.config.y - b.config.y || a.config.x - b.config.x;\n}\n\n/**\n * When the actively-moved item directly overlaps exactly one same-size item,\n * exchanging their positions reads much better than a cascading push. The\n * caller (service) decides when to offer this vs. falling back to `moveItem`.\n */\nexport function trySwap<T extends LayoutNode>(\n items: readonly T[],\n id: string,\n previous: GridItemConfig,\n next: GridItemConfig,\n): T[] | null {\n if (items.some((i) => i.id !== id && isStatic(i) && collides(i.config, next))) return null;\n const collisions = items.filter((i) => i.id !== id && !isStatic(i) && collides(i.config, next));\n if (collisions.length !== 1) return null;\n const [target] = collisions;\n if (target.config.w !== next.w || target.config.h !== next.h) return null;\n const arr = clone(items);\n const mover = arr.find((i) => i.id === id)!;\n const other = arr.find((i) => i.id === target.id)!;\n mover.config.x = next.x;\n mover.config.y = next.y;\n other.config.x = previous.x;\n other.config.y = previous.y;\n return arr;\n}\n\n/**\n * Removes gaps by pulling every non-static item as far toward the start of the\n * grid as it can go without overlapping another item, in reading order.\n */\nexport function compact<T extends LayoutNode>(items: readonly T[], mode: CompactMode): T[] {\n const arr = clone(items);\n if (mode === 'none') return arr;\n const canX = mode === 'horizontal' || mode === 'both';\n const canY = mode === 'vertical' || mode === 'both';\n const sorted = [...arr].sort((a, b) => a.config.y - b.config.y || a.config.x - b.config.x);\n for (const item of sorted) {\n if (isStatic(item)) continue;\n if (canY) {\n let y = item.config.y;\n while (y > 0 && !getFirstCollision(arr, item.id, { ...item.config, y: y - 1 })) y--;\n item.config.y = y;\n }\n if (canX) {\n let x = item.config.x;\n while (x > 0 && !getFirstCollision(arr, item.id, { ...item.config, x: x - 1 })) x--;\n item.config.x = x;\n }\n }\n return arr;\n}\n\n/** Highest occupied row (0-based, exclusive) across all items — drives the grid's auto-height. */\nexport function maxOccupiedRow(items: readonly LayoutNode[]): number {\n return items.reduce((max, i) => Math.max(max, i.config.y + i.config.h), 0);\n}\n\n/**\n * Finds a cell for `config` that doesn't collide with any existing item.\n * Tries the requested (x, y) first; if that's already occupied, scans\n * forward in reading order (row by row, top to bottom, left to right — the\n * caller is responsible for any RTL flipping when it turns this back into\n * pixels) for the first gap large enough to fit it.\n *\n * This is what a newly-registered item (or one whose config changes to a\n * position that's no longer free) should go through instead of silently\n * overlapping whatever's already there: unlike a drag/resize, registering an\n * item isn't a deliberate \"make room for me\" gesture, so relocating the new\n * item to open space reads far better than shoving already-placed items\n * around to accommodate it.\n */\nexport function findFreeSpot<T extends LayoutNode>(\n items: readonly T[],\n config: GridItemConfig,\n cols: number,\n excludeId?: string,\n): { x: number; y: number } {\n const others = excludeId ? items.filter((i) => i.id !== excludeId) : items;\n const fits = (x: number, y: number) => !others.some((i) => collides(i.config, { ...config, x, y }));\n\n const startX = Math.max(0, Math.min(config.x, cols - config.w));\n const startY = Math.max(0, config.y);\n if (fits(startX, startY)) return { x: startX, y: startY };\n\n // The row just past the current bottom is always fully empty, so this loop\n // is guaranteed to find a fit no later than `maxY`.\n const maxY = maxOccupiedRow(others) + 1;\n for (let y = 0; y <= maxY; y++) {\n for (let x = 0; x <= cols - config.w; x++) {\n if (fits(x, y)) return { x, y };\n }\n }\n return { x: startX, y: maxY + 1 };\n}\n","import { GridItemConfig } from '../options/grid-item-config';\nimport { IGridLayoutOptions } from '../options/options';\n\n/**\n * All pixel <-> grid-cell math lives here, in one RTL-aware place.\n *\n * Grid coordinates are always *logical* (reading-order): x = 0 is the first\n * column in the direction text flows — the left edge in LTR, the right edge\n * in RTL. Every physical (CSS `left`/pixel) calculation goes through here so\n * the rest of the codebase never has to think about direction again.\n */\nexport interface GridMetrics {\n /** Inner content width available for columns (container width minus padding). */\n contentWidth: number;\n colWidth: number;\n rowHeight: number;\n gap: number;\n padding: number;\n}\n\nexport function computeMetrics(containerWidth: number, options: IGridLayoutOptions): GridMetrics {\n const cols = Math.max(1, Math.floor(options.cols));\n const gap = options.gap ?? 0;\n const padding = options.padding ?? 0;\n const contentWidth = Math.max(0, containerWidth - padding * 2);\n const colWidth = Math.max(1, (contentWidth - gap * (cols - 1)) / cols);\n const rowHeight = options.rowHeight === 'fit' ? Math.max(1, colWidth) : Math.max(1, options.rowHeight);\n return { contentWidth, colWidth, rowHeight, gap, padding };\n}\n\n/** Physical CSS `left` (px, relative to the grid surface's content box) for a logical column. */\nexport function colToLeft(colIndex: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\n if (!rtl) return m.padding + colIndex * (m.colWidth + m.gap);\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\n const rightEdge = m.padding + colIndex * (m.colWidth + m.gap);\n return m.contentWidth + m.padding - rightEdge - widthPx;\n}\n\nexport function rowToTop(rowIndex: number, m: GridMetrics): number {\n return m.padding + rowIndex * (m.rowHeight + m.gap);\n}\n\nexport function spanToWidthPx(spanCols: number, m: GridMetrics): number {\n return spanCols * m.colWidth + Math.max(0, spanCols - 1) * m.gap;\n}\n\nexport function spanToHeightPx(spanRows: number, m: GridMetrics): number {\n return spanRows * m.rowHeight + Math.max(0, spanRows - 1) * m.gap;\n}\n\n/** Physical left px (as above) -> nearest logical column index. Inverse of `colToLeft`. */\nexport function leftToCol(leftPx: number, spanCols: number, m: GridMetrics, rtl: boolean): number {\n if (!rtl) return Math.round((leftPx - m.padding) / (m.colWidth + m.gap));\n const widthPx = spanCols * m.colWidth + (spanCols - 1) * m.gap;\n const rightEdge = m.contentWidth + m.padding - leftPx - widthPx;\n return Math.round((rightEdge - m.padding) / (m.colWidth + m.gap));\n}\n\nexport function topToRow(topPx: number, m: GridMetrics): number {\n return Math.round((topPx - m.padding) / (m.rowHeight + m.gap));\n}\n\n/** Places an item's pixel box (left/top/width/height) inside the grid surface, RTL-aware. */\nexport function placeItem(config: GridItemConfig, m: GridMetrics, rtl: boolean): { left: number; top: number; width: number; height: number } {\n return {\n left: colToLeft(config.x, config.w, m, rtl),\n top: rowToTop(config.y, m),\n width: spanToWidthPx(config.w, m),\n height: spanToHeightPx(config.h, m),\n };\n}\n","import { Injectable, computed, effect, signal } from '@angular/core';\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\nimport {\n normalizeGridItem,\n gridItemConfigsEqual,\n GridItemConfig,\n} from '../options/grid-item-config';\nimport { LayoutOutput } from '../options/layout-output';\nimport { computeMetrics, leftToCol, placeItem, topToRow, GridMetrics } from '../utils/geometry';\nimport { compact, maxOccupiedRow, moveItem, trySwap, findFreeSpot } from '../utils/compaction';\nimport { isRtl } from 'ngx-kit/drag-resize';\n\nexport interface GridItemState {\n id: string;\n config: GridItemConfig;\n element?: HTMLElement;\n dragging?: boolean;\n resizing?: boolean;\n}\n\n/** Structural + value equality for two item-state arrays (order-independent). */\nfunction itemsEqual(a: readonly GridItemState[], b: readonly GridItemState[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((itemA) => {\n const itemB = b.find((x) => x.id === itemA.id);\n return (\n !!itemB && itemA.element === itemB.element && gridItemConfigsEqual(itemA.config, itemB.config)\n );\n });\n}\n\n/** Value equality for two options objects — see `setOptions` for why this matters. */\nfunction optionsEqual(a: GridLayoutOptions, b: GridLayoutOptions): boolean {\n const bg1 = a.gridBackgroundConfig ?? {};\n const bg2 = b.gridBackgroundConfig ?? {};\n return (\n a.cols === b.cols &&\n a.rowHeight === b.rowHeight &&\n a.gap === b.gap &&\n a.padding === b.padding &&\n a.flow === b.flow &&\n a.compact === b.compact &&\n a.allowOverlap === b.allowOverlap &&\n a.pushItems === b.pushItems &&\n a.swap === b.swap &&\n a.dragThreshold === b.dragThreshold &&\n a.animate === b.animate &&\n a.rtl === b.rtl &&\n (a.maxRows ?? null) === (b.maxRows ?? null) &&\n bg1.show === bg2.show &&\n bg1.borderColor === bg2.borderColor &&\n bg1.gapColor === bg2.gapColor &&\n bg1.rowColor === bg2.rowColor &&\n bg1.columnColor === bg2.columnColor &&\n bg1.borderWidth === bg2.borderWidth\n );\n}\n\n@Injectable()\nexport class GridLayoutService {\n readonly options = signal<GridLayoutOptions>(new GridLayoutOptions());\n readonly items = signal<readonly GridItemState[]>([]);\n readonly editMode = signal(true);\n readonly activeId = signal<string | null>(null);\n readonly isInteracting = computed(() => this.activeId() !== null);\n readonly height = computed(() => this.calculateHeight(this.items(), this.options()));\n readonly layout = computed<LayoutOutput[]>(() =>\n this.items().map((x) => ({ id: x.id, ...x.config })),\n );\n readonly columns = computed(() => Math.max(1, Math.floor(this.options().cols)));\n\n readonly rtl = computed(() => {\n this.rtlTick();\n return this.resolveRtl();\n });\n private rtlTick = signal(0);\n\n private layoutListener?: (layout: LayoutOutput[]) => void;\n private startConfig: GridItemConfig | null = null;\n private startItems: readonly GridItemState[] | null = null;\n private previewItems = signal<readonly GridItemState[] | null>(null);\n private _element!: HTMLElement;\n private placeholder?: HTMLElement;\n\n constructor() {\n effect(() => {\n // Re-run whenever options or items change so CSS positions always reflect state.\n this.options();\n this.items();\n this.previewItems();\n this.rtlTick();\n if (this._element) this.applyCss();\n });\n }\n\n connect(onLayout: (layout: LayoutOutput[]) => void): void {\n this.layoutListener = onLayout;\n }\n setOptions(value: Partial<IGridLayoutOptions>): void {\n const next = Object.assign(new GridLayoutOptions(), this.options(), value);\n if (optionsEqual(this.options(), next)) return;\n this.options.set(next);\n }\n setEditMode(value: boolean): void {\n this.editMode.set(value);\n }\n setItems(items: GridItemState[]): void {\n this.items.set(items.map((x) => ({ ...x, config: normalizeGridItem(x.config) })));\n this.settle();\n this.emit();\n }\n\n registerItem(item: GridItemState): void {\n const existing = this.items().find((x) => x.id === item.id);\n if (!existing) {\n const normalized = normalizeGridItem(item.config);\n const placed = this.options().allowOverlap\n ? normalized\n : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns()) };\n this.items.update((xs) => [...xs, { ...item, config: placed }]);\n this.settle();\n return;\n }\n if (existing.element === item.element) return;\n this.items.update((xs) =>\n xs.map((x) => (x.id === item.id ? { ...x, element: item.element } : x)),\n );\n }\n\n updateItemConfig(id: string, config: GridItemConfig): void {\n const existing = this.items().find((x) => x.id === id);\n if (!existing) return;\n const normalized = normalizeGridItem(config);\n const placed = this.options().allowOverlap\n ? normalized\n : { ...normalized, ...findFreeSpot(this.items(), normalized, this.columns(), id) };\n if (gridItemConfigsEqual(existing.config, placed)) return;\n this.items.update((xs) => xs.map((x) => (x.id === id ? { ...x, config: placed } : x)));\n this.settle();\n }\n unregisterItem(id: string): void {\n this.items.update((xs) => xs.filter((x) => x.id !== id));\n this.settle();\n this.emit();\n }\n\n /** Called once the grid surface element exists (e.g. from `ngAfterViewInit`). */\n attachElement(el: HTMLElement): void {\n this._element = el;\n this.placeholder =\n (el.querySelector('.ngx-grid-layout__placeholder') as HTMLElement | null) ?? undefined;\n if (this.placeholder) {\n this.placeholder.style.position = 'absolute';\n this.placeholder.style.display = 'none';\n this.placeholder.style.pointerEvents = 'none';\n this.placeholder.setAttribute('aria-hidden', 'true');\n }\n // `rtl` reads `this._element` directly (it isn't a signal), so bump a tick\n // signal to force the `rtl` computed to re-evaluate now that the element,\n // and therefore its computed `direction`, is known.\n this.rtlTick.update((n) => n + 1);\n this.applyCss();\n }\n\n /** Recomputes pixel positions after the surface resizes. Call from a `ResizeObserver`. */\n refreshMetrics(): void {\n this.applyCss();\n }\n\n isItemDraggable(item: GridItemState): boolean {\n return this.editMode() && !item.config.static && (item.config.isDraggable ?? true);\n }\n isItemResizable(item: GridItemState): boolean {\n return this.editMode() && !item.config.static && (item.config.isResizable ?? true);\n }\n\n // ---- Pointer-driven interaction (drag / resize) ----------------------------------\n\n begin(id: string): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n\n this.startItems = this.items().map((x) => ({ ...x, config: { ...x.config } }));\n this.startConfig = { ...target.config };\n this.previewItems.set(null);\n this.activeId.set(id);\n this.applyCss();\n }\n\n move(id: string): void {\n const target = this.items().find((it) => it.id === id);\n if (!target?.element) return;\n const next = this.screenToGrid(target);\n this.preview(id, next);\n }\n\n resize(\n id: string,\n out: { width: number; height: number; moveLeft: number; moveTop: number },\n ): void {\n const target = this.items().find((x) => x.id === id);\n if (!target?.element) return;\n const next = this.screenResizeToGrid(target, out);\n this.preview(id, next);\n }\n\n end(id: string): void {\n if (this.activeId() !== id) return;\n\n const preview = this.previewItems();\n if (preview) {\n this.items.set(preview.map((x) => ({ ...x, config: { ...x.config } })));\n }\n const target = this.items().find((x) => x.id === id);\n if (target?.element) target.element.style.transform = '';\n\n this.previewItems.set(null);\n this.activeId.set(null);\n this.startConfig = null;\n this.startItems = null;\n\n // Final normalization/compaction happens only after the preview is committed.\n this.settle(id);\n this.applyCss();\n this.emit();\n }\n\n // ---- Keyboard-driven interaction (a11y) -------------------------------------------\n\n /** Moves an item by whole grid cells — used by arrow-key handling in the item component. */\n moveByCells(id: string, dCols: number, dRows: number): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n this.begin(id);\n this.preview(id, { ...target.config, x: target.config.x + dCols, y: target.config.y + dRows });\n this.end(id);\n }\n\n /** Resizes an item by whole grid cells — used by shift+arrow handling in the item component. */\n resizeByCells(id: string, dCols: number, dRows: number): void {\n const target = this.items().find((x) => x.id === id);\n if (!target) return;\n this.begin(id);\n const w = this.clampSize(\n target.config.w + dCols,\n target.config.minW,\n target.config.maxW,\n this.columns(),\n );\n const h = this.clampSize(\n target.config.h + dRows,\n target.config.minH,\n target.config.maxH,\n Infinity,\n );\n this.preview(id, { ...target.config, w, h });\n this.end(id);\n }\n\n // ---- Internals ----------------------------------------------------------------------\n\n private preview(id: string, config: GridItemConfig): void {\n const base = this.startItems;\n if (!base) return;\n\n const clamped = this.clamp(config);\n const opt = this.options();\n\n // The placeholder is the moving item during preview. The real DOM element\n // remains under ngxDraggable's control and is never repositioned by the grid.\n let candidate: GridItemState[];\n\n if (!opt.allowOverlap && opt.swap && this.startConfig) {\n const swapped = trySwap(base, id, this.startConfig, clamped);\n candidate =\n swapped ??\n base.map((x) =>\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\n );\n } else {\n candidate = base.map((x) =>\n x.id === id ? { ...x, config: { ...clamped } } : { ...x, config: { ...x.config } },\n );\n }\n\n if (!opt.allowOverlap && opt.pushItems) {\n candidate = moveItem(candidate, id, clamped.x, clamped.y, {\n cols: this.columns(),\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\n allowOverlap: false,\n maxRows: opt.maxRows,\n });\n }\n if (!opt.allowOverlap && opt.compact !== 'none') {\n candidate = compact(candidate, opt.compact);\n }\n\n this.previewItems.set(candidate);\n this.applyCss();\n }\n\n private screenToGrid(item: GridItemState): GridItemConfig {\n const containerRect = this._element.getBoundingClientRect();\n const r = item.element!.getBoundingClientRect();\n const m = this.metrics();\n const rtl = this.rtl();\n const leftPx = r.left - containerRect.left;\n const topPx = r.top - containerRect.top;\n const nx = leftToCol(leftPx, item.config.w, m, rtl);\n const ny = topToRow(topPx, m);\n return this.clamp({ ...item.config, x: nx, y: ny });\n }\n\n private screenResizeToGrid(\n item: GridItemState,\n out: { width: number; height: number; moveLeft: number; moveTop: number },\n ): GridItemConfig {\n const m = this.metrics();\n const gap = m.gap;\n let w = Math.max(1, Math.round((out.width + gap) / (m.colWidth + gap)));\n let h = Math.max(1, Math.round((out.height + gap) / (m.rowHeight + gap)));\n let x = item.config.x;\n let y = item.config.y;\n // moveLeft/moveTop are physical (viewport) deltas from the resizable directive;\n // moving the item's *start* edge left/up in physical space means, in RTL, that\n // the logical column count grows from the *end* instead — handled by re-deriving\n // x from the resulting physical box rather than from moveLeft directly.\n if (this.rtl()) {\n // 'w' handle grows width to the right physically but that's the grid's logical end;\n // recompute x from the (possibly shifted) physical left edge captured via the element.\n const r = item.element!.getBoundingClientRect();\n const containerRect = this._element.getBoundingClientRect();\n const leftPx = r.left + out.moveLeft - containerRect.left;\n x = leftToCol(leftPx, w, m, true);\n } else {\n if (out.moveLeft) x += Math.round(out.moveLeft / (m.colWidth + gap));\n }\n if (out.moveTop) y += Math.round(out.moveTop / (m.rowHeight + gap));\n return this.clamp({ ...item.config, x, y, w, h });\n }\n\n private clamp(c: GridItemConfig): GridItemConfig {\n const cols = this.columns();\n const next = { ...c };\n next.w = this.clampSize(next.w, next.minW, next.maxW, cols);\n next.h = this.clampSize(next.h, next.minH, next.maxH, this.options().maxRows ?? Infinity);\n next.x = Math.max(0, Math.min(next.x, cols - next.w));\n next.y = Math.max(0, next.y);\n if (this.options().maxRows)\n next.y = Math.min(next.y, Math.max(0, this.options().maxRows! - next.h));\n return next;\n }\n\n private clampSize(\n size: number,\n min: number | undefined,\n max: number | undefined,\n hardMax: number,\n ): number {\n let v = Math.max(min ?? 1, size);\n if (max) v = Math.min(v, max);\n return Math.min(v, hardMax);\n }\n\n /** Applies pushes on drag-end and, when configured, removes gaps via compaction. */\n private settle(activeId?: string): void {\n const opt = this.options();\n const before = this.items();\n let arr = before.map((x) => ({ ...x, config: { ...x.config } }));\n if (!opt.allowOverlap) {\n if (activeId && opt.pushItems) {\n arr = moveItem(\n arr,\n activeId,\n arr.find((x) => x.id === activeId)!.config.x,\n arr.find((x) => x.id === activeId)!.config.y,\n {\n cols: this.columns(),\n compact: opt.compact === 'none' ? 'vertical' : opt.compact,\n allowOverlap: false,\n maxRows: opt.maxRows,\n },\n );\n }\n if (opt.compact !== 'none') arr = compact(arr, opt.compact);\n }\n // Compaction/push are deterministic pure functions: if they didn't change\n // anything, keep the previous array reference instead of writing an\n // equal-but-new one — that would otherwise ripple into every computed\n // derived from `items` (layout, height, per-item `interactive`, ...) for\n // no reason, and risks re-arming the same feedback loop described above.\n if (itemsEqual(before, arr)) return;\n this.items.set(arr);\n this.applyCss();\n }\n\n private applyCss(): void {\n if (!this._element) return;\n\n const source = this.previewItems() ?? this.items();\n const activeId = this.activeId();\n const m = this.metrics();\n const rtl = this.rtl();\n\n for (const item of source) {\n if (!item.element) continue;\n\n // While dragging/resizing, the real active element is moved by\n // ngxDraggable/ngxResizable. Never fight those directives by writing\n // left/top/width/height here.\n if (item.id === activeId) continue;\n\n const box = placeItem(item.config, m, rtl);\n const style = item.element.style;\n style.position = 'absolute';\n style.left = `${box.left}px`;\n style.top = `${box.top}px`;\n style.width = `${box.width}px`;\n style.height = `${box.height}px`;\n item.element.dataset['gridX'] = String(item.config.x);\n item.element.dataset['gridY'] = String(item.config.y);\n item.element.dataset['gridW'] = String(item.config.w);\n item.element.dataset['gridH'] = String(item.config.h);\n }\n\n const placeholderItem = activeId ? source.find((x) => x.id === activeId) : undefined;\n if (this.placeholder) {\n if (placeholderItem && activeId) {\n const box = placeItem(placeholderItem.config, m, rtl);\n const style = this.placeholder.style;\n style.display = 'block';\n style.left = `${box.left}px`;\n style.top = `${box.top}px`;\n style.width = `${box.width}px`;\n style.height = `${box.height}px`;\n this.placeholder.dataset['gridX'] = String(placeholderItem.config.x);\n this.placeholder.dataset['gridY'] = String(placeholderItem.config.y);\n this.placeholder.dataset['gridW'] = String(placeholderItem.config.w);\n this.placeholder.dataset['gridH'] = String(placeholderItem.config.h);\n } else {\n this.placeholder.style.display = 'none';\n }\n }\n }\n\n private metrics(): GridMetrics {\n const rect = this._element?.getBoundingClientRect() ?? ({ width: 0 } as DOMRect);\n return computeMetrics(rect.width, this.options());\n }\n\n private resolveRtl(): boolean {\n const opt = this.options().rtl;\n if (opt === true || opt === false) return opt;\n return this._element ? isRtl(this._element) : false;\n }\n\n private calculateHeight(items: readonly GridItemState[], o: GridLayoutOptions): number {\n const preview = this.previewItems();\n const source = preview ?? items;\n const rows = Math.max(1, maxOccupiedRow(source));\n const m = this._element\n ? this.metrics()\n : ({\n rowHeight: o.rowHeight === 'fit' ? 100 : o.rowHeight,\n gap: o.gap ?? 0,\n padding: o.padding ?? 0,\n } as GridMetrics);\n return m.padding * 2 + rows * m.rowHeight + Math.max(0, rows - 1) * m.gap;\n }\n\n private emit(): void {\n this.layoutListener?.(this.layout());\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n effect,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { GridLayoutService, GridItemState } from '../services/grid-layout.service';\nimport { GridLayoutOptions, IGridLayoutOptions } from '../options/options';\nimport { LayoutOutput } from '../options/layout-output';\n\n@Component({\n selector: 'ngx-grid-layout',\n standalone: true,\n template: `\n <div class=\"ngx-grid-layout__surface\" [class.edit-mode]=\"editMode()\">\n <div class=\"ngx-grid-layout__placeholder\"></div>\n <ng-content />\n </div>\n `,\n host: {\n '[class.ngx-grid-layout--dragging]': 'service.isInteracting()',\n '[class.ngx-grid-layout--view]': '!editMode()',\n '[style.height.px]': 'service.height()',\n '[attr.dir]': 'dirOverride() ?? null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./grid-layout.component.scss'],\n})\nexport class NgxGridLayoutComponent implements AfterViewInit, OnDestroy {\n readonly options = input<IGridLayoutOptions>(new GridLayoutOptions());\n readonly editMode = input(true);\n readonly layoutChange = output<LayoutOutput[]>();\n /** Explicit direction override. Leave unset to inherit the page/host direction automatically. */\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined);\n readonly dirOverride = this.dir;\n\n readonly service = inject(GridLayoutService);\n private readonly el = inject(ElementRef<HTMLElement>);\n private surface?: HTMLElement;\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n effect(() => {\n const opts = { ...this.options() };\n if (this.dir()) opts.rtl = this.dir() === 'rtl';\n this.service.setOptions(opts);\n this.service.setEditMode(this.editMode());\n });\n\n this.service.connect((layout) => this.layoutChange.emit(layout));\n }\n\n ngAfterViewInit(): void {\n this.surface = this.el.nativeElement.querySelector('.ngx-grid-layout__surface') as HTMLElement;\n this.service.attachElement(this.surface);\n this.setCss();\n\n this.resizeObserver = new ResizeObserver(() => {\n this.service.refreshMetrics();\n this.setCss();\n });\n this.resizeObserver.observe(this.surface);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n setItems(items: GridItemState[]): void {\n this.service.setItems(items);\n }\n update(options: Partial<IGridLayoutOptions>): void {\n this.service.setOptions(options);\n this.setCss();\n }\n\n private setCss(): void {\n const el = this.el.nativeElement,\n o = this.service.options();\n el.style.setProperty('--grid-cols', String(o.cols));\n el.style.setProperty('--grid-gap', `${o.gap ?? 0}px`);\n el.style.setProperty('--grid-row', `${o.rowHeight === 'fit' ? 100 : o.rowHeight}px`);\n const b = o.gridBackgroundConfig;\n el.style.setProperty('--grid-gap-color', `${b.gapColor}`);\n el.style.setProperty('--grid-border-width', `${b?.borderWidth ?? 0}px`);\n el.style.setProperty('--grid-border-color', b?.borderColor ?? 'transparent');\n el.style.setProperty('--grid-row-color', b?.rowColor ?? 'transparent');\n el.style.setProperty('--grid-col-color', b?.columnColor ?? 'transparent');\n el.style.setProperty(\n '--grid-bg-opacity',\n b?.show === 'never'\n ? '0'\n : b?.show === 'whenDragging'\n ? this.service.isInteracting()\n ? '1'\n : '0'\n : '1',\n );\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n type OnInit,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { GridLayoutService } from '../services/grid-layout.service';\nimport { GridItemConfig } from '../options/grid-item-config';\nimport { NgxDraggable, NgxResizable } from 'ngx-kit/drag-resize';\n\n@Component({\n selector: 'ngx-grid-item',\n standalone: true,\n hostDirectives: [\n { directive: NgxDraggable, inputs: ['dragHandle', 'lockAxis'], outputs: [] },\n NgxResizable,\n ],\n template: `\n <ng-content />\n `,\n host: {\n '[style.position]': '\"absolute\"',\n '[style.display]': '\"block\"',\n '[style.boxSizing]': '\"border-box\"',\n '[style.transition]': 'transitionStyle()',\n '[class.ngx-grid-item--dragging]': 'dragging()',\n '[class.ngx-grid-item--resizing]': 'resizing()',\n '[class.ngx-grid-item--static]': 'config().static',\n '[class.with-resize-handler]': 'resizable()',\n '[attr.tabindex]': 'interactive() ? 0 : null',\n '[attr.aria-grabbed]': 'dragging()',\n '[attr.data-grid-id]': 'itemId()',\n '(keydown)': 'onKeyDown($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./grid-item.component.scss'],\n})\nexport class NgxGridItemComponent implements OnDestroy, OnInit {\n /** Bound as `[id]` in templates (matches the demo app's existing usage). */\n readonly itemId = input<string | undefined>(undefined, { alias: 'id' });\n readonly config = input<GridItemConfig>({ x: 0, y: 0, w: 1, h: 1 });\n readonly layoutChange = output<GridItemConfig>();\n\n readonly dragging = signal(false);\n readonly resizing = signal(false);\n readonly active = computed(() => this.dragging() || this.resizing());\n readonly transitionStyle = computed(() =>\n !this.active() && this.service.options().animate\n ? 'left .18s ease, top .18s ease, width .18s ease, height .18s ease'\n : 'none',\n );\n readonly interactive = computed(() => {\n const id = this.itemId();\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\n return !!item && (this.service.isItemDraggable(item) || this.service.isItemResizable(item));\n });\n\n private readonly service = inject(GridLayoutService);\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly drag = inject(NgxDraggable);\n private readonly resize = inject(NgxResizable);\n\n readonly resizable = computed(() => {\n return !this.resize.disabled && this.service.editMode();\n });\n constructor() {\n // `takeUntilDestroyed()` releases these subscriptions on destroy — the\n // event for every grid item ever created (real damage in layouts where\n // items are added/removed dynamically, e.g. via *ngFor + trackBy).\n this.drag.dragStart.pipe(takeUntilDestroyed()).subscribe(() => this.onDragStart());\n this.drag.dragMove.pipe(takeUntilDestroyed()).subscribe(() => this.onDragMove());\n this.drag.dragEnd.pipe(takeUntilDestroyed()).subscribe(() => this.onDragEnd());\n this.resize.resizeStart.pipe(takeUntilDestroyed()).subscribe(() => this.onResizeStart());\n this.resize.resizeMove.pipe(takeUntilDestroyed()).subscribe((v) => this.onResizeMove(v));\n this.resize.resizeEnd.pipe(takeUntilDestroyed()).subscribe(() => this.onResizeEnd());\n\n // Keep the hosted directives in sync with per-item state: static items and\n // items explicitly marked non-draggable/non-resizable stop reacting entirely.\n effect(() => {\n const id = this.itemId();\n const item = id ? this.service.items().find((x) => x.id === id) : undefined;\n this.drag.disabled = !item || !this.service.isItemDraggable(item);\n this.resize.disabled = !item || !this.service.isItemResizable(item);\n if (item) this.applySizeConstraints(item.config);\n });\n }\n\n ngOnInit(): void {\n const id = this.itemId();\n if (!id) return;\n this.service.registerItem({\n id,\n config: this.config(),\n element: this.el.nativeElement,\n });\n }\n\n ngOnDestroy(): void {\n const id = this.itemId();\n if (id) this.service.unregisterItem(id);\n }\n\n onDragStart = (): void => {\n this.dragging.set(true);\n const id = this.itemId();\n if (id) this.service.begin(id);\n };\n onDragMove = (): void => {\n const id = this.itemId();\n if (id) this.service.move(id);\n };\n onDragEnd = (): void => {\n this.dragging.set(false);\n this.finishInteraction();\n };\n onResizeStart = (): void => {\n this.resizing.set(true);\n const id = this.itemId();\n if (id) this.service.begin(id);\n };\n onResizeMove = (v: {\n width: number;\n height: number;\n moveLeft: number;\n moveTop: number;\n }): void => {\n const id = this.itemId();\n if (id) this.service.resize(id, v);\n };\n onResizeEnd = (): void => {\n this.resizing.set(false);\n this.finishInteraction();\n };\n\n /** Arrow keys move the item by one cell; Shift+arrow resizes it by one cell. */\n onKeyDown(e: KeyboardEvent): void {\n const id = this.itemId();\n if (!id || !this.interactive()) return;\n const item = this.service.items().find((x) => x.id === id);\n if (!item) return;\n const deltas: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const delta = deltas[e.key];\n if (!delta) return;\n e.preventDefault();\n if (e.shiftKey && this.service.isItemResizable(item)) {\n this.service.resizeByCells(id, delta[0], delta[1]);\n } else if (this.service.isItemDraggable(item)) {\n this.service.moveByCells(id, delta[0], delta[1]);\n }\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\n }\n\n private finishInteraction(): void {\n const id = this.itemId();\n if (!id) return;\n this.service.end(id);\n this.layoutChange.emit(this.service.items().find((x) => x.id === id)?.config ?? this.config());\n }\n\n /** Converts the item's min/max cell counts (config) into px for the resize directive. */\n private applySizeConstraints(config: GridItemConfig): void {\n const cellPx = this.el.nativeElement.getBoundingClientRect();\n const cols = Math.max(1, config.w);\n const rows = Math.max(1, config.h);\n const colPx = cellPx.width / cols || 1;\n const rowPx = cellPx.height / rows || 1;\n this.resize.minWidth = (config.minW ?? 1) * colPx;\n this.resize.minHeight = (config.minH ?? 1) * rowPx;\n this.resize.maxWidth = config.maxW ? config.maxW * colPx : Infinity;\n this.resize.maxHeight = config.maxH ? config.maxH * rowPx : Infinity;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgxGridLayoutComponent } from './grid-layout/grid-layout.component';\nimport { NgxGridItemComponent } from './grid-item/grid-item.component';\nimport { GridLayoutService } from './services/grid-layout.service';\n\n@NgModule({\n imports: [NgxGridLayoutComponent, NgxGridItemComponent],\n exports: [NgxGridLayoutComponent, NgxGridItemComponent],\n providers: [GridLayoutService],\n})\nexport class NgxGridLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-image-editor.mjs","sources":["../../../projects/libs/image-editor/directives/pointer-drag.directive.ts","../../../projects/libs/image-editor/utils/image-io.ts","../../../projects/libs/image-editor/utils/cartoonify.ts","../../../projects/libs/image-editor/utils/render-pipeline.ts","../../../projects/libs/image-editor/tokens/localization.ts","../../../projects/libs/image-editor/components/image-editor.component.ts","../../../projects/libs/image-editor/components/image-editor.component.html","../../../projects/libs/image-editor/ngx-kit-image-editor.ts"],"sourcesContent":["import { Directive, HostListener, output } from '@angular/core';\n\nexport interface NgxPointerDragDelta {\n dx: number;\n dy: number;\n}\n\n/**\n * درگ عمومی روی پایه‌ی Pointer Events + setPointerCapture (دقیقاً همون\n * تکنیکی که در ngx-kit/data-table برای ریسایز ستون استفاده شده) — نیازی به\n * listener سطح document نداره چون بعد از setPointerCapture، رویدادهای\n * pointermove/pointerup حتی بیرون از محدوده‌ی المنت هم به خودش می‌رسن.\n *\n * dx/dy تجمعی از لحظه‌ی pointerdown هستن (نه دلتای بین دو move متوالی)، چون\n * معمولاً مصرف‌کننده می‌خواد «موقعیت شروع + دلتای کل» رو حساب کنه، نه جمع\n * تدریجی گرد شونده‌ی دلتاهای ریز.\n */\n@Directive({\n selector: '[ngxPointerDrag]',\n standalone: true,\n})\nexport class NgxPointerDragDirective {\n dragStart = output<void>();\n dragMove = output<NgxPointerDragDelta>();\n dragEnd = output<void>();\n\n private dragging = false;\n private startX = 0;\n private startY = 0;\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(ev: PointerEvent): void {\n ev.preventDefault();\n ev.stopPropagation();\n this.dragging = true;\n this.startX = ev.clientX;\n this.startY = ev.clientY;\n (ev.target as HTMLElement).setPointerCapture(ev.pointerId);\n this.dragStart.emit();\n }\n\n @HostListener('pointermove', ['$event'])\n onPointerMove(ev: PointerEvent): void {\n if (!this.dragging) return;\n this.dragMove.emit({ dx: ev.clientX - this.startX, dy: ev.clientY - this.startY });\n }\n\n @HostListener('pointerup')\n @HostListener('pointercancel')\n onPointerUp(): void {\n if (!this.dragging) return;\n this.dragging = false;\n this.dragEnd.emit();\n }\n}\n","/** یه File/Blob/data-URL/URL رو به یک HTMLImageElement بارگذاری‌شده تبدیل می‌کنه */\nexport function loadImage(source: File | Blob | string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n // برای URLهای cross-origin لازم می‌شه، وگرنه canvas بعداً «tainted» می‌شه\n // و toBlob/toDataURL با SecurityError شکست می‌خوره.\n img.crossOrigin = 'anonymous';\n\n const objectUrl = typeof source === 'string' ? null : URL.createObjectURL(source);\n const url = objectUrl ?? (source as string);\n\n img.onload = () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n resolve(img);\n };\n img.onerror = () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error('Failed to load image'));\n };\n img.src = url;\n });\n}\n\n/** canvas.toBlob به‌صورت Promise، به‌همراه fallback برای مرورگرهای قدیمی‌تر */\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n type = 'image/jpeg',\n quality = 0.92,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error('Failed to convert canvas to blob'));\n },\n type,\n quality,\n );\n });\n}\n\n/**\n * یه کپیِ کوچیک‌شده از تصویر اصلی می‌سازه که کل UI ویرایشگر (چرخش، کراپ،\n * پیش‌نمایش فیلترها/کارتونی) روی همین کار می‌کنه، نه روی تصویر اصلی که\n * ممکنه چند مگاپیکسل باشه. این باعث می‌شه درگ‌کردنِ اسلایدرها یا لبه‌های\n * کراپ روون بمونه؛ خروجی نهایی (save) همیشه از روی تصویر اصلیِ کامل رندر\n * می‌شه، نه از روی این کپی.\n */\nexport function createWorkingCopy(img: HTMLImageElement, maxSize = 1200): HTMLCanvasElement {\n const { width, height } = fitWithin(img.naturalWidth, img.naturalHeight, maxSize, maxSize);\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, width, height);\n return canvas;\n}\n\n/** ابعاد جدید رو طوری حساب می‌کنه که از maxWidth/maxHeight بیشتر نشه، با حفظ نسبت تصویر */\nexport function fitWithin(\n width: number,\n height: number,\n maxWidth?: number,\n maxHeight?: number,\n): { width: number; height: number } {\n if (!maxWidth && !maxHeight) return { width, height };\n let ratio = 1;\n if (maxWidth) ratio = Math.min(ratio, maxWidth / width);\n if (maxHeight) ratio = Math.min(ratio, maxHeight / height);\n if (ratio >= 1) return { width, height };\n return { width: Math.round(width * ratio), height: Math.round(height * ratio) };\n}\n","/**\n * افکت «کارتونی»: چون ctx.filter استاندارد چیزی شبیه cartoon نداره (فقط\n * brightness/contrast/saturate/grayscale/sepia/invert/blur/hue-rotate)، این\n * یکی رو واقعاً با پردازش پیکسلی پیاده کردیم؛ دو مرحله:\n *\n * ۱) Posterize: هر کانال رنگ به تعداد محدودی سطح گرد می‌شه (پهنه‌های رنگیِ\n * صاف و یکدست، حسِ کارتونی رنگ می‌ده).\n * ۲) لبه‌یابی Sobel روی نسخه‌ی خاکستریِ تصویر: هرجا شدت لبه از حد آستانه\n * بیشتر باشه، پیکسل تیره می‌شه (حسِ خط دور کارتونی).\n *\n * روی خودِ ImageData کار می‌کنه، پس هزینه‌ش با اندازه‌ی تصویر خطی‌ست؛ برای\n * تصاویر خیلی بزرگ (>~3000px) بهتره قبلش resize بشه (که در کامپوننت اصلی\n * با fitWithin قبل از اعمال فیلتر انجام می‌شه).\n */\nexport function applyCartoonEffect(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n options: { levels?: number; edgeThreshold?: number } = {},\n): void {\n const levels = options.levels ?? 5;\n const edgeThreshold = options.edgeThreshold ?? 80;\n\n const imageData = ctx.getImageData(0, 0, width, height);\n const src = imageData.data;\n\n // ۱) خاکستری برای Sobel\n const gray = new Uint8ClampedArray(width * height);\n for (let i = 0, p = 0; i < src.length; i += 4, p++) {\n gray[p] = (src[i] * 0.299 + src[i + 1] * 0.587 + src[i + 2] * 0.114) | 0;\n }\n\n // ۲) Posterize رنگ‌ها\n const step = 255 / (levels - 1);\n for (let i = 0; i < src.length; i += 4) {\n src[i] = Math.round(Math.round(src[i] / step) * step);\n src[i + 1] = Math.round(Math.round(src[i + 1] / step) * step);\n src[i + 2] = Math.round(Math.round(src[i + 2] / step) * step);\n }\n\n // ۳) Sobel روی gray، خط دور تیره روی src\n const gxKernel = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const gyKernel = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n let k = 0;\n for (let dy = -1; dy <= 1; dy++) {\n for (let dx = -1; dx <= 1; dx++) {\n const v = gray[(y + dy) * width + (x + dx)];\n gx += v * gxKernel[k];\n gy += v * gyKernel[k];\n k++;\n }\n }\n const magnitude = Math.sqrt(gx * gx + gy * gy);\n if (magnitude > edgeThreshold) {\n const idx = (y * width + x) * 4;\n src[idx] = 20;\n src[idx + 1] = 20;\n src[idx + 2] = 20;\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n}\n","import { NgxCropRect, NgxImageEditorAdjustments } from '../contracts/image-editor-types';\nimport { applyCartoonEffect } from './cartoonify';\nimport { fitWithin } from './image-io';\n\n/** تصویر مبدأ رو با زاویه‌ی داده‌شده روی یه canvas جدید (به اندازه‌ی bounding-box نتیجه) می‌چرخونه */\nexport function renderRotated(\n source: CanvasImageSource,\n width: number,\n height: number,\n degrees: number,\n): HTMLCanvasElement {\n const rad = (degrees * Math.PI) / 180;\n const sin = Math.abs(Math.sin(rad));\n const cos = Math.abs(Math.cos(rad));\n const newW = Math.max(1, Math.round(width * cos + height * sin));\n const newH = Math.max(1, Math.round(width * sin + height * cos));\n\n const canvas = document.createElement('canvas');\n canvas.width = newW;\n canvas.height = newH;\n const ctx = canvas.getContext('2d')!;\n ctx.translate(newW / 2, newH / 2);\n ctx.rotate(rad);\n ctx.drawImage(source, -width / 2, -height / 2, width, height);\n return canvas;\n}\n\nfunction buildCssFilter(adjustments: NgxImageEditorAdjustments): string {\n const parts = [\n `brightness(${adjustments.brightness}%)`,\n `contrast(${adjustments.contrast}%)`,\n `saturate(${adjustments.saturation}%)`,\n ];\n if (adjustments.filter === 'grayscale') parts.push('grayscale(1)');\n if (adjustments.filter === 'sepia') parts.push('sepia(1)');\n if (adjustments.filter === 'invert') parts.push('invert(1)');\n return parts.join(' ');\n}\n\n/**\n * کراپ + فیلترها رو روی یه canvas خروجی می‌سازه. brightness/contrast/\n * saturation/grayscale/sepia/invert همه با ctx.filter بومیِ Canvas 2D انجام\n * می‌شن (شتاب‌دهی‌شده توسط مرورگر، بدون حلقه‌ی پیکسلی دستی)؛ فقط cartoon\n * (که معادل بومی نداره) با پردازش پیکسلی جدا انجام می‌شه.\n *\n * maxWidth/maxHeight برای دو حالت استفاده می‌شه: پیش‌نمایش زنده (عدد کوچیک،\n * برای واکنش‌گرا موندن حین کشیدن اسلایدرها) و خروجی نهایی (بدون محدودیت یا\n * محدودیت دلخواه کاربر).\n */\nexport function renderComposite(\n source: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n crop: NgxCropRect,\n adjustments: NgxImageEditorAdjustments,\n maxWidth?: number,\n maxHeight?: number,\n): HTMLCanvasElement {\n const { width: outW, height: outH } = fitWithin(crop.width, crop.height, maxWidth, maxHeight);\n\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, outW);\n canvas.height = Math.max(1, outH);\n const ctx = canvas.getContext('2d')!;\n\n ctx.filter = buildCssFilter(adjustments);\n ctx.drawImage(source, crop.x, crop.y, crop.width, crop.height, 0, 0, canvas.width, canvas.height);\n ctx.filter = 'none';\n\n if (adjustments.filter === 'cartoon') {\n applyCartoonEffect(ctx, canvas.width, canvas.height);\n }\n\n return canvas;\n}\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const NGX_IMAGE_EDITOR_LOCALIZATION = new InjectionToken<NgxImageEditorLocalization>(\r\n 'ngx-image-localization',\r\n {\r\n factory: () => DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION,\r\n },\r\n);\r\n\r\nexport class NgxImageEditorLocalization {\r\n LoadingImage = 'Loading image…';\r\n Rotation = 'Fine rotation';\r\n Brightness = 'Brightness';\r\n Contrast = 'Contrast';\r\n Saturation = 'Saturation';\r\n Filter = 'Filter';\r\n None = 'None';\r\n Grayscale = 'Grayscale';\r\n Sepia = 'Sepia';\r\n Invert = 'Invert';\r\n Cartoon = 'Cartoon';\r\n Cancel = 'Cancel';\r\n Save = 'Save';\r\n Saving = 'Saving…';\r\n Reset = 'Reset';\r\n}\r\nexport const DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION = new NgxImageEditorLocalization();\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SliderComponent } from 'ngx-kit/shared';\r\nimport {\r\n NgxCropRect,\r\n NgxImageEditorAdjustments,\r\n NgxImageEditorResult,\r\n NgxImageFilterPreset,\r\n} from '../contracts/image-editor-types';\r\nimport { NgxPointerDragDelta, NgxPointerDragDirective } from '../directives/pointer-drag.directive';\r\nimport { canvasToBlob, createWorkingCopy, loadImage } from '../utils/image-io';\r\nimport { renderComposite, renderRotated } from '../utils/render-pipeline';\r\nimport { Corner } from '../types/corner';\r\nimport { NGX_IMAGE_EDITOR_LOCALIZATION, NgxImageEditorLocalization } from '../tokens/localization';\r\n\r\nconst ALL_FILTERS: NgxImageFilterPreset[] = ['none', 'grayscale', 'sepia', 'invert', 'cartoon'];\r\n\r\n/**\r\n * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده\r\n * (سیاه‌وسفید، سپیا، معکوس، کارتونی) + فشرده‌سازی خروجی. کاملاً روی Canvas\r\n * خام پیاده شده، بدون هیچ وابستگی خارجی‌ای.\r\n *\r\n * نکته‌ی مهمِ معماری: تمام تعامل زنده (چرخوندن، جابه‌جا/ریسایز کراپ‌باکس،\r\n * پیش‌نمایش فیلترها حتی کارتونی) روی یه کپیِ کوچیک‌شده از تصویر انجام می‌شه\r\n * (createWorkingCopy)، نه روی تصویر اصلی که ممکنه چند مگاپیکسل باشه — وگرنه\r\n * درگ‌کردن اسلایدرها/گوشه‌های کراپ رو کاربر حس تاخیر می‌کرد. فقط لحظه‌ی\r\n * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.\r\n *\r\n * اندازه‌ی صحنه (stage) با panelSize کنترل می‌شه: عرض همیشه ۱۰۰٪ عرضِ\r\n * والدِ کامپوننته (با ResizeObserver اندازه‌گیری می‌شه، پس با تغییر سایز\r\n * صفحه/layout هم زنده هماهنگ می‌مونه)، ارتفاع دقیقاً همون چیزیه که کاربر با\r\n * panelSize می‌ده. تصویر همیشه با یک مقیاسِ «contain» واقعی (هم بر اساس\r\n * عرض، هم بر اساس ارتفاع — هرکدوم تنگ‌تره) جا داده می‌شه، پس کلِ تصویر\r\n * همیشه در محدوده‌ی همین باکس دیده می‌شه، صرف‌نظر از اندازه‌ی واقعیِ فایل.\r\n * سقفِ مقیاس هم ۱ هست، یعنی تصاویر کوچیک بزرگ‌نمایی نمی‌شن (که باعثِ محو\r\n * شدن‌شون می‌شد).\r\n */\r\n@Component({\r\n selector: 'ngx-image-editor',\r\n standalone: true,\r\n imports: [FormsModule, SliderComponent, NgxPointerDragDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './image-editor.component.html',\r\n styleUrl: './image-editor.component.scss',\r\n host: { class: 'ngx-image-editor-host' },\r\n})\r\nexport class NgxImageEditorComponent {\r\n source = input<File | Blob | string | null>(null);\r\n /** قفل نسبتِ کراپ (مثلاً ۱ برای آواتار مربعی)؛ undefined یعنی آزاد */\r\n aspectRatio = input<number | undefined>(undefined);\r\n outputMaxWidth = input<number | undefined>(undefined);\r\n outputMaxHeight = input<number | undefined>(undefined);\r\n outputType = input<'image/jpeg' | 'image/png' | 'image/webp'>('image/jpeg');\r\n\r\n /**\r\n * کدوم فیلترها نشون داده بشن (و به چه ترتیبی). اگه ندید، هر ۵ تا نشون داده\r\n * می‌شن. آرایه‌ی خالی یعنی کلِ بخشِ فیلتر مخفی بشه.\r\n */\r\n filters = input<NgxImageFilterPreset[]>(ALL_FILTERS);\r\n quality = input(0.92);\r\n\r\n defaultLocalization = inject(NGX_IMAGE_EDITOR_LOCALIZATION);\r\n localize = input<NgxImageEditorLocalization>(this.defaultLocalization);\r\n\r\n saved = output<NgxImageEditorResult>();\r\n cancelled = output<void>();\r\n\r\n protected readonly loading = signal(false);\r\n protected readonly saving = signal(false);\r\n protected readonly loadError = signal<string | null>(null);\r\n\r\n private readonly originalImage = signal<HTMLImageElement | null>(null);\r\n private readonly workingCanvas = signal<HTMLCanvasElement | null>(null);\r\n private readonly stageWrapEl = viewChild<ElementRef<HTMLElement>>('stageWrap');\r\n /** عرضِ واقعیِ رندرشده‌ی کانتینر؛ چون عرض همیشه ۱۰۰٪ (fluid) هست، باید زنده اندازه‌گیری بشه */\r\n private readonly containerWidth = signal(0);\r\n\r\n protected readonly rotation = signal(0);\r\n protected readonly brightness = signal(100);\r\n protected readonly contrast = signal(100);\r\n protected readonly saturation = signal(100);\r\n protected readonly filterPreset = signal<NgxImageFilterPreset>('none');\r\n\r\n protected readonly crop = signal<NgxCropRect>({ x: 0, y: 0, width: 0, height: 0 });\r\n\r\n protected readonly adjustments = computed<NgxImageEditorAdjustments>(() => ({\r\n brightness: this.brightness(),\r\n contrast: this.contrast(),\r\n saturation: this.saturation(),\r\n rotation: this.rotation(),\r\n filter: this.filterPreset(),\r\n }));\r\n\r\n protected readonly filterLabels = computed<Record<NgxImageFilterPreset, string>>(() => {\r\n const t = this.localize();\r\n return {\r\n none: t.None,\r\n grayscale: t.Grayscale,\r\n sepia: t.Sepia,\r\n invert: t.Invert,\r\n cartoon: t.Cartoon,\r\n };\r\n });\r\n\r\n /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */\r\n protected readonly rotatedWorkingCanvas = computed(() => {\r\n const wc = this.workingCanvas();\r\n if (!wc) return null;\r\n return renderRotated(wc, wc.width, wc.height, this.rotation());\r\n });\r\n\r\n protected readonly panelSize = computed(() => {\r\n return this.stageWrapEl()?.nativeElement.getBoundingClientRect().height ?? 0;\r\n });\r\n\r\n /**\r\n * مقیاسِ «contain» واقعی: کوچیک‌ترینِ نسبتِ عرض و ارتفاع (هرکدوم تنگ‌تره)\r\n * تعیین‌کننده‌ست، و سقفش هم ۱ هست تا تصاویر کوچیک بزرگ‌نمایی نشن.\r\n */\r\n protected readonly displayScale = computed(() => {\r\n const rc = this.rotatedWorkingCanvas();\r\n const containerW = this.containerWidth();\r\n const panelH = this.panelSize();\r\n if (!rc || rc.width <= 0 || rc.height <= 0 || containerW <= 0 || panelH <= 0) return 1;\r\n return Math.min(containerW / rc.width, panelH / rc.height, 1);\r\n });\r\n\r\n protected readonly stageImageUrl = computed(() => {\r\n const rc = this.rotatedWorkingCanvas();\r\n return rc ? rc.toDataURL('image/png') : null;\r\n });\r\n\r\n protected readonly stageSize = computed(() => {\r\n const rc = this.rotatedWorkingCanvas();\r\n const scale = this.displayScale();\r\n return rc ? { width: rc.width * scale, height: rc.height * scale } : { width: 0, height: 0 };\r\n });\r\n\r\n protected readonly cropOverlayStyle = computed(() => {\r\n const scale = this.displayScale();\r\n const c = this.crop();\r\n return {\r\n left: `${c.x * scale}px`,\r\n top: `${c.y * scale}px`,\r\n width: `${c.width * scale}px`,\r\n height: `${c.height * scale}px`,\r\n };\r\n });\r\n\r\n /** پیش‌نمایش نهایی (کوچیک، حداکثر ۴۸۰ پیکسل) — شامل همه‌چیز، حتی افکت کارتونی */\r\n protected readonly previewUrl = computed(() => {\r\n const rc = this.rotatedWorkingCanvas();\r\n const c = this.crop();\r\n if (!rc || c.width <= 0 || c.height <= 0) return null;\r\n const canvas = renderComposite(rc, rc.width, rc.height, c, this.adjustments(), 480, 480);\r\n return canvas.toDataURL('image/png');\r\n });\r\n\r\n private moveSnapshot: NgxCropRect | null = null;\r\n private resizeSnapshot: NgxCropRect | null = null;\r\n\r\n constructor() {\r\n // بارگذاری تصویر هروقت source عوض بشه\r\n effect(() => {\r\n const src = this.source();\r\n if (!src) {\r\n this.originalImage.set(null);\r\n this.workingCanvas.set(null);\r\n return;\r\n }\r\n this.loading.set(true);\r\n this.loadError.set(null);\r\n loadImage(src)\r\n .then((img) => {\r\n this.originalImage.set(img);\r\n this.workingCanvas.set(createWorkingCopy(img));\r\n this.resetAdjustments();\r\n })\r\n .catch((err) => this.loadError.set(err?.message ?? 'Failed to load image'))\r\n .finally(() => this.loading.set(false));\r\n });\r\n\r\n // هر وقت چرخیده‌شده عوض بشه (بارگذاریِ تصویر جدید یا چرخش)، کراپ روی کل قاب ریست بشه\r\n effect(() => {\r\n const rc = this.rotatedWorkingCanvas();\r\n if (rc) {\r\n this.crop.set({ x: 0, y: 0, width: rc.width, height: rc.height });\r\n }\r\n });\r\n\r\n // اگه فیلترِ فعلاً انتخاب‌شده دیگه توی لیستِ مجازِ filters() نباشه (مثلاً\r\n // مصرف‌کننده cartoon رو غیرفعال کرده درحالی‌که کاربر روش بود)، برو روی\r\n // اولین فیلترِ مجاز؛ اگه لیست خالی باشه (کلاً فیلتر مخفیه)، روی none بمون.\r\n effect(() => {\r\n const allowed = this.filters();\r\n if (allowed.length && !allowed.includes(this.filterPreset())) {\r\n this.filterPreset.set(allowed[0]);\r\n }\r\n });\r\n\r\n // اندازه‌گیریِ زنده‌ی عرضِ واقعیِ کانتینر — چون عرض همیشه ۱۰۰٪ (fluid)ه،\r\n // فقط با ResizeObserver می‌شه فهمید الان چند پیکسله (نه یه عددِ ثابتِ ورودی).\r\n effect((onCleanup) => {\r\n const el = this.stageWrapEl()?.nativeElement;\r\n if (!el) return;\r\n this.containerWidth.set(el.getBoundingClientRect().width);\r\n const ro = new ResizeObserver((entries) => {\r\n const width = entries[0]?.contentRect.width;\r\n if (width != null) this.containerWidth.set(width);\r\n });\r\n ro.observe(el);\r\n onCleanup(() => ro.disconnect());\r\n });\r\n }\r\n\r\n private resetAdjustments(): void {\r\n this.rotation.set(0);\r\n this.brightness.set(100);\r\n this.contrast.set(100);\r\n this.saturation.set(100);\r\n this.filterPreset.set(this.filters()[0] ?? 'none');\r\n }\r\n\r\n protected rotateBy(delta: number): void {\r\n this.rotation.update((r) => {\r\n let next = r + delta;\r\n if (next > 180) next -= 360;\r\n if (next < -180) next += 360;\r\n return next;\r\n });\r\n }\r\n\r\n protected setFilter(preset: NgxImageFilterPreset): void {\r\n this.filterPreset.set(preset);\r\n }\r\n\r\n // ---------- درگ جابه‌جاییِ کل کراپ‌باکس ----------\r\n protected onMoveDragStart(): void {\r\n this.moveSnapshot = { ...this.crop() };\r\n }\r\n\r\n protected onMoveDragMove(delta: NgxPointerDragDelta): void {\r\n const rc = this.rotatedWorkingCanvas();\r\n const snap = this.moveSnapshot;\r\n if (!rc || !snap) return;\r\n const scale = this.displayScale();\r\n const dxSrc = delta.dx / scale;\r\n const dySrc = delta.dy / scale;\r\n const maxX = Math.max(0, rc.width - snap.width);\r\n const maxY = Math.max(0, rc.height - snap.height);\r\n const x = Math.min(Math.max(0, snap.x + dxSrc), maxX);\r\n const y = Math.min(Math.max(0, snap.y + dySrc), maxY);\r\n this.crop.set({ ...snap, x, y });\r\n }\r\n\r\n // ---------- درگ ریسایز از گوشه‌ها ----------\r\n protected onResizeDragStart(): void {\r\n this.resizeSnapshot = { ...this.crop() };\r\n }\r\n\r\n protected onResizeDragMove(corner: Corner, delta: NgxPointerDragDelta): void {\r\n const rc = this.rotatedWorkingCanvas();\r\n const snap = this.resizeSnapshot;\r\n if (!rc || !snap) return;\r\n\r\n const scale = this.displayScale();\r\n const dxSrc = delta.dx / scale;\r\n const dySrc = delta.dy / scale;\r\n const minSize = 24;\r\n\r\n let { x, y, width, height } = snap;\r\n\r\n if (corner === 'nw' || corner === 'sw') {\r\n const newX = Math.min(snap.x + dxSrc, snap.x + snap.width - minSize);\r\n x = Math.max(0, newX);\r\n width = snap.x + snap.width - x;\r\n }\r\n if (corner === 'ne' || corner === 'se') {\r\n width = Math.min(Math.max(minSize, snap.width + dxSrc), rc.width - snap.x);\r\n }\r\n if (corner === 'nw' || corner === 'ne') {\r\n const newY = Math.min(snap.y + dySrc, snap.y + snap.height - minSize);\r\n y = Math.max(0, newY);\r\n height = snap.y + snap.height - y;\r\n }\r\n if (corner === 'sw' || corner === 'se') {\r\n height = Math.min(Math.max(minSize, snap.height + dySrc), rc.height - snap.y);\r\n }\r\n\r\n const ratio = this.aspectRatio();\r\n if (ratio) {\r\n height = width / ratio;\r\n }\r\n\r\n this.crop.set({ x, y, width, height });\r\n }\r\n\r\n protected cancel(): void {\r\n this.cancelled.emit();\r\n }\r\n\r\n async save(): Promise<void> {\r\n const original = this.originalImage();\r\n const working = this.workingCanvas();\r\n if (!original || !working) return;\r\n\r\n this.saving.set(true);\r\n try {\r\n // نسبت مقیاس بین کپیِ کوچیک‌شده (که کراپ/چرخش روش تعریف شده) و تصویر\r\n // اصلیِ کامل. چون createWorkingCopy مقیاس یکنواخت (هم‌جهت) اعمال\r\n // می‌کنه، همین یه ضریب برای هر دو بعد و بعد از چرخش هم معتبر می‌مونه.\r\n const scaleToOriginal = original.naturalWidth / working.width;\r\n\r\n const rotatedFull = renderRotated(\r\n original,\r\n original.naturalWidth,\r\n original.naturalHeight,\r\n this.rotation(),\r\n );\r\n\r\n const c = this.crop();\r\n const cropInFullRes: NgxCropRect = {\r\n x: c.x * scaleToOriginal,\r\n y: c.y * scaleToOriginal,\r\n width: c.width * scaleToOriginal,\r\n height: c.height * scaleToOriginal,\r\n };\r\n\r\n const finalCanvas = renderComposite(\r\n rotatedFull,\r\n rotatedFull.width,\r\n rotatedFull.height,\r\n cropInFullRes,\r\n this.adjustments(),\r\n this.outputMaxWidth(),\r\n this.outputMaxHeight(),\r\n );\r\n\r\n const type = this.outputType();\r\n const blob = await canvasToBlob(finalCanvas, type, this.quality());\r\n const dataUrl = finalCanvas.toDataURL(type, this.quality());\r\n this.saved.emit({ blob, dataUrl, width: finalCanvas.width, height: finalCanvas.height });\r\n } finally {\r\n this.saving.set(false);\r\n }\r\n }\r\n}\r\n","@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° left\">⟲ 90</button>\r\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90° right\">⟳ 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() }}°)</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","/**\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-image-editor.mjs","sources":["../../../projects/libs/image-editor/directives/pointer-drag.directive.ts","../../../projects/libs/image-editor/utils/image-io.ts","../../../projects/libs/image-editor/utils/cartoonify.ts","../../../projects/libs/image-editor/utils/render-pipeline.ts","../../../projects/libs/image-editor/tokens/localization.ts","../../../projects/libs/image-editor/components/image-editor.component.ts","../../../projects/libs/image-editor/components/image-editor.component.html","../../../projects/libs/image-editor/ngx-kit-image-editor.ts"],"sourcesContent":["import { Directive, HostListener, output } from '@angular/core';\n\nexport interface NgxPointerDragDelta {\n dx: number;\n dy: number;\n}\n\n/**\n * درگ عمومی روی پایه‌ی Pointer Events + setPointerCapture (دقیقاً همون\n * تکنیکی که در ngx-kit/data-table برای ریسایز ستون استفاده شده) — نیازی به\n * listener سطح document نداره چون بعد از setPointerCapture، رویدادهای\n * pointermove/pointerup حتی بیرون از محدوده‌ی المنت هم به خودش می‌رسن.\n *\n * dx/dy تجمعی از لحظه‌ی pointerdown هستن (نه دلتای بین دو move متوالی)، چون\n * معمولاً مصرف‌کننده می‌خواد «موقعیت شروع + دلتای کل» رو حساب کنه، نه جمع\n * تدریجی گرد شونده‌ی دلتاهای ریز.\n */\n@Directive({\n selector: '[ngxPointerDrag]',\n standalone: true,\n})\nexport class NgxPointerDragDirective {\n dragStart = output<void>();\n dragMove = output<NgxPointerDragDelta>();\n dragEnd = output<void>();\n\n private dragging = false;\n private startX = 0;\n private startY = 0;\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(ev: PointerEvent): void {\n ev.preventDefault();\n ev.stopPropagation();\n this.dragging = true;\n this.startX = ev.clientX;\n this.startY = ev.clientY;\n (ev.target as HTMLElement).setPointerCapture(ev.pointerId);\n this.dragStart.emit();\n }\n\n @HostListener('pointermove', ['$event'])\n onPointerMove(ev: PointerEvent): void {\n if (!this.dragging) return;\n this.dragMove.emit({ dx: ev.clientX - this.startX, dy: ev.clientY - this.startY });\n }\n\n @HostListener('pointerup')\n @HostListener('pointercancel')\n onPointerUp(): void {\n if (!this.dragging) return;\n this.dragging = false;\n this.dragEnd.emit();\n }\n}\n","/** یه File/Blob/data-URL/URL رو به یک HTMLImageElement بارگذاری‌شده تبدیل می‌کنه */\nexport function loadImage(source: File | Blob | string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n // برای URLهای cross-origin لازم می‌شه، وگرنه canvas بعداً «tainted» می‌شه\n // و toBlob/toDataURL با SecurityError شکست می‌خوره.\n img.crossOrigin = 'anonymous';\n\n const objectUrl = typeof source === 'string' ? null : URL.createObjectURL(source);\n const url = objectUrl ?? (source as string);\n\n img.onload = () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n resolve(img);\n };\n img.onerror = () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error('Failed to load image'));\n };\n img.src = url;\n });\n}\n\n/** canvas.toBlob به‌صورت Promise، به‌همراه fallback برای مرورگرهای قدیمی‌تر */\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n type = 'image/jpeg',\n quality = 0.92,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error('Failed to convert canvas to blob'));\n },\n type,\n quality,\n );\n });\n}\n\n/**\n * یه کپیِ کوچیک‌شده از تصویر اصلی می‌سازه که کل UI ویرایشگر (چرخش، کراپ،\n * پیش‌نمایش فیلترها/کارتونی) روی همین کار می‌کنه، نه روی تصویر اصلی که\n * ممکنه چند مگاپیکسل باشه. این باعث می‌شه درگ‌کردنِ اسلایدرها یا لبه‌های\n * کراپ روون بمونه؛ خروجی نهایی (save) همیشه از روی تصویر اصلیِ کامل رندر\n * می‌شه، نه از روی این کپی.\n */\nexport function createWorkingCopy(img: HTMLImageElement, maxSize = 1200): HTMLCanvasElement {\n const { width, height } = fitWithin(img.naturalWidth, img.naturalHeight, maxSize, maxSize);\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, width, height);\n return canvas;\n}\n\n/** ابعاد جدید رو طوری حساب می‌کنه که از maxWidth/maxHeight بیشتر نشه، با حفظ نسبت تصویر */\nexport function fitWithin(\n width: number,\n height: number,\n maxWidth?: number,\n maxHeight?: number,\n): { width: number; height: number } {\n if (!maxWidth && !maxHeight) return { width, height };\n let ratio = 1;\n if (maxWidth) ratio = Math.min(ratio, maxWidth / width);\n if (maxHeight) ratio = Math.min(ratio, maxHeight / height);\n if (ratio >= 1) return { width, height };\n return { width: Math.round(width * ratio), height: Math.round(height * ratio) };\n}\n","/**\n * افکت «کارتونی»: چون ctx.filter استاندارد چیزی شبیه cartoon نداره (فقط\n * brightness/contrast/saturate/grayscale/sepia/invert/blur/hue-rotate)، این\n * یکی رو واقعاً با پردازش پیکسلی پیاده کردیم؛ دو مرحله:\n *\n * ۱) Posterize: هر کانال رنگ به تعداد محدودی سطح گرد می‌شه (پهنه‌های رنگیِ\n * صاف و یکدست، حسِ کارتونی رنگ می‌ده).\n * ۲) لبه‌یابی Sobel روی نسخه‌ی خاکستریِ تصویر: هرجا شدت لبه از حد آستانه\n * بیشتر باشه، پیکسل تیره می‌شه (حسِ خط دور کارتونی).\n *\n * روی خودِ ImageData کار می‌کنه، پس هزینه‌ش با اندازه‌ی تصویر خطی‌ست؛ برای\n * تصاویر خیلی بزرگ (>~3000px) بهتره قبلش resize بشه (که در کامپوننت اصلی\n * با fitWithin قبل از اعمال فیلتر انجام می‌شه).\n */\nexport function applyCartoonEffect(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n options: { levels?: number; edgeThreshold?: number } = {},\n): void {\n const levels = options.levels ?? 5;\n const edgeThreshold = options.edgeThreshold ?? 80;\n\n const imageData = ctx.getImageData(0, 0, width, height);\n const src = imageData.data;\n\n // ۱) خاکستری برای Sobel\n const gray = new Uint8ClampedArray(width * height);\n for (let i = 0, p = 0; i < src.length; i += 4, p++) {\n gray[p] = (src[i] * 0.299 + src[i + 1] * 0.587 + src[i + 2] * 0.114) | 0;\n }\n\n // ۲) Posterize رنگ‌ها\n const step = 255 / (levels - 1);\n for (let i = 0; i < src.length; i += 4) {\n src[i] = Math.round(Math.round(src[i] / step) * step);\n src[i + 1] = Math.round(Math.round(src[i + 1] / step) * step);\n src[i + 2] = Math.round(Math.round(src[i + 2] / step) * step);\n }\n\n // ۳) Sobel روی gray، خط دور تیره روی src\n const gxKernel = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const gyKernel = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n let k = 0;\n for (let dy = -1; dy <= 1; dy++) {\n for (let dx = -1; dx <= 1; dx++) {\n const v = gray[(y + dy) * width + (x + dx)];\n gx += v * gxKernel[k];\n gy += v * gyKernel[k];\n k++;\n }\n }\n const magnitude = Math.sqrt(gx * gx + gy * gy);\n if (magnitude > edgeThreshold) {\n const idx = (y * width + x) * 4;\n src[idx] = 20;\n src[idx + 1] = 20;\n src[idx + 2] = 20;\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n}\n","import { NgxCropRect, NgxImageEditorAdjustments } from '../contracts/image-editor-types';\nimport { applyCartoonEffect } from './cartoonify';\nimport { fitWithin } from './image-io';\n\n/** تصویر مبدأ رو با زاویه‌ی داده‌شده روی یه canvas جدید (به اندازه‌ی bounding-box نتیجه) می‌چرخونه */\nexport function renderRotated(\n source: CanvasImageSource,\n width: number,\n height: number,\n degrees: number,\n): HTMLCanvasElement {\n const rad = (degrees * Math.PI) / 180;\n const sin = Math.abs(Math.sin(rad));\n const cos = Math.abs(Math.cos(rad));\n const newW = Math.max(1, Math.round(width * cos + height * sin));\n const newH = Math.max(1, Math.round(width * sin + height * cos));\n\n const canvas = document.createElement('canvas');\n canvas.width = newW;\n canvas.height = newH;\n const ctx = canvas.getContext('2d')!;\n ctx.translate(newW / 2, newH / 2);\n ctx.rotate(rad);\n ctx.drawImage(source, -width / 2, -height / 2, width, height);\n return canvas;\n}\n\nfunction buildCssFilter(adjustments: NgxImageEditorAdjustments): string {\n const parts = [\n `brightness(${adjustments.brightness}%)`,\n `contrast(${adjustments.contrast}%)`,\n `saturate(${adjustments.saturation}%)`,\n ];\n if (adjustments.filter === 'grayscale') parts.push('grayscale(1)');\n if (adjustments.filter === 'sepia') parts.push('sepia(1)');\n if (adjustments.filter === 'invert') parts.push('invert(1)');\n return parts.join(' ');\n}\n\n/**\n * کراپ + فیلترها رو روی یه canvas خروجی می‌سازه. brightness/contrast/\n * saturation/grayscale/sepia/invert همه با ctx.filter بومیِ Canvas 2D انجام\n * می‌شن (شتاب‌دهی‌شده توسط مرورگر، بدون حلقه‌ی پیکسلی دستی)؛ فقط cartoon\n * (که معادل بومی نداره) با پردازش پیکسلی جدا انجام می‌شه.\n *\n * maxWidth/maxHeight برای دو حالت استفاده می‌شه: پیش‌نمایش زنده (عدد کوچیک،\n * برای واکنش‌گرا موندن حین کشیدن اسلایدرها) و خروجی نهایی (بدون محدودیت یا\n * محدودیت دلخواه کاربر).\n */\nexport function renderComposite(\n source: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n crop: NgxCropRect,\n adjustments: NgxImageEditorAdjustments,\n maxWidth?: number,\n maxHeight?: number,\n): HTMLCanvasElement {\n const { width: outW, height: outH } = fitWithin(crop.width, crop.height, maxWidth, maxHeight);\n\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, outW);\n canvas.height = Math.max(1, outH);\n const ctx = canvas.getContext('2d')!;\n\n ctx.filter = buildCssFilter(adjustments);\n ctx.drawImage(source, crop.x, crop.y, crop.width, crop.height, 0, 0, canvas.width, canvas.height);\n ctx.filter = 'none';\n\n if (adjustments.filter === 'cartoon') {\n applyCartoonEffect(ctx, canvas.width, canvas.height);\n }\n\n return canvas;\n}\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const NGX_IMAGE_EDITOR_LOCALIZATION = new InjectionToken<NgxImageEditorLocalization>(\r\n 'ngx-image-localization',\r\n {\r\n factory: () => DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION,\r\n },\r\n);\r\n\r\nexport class NgxImageEditorLocalization {\r\n LoadingImage = 'Loading image…';\r\n Rotation = 'Fine rotation';\r\n Brightness = 'Brightness';\r\n Contrast = 'Contrast';\r\n Saturation = 'Saturation';\r\n Filter = 'Filter';\r\n None = 'None';\r\n Grayscale = 'Grayscale';\r\n Sepia = 'Sepia';\r\n Invert = 'Invert';\r\n Cartoon = 'Cartoon';\r\n Cancel = 'Cancel';\r\n Save = 'Save';\r\n Saving = 'Saving…';\r\n Reset = 'Reset';\r\n}\r\nexport const DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION = new NgxImageEditorLocalization();\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { SliderComponent } from 'ngx-kit/shared';\nimport {\n NgxCropRect,\n NgxImageEditorAdjustments,\n NgxImageEditorResult,\n NgxImageFilterPreset,\n} from '../contracts/image-editor-types';\nimport { NgxPointerDragDelta, NgxPointerDragDirective } from '../directives/pointer-drag.directive';\nimport { canvasToBlob, createWorkingCopy, loadImage } from '../utils/image-io';\nimport { renderComposite, renderRotated } from '../utils/render-pipeline';\nimport { Corner } from '../types/corner';\nimport { NGX_IMAGE_EDITOR_LOCALIZATION, NgxImageEditorLocalization } from '../tokens/localization';\n\nconst ALL_FILTERS: NgxImageFilterPreset[] = ['none', 'grayscale', 'sepia', 'invert', 'cartoon'];\n\n/**\n * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده\n * (سیاه‌وسفید، سپیا، معکوس، کارتونی) + فشرده‌سازی خروجی. کاملاً روی Canvas\n * خام پیاده شده، بدون هیچ وابستگی خارجی‌ای.\n *\n * نکته‌ی مهمِ معماری: تمام تعامل زنده (چرخوندن، جابه‌جا/ریسایز کراپ‌باکس،\n * پیش‌نمایش فیلترها حتی کارتونی) روی یه کپیِ کوچیک‌شده از تصویر انجام می‌شه\n * (createWorkingCopy)، نه روی تصویر اصلی که ممکنه چند مگاپیکسل باشه — وگرنه\n * درگ‌کردن اسلایدرها/گوشه‌های کراپ رو کاربر حس تاخیر می‌کرد. فقط لحظه‌ی\n * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.\n *\n * اندازه‌ی صحنه (stage) با panelSize کنترل می‌شه: عرض همیشه ۱۰۰٪ عرضِ\n * والدِ کامپوننته (با ResizeObserver اندازه‌گیری می‌شه، پس با تغییر سایز\n * صفحه/layout هم زنده هماهنگ می‌مونه)، ارتفاع دقیقاً همون چیزیه که کاربر با\n * panelSize می‌ده. تصویر همیشه با یک مقیاسِ «contain» واقعی (هم بر اساس\n * عرض، هم بر اساس ارتفاع — هرکدوم تنگ‌تره) جا داده می‌شه، پس کلِ تصویر\n * همیشه در محدوده‌ی همین باکس دیده می‌شه، صرف‌نظر از اندازه‌ی واقعیِ فایل.\n * سقفِ مقیاس هم ۱ هست، یعنی تصاویر کوچیک بزرگ‌نمایی نمی‌شن (که باعثِ محو\n * شدن‌شون می‌شد).\n */\n@Component({\n selector: 'ngx-image-editor',\n standalone: true,\n imports: [FormsModule, SliderComponent, NgxPointerDragDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './image-editor.component.html',\n styleUrl: './image-editor.component.scss',\n host: { class: 'ngx-image-editor-host' },\n})\nexport class NgxImageEditorComponent {\n source = input<File | Blob | string | null>(null);\n /** قفل نسبتِ کراپ (مثلاً ۱ برای آواتار مربعی)؛ undefined یعنی آزاد */\n aspectRatio = input<number | undefined>(undefined);\n outputMaxWidth = input<number | undefined>(undefined);\n outputMaxHeight = input<number | undefined>(undefined);\n outputType = input<'image/jpeg' | 'image/png' | 'image/webp'>('image/jpeg');\n\n /**\n * کدوم فیلترها نشون داده بشن (و به چه ترتیبی). اگه ندید، هر ۵ تا نشون داده\n * می‌شن. آرایه‌ی خالی یعنی کلِ بخشِ فیلتر مخفی بشه.\n */\n filters = input<NgxImageFilterPreset[]>(ALL_FILTERS);\n quality = input(0.92);\n\n defaultLocalization = inject(NGX_IMAGE_EDITOR_LOCALIZATION);\n localize = input<NgxImageEditorLocalization>(this.defaultLocalization);\n\n saved = output<NgxImageEditorResult>();\n cancelled = output<void>();\n\n protected readonly loading = signal(false);\n protected readonly saving = signal(false);\n protected readonly loadError = signal<string | null>(null);\n\n private readonly originalImage = signal<HTMLImageElement | null>(null);\n private readonly workingCanvas = signal<HTMLCanvasElement | null>(null);\n private readonly stageWrapEl = viewChild<ElementRef<HTMLElement>>('stageWrap');\n /** عرضِ واقعیِ رندرشده‌ی کانتینر؛ چون عرض همیشه ۱۰۰٪ (fluid) هست، باید زنده اندازه‌گیری بشه */\n private readonly containerWidth = signal(0);\n\n protected readonly rotation = signal(0);\n protected readonly brightness = signal(100);\n protected readonly contrast = signal(100);\n protected readonly saturation = signal(100);\n protected readonly filterPreset = signal<NgxImageFilterPreset>('none');\n\n protected readonly crop = signal<NgxCropRect>({ x: 0, y: 0, width: 0, height: 0 });\n\n protected readonly adjustments = computed<NgxImageEditorAdjustments>(() => ({\n brightness: this.brightness(),\n contrast: this.contrast(),\n saturation: this.saturation(),\n rotation: this.rotation(),\n filter: this.filterPreset(),\n }));\n\n protected readonly filterLabels = computed<Record<NgxImageFilterPreset, string>>(() => {\n const t = this.localize();\n return {\n none: t.None,\n grayscale: t.Grayscale,\n sepia: t.Sepia,\n invert: t.Invert,\n cartoon: t.Cartoon,\n };\n });\n\n /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */\n protected readonly rotatedWorkingCanvas = computed(() => {\n const wc = this.workingCanvas();\n if (!wc) return null;\n return renderRotated(wc, wc.width, wc.height, this.rotation());\n });\n\n protected readonly panelSize = computed(() => {\n return this.stageWrapEl()?.nativeElement.getBoundingClientRect().height ?? 0;\n });\n\n /**\n * مقیاسِ «contain» واقعی: کوچیک‌ترینِ نسبتِ عرض و ارتفاع (هرکدوم تنگ‌تره)\n * تعیین‌کننده‌ست، و سقفش هم ۱ هست تا تصاویر کوچیک بزرگ‌نمایی نشن.\n */\n protected readonly displayScale = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n const containerW = this.containerWidth();\n const panelH = this.panelSize();\n if (!rc || rc.width <= 0 || rc.height <= 0 || containerW <= 0 || panelH <= 0) return 1;\n return Math.min(containerW / rc.width, panelH / rc.height, 1);\n });\n\n protected readonly stageImageUrl = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n return rc ? rc.toDataURL('image/png') : null;\n });\n\n protected readonly stageSize = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n const scale = this.displayScale();\n return rc ? { width: rc.width * scale, height: rc.height * scale } : { width: 0, height: 0 };\n });\n\n protected readonly cropOverlayStyle = computed(() => {\n const scale = this.displayScale();\n const c = this.crop();\n return {\n left: `${c.x * scale}px`,\n top: `${c.y * scale}px`,\n width: `${c.width * scale}px`,\n height: `${c.height * scale}px`,\n };\n });\n\n /** پیش‌نمایش نهایی (کوچیک، حداکثر ۴۸۰ پیکسل) — شامل همه‌چیز، حتی افکت کارتونی */\n protected readonly previewUrl = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n const c = this.crop();\n if (!rc || c.width <= 0 || c.height <= 0) return null;\n const canvas = renderComposite(rc, rc.width, rc.height, c, this.adjustments(), 480, 480);\n return canvas.toDataURL('image/png');\n });\n\n private moveSnapshot: NgxCropRect | null = null;\n private resizeSnapshot: NgxCropRect | null = null;\n\n constructor() {\n // بارگذاری تصویر هروقت source عوض بشه\n effect(() => {\n const src = this.source();\n if (!src) {\n this.originalImage.set(null);\n this.workingCanvas.set(null);\n return;\n }\n this.loading.set(true);\n this.loadError.set(null);\n loadImage(src)\n .then((img) => {\n this.originalImage.set(img);\n this.workingCanvas.set(createWorkingCopy(img));\n this.resetAdjustments();\n })\n .catch((err) => this.loadError.set(err?.message ?? 'Failed to load image'))\n .finally(() => this.loading.set(false));\n });\n\n // هر وقت چرخیده‌شده عوض بشه (بارگذاریِ تصویر جدید یا چرخش)، کراپ روی کل قاب ریست بشه\n effect(() => {\n const rc = this.rotatedWorkingCanvas();\n if (rc) {\n this.crop.set({ x: 0, y: 0, width: rc.width, height: rc.height });\n }\n });\n\n // اگه فیلترِ فعلاً انتخاب‌شده دیگه توی لیستِ مجازِ filters() نباشه (مثلاً\n // مصرف‌کننده cartoon رو غیرفعال کرده درحالی‌که کاربر روش بود)، برو روی\n // اولین فیلترِ مجاز؛ اگه لیست خالی باشه (کلاً فیلتر مخفیه)، روی none بمون.\n effect(() => {\n const allowed = this.filters();\n if (allowed.length && !allowed.includes(this.filterPreset())) {\n this.filterPreset.set(allowed[0]);\n }\n });\n\n // اندازه‌گیریِ زنده‌ی عرضِ واقعیِ کانتینر — چون عرض همیشه ۱۰۰٪ (fluid)ه،\n // فقط با ResizeObserver می‌شه فهمید الان چند پیکسله (نه یه عددِ ثابتِ ورودی).\n effect((onCleanup) => {\n const el = this.stageWrapEl()?.nativeElement;\n if (!el) return;\n this.containerWidth.set(el.getBoundingClientRect().width);\n const ro = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width != null) this.containerWidth.set(width);\n });\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n });\n }\n\n private resetAdjustments(): void {\n this.rotation.set(0);\n this.brightness.set(100);\n this.contrast.set(100);\n this.saturation.set(100);\n this.filterPreset.set(this.filters()[0] ?? 'none');\n }\n\n protected rotateBy(delta: number): void {\n this.rotation.update((r) => {\n let next = r + delta;\n if (next > 180) next -= 360;\n if (next < -180) next += 360;\n return next;\n });\n }\n\n protected setFilter(preset: NgxImageFilterPreset): void {\n this.filterPreset.set(preset);\n }\n\n // ---------- درگ جابه‌جاییِ کل کراپ‌باکس ----------\n protected onMoveDragStart(): void {\n this.moveSnapshot = { ...this.crop() };\n }\n\n protected onMoveDragMove(delta: NgxPointerDragDelta): void {\n const rc = this.rotatedWorkingCanvas();\n const snap = this.moveSnapshot;\n if (!rc || !snap) return;\n const scale = this.displayScale();\n const dxSrc = delta.dx / scale;\n const dySrc = delta.dy / scale;\n const maxX = Math.max(0, rc.width - snap.width);\n const maxY = Math.max(0, rc.height - snap.height);\n const x = Math.min(Math.max(0, snap.x + dxSrc), maxX);\n const y = Math.min(Math.max(0, snap.y + dySrc), maxY);\n this.crop.set({ ...snap, x, y });\n }\n\n // ---------- درگ ریسایز از گوشه‌ها ----------\n protected onResizeDragStart(): void {\n this.resizeSnapshot = { ...this.crop() };\n }\n\n protected onResizeDragMove(corner: Corner, delta: NgxPointerDragDelta): void {\n const rc = this.rotatedWorkingCanvas();\n const snap = this.resizeSnapshot;\n if (!rc || !snap) return;\n\n const scale = this.displayScale();\n const dxSrc = delta.dx / scale;\n const dySrc = delta.dy / scale;\n const minSize = 24;\n\n let { x, y, width, height } = snap;\n\n if (corner === 'nw' || corner === 'sw') {\n const newX = Math.min(snap.x + dxSrc, snap.x + snap.width - minSize);\n x = Math.max(0, newX);\n width = snap.x + snap.width - x;\n }\n if (corner === 'ne' || corner === 'se') {\n width = Math.min(Math.max(minSize, snap.width + dxSrc), rc.width - snap.x);\n }\n if (corner === 'nw' || corner === 'ne') {\n const newY = Math.min(snap.y + dySrc, snap.y + snap.height - minSize);\n y = Math.max(0, newY);\n height = snap.y + snap.height - y;\n }\n if (corner === 'sw' || corner === 'se') {\n height = Math.min(Math.max(minSize, snap.height + dySrc), rc.height - snap.y);\n }\n\n const ratio = this.aspectRatio();\n if (ratio) {\n height = width / ratio;\n }\n\n this.crop.set({ x, y, width, height });\n }\n\n protected cancel(): void {\n this.cancelled.emit();\n }\n\n async save(): Promise<void> {\n const original = this.originalImage();\n const working = this.workingCanvas();\n if (!original || !working) return;\n\n this.saving.set(true);\n try {\n // نسبت مقیاس بین کپیِ کوچیک‌شده (که کراپ/چرخش روش تعریف شده) و تصویر\n // اصلیِ کامل. چون createWorkingCopy مقیاس یکنواخت (هم‌جهت) اعمال\n // می‌کنه، همین یه ضریب برای هر دو بعد و بعد از چرخش هم معتبر می‌مونه.\n const scaleToOriginal = original.naturalWidth / working.width;\n\n const rotatedFull = renderRotated(\n original,\n original.naturalWidth,\n original.naturalHeight,\n this.rotation(),\n );\n\n const c = this.crop();\n const cropInFullRes: NgxCropRect = {\n x: c.x * scaleToOriginal,\n y: c.y * scaleToOriginal,\n width: c.width * scaleToOriginal,\n height: c.height * scaleToOriginal,\n };\n\n const finalCanvas = renderComposite(\n rotatedFull,\n rotatedFull.width,\n rotatedFull.height,\n cropInFullRes,\n this.adjustments(),\n this.outputMaxWidth(),\n this.outputMaxHeight(),\n );\n\n const type = this.outputType();\n const blob = await canvasToBlob(finalCanvas, type, this.quality());\n const dataUrl = finalCanvas.toDataURL(type, this.quality());\n this.saved.emit({ blob, dataUrl, width: finalCanvas.width, height: finalCanvas.height });\n } finally {\n this.saving.set(false);\n }\n }\n}\n","@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° left\">⟲ 90</button>\r\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90° right\">⟳ 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() }}°)</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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -180,18 +180,18 @@ class NgxMenuItem {
180
180
  this.menuContext?.close();
181
181
  }
182
182
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMenuItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
183
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: NgxMenuItem, isStandalone: true, selector: "ngx-menu-item,[ngx-menu-item]", host: { listeners: { "click": "onClick()" } }, exportAs: ["NgxMenuItem"], ngImport: i0, template: `
184
- <div class="ngx-menu-item">
185
- <ng-content></ng-content>
186
- </div>
183
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: NgxMenuItem, isStandalone: true, selector: "ngx-menu-item,[ngx-menu-item]", host: { listeners: { "click": "onClick()" } }, exportAs: ["NgxMenuItem"], ngImport: i0, template: `
184
+ <div class="ngx-menu-item">
185
+ <ng-content></ng-content>
186
+ </div>
187
187
  `, isInline: true, styles: [".ngx-menu-item{box-sizing:border-box;outline:0;padding:var(--ngx-menu-item-padding, 6px 12px);transition:all .3s}.ngx-menu-item:hover{cursor:pointer;background-color:var(--ngx-menu-item-hover-bg, #9bc6ff68)}\n"] });
188
188
  }
189
189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMenuItem, decorators: [{
190
190
  type: Component,
191
- args: [{ selector: 'ngx-menu-item,[ngx-menu-item]', template: `
192
- <div class="ngx-menu-item">
193
- <ng-content></ng-content>
194
- </div>
191
+ args: [{ selector: 'ngx-menu-item,[ngx-menu-item]', template: `
192
+ <div class="ngx-menu-item">
193
+ <ng-content></ng-content>
194
+ </div>
195
195
  `, exportAs: 'NgxMenuItem', styles: [".ngx-menu-item{box-sizing:border-box;outline:0;padding:var(--ngx-menu-item-padding, 6px 12px);transition:all .3s}.ngx-menu-item:hover{cursor:pointer;background-color:var(--ngx-menu-item-hover-bg, #9bc6ff68)}\n"] }]
196
196
  }], propDecorators: { onClick: [{
197
197
  type: HostListener,
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-menu.mjs","sources":["../../../projects/libs/menu/directives/ngx-menu.directive.ts","../../../projects/libs/menu/directives/ngx-context-menu.directive.ts","../../../projects/libs/menu/tokens/menu-context.token.ts","../../../projects/libs/menu/components/ngx-menu/menu.component.ts","../../../projects/libs/menu/components/ngx-menu-item/menu-item.component.ts","../../../projects/libs/menu/components/ngx-menu-divider/menu-divider.component.ts","../../../projects/libs/menu/ngx-menu.module.ts","../../../projects/libs/menu/ngx-kit-menu.ts"],"sourcesContent":["import {\n Directive,\n OnDestroy,\n ElementRef,\n HostListener,\n input,\n ApplicationRef,\n} from '@angular/core';\nimport { OverlayRef, OverlayService, OverlayInstance, Alignment, Placement } from 'ngx-kit/shared';\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\n\n@Directive({\n selector: '[ngxMenu]',\n exportAs: 'ngxMenu',\n})\nexport class NgxMenu implements OnDestroy {\n ngxMenu = input.required<NgxMenuPanel>();\n placement = input<Placement>();\n alignment = input<Alignment>();\n\n private containerRef?: OverlayRef<NgxMenuPanel>;\n\n constructor(\n private el: ElementRef,\n private appRef: ApplicationRef,\n private overlayService: OverlayService,\n ) {}\n\n ngOnDestroy(): void {\n this.destroyContainer();\n }\n\n @HostListener('click', ['$event'])\n onClick(ev: Event) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggleContainer();\n }\n\n private toggleContainer() {\n if (this.containerRef) {\n this.destroyContainer();\n return;\n }\n const t = this.ngxMenu().template();\n if (!t) return;\n this.containerRef = this.overlayService.openTemplate({\n anchor: this.el.nativeElement,\n template: t,\n appRef: this.appRef,\n alignment: this.alignment() ?? 'start',\n placement: this.placement() ?? 'auto',\n onClosed: () => {\n this.containerRef = undefined;\n this.overlayService.closeAll();\n },\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\n this.ngxMenu().containerRef = ref;\n },\n });\n }\n\n private destroyContainer() {\n this.containerRef?.close();\n this.containerRef = undefined;\n }\n}\n","import { Directive, OnDestroy, input, ApplicationRef, ElementRef } from '@angular/core';\r\nimport { OverlayRef, OverlayService, OverlayInstance } from 'ngx-kit/shared';\r\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\r\n\r\n@Directive({\r\n selector: '[ngxContextMenu]',\r\n exportAs: 'ngxContextMenu',\r\n})\r\nexport class NgxContextMenu implements OnDestroy {\r\n ngxContextMenu = input.required<NgxMenuPanel>();\r\n\r\n private containerRef?: OverlayRef<NgxMenuPanel>;\r\n\r\n // باید همون رفرنس تابعی که به addEventListener داده می‌شه رو نگه داریم و به\r\n // removeEventListener هم بدیم؛ قبلاً هر بار یک آرو فانکشن جدید ساخته می‌شد\r\n // که removeEventListener اصلاً نمی‌تونست تشخیص بده مال همون listener قبلیه،\r\n // پس listener هیچ‌وقت واقعاً حذف نمی‌شد (نشتی حافظه‌ی کامل directive + المنت).\r\n private readonly boundOnClick = (ev: PointerEvent) => this.onClick(ev);\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private appRef: ApplicationRef,\r\n private overlayService: OverlayService,\r\n ) {\r\n el.nativeElement.addEventListener('contextmenu', this.boundOnClick);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyContainer();\r\n this.el.nativeElement.removeEventListener('contextmenu', this.boundOnClick);\r\n }\r\n\r\n onClick(ev: PointerEvent) {\r\n if (ev.currentTarget == this.el.nativeElement) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.toggleContainer(ev.clientX, ev.clientY);\r\n }\r\n }\r\n\r\n private toggleContainer(x: number, y: number) {\r\n if (this.containerRef) {\r\n this.destroyContainer();\r\n return;\r\n }\r\n const t = this.ngxContextMenu().template();\r\n if (!t) return;\r\n this.containerRef = this.overlayService.openTemplate({\r\n anchor: this.el.nativeElement,\r\n point: { x, y },\r\n template: t,\r\n appRef: this.appRef,\r\n alignment: 'start',\r\n placement: 'auto',\r\n onClosed: () => {\r\n this.containerRef = undefined;\r\n this.overlayService.closeAll();\r\n },\r\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\r\n this.ngxContextMenu().containerRef = ref;\r\n },\r\n });\r\n }\r\n\r\n private destroyContainer() {\r\n this.containerRef?.close();\r\n this.containerRef = undefined;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\n\nexport interface MenuContext {\n close(): void;\n}\n\nexport const NGX_MENU_CONTEXT = new InjectionToken<MenuContext>('ngx-menu-context');\n","import { CommonModule } from '@angular/common';\nimport { Component, input, TemplateRef, viewChild } from '@angular/core';\nimport { OverlayRef } from 'ngx-kit/shared';\nimport { MenuContext, NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\n\n@Component({\n selector: 'ngx-menu,[ngx-menu]',\n template: `\n <ng-template>\n <div class=\"ngx-menu-panel\" [class]=\"class()\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n `,\n exportAs: 'NgxMenu',\n styles: `\n .ngx-menu-panel {\n --ngx-menu-bg: light-dark(#ffffff, #252425);\n --ngx-menu-fg: light-dark(#000000, #ffffff);\n }\n .ngx-menu-panel {\n overflow: auto;\n box-sizing: border-box;\n outline: 0;\n background-color: var(--ngx-menu-bg);\n color: var(--ngx-menu-fg);\n box-shadow: var(--ngx-menu-shadow, 0px 0px 4px rgb(0 0 0 / 30%));\n border-radius: var(--ngx-menu-radius, 10px);\n padding: var(--ngx-menu-padding, 5px);\n min-width: var(--ngx-menu-min-width, 20px);\n min-height: var(--ngx-menu-min-height, 40px);\n will-change: transform, opacity;\n }\n .ngx-menu-panel.ngx-menu-panel-exit {\n animation: menu-exit 100ms 25ms linear forwards;\n }\n `,\n imports: [CommonModule],\n providers: [{ provide: NGX_MENU_CONTEXT, useExisting: NgxMenuPanel }],\n})\nexport class NgxMenuPanel implements MenuContext {\n template = viewChild<TemplateRef<any>>(TemplateRef);\n class = input<string>();\n\n containerRef?: OverlayRef<NgxMenuPanel>;\n\n close(): void {\n this.containerRef?.close();\n }\n}\n","import { Component, HostListener, inject } from '@angular/core';\r\nimport { NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\r\nimport { NgxMenu } from '../../directives/ngx-menu.directive';\r\n\r\n@Component({\r\n selector: 'ngx-menu-item,[ngx-menu-item]',\r\n template: `\r\n <div class=\"ngx-menu-item\">\r\n <ng-content></ng-content>\r\n </div>\r\n `,\r\n exportAs: 'NgxMenuItem',\r\n styles: `\r\n .ngx-menu-item {\r\n box-sizing: border-box;\r\n outline: 0;\r\n padding: var(--ngx-menu-item-padding, 6px 12px);\r\n transition: all 300ms;\r\n &:hover {\r\n cursor: pointer;\r\n background-color: var(--ngx-menu-item-hover-bg, #9bc6ff68);\r\n }\r\n }\r\n `,\r\n})\r\nexport class NgxMenuItem {\r\n menuContext = inject(NGX_MENU_CONTEXT);\r\n childMenu = inject(NgxMenu, {\r\n self: true,\r\n optional: true,\r\n });\r\n\r\n @HostListener('click')\r\n onClick() {\r\n if (this.childMenu?.ngxMenu) {\r\n return;\r\n }\r\n this.menuContext?.close();\r\n }\r\n}\r\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngx-menu-divider,[ngx-menu-divider]',\n template: ``,\n styles: `\n :host {\n display: block;\n border-bottom: var(--ngx-menu-item-border, 1px #43434d3d solid);\n border-bottom-color: var(--ngx-menu-divider-border-color, #43434d3d);\n margin: var(--ngx-menu-divider-margin, 10px calc(var(--ngx-menu-padding, 5px) * -1));\n }\n `,\n})\nexport class NgxMenuDivider {}\n","import { NgModule } from '@angular/core';\nimport { NgxMenuDivider } from './components/ngx-menu-divider/menu-divider.component';\nimport { NgxMenuItem } from './components/ngx-menu-item/menu-item.component';\nimport { NgxMenuPanel } from './components/ngx-menu/menu.component';\nimport { NgxMenu } from './directives/ngx-menu.directive';\nimport { NgxContextMenu } from './public-api';\n\nconst d = [NgxMenu, NgxContextMenu, NgxMenuPanel, NgxMenuItem, NgxMenuDivider];\n@NgModule({\n imports: d,\n exports: d,\n})\nexport class NgxMenuModule {}\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-menu.mjs","sources":["../../../projects/libs/menu/directives/ngx-menu.directive.ts","../../../projects/libs/menu/directives/ngx-context-menu.directive.ts","../../../projects/libs/menu/tokens/menu-context.token.ts","../../../projects/libs/menu/components/ngx-menu/menu.component.ts","../../../projects/libs/menu/components/ngx-menu-item/menu-item.component.ts","../../../projects/libs/menu/components/ngx-menu-divider/menu-divider.component.ts","../../../projects/libs/menu/ngx-menu.module.ts","../../../projects/libs/menu/ngx-kit-menu.ts"],"sourcesContent":["import {\n Directive,\n OnDestroy,\n ElementRef,\n HostListener,\n input,\n ApplicationRef,\n} from '@angular/core';\nimport { OverlayRef, OverlayService, OverlayInstance, Alignment, Placement } from 'ngx-kit/shared';\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\n\n@Directive({\n selector: '[ngxMenu]',\n exportAs: 'ngxMenu',\n})\nexport class NgxMenu implements OnDestroy {\n ngxMenu = input.required<NgxMenuPanel>();\n placement = input<Placement>();\n alignment = input<Alignment>();\n\n private containerRef?: OverlayRef<NgxMenuPanel>;\n\n constructor(\n private el: ElementRef,\n private appRef: ApplicationRef,\n private overlayService: OverlayService,\n ) {}\n\n ngOnDestroy(): void {\n this.destroyContainer();\n }\n\n @HostListener('click', ['$event'])\n onClick(ev: Event) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggleContainer();\n }\n\n private toggleContainer() {\n if (this.containerRef) {\n this.destroyContainer();\n return;\n }\n const t = this.ngxMenu().template();\n if (!t) return;\n this.containerRef = this.overlayService.openTemplate({\n anchor: this.el.nativeElement,\n template: t,\n appRef: this.appRef,\n alignment: this.alignment() ?? 'start',\n placement: this.placement() ?? 'auto',\n onClosed: () => {\n this.containerRef = undefined;\n this.overlayService.closeAll();\n },\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\n this.ngxMenu().containerRef = ref;\n },\n });\n }\n\n private destroyContainer() {\n this.containerRef?.close();\n this.containerRef = undefined;\n }\n}\n","import { Directive, OnDestroy, input, ApplicationRef, ElementRef } from '@angular/core';\nimport { OverlayRef, OverlayService, OverlayInstance } from 'ngx-kit/shared';\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\n\n@Directive({\n selector: '[ngxContextMenu]',\n exportAs: 'ngxContextMenu',\n})\nexport class NgxContextMenu implements OnDestroy {\n ngxContextMenu = input.required<NgxMenuPanel>();\n\n private containerRef?: OverlayRef<NgxMenuPanel>;\n\n // باید همون رفرنس تابعی که به addEventListener داده می‌شه رو نگه داریم و به\n // removeEventListener هم بدیم؛ قبلاً هر بار یک آرو فانکشن جدید ساخته می‌شد\n // که removeEventListener اصلاً نمی‌تونست تشخیص بده مال همون listener قبلیه،\n // پس listener هیچ‌وقت واقعاً حذف نمی‌شد (نشتی حافظه‌ی کامل directive + المنت).\n private readonly boundOnClick = (ev: PointerEvent) => this.onClick(ev);\n\n constructor(\n private el: ElementRef<HTMLElement>,\n private appRef: ApplicationRef,\n private overlayService: OverlayService,\n ) {\n el.nativeElement.addEventListener('contextmenu', this.boundOnClick);\n }\n\n ngOnDestroy(): void {\n this.destroyContainer();\n this.el.nativeElement.removeEventListener('contextmenu', this.boundOnClick);\n }\n\n onClick(ev: PointerEvent) {\n if (ev.currentTarget == this.el.nativeElement) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggleContainer(ev.clientX, ev.clientY);\n }\n }\n\n private toggleContainer(x: number, y: number) {\n if (this.containerRef) {\n this.destroyContainer();\n return;\n }\n const t = this.ngxContextMenu().template();\n if (!t) return;\n this.containerRef = this.overlayService.openTemplate({\n anchor: this.el.nativeElement,\n point: { x, y },\n template: t,\n appRef: this.appRef,\n alignment: 'start',\n placement: 'auto',\n onClosed: () => {\n this.containerRef = undefined;\n this.overlayService.closeAll();\n },\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\n this.ngxContextMenu().containerRef = ref;\n },\n });\n }\n\n private destroyContainer() {\n this.containerRef?.close();\n this.containerRef = undefined;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface MenuContext {\n close(): void;\n}\n\nexport const NGX_MENU_CONTEXT = new InjectionToken<MenuContext>('ngx-menu-context');\n","import { CommonModule } from '@angular/common';\nimport { Component, input, TemplateRef, viewChild } from '@angular/core';\nimport { OverlayRef } from 'ngx-kit/shared';\nimport { MenuContext, NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\n\n@Component({\n selector: 'ngx-menu,[ngx-menu]',\n template: `\n <ng-template>\n <div class=\"ngx-menu-panel\" [class]=\"class()\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n `,\n exportAs: 'NgxMenu',\n styles: `\n .ngx-menu-panel {\n --ngx-menu-bg: light-dark(#ffffff, #252425);\n --ngx-menu-fg: light-dark(#000000, #ffffff);\n }\n .ngx-menu-panel {\n overflow: auto;\n box-sizing: border-box;\n outline: 0;\n background-color: var(--ngx-menu-bg);\n color: var(--ngx-menu-fg);\n box-shadow: var(--ngx-menu-shadow, 0px 0px 4px rgb(0 0 0 / 30%));\n border-radius: var(--ngx-menu-radius, 10px);\n padding: var(--ngx-menu-padding, 5px);\n min-width: var(--ngx-menu-min-width, 20px);\n min-height: var(--ngx-menu-min-height, 40px);\n will-change: transform, opacity;\n }\n .ngx-menu-panel.ngx-menu-panel-exit {\n animation: menu-exit 100ms 25ms linear forwards;\n }\n `,\n imports: [CommonModule],\n providers: [{ provide: NGX_MENU_CONTEXT, useExisting: NgxMenuPanel }],\n})\nexport class NgxMenuPanel implements MenuContext {\n template = viewChild<TemplateRef<any>>(TemplateRef);\n class = input<string>();\n\n containerRef?: OverlayRef<NgxMenuPanel>;\n\n close(): void {\n this.containerRef?.close();\n }\n}\n","import { Component, HostListener, inject } from '@angular/core';\nimport { NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\nimport { NgxMenu } from '../../directives/ngx-menu.directive';\n\n@Component({\n selector: 'ngx-menu-item,[ngx-menu-item]',\n template: `\n <div class=\"ngx-menu-item\">\n <ng-content></ng-content>\n </div>\n `,\n exportAs: 'NgxMenuItem',\n styles: `\n .ngx-menu-item {\n box-sizing: border-box;\n outline: 0;\n padding: var(--ngx-menu-item-padding, 6px 12px);\n transition: all 300ms;\n &:hover {\n cursor: pointer;\n background-color: var(--ngx-menu-item-hover-bg, #9bc6ff68);\n }\n }\n `,\n})\nexport class NgxMenuItem {\n menuContext = inject(NGX_MENU_CONTEXT);\n childMenu = inject(NgxMenu, {\n self: true,\n optional: true,\n });\n\n @HostListener('click')\n onClick() {\n if (this.childMenu?.ngxMenu) {\n return;\n }\n this.menuContext?.close();\n }\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngx-menu-divider,[ngx-menu-divider]',\n template: ``,\n styles: `\n :host {\n display: block;\n border-bottom: var(--ngx-menu-item-border, 1px #43434d3d solid);\n border-bottom-color: var(--ngx-menu-divider-border-color, #43434d3d);\n margin: var(--ngx-menu-divider-margin, 10px calc(var(--ngx-menu-padding, 5px) * -1));\n }\n `,\n})\nexport class NgxMenuDivider {}\n","import { NgModule } from '@angular/core';\nimport { NgxMenuDivider } from './components/ngx-menu-divider/menu-divider.component';\nimport { NgxMenuItem } from './components/ngx-menu-item/menu-item.component';\nimport { NgxMenuPanel } from './components/ngx-menu/menu.component';\nimport { NgxMenu } from './directives/ngx-menu.directive';\nimport { NgxContextMenu } from './public-api';\n\nconst d = [NgxMenu, NgxContextMenu, NgxMenuPanel, NgxMenuItem, NgxMenuDivider];\n@NgModule({\n imports: d,\n exports: d,\n})\nexport class NgxMenuModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}