ngx-kit 6.0.2 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) 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 +49 -49
  5. package/data-table/README.md +113 -113
  6. package/date-picker/README.md +69 -69
  7. package/dialog/README.md +92 -92
  8. package/drawer-menu/README.md +77 -77
  9. package/dropzone/README.md +422 -60
  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 +4 -4
  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 +1322 -200
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +2 -2
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +2 -2
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  24. package/fesm2022/ngx-kit-dropzone.mjs +273 -28
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  28. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-image-editor.mjs +101 -14
  31. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-menu.mjs +8 -8
  33. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-message.mjs +5 -0
  35. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  37. package/fesm2022/ngx-kit-shared.mjs +2 -2
  38. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  40. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  41. package/gallery/README.md +71 -71
  42. package/gradient-picker/README.md +41 -41
  43. package/menu/README.md +85 -85
  44. package/message/README.md +70 -70
  45. package/notify/README.md +58 -58
  46. package/package.json +1 -1
  47. package/shared/README.md +117 -117
  48. package/time-picker/README.md +95 -95
  49. package/types/ngx-kit-date-picker.d.ts +302 -36
  50. package/types/ngx-kit-dropzone.d.ts +129 -18
  51. package/types/ngx-kit-image-editor.d.ts +50 -5
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-gradient-picker.mjs","sources":["../../../projects/libs/gradient-picker/utils/build-gradient.ts","../../../projects/libs/gradient-picker/contracts/default-gradients.ts","../../../projects/libs/gradient-picker/components/input-gradient.component.ts","../../../projects/libs/gradient-picker/components/input-gradient.component.html","../../../projects/libs/gradient-picker/directives/ngx-input-gradient.directive.ts","../../../projects/libs/gradient-picker/ngx-kit-gradient-picker.ts"],"sourcesContent":["// gradient-utils.ts\nimport { GradientStop, GradientType } from '../contracts/GradientStop';\n\nexport function buildGradientFromStops(\n stops: GradientStop[],\n type: GradientType = 'linear',\n rotation: number | string = 0,\n): string {\n if (!stops || stops.length === 0) return '';\n\n // sort by numeric value\n const sorted = [...stops].sort((a, b) => a.value - b.value);\n\n // clamp 0..100 and format stops\n const parts = sorted.map((s) => {\n const v = Math.max(0, Math.min(Number(s.value) || 0, 100));\n return `${s.color.trim()} ${v}%`;\n });\n\n let prefix = '';\n if (type === 'linear') {\n // rotation can be number (deg) or string like 'to right' or '45deg'\n if (typeof rotation === 'number') prefix = `${rotation}deg, `;\n else if (typeof rotation === 'string' && rotation.trim().length)\n prefix = `${rotation.trim()}, `;\n } else if (type === 'radial') {\n // keep simple \"circle\" default: caller may put 'circle' in rotation (or pass separate option if needed)\n prefix = typeof rotation === 'string' && rotation.trim() ? `${rotation.trim()}, ` : 'circle, ';\n } else if (type === 'conic') {\n // conic-gradient accepts angle like 'from 45deg at 50% 50%'\n if (typeof rotation === 'number') prefix = `from ${rotation}deg, `;\n else if (typeof rotation === 'string' && rotation.trim()) prefix = `${rotation.trim()}, `;\n }\n\n return `${type}-gradient(${prefix}${parts.join(', ')})`;\n}\n\nexport function generateRandomColor(): string {\n const letters = '0123456789ABCDEF';\n let color = '#';\n for (let i = 0; i < 6; i++) {\n color += letters[Math.floor(Math.random() * 16)];\n }\n return color;\n}\n\nexport function isValidGradient(value: string): boolean {\n if (!value || typeof value !== 'string') return false;\n return /^\\s*(conic|linear|radial)-gradient\\s*\\(/i.test(value.trim());\n}\n\n/**\n * parseGradient\n * - returns: { type, rotation (number|string), stops, valid }\n * - stops: array of { id, color, value } where value is 0..100 (percent)\n * - rotation: number (deg) for linear if parsed as angle, or string (e.g. 'to right' or '45deg')\n */\nexport function parseGradient(value: string): {\n type: GradientType;\n rotation: number;\n shape?: string;\n stops: GradientStop[];\n valid: boolean;\n} {\n let type: GradientType = 'linear';\n let rotation = 180;\n let shape: string | undefined;\n let stops: GradientStop[] = [];\n let valid = false;\n\n if (!value) return { type, rotation, shape, stops, valid };\n\n const match = value.trim().match(/^(\\s*)(conic|linear|radial)-gradient\\s*\\((.*)\\)$/i);\n if (!match) return { type, rotation, shape, stops, valid };\n\n type = match[2].toLowerCase() as GradientType;\n let content = match[3].trim();\n\n // --- Split arguments by commas, respecting parentheses (for rgba, hsl, etc.)\n const parts: string[] = [];\n let buf = '';\n let depth = 0;\n for (const c of content) {\n if (c === '(') depth++;\n if (c === ')') depth--;\n if (c === ',' && depth === 0) {\n parts.push(buf.trim());\n buf = '';\n } else {\n buf += c;\n }\n }\n if (buf.trim()) parts.push(buf.trim());\n\n // --- Determine starting index for color stops\n let colorStopStart = 0;\n const first = parts[0];\n\n if (type === 'linear') {\n // e.g., \"90deg\" or \"to right\"\n const angleMatch = first.match(/^(\\d+)(deg)?$/i);\n if (angleMatch) {\n rotation = parseFloat(angleMatch[1]);\n colorStopStart = 1;\n } else if (/^to /i.test(first)) {\n // optional direction mapping\n colorStopStart = 1;\n }\n } else if (type === 'radial') {\n // e.g., \"circle\", \"circle at center\", \"ellipse at top left\"\n if (!/^#|rgb|hsl|[a-z]+\\(/i.test(first)) {\n shape = first;\n colorStopStart = 1;\n }\n } else if (type === 'conic') {\n // e.g., \"from 0deg at center\"\n if (!/^#|rgb|hsl|[a-z]+\\(/i.test(first)) colorStopStart = 1;\n }\n\n // --- Regex for color stops\n const colorStopRegex =\n /((#([0-9a-fA-F]{3,8}))|(rgba?\\([^\\)]+\\))|(hsla?\\([^\\)]+\\))|([a-zA-Z]+))(\\s+([\\d.]+%?))?/;\n\n for (let i = colorStopStart; i < parts.length; i++) {\n const stopPart = parts[i].trim();\n const m = stopPart.match(colorStopRegex);\n if (m) {\n const color = m[1];\n const posStr = m[9];\n let value = 0;\n if (posStr && posStr.endsWith('%')) value = parseFloat(posStr);\n else if (posStr) value = parseFloat(posStr);\n else {\n // اگر درصدی وجود نداشت، با توجه به ایندکس مقدار دهی کن\n if (stops.length === 0) value = 0;\n else if (i === parts.length - 1) value = 100;\n else value = (100 / (parts.length - colorStopStart - 1)) * stops.length;\n }\n\n stops.push({ color, value, id: generateId(stops) });\n }\n }\n\n valid = stops.length >= 2;\n return { type, rotation, shape, stops, valid };\n}\n\nfunction generateId(rangeValues: GradientStop[]): string {\n const id = 'ngx-stop-' + Math.random().toString(36).substring(2, 9);\n return rangeValues.find((x) => x.id === id) ? generateId(rangeValues) : id;\n}\n","import { GradientStop } from './GradientStop';\n\nexport const DefaultGradients: GradientStop[][] = [\n // Sunset\n [\n { id: '1', value: 0, color: '#ff7e5f' },\n { id: '2', value: 100, color: '#feb47b' },\n ],\n\n // Ocean Blue\n [\n { id: '1', value: 0, color: '#00c6ff' },\n { id: '2', value: 100, color: '#0072ff' },\n ],\n\n // Purple Dream\n [\n { id: '1', value: 0, color: '#a18cd1' },\n { id: '2', value: 100, color: '#fbc2eb' },\n ],\n\n // Cool Sky\n [\n { id: '1', value: 0, color: '#2193b0' },\n { id: '2', value: 100, color: '#6dd5ed' },\n ],\n\n // Peach\n [\n { id: '1', value: 0, color: '#ed4264' },\n { id: '2', value: 100, color: '#ffedbc' },\n ],\n\n // Night Fade\n [\n { id: '1', value: 0, color: '#a18cd1' },\n { id: '2', value: 100, color: '#fbc2eb' },\n ],\n\n // Aqua Marine\n [\n { id: '1', value: 0, color: '#1a2980' },\n { id: '2', value: 100, color: '#26d0ce' },\n ],\n\n // Forest\n [\n { id: '1', value: 0, color: '#5a3f37' },\n { id: '2', value: 100, color: '#2c7744' },\n ],\n\n // Flame\n [\n { id: '1', value: 0, color: '#ff4e50' },\n { id: '2', value: 100, color: '#f9d423' },\n ],\n\n // Blue Lagoon\n [\n { id: '1', value: 0, color: '#43cea2' },\n { id: '2', value: 100, color: '#185a9d' },\n ],\n\n // Retro\n [\n { id: '1', value: 0, color: '#3fada8' },\n { id: '2', value: 100, color: '#808080' },\n ],\n\n // Sunrise\n [\n { id: '1', value: 0, color: '#ff512f' },\n { id: '2', value: 100, color: '#dd2476' },\n ],\n\n // Rainbow\n [\n { id: '1', value: 0, color: '#ff0000' },\n { id: '2', value: 20, color: '#ff9900' },\n { id: '3', value: 40, color: '#ffff00' },\n { id: '4', value: 60, color: '#00ff00' },\n { id: '5', value: 80, color: '#0000ff' },\n { id: '6', value: 100, color: '#8b00ff' },\n ],\n\n // Candy\n [\n { id: '1', value: 0, color: '#f953c6' },\n { id: '2', value: 100, color: '#b91d73' },\n ],\n\n // Citrus\n [\n { id: '1', value: 0, color: '#fdc830' },\n { id: '2', value: 100, color: '#f37335' },\n ],\n\n // Lava\n [\n { id: '1', value: 0, color: '#e52d27' },\n { id: '2', value: 100, color: '#b31217' },\n ],\n\n // Winter\n [\n { id: '1', value: 0, color: '#e6dada' },\n { id: '2', value: 100, color: '#274046' },\n ],\n\n // Purple Love\n [\n { id: '1', value: 0, color: '#cc2b5e' },\n { id: '2', value: 100, color: '#753a88' },\n ],\n\n // Mint\n [\n { id: '1', value: 0, color: '#76b852' },\n { id: '2', value: 100, color: '#8dc26f' },\n ],\n\n // Cloud\n [\n { id: '1', value: 0, color: '#bdc3c7' },\n { id: '2', value: 100, color: '#2c3e50' },\n ],\n];\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport {\n NG_VALUE_ACCESSOR,\n NG_VALIDATORS,\n ControlValueAccessor,\n Validator,\n AbstractControl,\n ValidationErrors,\n FormsModule,\n} from '@angular/forms';\nimport { GradientStop, GradientType } from '../contracts/GradientStop';\nimport {\n buildGradientFromStops,\n generateRandomColor,\n isValidGradient,\n parseGradient,\n} from '../utils/build-gradient';\nimport { DefaultGradients } from '../contracts/default-gradients';\nimport { BrowserService, RangeSliderComponent } from 'ngx-kit/shared';\nimport { NgxInputColor } from 'ngx-kit/color-picker';\nimport { NgxInputAngle } from 'ngx-kit/angle-selector';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'ngx-input-gradient',\n templateUrl: './input-gradient.component.html',\n styleUrls: ['./input-gradient.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxInputGradientComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: NgxInputGradientComponent,\n },\n ],\n host: {\n '[class.dark]': 'theme==\"dark\"',\n },\n imports: [CommonModule, FormsModule, RangeSliderComponent, NgxInputColor, NgxInputAngle],\n})\nexport class NgxInputGradientComponent\n implements OnInit, OnDestroy, ControlValueAccessor, Validator\n{\n browserService = inject(BrowserService);\n theme: 'light' | 'dark' = this.browserService.prefersDarkMode ? 'dark' : 'light';\n @Input('theme') set setTheme(val: 'light' | 'dark' | 'auto') {\n if (!val || val == 'auto') {\n this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';\n } else {\n this.theme = val;\n }\n }\n @Output() change = new EventEmitter<string>();\n\n defaultGradients: string[] = [];\n\n resultGradient = '';\n baseBg = '';\n rangeValues: GradientStop[] = [];\n type: GradientType = 'linear';\n rotation: number = 90;\n selectedIndex = 0;\n\n isDisabled = false;\n protected _onChange = (value: string) => {};\n protected _onTouched = () => {};\n _onValidateChange = () => {};\n\n @ViewChild('rangeSlider', { static: true }) rangeSlider?: RangeSliderComponent;\n\n constructor(private cd: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.setDefaultGradients();\n }\n ngOnDestroy(): void {}\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n }\n registerOnValidatorChange(fn: () => void): void {\n this._onValidateChange = fn;\n }\n validate(control: AbstractControl): ValidationErrors | null {\n if (!this.resultGradient) return { required: true };\n const parsed = parseGradient(this.resultGradient);\n if (!parsed.valid) return { invalid: true };\n if (parsed.stops.length < 2) return { stops: 'at least 2 color stops required' };\n return null;\n }\n\n writeValue(value: any): void {\n if (value && isValidGradient(value)) {\n const parsed = parseGradient(value);\n if (parsed.valid) {\n this.resultGradient = value;\n this.type = parsed.type;\n this.rotation = +parsed.rotation;\n this.rangeValues = parsed.stops;\n } else {\n this.resultGradient = '';\n this.rangeValues = [\n { color: generateRandomColor(), value: 0, id: this.generateId() },\n { color: generateRandomColor(), value: 100, id: this.generateId() },\n ];\n this.type = 'linear';\n this.rotation = 90;\n }\n } else {\n this.resultGradient = '';\n this.rangeValues = [\n { color: generateRandomColor(), value: 0, id: this.generateId() },\n { color: generateRandomColor(), value: 100, id: this.generateId() },\n ];\n this.type = 'linear';\n this.rotation = 90;\n }\n this.generateGradient();\n }\n private generateId(): string {\n let id = 'ngx-thumb-' + Math.random().toString(36).substring(2, 9);\n if (this.rangeValues.findIndex((x) => x.id == id) >= 0) {\n return this.generateId();\n }\n return id;\n }\n\n stopPropagation(ev: Event) {\n ev.stopPropagation();\n }\n\n remove() {\n if (this.rangeValues.length > 2) {\n this.rangeValues.splice(this.selectedIndex, 1);\n this.selectedIndex = 0;\n this.generateGradient();\n }\n }\n\n generateGradient(ev?: string) {\n if (ev && this.rangeValues[this.selectedIndex]) {\n this.rangeValues[this.selectedIndex].color = ev;\n }\n for (let item of this.rangeValues) {\n item.color ??= generateRandomColor();\n }\n this.baseBg = buildGradientFromStops(this.rangeValues, 'linear', 90);\n this.resultGradient = buildGradientFromStops(this.rangeValues, this.type, +this.rotation);\n this.emitChange();\n }\n\n updateRangeSlider() {\n if (this.rangeSlider) {\n this.rangeSlider.writeValue(this.rangeValues);\n }\n }\n emitChange() {\n this._onChange(this.resultGradient);\n this.change.emit(this.resultGradient);\n }\n\n setDefaultGradients() {\n this.defaultGradients = [];\n\n for (let item of DefaultGradients) {\n this.defaultGradients.push(buildGradientFromStops(item, 'linear', 90));\n }\n }\n\n onSelectDefault(item: string, i: number) {\n // console.log('onSelectDefault', item, i);\n this.writeValue(item);\n this.emitChange();\n }\n}\n","<div class=\"ngx-input-gradient-picker\" (click)=\"stopPropagation($event)\">\n <div class=\"ngx-color-preview\" [ngStyle]=\"{ '--ngx-selected-gradient': resultGradient }\"></div>\n <div class=\"ngx-c-inner\">\n <range-slider\n [(ngModel)]=\"rangeValues\"\n name=\"rangeCalues\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"1\"\n [addNewRangeOnClick]=\"true\"\n [background]=\"baseBg\"\n [(selectedIndex)]=\"selectedIndex\"\n (change)=\"generateGradient()\"\n #rangeSlider></range-slider>\n\n <div class=\"text-end\">\n <button class=\"remove-btn\" type=\"button\" (click)=\"remove()\">remove</button>\n </div>\n @if (rangeValues[selectedIndex]) {\n <div class=\"ngx-row\">\n <div class=\"ngx-col-6\">\n <div class=\"label\">Color</div>\n <div class=\"input-color\">\n <input\n type=\"text\"\n [(ngModel)]=\"rangeValues[selectedIndex].color\"\n name=\"color\"\n #inputColor\n (ngModelChange)=\"generateGradient(); updateRangeSlider()\" />\n <span\n #ngxGradColor\n class=\"color\"\n [style.backgroundColor]=\"rangeValues[selectedIndex].color\"\n [ngxInputColor]=\"inputColor\"\n [theme]=\"theme\"\n [ngModel]=\"rangeValues[selectedIndex].color\"\n [simpleMode]=\"true\"\n (change)=\"generateGradient($event)\"></span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Position</div>\n <input\n type=\"number\"\n [(ngModel)]=\"rangeValues[selectedIndex].value\"\n min=\"0\"\n max=\"100\"\n name=\"posiition\"\n (change)=\"generateGradient(); updateRangeSlider()\" />\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Rotation</div>\n <div class=\"ngx-input-group\">\n <input\n type=\"text\"\n [(ngModel)]=\"rotation\"\n ngxInputAngle\n [theme]=\"theme\"\n (change)=\"generateGradient()\"\n name=\"rotation\"\n [disabled]=\"type == 'radial'\" />\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Type</div>\n <div class=\"ngx-input-group\">\n <select [(ngModel)]=\"type\" (change)=\"generateGradient()\" name=\"type\">\n <option value=\"linear\">linear</option>\n <option value=\"radial\">radial</option>\n </select>\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n </div>\n }\n\n <div class=\"default-list\">\n @for (item of defaultGradients; track $index; let i = $index) {\n <span [style.background]=\"item\" (click)=\"onSelectDefault(item, i)\"></span>\n }\n </div>\n </div>\n</div>\n","import {\n AfterViewInit,\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n Output,\n Renderer2,\n ViewContainerRef,\n forwardRef,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { NgxInputGradientComponent } from '../components/input-gradient.component';\nimport { isValidGradient, parseGradient } from '../utils/build-gradient';\nimport { OverlayRef, OverlayService } from 'ngx-kit/shared';\n\n@Directive({\n selector: '[ngxInputGradient]',\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputGradient), multi: true },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: NgxInputGradient,\n },\n ],\n})\nexport class NgxInputGradient implements AfterViewInit, OnDestroy, ControlValueAccessor, Validator {\n @Input() setInputBackground = true;\n @Input() theme: 'light' | 'dark' | 'auto' = 'auto';\n private _targetInput?: HTMLInputElement;\n @Input('ngxInputColor') set ngxInputColor(\n el: HTMLInputElement | ElementRef<HTMLInputElement> | null | undefined | '',\n ) {\n this.isHostInput = false;\n if (el instanceof ElementRef) {\n this._targetInput = el.nativeElement;\n } else if (el instanceof HTMLInputElement) {\n this.isHostInput = true;\n this._targetInput = el;\n } else {\n this._targetInput = undefined;\n }\n\n if (this._targetInput) {\n this._targetInput.removeEventListener('input', this.boundInputHandler);\n this._targetInput.addEventListener('input', this.boundInputHandler);\n }\n }\n @Output() change = new EventEmitter<string>();\n\n private boundInputHandler = (e: Event) => {\n this.writeValue((e.target as HTMLInputElement).value);\n };\n private isHostInput = false;\n private pickerRef?: OverlayRef<NgxInputGradientComponent>;\n\n value = '';\n\n protected _onChange = (value: string) => {};\n protected _onTouched = () => {};\n _onValidateChange = () => {};\n constructor(\n private el: ElementRef<HTMLInputElement>,\n private renderer: Renderer2,\n private viewContainerRef: ViewContainerRef,\n private overlayService: OverlayService,\n ) {}\n\n @HostListener('click', ['$event']) onClick(ev: Event) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggleColorPicker();\n }\n ngAfterViewInit(): void {\n if (this._targetInput && this._targetInput.tagName.toLowerCase() === 'input') {\n this.writeValue(this._targetInput.value);\n }\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n if (disabled) {\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\n } else {\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\n }\n }\n registerOnValidatorChange(fn: () => void): void {\n this._onValidateChange = fn;\n }\n validate(control: AbstractControl): ValidationErrors | null {\n return null;\n }\n\n ngOnDestroy(): void {\n this.destroyPicker();\n }\n\n writeValue(val: any): void {\n this.value = val;\n if (val && isValidGradient(val)) {\n // const parsed = parseGradient(val);\n if (this.setInputBackground) {\n this.renderer.setStyle(this.el.nativeElement, 'background', val);\n }\n if (this.isHostInput) {\n this.el.nativeElement.value = this.value;\n }\n this._onValidateChange();\n } else {\n this.renderer.setStyle(this.el.nativeElement, 'background', '');\n }\n }\n\n toggleColorPicker() {\n if (this.pickerRef) {\n this.destroyPicker();\n return;\n }\n\n this.pickerRef = this.overlayService.open({\n anchor: this.el.nativeElement,\n component: NgxInputGradientComponent,\n viewContainerRef: this.viewContainerRef,\n alignment: 'start',\n placement: 'auto',\n configure: (instance, ref) => {\n instance.setTheme = this.theme;\n instance.writeValue(this.value);\n\n instance.change.subscribe((c: string) => {\n this.value = c;\n this.emitChange(c);\n });\n\n // instance.closed.subscribe(() => ref.close());\n },\n onClosed: () => {\n this.pickerRef = undefined;\n },\n });\n }\n\n destroyPicker() {\n if (this.pickerRef) {\n this.pickerRef.close();\n this.pickerRef = undefined;\n }\n }\n\n private async emitChange(c: string) {\n if (this.setInputBackground) {\n this.renderer.setStyle(this.el.nativeElement, 'background', c);\n }\n\n // اگر روی input باشیم، مقدار رو در input قرار بده\n if (this.isHostInput) {\n const input = this.el.nativeElement as HTMLInputElement;\n input.value = c;\n }\n\n // اگر targetInput وجود داره، در اونم مقدار ست کن\n if (this._targetInput instanceof HTMLInputElement) {\n this._targetInput.value = c;\n const event = new Event('input', { bubbles: true });\n this._targetInput.dispatchEvent(event);\n }\n\n this._onChange(c);\n this.change.emit(c);\n this._onTouched();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":";;;;;;;;;;;AAGM,SAAU,sBAAsB,CACpC,KAAqB,EACrB,IAAA,GAAqB,QAAQ,EAC7B,QAAA,GAA4B,CAAC,EAAA;AAE7B,IAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;;IAG3C,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;;IAG3D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,CAAA,EAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG;AAClC,IAAA,CAAC,CAAC;IAEF,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;;QAErB,IAAI,OAAO,QAAQ,KAAK,QAAQ;AAAE,YAAA,MAAM,GAAG,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAO;aACxD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM;AAC7D,YAAA,MAAM,GAAG,CAAA,EAAG,QAAQ,CAAC,IAAI,EAAE,IAAI;IACnC;AAAO,SAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;;QAE5B,MAAM,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAA,EAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU;IAChG;AAAO,SAAA,IAAI,IAAI,KAAK,OAAO,EAAE;;QAE3B,IAAI,OAAO,QAAQ,KAAK,QAAQ;AAAE,YAAA,MAAM,GAAG,CAAA,KAAA,EAAQ,QAAQ,CAAA,KAAA,CAAO;aAC7D,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;AAAE,YAAA,MAAM,GAAG,CAAA,EAAG,QAAQ,CAAC,IAAI,EAAE,IAAI;IAC3F;AAEA,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;AACzD;SAEgB,mBAAmB,GAAA;IACjC,MAAM,OAAO,GAAG,kBAAkB;IAClC,IAAI,KAAK,GAAG,GAAG;AACf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,QAAA,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD;AACA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,eAAe,CAAC,KAAa,EAAA;AAC3C,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IACrD,OAAO,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACtE;AAEA;;;;;AAKG;AACG,SAAU,aAAa,CAAC,KAAa,EAAA;IAOzC,IAAI,IAAI,GAAiB,QAAQ;IACjC,IAAI,QAAQ,GAAG,GAAG;AAClB,IAAA,IAAI,KAAyB;IAC7B,IAAI,KAAK,GAAmB,EAAE;IAC9B,IAAI,KAAK,GAAG,KAAK;AAEjB,IAAA,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,mDAAmD,CAAC;AACrF,IAAA,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAE1D,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAkB;IAC7C,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;;IAG7B,MAAM,KAAK,GAAa,EAAE;IAC1B,IAAI,GAAG,GAAG,EAAE;IACZ,IAAI,KAAK,GAAG,CAAC;AACb,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,IAAI,CAAC,KAAK,GAAG;AAAE,YAAA,KAAK,EAAE;QACtB,IAAI,CAAC,KAAK,GAAG;AAAE,YAAA,KAAK,EAAE;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACtB,GAAG,GAAG,EAAE;QACV;aAAO;YACL,GAAG,IAAI,CAAC;QACV;IACF;IACA,IAAI,GAAG,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;;IAGtC,IAAI,cAAc,GAAG,CAAC;AACtB,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;AAEtB,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;;QAErB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAChD,IAAI,UAAU,EAAE;YACd,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACpC,cAAc,GAAG,CAAC;QACpB;AAAO,aAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;;YAE9B,cAAc,GAAG,CAAC;QACpB;IACF;AAAO,SAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;;QAE5B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACvC,KAAK,GAAG,KAAK;YACb,cAAc,GAAG,CAAC;QACpB;IACF;AAAO,SAAA,IAAI,IAAI,KAAK,OAAO,EAAE;;AAE3B,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,cAAc,GAAG,CAAC;IAC7D;;IAGA,MAAM,cAAc,GAClB,yFAAyF;AAE3F,IAAA,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;QACxC,IAAI,CAAC,EAAE;AACL,YAAA,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AAClB,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,KAAK,GAAG,CAAC;AACb,YAAA,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,gBAAA,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;AACzD,iBAAA,IAAI,MAAM;AAAE,gBAAA,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;iBACtC;;AAEH,gBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,KAAK,GAAG,CAAC;AAC5B,qBAAA,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,GAAG,GAAG;;AACvC,oBAAA,KAAK,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM;YACzE;AAEA,YAAA,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD;IACF;AAEA,IAAA,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AAChD;AAEA,SAAS,UAAU,CAAC,WAA2B,EAAA;IAC7C,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE;AAC5E;;ACpJO,MAAM,gBAAgB,GAAqB;;AAEhD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;QACxC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;QACxC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;QACxC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;QACxC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;;AAGD,IAAA;QACE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;QACvC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,KAAA;CACF;;MCrEY,yBAAyB,CAAA;AA8BhB,IAAA,EAAA;AA3BpB,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,KAAK,GAAqB,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,MAAM,GAAG,OAAO;IAChF,IAAoB,QAAQ,CAAC,GAA8B,EAAA;AACzD,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,MAAM,GAAG,OAAO;QACrE;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG;QAClB;IACF;AACU,IAAA,MAAM,GAAG,IAAI,YAAY,EAAU;IAE7C,gBAAgB,GAAa,EAAE;IAE/B,cAAc,GAAG,EAAE;IACnB,MAAM,GAAG,EAAE;IACX,WAAW,GAAmB,EAAE;IAChC,IAAI,GAAiB,QAAQ;IAC7B,QAAQ,GAAW,EAAE;IACrB,aAAa,GAAG,CAAC;IAEjB,UAAU,GAAG,KAAK;AACR,IAAA,SAAS,GAAG,CAAC,KAAa,KAAI,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AAC/B,IAAA,iBAAiB,GAAG,MAAK,EAAE,CAAC;AAEgB,IAAA,WAAW;AAEvD,IAAA,WAAA,CAAoB,EAAqB,EAAA;QAArB,IAAA,CAAA,EAAE,GAAF,EAAE;IAAsB;IAE5C,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AACA,IAAA,WAAW,KAAU;AACrB,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;IAC5B;AACA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AACA,IAAA,QAAQ,CAAC,OAAwB,EAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;AAC3C,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE,KAAK,EAAE,iCAAiC,EAAE;AAChF,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;AACnC,YAAA,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,gBAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACvB,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ;AAChC,gBAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK;YACjC;iBAAO;AACL,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE;gBACxB,IAAI,CAAC,WAAW,GAAG;AACjB,oBAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE;AACjE,oBAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE;iBACpE;AACD,gBAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,gBAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;YACpB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;YACxB,IAAI,CAAC,WAAW,GAAG;AACjB,gBAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE;AACjE,gBAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE;aACpE;AACD,YAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;QACpB;QACA,IAAI,CAAC,gBAAgB,EAAE;IACzB;IACQ,UAAU,GAAA;QAChB,IAAI,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE;AACtD,YAAA,OAAO,IAAI,CAAC,UAAU,EAAE;QAC1B;AACA,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,eAAe,CAAC,EAAS,EAAA;QACvB,EAAE,CAAC,eAAe,EAAE;IACtB;IAEA,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC;YACtB,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;AAEA,IAAA,gBAAgB,CAAC,EAAW,EAAA;QAC1B,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,GAAG,EAAE;QACjD;AACA,QAAA,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,KAAK,KAAK,mBAAmB,EAAE;QACtC;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC;AACpE,QAAA,IAAI,CAAC,cAAc,GAAG,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzF,IAAI,CAAC,UAAU,EAAE;IACnB;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAC/C;IACF;IACA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IACvC;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAE1B,QAAA,KAAK,IAAI,IAAI,IAAI,gBAAgB,EAAE;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxE;IACF;IAEA,eAAe,CAAC,IAAY,EAAE,CAAS,EAAA;;AAErC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE;IACnB;uGA1IW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAjBzB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,yBAAyB,CAAC;AACxD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,WAAW,EAAE,yBAAyB;AACvC,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnDH,q1HA8FA,EAAA,MAAA,EAAA,CAAA,8iFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,stDAAE,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,KAAA,EAAA,KAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAE5E,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAtBrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,eAAA,EAGb,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,+BAA+B,CAAC;AACxD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,WAAW,EAAA,yBAA2B;AACvC,yBAAA;qBACF,EAAA,IAAA,EACK;AACJ,wBAAA,cAAc,EAAE,eAAe;qBAChC,EAAA,OAAA,EACQ,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,q1HAAA,EAAA,MAAA,EAAA,CAAA,8iFAAA,CAAA,EAAA;;sBAOvF,KAAK;uBAAC,OAAO;;sBAOb;;sBAgBA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;MEjD/B,gBAAgB,CAAA;AAoCjB,IAAA,EAAA;AACA,IAAA,QAAA;AACA,IAAA,gBAAA;AACA,IAAA,cAAA;IAtCD,kBAAkB,GAAG,IAAI;IACzB,KAAK,GAA8B,MAAM;AAC1C,IAAA,YAAY;IACpB,IAA4B,aAAa,CACvC,EAA2E,EAAA;AAE3E,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,EAAE,YAAY,UAAU,EAAE;AAC5B,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,aAAa;QACtC;AAAO,aAAA,IAAI,EAAE,YAAY,gBAAgB,EAAE;AACzC,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACxB;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;QAC/B;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC;YACtE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC;QACrE;IACF;AACU,IAAA,MAAM,GAAG,IAAI,YAAY,EAAU;AAErC,IAAA,iBAAiB,GAAG,CAAC,CAAQ,KAAI;QACvC,IAAI,CAAC,UAAU,CAAE,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC;AACvD,IAAA,CAAC;IACO,WAAW,GAAG,KAAK;AACnB,IAAA,SAAS;IAEjB,KAAK,GAAG,EAAE;AAEA,IAAA,SAAS,GAAG,CAAC,KAAa,KAAI,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AAC/B,IAAA,iBAAiB,GAAG,MAAK,EAAE,CAAC;AAC5B,IAAA,WAAA,CACU,EAAgC,EAChC,QAAmB,EACnB,gBAAkC,EAClC,cAA8B,EAAA;QAH9B,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,cAAc,GAAd,cAAc;IACrB;AAEgC,IAAA,OAAO,CAAC,EAAS,EAAA;QAClD,EAAE,CAAC,eAAe,EAAE;QACpB,EAAE,CAAC,cAAc,EAAE;QACnB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IACA,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;YAC5E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C;IACF;AACA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;QAChC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;QACxE;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;QAClE;IACF;AACA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AACA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,IAAI;IACb;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA,IAAA,UAAU,CAAC,GAAQ,EAAA;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;AAChB,QAAA,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE;;AAE/B,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,CAAC;YAClE;AACA,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;YAC1C;YACA,IAAI,CAAC,iBAAiB,EAAE;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,CAAC;QACjE;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;QAEA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACxC,YAAA,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa;AAC7B,YAAA,SAAS,EAAE,yBAAyB;YACpC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAI;AAC3B,gBAAA,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK;AAC9B,gBAAA,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;gBAE/B,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAS,KAAI;AACtC,oBAAA,IAAI,CAAC,KAAK,GAAG,CAAC;AACd,oBAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpB,gBAAA,CAAC,CAAC;;YAGJ,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;YAC5B,CAAC;AACF,SAAA,CAAC;IACJ;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC5B;IACF;IAEQ,MAAM,UAAU,CAAC,CAAS,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;QAChE;;AAGA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAiC;AACvD,YAAA,KAAK,CAAC,KAAK,GAAG,CAAC;QACjB;;AAGA,QAAA,IAAI,IAAI,CAAC,YAAY,YAAY,gBAAgB,EAAE;AACjD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC;AAC3B,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC;QACxC;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE;IACnB;uGArJW,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAThB;AACT,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC5F,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,WAAW,EAAE,gBAAgB;AAC9B,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAX5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC5F,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,WAAW,EAAA,gBAAkB;AAC9B,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBAEE;;sBACA;;sBAEA,KAAK;uBAAC,eAAe;;sBAkBrB;;sBAoBA,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;AC9EnC;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-kit-gradient-picker.mjs","sources":["../../../projects/libs/gradient-picker/utils/build-gradient.ts","../../../projects/libs/gradient-picker/contracts/default-gradients.ts","../../../projects/libs/gradient-picker/components/input-gradient.component.ts","../../../projects/libs/gradient-picker/components/input-gradient.component.html","../../../projects/libs/gradient-picker/directives/ngx-input-gradient.directive.ts","../../../projects/libs/gradient-picker/ngx-kit-gradient-picker.ts"],"sourcesContent":["// gradient-utils.ts\r\nimport { GradientStop, GradientType } from '../contracts/GradientStop';\r\n\r\nexport function buildGradientFromStops(\r\n stops: GradientStop[],\r\n type: GradientType = 'linear',\r\n rotation: number | string = 0,\r\n): string {\r\n if (!stops || stops.length === 0) return '';\r\n\r\n // sort by numeric value\r\n const sorted = [...stops].sort((a, b) => a.value - b.value);\r\n\r\n // clamp 0..100 and format stops\r\n const parts = sorted.map((s) => {\r\n const v = Math.max(0, Math.min(Number(s.value) || 0, 100));\r\n return `${s.color.trim()} ${v}%`;\r\n });\r\n\r\n let prefix = '';\r\n if (type === 'linear') {\r\n // rotation can be number (deg) or string like 'to right' or '45deg'\r\n if (typeof rotation === 'number') prefix = `${rotation}deg, `;\r\n else if (typeof rotation === 'string' && rotation.trim().length)\r\n prefix = `${rotation.trim()}, `;\r\n } else if (type === 'radial') {\r\n // keep simple \"circle\" default: caller may put 'circle' in rotation (or pass separate option if needed)\r\n prefix = typeof rotation === 'string' && rotation.trim() ? `${rotation.trim()}, ` : 'circle, ';\r\n } else if (type === 'conic') {\r\n // conic-gradient accepts angle like 'from 45deg at 50% 50%'\r\n if (typeof rotation === 'number') prefix = `from ${rotation}deg, `;\r\n else if (typeof rotation === 'string' && rotation.trim()) prefix = `${rotation.trim()}, `;\r\n }\r\n\r\n return `${type}-gradient(${prefix}${parts.join(', ')})`;\r\n}\r\n\r\nexport function generateRandomColor(): string {\r\n const letters = '0123456789ABCDEF';\r\n let color = '#';\r\n for (let i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n return color;\r\n}\r\n\r\nexport function isValidGradient(value: string): boolean {\r\n if (!value || typeof value !== 'string') return false;\r\n return /^\\s*(conic|linear|radial)-gradient\\s*\\(/i.test(value.trim());\r\n}\r\n\r\n/**\r\n * parseGradient\r\n * - returns: { type, rotation (number|string), stops, valid }\r\n * - stops: array of { id, color, value } where value is 0..100 (percent)\r\n * - rotation: number (deg) for linear if parsed as angle, or string (e.g. 'to right' or '45deg')\r\n */\r\nexport function parseGradient(value: string): {\r\n type: GradientType;\r\n rotation: number;\r\n shape?: string;\r\n stops: GradientStop[];\r\n valid: boolean;\r\n} {\r\n let type: GradientType = 'linear';\r\n let rotation = 180;\r\n let shape: string | undefined;\r\n let stops: GradientStop[] = [];\r\n let valid = false;\r\n\r\n if (!value) return { type, rotation, shape, stops, valid };\r\n\r\n const match = value.trim().match(/^(\\s*)(conic|linear|radial)-gradient\\s*\\((.*)\\)$/i);\r\n if (!match) return { type, rotation, shape, stops, valid };\r\n\r\n type = match[2].toLowerCase() as GradientType;\r\n let content = match[3].trim();\r\n\r\n // --- Split arguments by commas, respecting parentheses (for rgba, hsl, etc.)\r\n const parts: string[] = [];\r\n let buf = '';\r\n let depth = 0;\r\n for (const c of content) {\r\n if (c === '(') depth++;\r\n if (c === ')') depth--;\r\n if (c === ',' && depth === 0) {\r\n parts.push(buf.trim());\r\n buf = '';\r\n } else {\r\n buf += c;\r\n }\r\n }\r\n if (buf.trim()) parts.push(buf.trim());\r\n\r\n // --- Determine starting index for color stops\r\n let colorStopStart = 0;\r\n const first = parts[0];\r\n\r\n if (type === 'linear') {\r\n // e.g., \"90deg\" or \"to right\"\r\n const angleMatch = first.match(/^(\\d+)(deg)?$/i);\r\n if (angleMatch) {\r\n rotation = parseFloat(angleMatch[1]);\r\n colorStopStart = 1;\r\n } else if (/^to /i.test(first)) {\r\n // optional direction mapping\r\n colorStopStart = 1;\r\n }\r\n } else if (type === 'radial') {\r\n // e.g., \"circle\", \"circle at center\", \"ellipse at top left\"\r\n if (!/^#|rgb|hsl|[a-z]+\\(/i.test(first)) {\r\n shape = first;\r\n colorStopStart = 1;\r\n }\r\n } else if (type === 'conic') {\r\n // e.g., \"from 0deg at center\"\r\n if (!/^#|rgb|hsl|[a-z]+\\(/i.test(first)) colorStopStart = 1;\r\n }\r\n\r\n // --- Regex for color stops\r\n const colorStopRegex =\r\n /((#([0-9a-fA-F]{3,8}))|(rgba?\\([^\\)]+\\))|(hsla?\\([^\\)]+\\))|([a-zA-Z]+))(\\s+([\\d.]+%?))?/;\r\n\r\n for (let i = colorStopStart; i < parts.length; i++) {\r\n const stopPart = parts[i].trim();\r\n const m = stopPart.match(colorStopRegex);\r\n if (m) {\r\n const color = m[1];\r\n const posStr = m[9];\r\n let value = 0;\r\n if (posStr && posStr.endsWith('%')) value = parseFloat(posStr);\r\n else if (posStr) value = parseFloat(posStr);\r\n else {\r\n // اگر درصدی وجود نداشت، با توجه به ایندکس مقدار دهی کن\r\n if (stops.length === 0) value = 0;\r\n else if (i === parts.length - 1) value = 100;\r\n else value = (100 / (parts.length - colorStopStart - 1)) * stops.length;\r\n }\r\n\r\n stops.push({ color, value, id: generateId(stops) });\r\n }\r\n }\r\n\r\n valid = stops.length >= 2;\r\n return { type, rotation, shape, stops, valid };\r\n}\r\n\r\nfunction generateId(rangeValues: GradientStop[]): string {\r\n const id = 'ngx-stop-' + Math.random().toString(36).substring(2, 9);\r\n return rangeValues.find((x) => x.id === id) ? generateId(rangeValues) : id;\r\n}\r\n","import { GradientStop } from './GradientStop';\n\nexport const DefaultGradients: GradientStop[][] = [\n // Sunset\n [\n { id: '1', value: 0, color: '#ff7e5f' },\n { id: '2', value: 100, color: '#feb47b' },\n ],\n\n // Ocean Blue\n [\n { id: '1', value: 0, color: '#00c6ff' },\n { id: '2', value: 100, color: '#0072ff' },\n ],\n\n // Purple Dream\n [\n { id: '1', value: 0, color: '#a18cd1' },\n { id: '2', value: 100, color: '#fbc2eb' },\n ],\n\n // Cool Sky\n [\n { id: '1', value: 0, color: '#2193b0' },\n { id: '2', value: 100, color: '#6dd5ed' },\n ],\n\n // Peach\n [\n { id: '1', value: 0, color: '#ed4264' },\n { id: '2', value: 100, color: '#ffedbc' },\n ],\n\n // Night Fade\n [\n { id: '1', value: 0, color: '#a18cd1' },\n { id: '2', value: 100, color: '#fbc2eb' },\n ],\n\n // Aqua Marine\n [\n { id: '1', value: 0, color: '#1a2980' },\n { id: '2', value: 100, color: '#26d0ce' },\n ],\n\n // Forest\n [\n { id: '1', value: 0, color: '#5a3f37' },\n { id: '2', value: 100, color: '#2c7744' },\n ],\n\n // Flame\n [\n { id: '1', value: 0, color: '#ff4e50' },\n { id: '2', value: 100, color: '#f9d423' },\n ],\n\n // Blue Lagoon\n [\n { id: '1', value: 0, color: '#43cea2' },\n { id: '2', value: 100, color: '#185a9d' },\n ],\n\n // Retro\n [\n { id: '1', value: 0, color: '#3fada8' },\n { id: '2', value: 100, color: '#808080' },\n ],\n\n // Sunrise\n [\n { id: '1', value: 0, color: '#ff512f' },\n { id: '2', value: 100, color: '#dd2476' },\n ],\n\n // Rainbow\n [\n { id: '1', value: 0, color: '#ff0000' },\n { id: '2', value: 20, color: '#ff9900' },\n { id: '3', value: 40, color: '#ffff00' },\n { id: '4', value: 60, color: '#00ff00' },\n { id: '5', value: 80, color: '#0000ff' },\n { id: '6', value: 100, color: '#8b00ff' },\n ],\n\n // Candy\n [\n { id: '1', value: 0, color: '#f953c6' },\n { id: '2', value: 100, color: '#b91d73' },\n ],\n\n // Citrus\n [\n { id: '1', value: 0, color: '#fdc830' },\n { id: '2', value: 100, color: '#f37335' },\n ],\n\n // Lava\n [\n { id: '1', value: 0, color: '#e52d27' },\n { id: '2', value: 100, color: '#b31217' },\n ],\n\n // Winter\n [\n { id: '1', value: 0, color: '#e6dada' },\n { id: '2', value: 100, color: '#274046' },\n ],\n\n // Purple Love\n [\n { id: '1', value: 0, color: '#cc2b5e' },\n { id: '2', value: 100, color: '#753a88' },\n ],\n\n // Mint\n [\n { id: '1', value: 0, color: '#76b852' },\n { id: '2', value: 100, color: '#8dc26f' },\n ],\n\n // Cloud\n [\n { id: '1', value: 0, color: '#bdc3c7' },\n { id: '2', value: 100, color: '#2c3e50' },\n ],\n];\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n forwardRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n ControlValueAccessor,\r\n Validator,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport { GradientStop, GradientType } from '../contracts/GradientStop';\r\nimport {\r\n buildGradientFromStops,\r\n generateRandomColor,\r\n isValidGradient,\r\n parseGradient,\r\n} from '../utils/build-gradient';\r\nimport { DefaultGradients } from '../contracts/default-gradients';\r\nimport { BrowserService, RangeSliderComponent } from 'ngx-kit/shared';\r\nimport { NgxInputColor } from 'ngx-kit/color-picker';\r\nimport { NgxInputAngle } from 'ngx-kit/angle-selector';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ngx-input-gradient',\r\n templateUrl: './input-gradient.component.html',\r\n styleUrls: ['./input-gradient.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxInputGradientComponent),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: NgxInputGradientComponent,\r\n },\r\n ],\r\n host: {\r\n '[class.dark]': 'theme==\"dark\"',\r\n },\r\n imports: [CommonModule, FormsModule, RangeSliderComponent, NgxInputColor, NgxInputAngle],\r\n})\r\nexport class NgxInputGradientComponent\r\n implements OnInit, OnDestroy, ControlValueAccessor, Validator\r\n{\r\n browserService = inject(BrowserService);\r\n theme: 'light' | 'dark' = this.browserService.prefersDarkMode ? 'dark' : 'light';\r\n @Input('theme') set setTheme(val: 'light' | 'dark' | 'auto') {\r\n if (!val || val == 'auto') {\r\n this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';\r\n } else {\r\n this.theme = val;\r\n }\r\n }\r\n @Output() change = new EventEmitter<string>();\r\n\r\n defaultGradients: string[] = [];\r\n\r\n resultGradient = '';\r\n baseBg = '';\r\n rangeValues: GradientStop[] = [];\r\n type: GradientType = 'linear';\r\n rotation: number = 90;\r\n selectedIndex = 0;\r\n\r\n isDisabled = false;\r\n protected _onChange = (value: string) => {};\r\n protected _onTouched = () => {};\r\n _onValidateChange = () => {};\r\n\r\n @ViewChild('rangeSlider', { static: true }) rangeSlider?: RangeSliderComponent;\r\n\r\n constructor(private cd: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n this.setDefaultGradients();\r\n }\r\n ngOnDestroy(): void {}\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n }\r\n registerOnValidatorChange(fn: () => void): void {\r\n this._onValidateChange = fn;\r\n }\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n if (!this.resultGradient) return { required: true };\r\n const parsed = parseGradient(this.resultGradient);\r\n if (!parsed.valid) return { invalid: true };\r\n if (parsed.stops.length < 2) return { stops: 'at least 2 color stops required' };\r\n return null;\r\n }\r\n\r\n writeValue(value: any): void {\r\n if (value && isValidGradient(value)) {\r\n const parsed = parseGradient(value);\r\n if (parsed.valid) {\r\n this.resultGradient = value;\r\n this.type = parsed.type;\r\n this.rotation = +parsed.rotation;\r\n this.rangeValues = parsed.stops;\r\n } else {\r\n this.resultGradient = '';\r\n this.rangeValues = [\r\n { color: generateRandomColor(), value: 0, id: this.generateId() },\r\n { color: generateRandomColor(), value: 100, id: this.generateId() },\r\n ];\r\n this.type = 'linear';\r\n this.rotation = 90;\r\n }\r\n } else {\r\n this.resultGradient = '';\r\n this.rangeValues = [\r\n { color: generateRandomColor(), value: 0, id: this.generateId() },\r\n { color: generateRandomColor(), value: 100, id: this.generateId() },\r\n ];\r\n this.type = 'linear';\r\n this.rotation = 90;\r\n }\r\n this.generateGradient();\r\n }\r\n private generateId(): string {\r\n let id = 'ngx-thumb-' + Math.random().toString(36).substring(2, 9);\r\n if (this.rangeValues.findIndex((x) => x.id == id) >= 0) {\r\n return this.generateId();\r\n }\r\n return id;\r\n }\r\n\r\n stopPropagation(ev: Event) {\r\n ev.stopPropagation();\r\n }\r\n\r\n remove() {\r\n if (this.rangeValues.length > 2) {\r\n this.rangeValues.splice(this.selectedIndex, 1);\r\n this.selectedIndex = 0;\r\n this.generateGradient();\r\n }\r\n }\r\n\r\n generateGradient(ev?: string) {\r\n if (ev && this.rangeValues[this.selectedIndex]) {\r\n this.rangeValues[this.selectedIndex].color = ev;\r\n }\r\n for (let item of this.rangeValues) {\r\n item.color ??= generateRandomColor();\r\n }\r\n this.baseBg = buildGradientFromStops(this.rangeValues, 'linear', 90);\r\n this.resultGradient = buildGradientFromStops(this.rangeValues, this.type, +this.rotation);\r\n this.emitChange();\r\n }\r\n\r\n updateRangeSlider() {\r\n if (this.rangeSlider) {\r\n this.rangeSlider.writeValue(this.rangeValues);\r\n }\r\n }\r\n emitChange() {\r\n this._onChange(this.resultGradient);\r\n this.change.emit(this.resultGradient);\r\n }\r\n\r\n setDefaultGradients() {\r\n this.defaultGradients = [];\r\n\r\n for (let item of DefaultGradients) {\r\n this.defaultGradients.push(buildGradientFromStops(item, 'linear', 90));\r\n }\r\n }\r\n\r\n onSelectDefault(item: string, i: number) {\r\n // console.log('onSelectDefault', item, i);\r\n this.writeValue(item);\r\n this.emitChange();\r\n }\r\n}\r\n","<div class=\"ngx-input-gradient-picker\" (click)=\"stopPropagation($event)\">\n <div class=\"ngx-color-preview\" [ngStyle]=\"{ '--ngx-selected-gradient': resultGradient }\"></div>\n <div class=\"ngx-c-inner\">\n <range-slider\n [(ngModel)]=\"rangeValues\"\n name=\"rangeCalues\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"1\"\n [addNewRangeOnClick]=\"true\"\n [background]=\"baseBg\"\n [(selectedIndex)]=\"selectedIndex\"\n (change)=\"generateGradient()\"\n #rangeSlider></range-slider>\n\n <div class=\"text-end\">\n <button class=\"remove-btn\" type=\"button\" (click)=\"remove()\">remove</button>\n </div>\n @if (rangeValues[selectedIndex]) {\n <div class=\"ngx-row\">\n <div class=\"ngx-col-6\">\n <div class=\"label\">Color</div>\n <div class=\"input-color\">\n <input\n type=\"text\"\n [(ngModel)]=\"rangeValues[selectedIndex].color\"\n name=\"color\"\n #inputColor\n (ngModelChange)=\"generateGradient(); updateRangeSlider()\" />\n <span\n #ngxGradColor\n class=\"color\"\n [style.backgroundColor]=\"rangeValues[selectedIndex].color\"\n [ngxInputColor]=\"inputColor\"\n [theme]=\"theme\"\n [ngModel]=\"rangeValues[selectedIndex].color\"\n [simpleMode]=\"true\"\n (change)=\"generateGradient($event)\"></span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Position</div>\n <input\n type=\"number\"\n [(ngModel)]=\"rangeValues[selectedIndex].value\"\n min=\"0\"\n max=\"100\"\n name=\"posiition\"\n (change)=\"generateGradient(); updateRangeSlider()\" />\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Rotation</div>\n <div class=\"ngx-input-group\">\n <input\n type=\"text\"\n [(ngModel)]=\"rotation\"\n ngxInputAngle\n [theme]=\"theme\"\n (change)=\"generateGradient()\"\n name=\"rotation\"\n [disabled]=\"type == 'radial'\" />\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Type</div>\n <div class=\"ngx-input-group\">\n <select [(ngModel)]=\"type\" (change)=\"generateGradient()\" name=\"type\">\n <option value=\"linear\">linear</option>\n <option value=\"radial\">radial</option>\n </select>\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n </div>\n }\n\n <div class=\"default-list\">\n @for (item of defaultGradients; track $index; let i = $index) {\n <span [style.background]=\"item\" (click)=\"onSelectDefault(item, i)\"></span>\n }\n </div>\n </div>\n</div>\n","import {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n Renderer2,\r\n ViewContainerRef,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator,\r\n} from '@angular/forms';\r\nimport { NgxInputGradientComponent } from '../components/input-gradient.component';\r\nimport { isValidGradient, parseGradient } from '../utils/build-gradient';\r\nimport { OverlayRef, OverlayService } from 'ngx-kit/shared';\r\n\r\n@Directive({\r\n selector: '[ngxInputGradient]',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputGradient), multi: true },\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: NgxInputGradient,\r\n },\r\n ],\r\n})\r\nexport class NgxInputGradient implements AfterViewInit, OnDestroy, ControlValueAccessor, Validator {\r\n @Input() setInputBackground = true;\r\n @Input() theme: 'light' | 'dark' | 'auto' = 'auto';\r\n private _targetInput?: HTMLInputElement;\r\n @Input('ngxInputColor') set ngxInputColor(\r\n el: HTMLInputElement | ElementRef<HTMLInputElement> | null | undefined | '',\r\n ) {\r\n this.isHostInput = false;\r\n if (el instanceof ElementRef) {\r\n this._targetInput = el.nativeElement;\r\n } else if (el instanceof HTMLInputElement) {\r\n this.isHostInput = true;\r\n this._targetInput = el;\r\n } else {\r\n this._targetInput = undefined;\r\n }\r\n\r\n if (this._targetInput) {\r\n this._targetInput.removeEventListener('input', this.boundInputHandler);\r\n this._targetInput.addEventListener('input', this.boundInputHandler);\r\n }\r\n }\r\n @Output() change = new EventEmitter<string>();\r\n\r\n private boundInputHandler = (e: Event) => {\r\n this.writeValue((e.target as HTMLInputElement).value);\r\n };\r\n private isHostInput = false;\r\n private pickerRef?: OverlayRef<NgxInputGradientComponent>;\r\n\r\n value = '';\r\n\r\n protected _onChange = (value: string) => {};\r\n protected _onTouched = () => {};\r\n _onValidateChange = () => {};\r\n constructor(\r\n private el: ElementRef<HTMLInputElement>,\r\n private renderer: Renderer2,\r\n private viewContainerRef: ViewContainerRef,\r\n private overlayService: OverlayService,\r\n ) {}\r\n\r\n @HostListener('click', ['$event']) onClick(ev: Event) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.toggleColorPicker();\r\n }\r\n ngAfterViewInit(): void {\r\n if (this._targetInput && this._targetInput.tagName.toLowerCase() === 'input') {\r\n this.writeValue(this._targetInput.value);\r\n }\r\n }\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n if (disabled) {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\r\n } else {\r\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\r\n }\r\n }\r\n registerOnValidatorChange(fn: () => void): void {\r\n this._onValidateChange = fn;\r\n }\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyPicker();\r\n }\r\n\r\n writeValue(val: any): void {\r\n this.value = val;\r\n if (val && isValidGradient(val)) {\r\n // const parsed = parseGradient(val);\r\n if (this.setInputBackground) {\r\n this.renderer.setStyle(this.el.nativeElement, 'background', val);\r\n }\r\n if (this.isHostInput) {\r\n this.el.nativeElement.value = this.value;\r\n }\r\n this._onValidateChange();\r\n } else {\r\n this.renderer.setStyle(this.el.nativeElement, 'background', '');\r\n }\r\n }\r\n\r\n toggleColorPicker() {\r\n if (this.pickerRef) {\r\n this.destroyPicker();\r\n return;\r\n }\r\n\r\n this.pickerRef = this.overlayService.open({\r\n anchor: this.el.nativeElement,\r\n component: NgxInputGradientComponent,\r\n viewContainerRef: this.viewContainerRef,\r\n alignment: 'start',\r\n placement: 'auto',\r\n configure: (instance, ref) => {\r\n instance.setTheme = this.theme;\r\n instance.writeValue(this.value);\r\n\r\n instance.change.subscribe((c: string) => {\r\n this.value = c;\r\n this.emitChange(c);\r\n });\r\n\r\n // instance.closed.subscribe(() => ref.close());\r\n },\r\n onClosed: () => {\r\n this.pickerRef = undefined;\r\n },\r\n });\r\n }\r\n\r\n destroyPicker() {\r\n if (this.pickerRef) {\r\n this.pickerRef.close();\r\n this.pickerRef = undefined;\r\n }\r\n }\r\n\r\n private async emitChange(c: string) {\r\n if (this.setInputBackground) {\r\n this.renderer.setStyle(this.el.nativeElement, 'background', c);\r\n }\r\n\r\n // اگر روی input باشیم، مقدار رو در input قرار بده\r\n if (this.isHostInput) {\r\n const input = this.el.nativeElement as HTMLInputElement;\r\n input.value = c;\r\n }\r\n\r\n // اگر targetInput وجود داره، در اونم مقدار ست کن\r\n if (this._targetInput instanceof HTMLInputElement) {\r\n this._targetInput.value = c;\r\n const event = new Event('input', { bubbles: true });\r\n this._targetInput.dispatchEvent(event);\r\n }\r\n\r\n this._onChange(c);\r\n this.change.emit(c);\r\n this._onTouched();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { output, HostListener, Directive, input, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { DecimalPipe } from '@angular/common';
2
+ import { output, HostListener, Directive, InjectionToken, input, inject, signal, viewChild, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
4
3
  import * as i1 from '@angular/forms';
5
4
  import { FormsModule } from '@angular/forms';
6
5
  import { SliderComponent } from 'ngx-kit/shared';
@@ -242,6 +241,29 @@ function renderComposite(source, sourceWidth, sourceHeight, crop, adjustments, m
242
241
  return canvas;
243
242
  }
244
243
 
244
+ const NGX_IMAGE_EDITOR_LOCALIZATION = new InjectionToken('ngx-image-localization', {
245
+ factory: () => DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION,
246
+ });
247
+ class NgxImageEditorLocalization {
248
+ LoadingImage = 'Loading image…';
249
+ Rotation = 'Fine rotation';
250
+ Brightness = 'Brightness';
251
+ Contrast = 'Contrast';
252
+ Saturation = 'Saturation';
253
+ Filter = 'Filter';
254
+ None = 'None';
255
+ Grayscale = 'Grayscale';
256
+ Sepia = 'Sepia';
257
+ Invert = 'Invert';
258
+ Cartoon = 'Cartoon';
259
+ Cancel = 'Cancel';
260
+ Save = 'Save';
261
+ Saving = 'Saving…';
262
+ Reset = 'Reset';
263
+ }
264
+ const DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION = new NgxImageEditorLocalization();
265
+
266
+ const ALL_FILTERS = ['none', 'grayscale', 'sepia', 'invert', 'cartoon'];
245
267
  /**
246
268
  * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده
247
269
  * (سیاه‌وسفید، سپیا، معکوس، کارتونی) + فشرده‌سازی خروجی. کاملاً روی Canvas
@@ -252,6 +274,15 @@ function renderComposite(source, sourceWidth, sourceHeight, crop, adjustments, m
252
274
  * (createWorkingCopy)، نه روی تصویر اصلی که ممکنه چند مگاپیکسل باشه — وگرنه
253
275
  * درگ‌کردن اسلایدرها/گوشه‌های کراپ رو کاربر حس تاخیر می‌کرد. فقط لحظه‌ی
254
276
  * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.
277
+ *
278
+ * اندازه‌ی صحنه (stage) با panelSize کنترل می‌شه: عرض همیشه ۱۰۰٪ عرضِ
279
+ * والدِ کامپوننته (با ResizeObserver اندازه‌گیری می‌شه، پس با تغییر سایز
280
+ * صفحه/layout هم زنده هماهنگ می‌مونه)، ارتفاع دقیقاً همون چیزیه که کاربر با
281
+ * panelSize می‌ده. تصویر همیشه با یک مقیاسِ «contain» واقعی (هم بر اساس
282
+ * عرض، هم بر اساس ارتفاع — هرکدوم تنگ‌تره) جا داده می‌شه، پس کلِ تصویر
283
+ * همیشه در محدوده‌ی همین باکس دیده می‌شه، صرف‌نظر از اندازه‌ی واقعیِ فایل.
284
+ * سقفِ مقیاس هم ۱ هست، یعنی تصاویر کوچیک بزرگ‌نمایی نمی‌شن (که باعثِ محو
285
+ * شدن‌شون می‌شد).
255
286
  */
256
287
  class NgxImageEditorComponent {
257
288
  source = input(null, /* @ts-ignore */
@@ -265,9 +296,17 @@ class NgxImageEditorComponent {
265
296
  ...(ngDevMode ? [{ debugName: "outputMaxHeight" }] : /* istanbul ignore next */ []));
266
297
  outputType = input('image/jpeg', /* @ts-ignore */
267
298
  ...(ngDevMode ? [{ debugName: "outputType" }] : /* istanbul ignore next */ []));
268
- /** حداکثر عرض نمایشِ ناحیه‌ی کراپ روی صفحه (پیکسل) */
269
- displayMaxWidth = input(420, /* @ts-ignore */
270
- ...(ngDevMode ? [{ debugName: "displayMaxWidth" }] : /* istanbul ignore next */ []));
299
+ /**
300
+ * کدوم فیلترها نشون داده بشن (و به چه ترتیبی). اگه ندید، هر ۵ تا نشون داده
301
+ * می‌شن. آرایه‌ی خالی یعنی کلِ بخشِ فیلتر مخفی بشه.
302
+ */
303
+ filters = input(ALL_FILTERS, /* @ts-ignore */
304
+ ...(ngDevMode ? [{ debugName: "filters" }] : /* istanbul ignore next */ []));
305
+ quality = input(0.92, /* @ts-ignore */
306
+ ...(ngDevMode ? [{ debugName: "quality" }] : /* istanbul ignore next */ []));
307
+ defaultLocalization = inject(NGX_IMAGE_EDITOR_LOCALIZATION);
308
+ localize = input(this.defaultLocalization, /* @ts-ignore */
309
+ ...(ngDevMode ? [{ debugName: "localize" }] : /* istanbul ignore next */ []));
271
310
  saved = output();
272
311
  cancelled = output();
273
312
  loading = signal(false, /* @ts-ignore */
@@ -280,6 +319,11 @@ class NgxImageEditorComponent {
280
319
  ...(ngDevMode ? [{ debugName: "originalImage" }] : /* istanbul ignore next */ []));
281
320
  workingCanvas = signal(null, /* @ts-ignore */
282
321
  ...(ngDevMode ? [{ debugName: "workingCanvas" }] : /* istanbul ignore next */ []));
322
+ stageWrapEl = viewChild('stageWrap', /* @ts-ignore */
323
+ ...(ngDevMode ? [{ debugName: "stageWrapEl" }] : /* istanbul ignore next */ []));
324
+ /** عرضِ واقعیِ رندرشده‌ی کانتینر؛ چون عرض همیشه ۱۰۰٪ (fluid) هست، باید زنده اندازه‌گیری بشه */
325
+ containerWidth = signal(0, /* @ts-ignore */
326
+ ...(ngDevMode ? [{ debugName: "containerWidth" }] : /* istanbul ignore next */ []));
283
327
  rotation = signal(0, /* @ts-ignore */
284
328
  ...(ngDevMode ? [{ debugName: "rotation" }] : /* istanbul ignore next */ []));
285
329
  brightness = signal(100, /* @ts-ignore */
@@ -290,8 +334,6 @@ class NgxImageEditorComponent {
290
334
  ...(ngDevMode ? [{ debugName: "saturation" }] : /* istanbul ignore next */ []));
291
335
  filterPreset = signal('none', /* @ts-ignore */
292
336
  ...(ngDevMode ? [{ debugName: "filterPreset" }] : /* istanbul ignore next */ []));
293
- quality = signal(0.92, /* @ts-ignore */
294
- ...(ngDevMode ? [{ debugName: "quality" }] : /* istanbul ignore next */ []));
295
337
  crop = signal({ x: 0, y: 0, width: 0, height: 0 }, /* @ts-ignore */
296
338
  ...(ngDevMode ? [{ debugName: "crop" }] : /* istanbul ignore next */ []));
297
339
  adjustments = computed(() => ({
@@ -302,6 +344,17 @@ class NgxImageEditorComponent {
302
344
  filter: this.filterPreset(),
303
345
  }), /* @ts-ignore */
304
346
  ...(ngDevMode ? [{ debugName: "adjustments" }] : /* istanbul ignore next */ []));
347
+ filterLabels = computed(() => {
348
+ const t = this.localize();
349
+ return {
350
+ none: t.None,
351
+ grayscale: t.Grayscale,
352
+ sepia: t.Sepia,
353
+ invert: t.Invert,
354
+ cartoon: t.Cartoon,
355
+ };
356
+ }, /* @ts-ignore */
357
+ ...(ngDevMode ? [{ debugName: "filterLabels" }] : /* istanbul ignore next */ []));
305
358
  /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */
306
359
  rotatedWorkingCanvas = computed(() => {
307
360
  const wc = this.workingCanvas();
@@ -310,11 +363,21 @@ class NgxImageEditorComponent {
310
363
  return renderRotated(wc, wc.width, wc.height, this.rotation());
311
364
  }, /* @ts-ignore */
312
365
  ...(ngDevMode ? [{ debugName: "rotatedWorkingCanvas" }] : /* istanbul ignore next */ []));
366
+ panelSize = computed(() => {
367
+ return this.stageWrapEl()?.nativeElement.getBoundingClientRect().height ?? 0;
368
+ }, /* @ts-ignore */
369
+ ...(ngDevMode ? [{ debugName: "panelSize" }] : /* istanbul ignore next */ []));
370
+ /**
371
+ * مقیاسِ «contain» واقعی: کوچیک‌ترینِ نسبتِ عرض و ارتفاع (هرکدوم تنگ‌تره)
372
+ * تعیین‌کننده‌ست، و سقفش هم ۱ هست تا تصاویر کوچیک بزرگ‌نمایی نشن.
373
+ */
313
374
  displayScale = computed(() => {
314
375
  const rc = this.rotatedWorkingCanvas();
315
- if (!rc)
376
+ const containerW = this.containerWidth();
377
+ const panelH = this.panelSize();
378
+ if (!rc || rc.width <= 0 || rc.height <= 0 || containerW <= 0 || panelH <= 0)
316
379
  return 1;
317
- return Math.min(1, this.displayMaxWidth() / rc.width);
380
+ return Math.min(containerW / rc.width, panelH / rc.height, 1);
318
381
  }, /* @ts-ignore */
319
382
  ...(ngDevMode ? [{ debugName: "displayScale" }] : /* istanbul ignore next */ []));
320
383
  stageImageUrl = computed(() => {
@@ -378,13 +441,37 @@ class NgxImageEditorComponent {
378
441
  this.crop.set({ x: 0, y: 0, width: rc.width, height: rc.height });
379
442
  }
380
443
  });
444
+ // اگه فیلترِ فعلاً انتخاب‌شده دیگه توی لیستِ مجازِ filters() نباشه (مثلاً
445
+ // مصرف‌کننده cartoon رو غیرفعال کرده درحالی‌که کاربر روش بود)، برو روی
446
+ // اولین فیلترِ مجاز؛ اگه لیست خالی باشه (کلاً فیلتر مخفیه)، روی none بمون.
447
+ effect(() => {
448
+ const allowed = this.filters();
449
+ if (allowed.length && !allowed.includes(this.filterPreset())) {
450
+ this.filterPreset.set(allowed[0]);
451
+ }
452
+ });
453
+ // اندازه‌گیریِ زنده‌ی عرضِ واقعیِ کانتینر — چون عرض همیشه ۱۰۰٪ (fluid)ه،
454
+ // فقط با ResizeObserver می‌شه فهمید الان چند پیکسله (نه یه عددِ ثابتِ ورودی).
455
+ effect((onCleanup) => {
456
+ const el = this.stageWrapEl()?.nativeElement;
457
+ if (!el)
458
+ return;
459
+ this.containerWidth.set(el.getBoundingClientRect().width);
460
+ const ro = new ResizeObserver((entries) => {
461
+ const width = entries[0]?.contentRect.width;
462
+ if (width != null)
463
+ this.containerWidth.set(width);
464
+ });
465
+ ro.observe(el);
466
+ onCleanup(() => ro.disconnect());
467
+ });
381
468
  }
382
469
  resetAdjustments() {
383
470
  this.rotation.set(0);
384
471
  this.brightness.set(100);
385
472
  this.contrast.set(100);
386
473
  this.saturation.set(100);
387
- this.filterPreset.set('none');
474
+ this.filterPreset.set(this.filters()[0] ?? 'none');
388
475
  }
389
476
  rotateBy(delta) {
390
477
  this.rotation.update((r) => {
@@ -486,16 +573,16 @@ class NgxImageEditorComponent {
486
573
  }
487
574
  }
488
575
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxImageEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
489
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxImageEditorComponent, isStandalone: true, selector: "ngx-image-editor", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, outputMaxWidth: { classPropertyName: "outputMaxWidth", publicName: "outputMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, outputMaxHeight: { classPropertyName: "outputMaxHeight", publicName: "outputMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, outputType: { classPropertyName: "outputType", publicName: "outputType", isSignal: true, isRequired: false, transformFunction: null }, displayMaxWidth: { classPropertyName: "displayMaxWidth", publicName: "displayMaxWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", cancelled: "cancelled" }, host: { classAttribute: "ngx-image-editor-host" }, ngImport: i0, template: "@if (loading()) {\n <div class=\"ngx-ie-state\">Loading image\u2026</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\">\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"Preview\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\n </div>\n\n <label class=\"ngx-ie-field\">\n <span>Fine rotation ({{ rotation() }}\u00B0)</span>\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>Brightness ({{ brightness() }}%)</span>\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>Contrast ({{ contrast() }}%)</span>\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>Saturation ({{ saturation() }}%)</span>\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <div class=\"ngx-ie-field\">\n <span>Filter</span>\n <div class=\"ngx-ie-filter-row\">\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'none'\"\n (click)=\"setFilter('none')\">\n None\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'grayscale'\"\n (click)=\"setFilter('grayscale')\">\n Grayscale\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'sepia'\"\n (click)=\"setFilter('sepia')\">\n Sepia\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'invert'\"\n (click)=\"setFilter('invert')\">\n Invert\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'cartoon'\"\n (click)=\"setFilter('cartoon')\">\n Cartoon\n </button>\n </div>\n </div>\n\n <label class=\"ngx-ie-field\">\n <span>Output quality ({{ quality() * 100 | number: '1.0-0' }}%)</span>\n <slider\n [ngModel]=\"quality() * 100\"\n (ngModelChange)=\"quality.set($event / 100)\"\n [min]=\"10\"\n [max]=\"100\"></slider>\n </label>\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">Cancel</button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? 'Saving\u2026' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n}\n", styles: [":host{display:block}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-stage-wrap{display:flex;align-items:flex-start;justify-content:center;padding:.5rem;background:light-dark(#f3f4f6,#18181b);border-radius:10px}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;min-inline-size:240px;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block}.ngx-ie-field{display:flex;flex-direction:column;gap:.3rem;font-size:.8rem;color:light-dark(#374151,#d4d4d8)}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }, { kind: "directive", type: NgxPointerDragDirective, selector: "[ngxPointerDrag]", outputs: ["dragStart", "dragMove", "dragEnd"] }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
576
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxImageEditorComponent, isStandalone: true, selector: "ngx-image-editor", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, outputMaxWidth: { classPropertyName: "outputMaxWidth", publicName: "outputMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, outputMaxHeight: { classPropertyName: "outputMaxHeight", publicName: "outputMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, outputType: { classPropertyName: "outputType", publicName: "outputType", isSignal: true, isRequired: false, transformFunction: null }, filters: { classPropertyName: "filters", publicName: "filters", isSignal: true, isRequired: false, transformFunction: null }, quality: { classPropertyName: "quality", publicName: "quality", isSignal: true, isRequired: false, transformFunction: null }, localize: { classPropertyName: "localize", publicName: "localize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", cancelled: "cancelled" }, host: { classAttribute: "ngx-image-editor-host" }, viewQueries: [{ propertyName: "stageWrapEl", first: true, predicate: ["stageWrap"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (loading()) {\n <div class=\"ngx-ie-state\">{{ localize().LoadingImage }}</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\" #stageWrap>\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel-row\">\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"Preview\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\n </div>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\">\n <span>{{ localize().Rotation }} ({{ rotation() }}\u00B0)</span>\n </slider>\n\n <button\n type=\"button\"\n (click)=\"rotation.set(0)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Brightness }} ({{ brightness() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"brightness.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Contrast }} ({{ contrast() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"contrast.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Saturation }} ({{ saturation() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"saturation.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n @if (filters().length) {\n <div>\n <span>{{ localize().Filter }}</span>\n <div class=\"ngx-ie-filter-row\">\n @for (f of filters(); track f) {\n <button type=\"button\" [class.active]=\"filterPreset() === f\" (click)=\"setFilter(f)\">\n {{ filterLabels()[f] }}\n </button>\n }\n </div>\n </div>\n }\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">\n {{ localize().Cancel }}\n </button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? localize().Saving : localize().Save }}\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;min-height:70dvh;--ngx-image-editor-panel-width: 25%}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:grid;grid-template-columns:1fr var(--ngx-image-editor-panel-width, 30%);gap:1.25rem;height:100%}.ngx-ie-stage-wrap{width:100%;display:flex;align-items:center;justify-content:center;background:light-dark(#f3f4f6,#18181b);border-radius:10px;overflow:hidden;flex-shrink:0}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-panel-row{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-field{display:flex;gap:.3rem;align-items:flex-end}.ngx-ie-field slider{flex:1}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}@media(max-width:768px){:host{height:unset!important}.ngx-ie-layout{display:flex;flex-direction:column}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SliderComponent, selector: "slider", inputs: ["step", "min", "max", "background", "isBgTransparent"], outputs: ["change"] }, { kind: "directive", type: NgxPointerDragDirective, selector: "[ngxPointerDrag]", outputs: ["dragStart", "dragMove", "dragEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
490
577
  }
491
578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxImageEditorComponent, decorators: [{
492
579
  type: Component,
493
- args: [{ selector: 'ngx-image-editor', standalone: true, imports: [FormsModule, DecimalPipe, SliderComponent, NgxPointerDragDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-image-editor-host' }, template: "@if (loading()) {\n <div class=\"ngx-ie-state\">Loading image\u2026</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\">\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"Preview\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\n </div>\n\n <label class=\"ngx-ie-field\">\n <span>Fine rotation ({{ rotation() }}\u00B0)</span>\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>Brightness ({{ brightness() }}%)</span>\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>Contrast ({{ contrast() }}%)</span>\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>Saturation ({{ saturation() }}%)</span>\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <div class=\"ngx-ie-field\">\n <span>Filter</span>\n <div class=\"ngx-ie-filter-row\">\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'none'\"\n (click)=\"setFilter('none')\">\n None\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'grayscale'\"\n (click)=\"setFilter('grayscale')\">\n Grayscale\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'sepia'\"\n (click)=\"setFilter('sepia')\">\n Sepia\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'invert'\"\n (click)=\"setFilter('invert')\">\n Invert\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'cartoon'\"\n (click)=\"setFilter('cartoon')\">\n Cartoon\n </button>\n </div>\n </div>\n\n <label class=\"ngx-ie-field\">\n <span>Output quality ({{ quality() * 100 | number: '1.0-0' }}%)</span>\n <slider\n [ngModel]=\"quality() * 100\"\n (ngModelChange)=\"quality.set($event / 100)\"\n [min]=\"10\"\n [max]=\"100\"></slider>\n </label>\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">Cancel</button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? 'Saving\u2026' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n}\n", styles: [":host{display:block}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-stage-wrap{display:flex;align-items:flex-start;justify-content:center;padding:.5rem;background:light-dark(#f3f4f6,#18181b);border-radius:10px}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;min-inline-size:240px;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block}.ngx-ie-field{display:flex;flex-direction:column;gap:.3rem;font-size:.8rem;color:light-dark(#374151,#d4d4d8)}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}\n"] }]
494
- }], ctorParameters: () => [], propDecorators: { source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], aspectRatio: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspectRatio", required: false }] }], outputMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputMaxWidth", required: false }] }], outputMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputMaxHeight", required: false }] }], outputType: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputType", required: false }] }], displayMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMaxWidth", required: false }] }], saved: [{ type: i0.Output, args: ["saved"] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }] } });
580
+ args: [{ selector: 'ngx-image-editor', standalone: true, imports: [FormsModule, SliderComponent, NgxPointerDragDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-image-editor-host' }, template: "@if (loading()) {\n <div class=\"ngx-ie-state\">{{ localize().LoadingImage }}</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\" #stageWrap>\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel-row\">\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"Preview\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"Rotate 90\u00B0 left\">\u27F2 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"Rotate 90\u00B0 right\">\u27F3 90</button>\n </div>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\">\n <span>{{ localize().Rotation }} ({{ rotation() }}\u00B0)</span>\n </slider>\n\n <button\n type=\"button\"\n (click)=\"rotation.set(0)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Brightness }} ({{ brightness() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"brightness.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Contrast }} ({{ contrast() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"contrast.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n <label class=\"ngx-ie-field\">\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\">\n <span>{{ localize().Saturation }} ({{ saturation() }}%)</span>\n </slider>\n <button\n type=\"button\"\n (click)=\"saturation.set(100)\"\n class=\"ngx-ie-btn-secondary\"\n [title]=\"localize().Reset\">\n x\n </button>\n </label>\n\n @if (filters().length) {\n <div>\n <span>{{ localize().Filter }}</span>\n <div class=\"ngx-ie-filter-row\">\n @for (f of filters(); track f) {\n <button type=\"button\" [class.active]=\"filterPreset() === f\" (click)=\"setFilter(f)\">\n {{ filterLabels()[f] }}\n </button>\n }\n </div>\n </div>\n }\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">\n {{ localize().Cancel }}\n </button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? localize().Saving : localize().Save }}\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;min-height:70dvh;--ngx-image-editor-panel-width: 25%}.ngx-ie-state{padding:2rem;text-align:center;color:light-dark(#6b7280,#9ca3af)}.ngx-ie-state--error{color:light-dark(#b91c1c,#f87171)}.ngx-ie-layout{display:grid;grid-template-columns:1fr var(--ngx-image-editor-panel-width, 30%);gap:1.25rem;height:100%}.ngx-ie-stage-wrap{width:100%;display:flex;align-items:center;justify-content:center;background:light-dark(#f3f4f6,#18181b);border-radius:10px;overflow:hidden;flex-shrink:0}.ngx-ie-stage{position:relative;touch-action:none;-webkit-user-select:none;user-select:none;direction:ltr}.ngx-ie-stage-img{display:block;inline-size:100%;block-size:100%;border-radius:4px;pointer-events:none;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-crop-box{position:absolute;box-sizing:border-box;border:2px solid #2563eb;box-shadow:0 0 0 9999px #00000073;cursor:move;touch-action:none}.ngx-ie-handle{position:absolute;inline-size:14px;block-size:14px;background:#fff;border:2px solid #2563eb;border-radius:50%;touch-action:none}.ngx-ie-handle--nw{inset-inline-start:-7px;inset-block-start:-7px;cursor:nwse-resize}.ngx-ie-handle--ne{inset-inline-end:-7px;inset-block-start:-7px;cursor:nesw-resize}.ngx-ie-handle--sw{inset-inline-start:-7px;inset-block-end:-7px;cursor:nesw-resize}.ngx-ie-handle--se{inset-inline-end:-7px;inset-block-end:-7px;cursor:nwse-resize}.ngx-ie-panel{flex:1;display:flex;flex-direction:column;gap:.75rem}.ngx-ie-panel-row{display:flex;flex-wrap:wrap;gap:1.25rem}.ngx-ie-preview{display:flex;align-items:center;justify-content:center;min-block-size:100px;background:light-dark(#f3f4f6,#18181b);border-radius:8px;overflow:hidden}.ngx-ie-preview img{max-inline-size:100%;max-block-size:160px;display:block;background:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-ie-field{display:flex;gap:.3rem;align-items:flex-end}.ngx-ie-field slider{flex:1}.ngx-ie-row{display:flex;gap:.5rem}.ngx-ie-rotate-row button,.ngx-ie-filter-row button{appearance:none;border:1px solid light-dark(#e5e7eb,#33333a);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:999px;padding:.4rem .85rem;font-size:.75rem;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .15s ease,color .15s ease}.ngx-ie-rotate-row button:hover,.ngx-ie-filter-row button:hover{background:light-dark(#f3f4f6,#2c2c31);transform:translateY(-1px)}.ngx-ie-rotate-row button:active,.ngx-ie-filter-row button:active{transform:translateY(0)}.ngx-ie-rotate-row button.active,.ngx-ie-filter-row button.active{background:light-dark(#2563eb,#3b82f6);border-color:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.3),rgba(59,130,246,.3))}.ngx-ie-filter-row{display:flex;flex-wrap:wrap;gap:.4rem}.ngx-ie-actions{margin-block-start:auto;justify-content:flex-end}.ngx-ie-btn-primary,.ngx-ie-btn-secondary{appearance:none;border:none;border-radius:8px;padding:.55rem 1.1rem;font-size:.85rem;cursor:pointer;font-weight:500;transition:transform .15s ease,box-shadow .15s ease,opacity .15s ease}.ngx-ie-btn-primary:hover,.ngx-ie-btn-secondary:hover{transform:translateY(-1px)}.ngx-ie-btn-primary:active,.ngx-ie-btn-secondary:active{transform:translateY(0)}.ngx-ie-btn-primary{background:light-dark(#2563eb,#3b82f6);color:#fff;box-shadow:0 2px 10px light-dark(rgba(37,99,235,.25),rgba(59,130,246,.25))}.ngx-ie-btn-primary:disabled{opacity:.6;cursor:not-allowed;transform:none}.ngx-ie-btn-secondary{background:light-dark(#e5e7eb,#3f3f46);color:light-dark(#374151,#e4e4e7)}@media(max-width:768px){:host{height:unset!important}.ngx-ie-layout{display:flex;flex-direction:column}}\n"] }]
581
+ }], ctorParameters: () => [], propDecorators: { source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], aspectRatio: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspectRatio", required: false }] }], outputMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputMaxWidth", required: false }] }], outputMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputMaxHeight", required: false }] }], outputType: [{ type: i0.Input, args: [{ isSignal: true, alias: "outputType", required: false }] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }], quality: [{ type: i0.Input, args: [{ isSignal: true, alias: "quality", required: false }] }], localize: [{ type: i0.Input, args: [{ isSignal: true, alias: "localize", required: false }] }], saved: [{ type: i0.Output, args: ["saved"] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }], stageWrapEl: [{ type: i0.ViewChild, args: ['stageWrap', { isSignal: true }] }] } });
495
582
 
496
583
  /**
497
584
  * Generated bundle index. Do not edit.
498
585
  */
499
586
 
500
- export { NgxImageEditorComponent, NgxPointerDragDirective, applyCartoonEffect, canvasToBlob, createWorkingCopy, fitWithin, loadImage, renderComposite, renderRotated };
587
+ export { DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION, NGX_IMAGE_EDITOR_LOCALIZATION, NgxImageEditorComponent, NgxImageEditorLocalization, NgxPointerDragDirective, applyCartoonEffect, canvasToBlob, createWorkingCopy, fitWithin, loadImage, renderComposite, renderRotated };
501
588
  //# sourceMappingURL=ngx-kit-image-editor.mjs.map