ngx-kit 6.2.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +52 -49
  5. package/data-table/README.md +120 -113
  6. package/date-picker/README.md +74 -69
  7. package/dialog/README.md +92 -92
  8. package/drag-resize/README.md +55 -0
  9. package/drawer-menu/README.md +125 -77
  10. package/dropzone/README.md +422 -422
  11. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  12. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  13. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  14. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  15. package/fesm2022/ngx-kit-color-picker.mjs +265 -73
  16. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  17. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  18. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  19. package/fesm2022/ngx-kit-date-picker.mjs +11 -11
  20. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  21. package/fesm2022/ngx-kit-dialog.mjs +3 -3
  22. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-drag-resize.mjs +1664 -0
  24. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -0
  25. package/fesm2022/ngx-kit-drawer-menu.mjs +424 -158
  26. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  28. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-form-field.mjs +3 -5
  30. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  31. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  32. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  33. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-grid-layout.mjs +927 -0
  35. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -0
  36. package/fesm2022/ngx-kit-image-editor.mjs +2 -2
  37. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-menu.mjs +8 -8
  39. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-kit-message.mjs +2 -2
  41. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  42. package/fesm2022/ngx-kit-notify.mjs +2 -2
  43. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  44. package/fesm2022/ngx-kit-shared.mjs +54 -3
  45. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  46. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  47. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  48. package/fesm2022/ngx-kit-virtual-scroll.mjs +392 -0
  49. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -0
  50. package/fesm2022/ngx-kit-webflow.mjs +709 -0
  51. package/fesm2022/ngx-kit-webflow.mjs.map +1 -0
  52. package/gallery/README.md +71 -71
  53. package/gradient-picker/README.md +41 -41
  54. package/grid-layout/README.md +64 -0
  55. package/image-editor/README.md +12 -12
  56. package/menu/README.md +85 -85
  57. package/message/README.md +70 -70
  58. package/notify/README.md +56 -58
  59. package/package.json +17 -1
  60. package/shared/README.md +117 -117
  61. package/time-picker/README.md +89 -95
  62. package/types/ngx-kit-color-picker.d.ts +72 -16
  63. package/types/ngx-kit-date-picker.d.ts +2 -1
  64. package/types/ngx-kit-drag-resize.d.ts +368 -0
  65. package/types/ngx-kit-drawer-menu.d.ts +148 -88
  66. package/types/ngx-kit-grid-layout.d.ts +310 -0
  67. package/types/ngx-kit-image-editor.d.ts +1 -1
  68. package/types/ngx-kit-shared.d.ts +12 -1
  69. package/types/ngx-kit-virtual-scroll.d.ts +179 -0
  70. package/types/ngx-kit-webflow.d.ts +286 -0
  71. package/virtual-scroll/README.md +199 -0
@@ -36,11 +36,11 @@ class NgxFormField {
36
36
  errorVisible = computed(() => this.invalid(), /* @ts-ignore */
37
37
  ...(ngDevMode ? [{ debugName: "errorVisible" }] : /* istanbul ignore next */ []));
38
38
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxFormField, deps: [], target: i0.ɵɵFactoryTarget.Component });
39
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxFormField, isStandalone: true, selector: "ngx-form-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, float: { classPropertyName: "float", publicName: "float", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\r\n class=\"mx-form-field\"\r\n [class.mx-form-field--float]=\"float()\"\r\n [class.mx-form-field--disabled]=\"disabled()\"\r\n [class.mx-form-field--readonly]=\"readonly()\"\r\n [class.mx-form-field--invalid]=\"invalid()\"\r\n [class.mx-form-field--required]=\"required()\">\r\n <div class=\"mx-form-field__before\">\r\n <div class=\"mx-form-field__prefix\">\r\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\r\n\r\n <span class=\"mx-form-field__label\">\r\n <span [aria-label]=\"label()\">{{ label() }}</span>\r\n </span>\r\n\r\n <div class=\"mx-form-field__after\">\r\n <div class=\"mx-form-field__suffix\">\r\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (hintVisible()) {\r\n <div class=\"mx-form-field__hint\">\r\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\r\n </div>\r\n}\r\n\r\n@if (errorVisible()) {\r\n <div class=\"mx-form-field__error-list\" role=\"alert\">\r\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\r\n </div>\r\n}\r\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
39
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxFormField, isStandalone: true, selector: "ngx-form-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, float: { classPropertyName: "float", publicName: "float", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"mx-form-field\"\n [class.mx-form-field--float]=\"float()\"\n [class.mx-form-field--disabled]=\"disabled()\"\n [class.mx-form-field--readonly]=\"readonly()\"\n [class.mx-form-field--invalid]=\"invalid()\"\n [class.mx-form-field--required]=\"required()\">\n <div class=\"mx-form-field__before\">\n <div class=\"mx-form-field__prefix\">\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\n\n <span class=\"mx-form-field__label\">\n <span [aria-label]=\"label()\">{{ label() }}</span>\n </span>\n\n <div class=\"mx-form-field__after\">\n <div class=\"mx-form-field__suffix\">\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\n </div>\n </div>\n</div>\n\n@if (hintVisible()) {\n <div class=\"mx-form-field__hint\">\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\n </div>\n}\n\n@if (errorVisible()) {\n <div class=\"mx-form-field__error-list\" role=\"alert\">\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\n </div>\n}\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
40
40
  }
41
41
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxFormField, decorators: [{
42
42
  type: Component,
43
- args: [{ selector: 'ngx-form-field', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\r\n class=\"mx-form-field\"\r\n [class.mx-form-field--float]=\"float()\"\r\n [class.mx-form-field--disabled]=\"disabled()\"\r\n [class.mx-form-field--readonly]=\"readonly()\"\r\n [class.mx-form-field--invalid]=\"invalid()\"\r\n [class.mx-form-field--required]=\"required()\">\r\n <div class=\"mx-form-field__before\">\r\n <div class=\"mx-form-field__prefix\">\r\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\r\n\r\n <span class=\"mx-form-field__label\">\r\n <span [aria-label]=\"label()\">{{ label() }}</span>\r\n </span>\r\n\r\n <div class=\"mx-form-field__after\">\r\n <div class=\"mx-form-field__suffix\">\r\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (hintVisible()) {\r\n <div class=\"mx-form-field__hint\">\r\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\r\n </div>\r\n}\r\n\r\n@if (errorVisible()) {\r\n <div class=\"mx-form-field__error-list\" role=\"alert\">\r\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\r\n </div>\r\n}\r\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"] }]
43
+ args: [{ selector: 'ngx-form-field', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"mx-form-field\"\n [class.mx-form-field--float]=\"float()\"\n [class.mx-form-field--disabled]=\"disabled()\"\n [class.mx-form-field--readonly]=\"readonly()\"\n [class.mx-form-field--invalid]=\"invalid()\"\n [class.mx-form-field--required]=\"required()\">\n <div class=\"mx-form-field__before\">\n <div class=\"mx-form-field__prefix\">\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\n\n <span class=\"mx-form-field__label\">\n <span [aria-label]=\"label()\">{{ label() }}</span>\n </span>\n\n <div class=\"mx-form-field__after\">\n <div class=\"mx-form-field__suffix\">\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\n </div>\n </div>\n</div>\n\n@if (hintVisible()) {\n <div class=\"mx-form-field__hint\">\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\n </div>\n}\n\n@if (errorVisible()) {\n <div class=\"mx-form-field__error-list\" role=\"alert\">\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\n </div>\n}\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"] }]
44
44
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], float: [{ type: i0.Input, args: [{ isSignal: true, alias: "float", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }] } });
45
45
 
46
46
  class NgxInput {
@@ -65,9 +65,7 @@ class NgxInput {
65
65
  syncValue() {
66
66
  const value = this.el.nativeElement.value;
67
67
  this.ref.value.set(value);
68
- this.hasValue.set(value !== null &&
69
- value !== undefined &&
70
- value !== '');
68
+ this.hasValue.set(value !== null && value !== undefined && value !== '');
71
69
  }
72
70
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInput, deps: [], target: i0.ɵɵFactoryTarget.Directive });
73
71
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: NgxInput, isStandalone: true, selector: "[ngxInput],ngx-input", host: { listeners: { "input": "onInput()", "change": "onChange()", "blur": "onBlur()" }, properties: { "class.has-value": "hasValue()" } }, ngImport: i0 });
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-form-field.mjs","sources":["../../../projects/libs/form-field/tokens/form-field.token.ts","../../../projects/libs/form-field/components/form-field.ts","../../../projects/libs/form-field/components/form-field.html","../../../projects/libs/form-field/directives/ngx-input.directive.ts","../../../projects/libs/form-field/directives/ngx-error.directive.ts","../../../projects/libs/form-field/directives/ngx-hint.directive.ts","../../../projects/libs/form-field/directives/ngx-prefix.directive.ts","../../../projects/libs/form-field/directives/ngx-suffix.directive.ts","../../../projects/libs/form-field/ngx-kit-form-field.ts"],"sourcesContent":["import { InjectionToken, signal } from '@angular/core';\r\n\r\nexport const MX_FORM_FIELD =\r\n new InjectionToken<MgxFormFieldRef>('mx-form-field', {\r\n factory: () => new MgxFormFieldRef(),\r\n });\r\n\r\nexport class MgxFormFieldRef {\r\n readonly value = signal('');\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewEncapsulation,\r\n computed,\r\n input,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport { MX_FORM_FIELD } from '../tokens/form-field.token';\r\n\r\n@Component({\r\n selector: 'ngx-form-field',\r\n standalone: true,\r\n templateUrl: './form-field.html',\r\n styleUrl: './form-field.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgxFormField {\r\n protected readonly ref = inject(MX_FORM_FIELD);\r\n\r\n readonly label = input.required<string>();\r\n\r\n /**\r\n * Forces the label to float even when the control is empty.\r\n * Similar to Material's floatLabel behavior.\r\n */\r\n readonly float = input(false);\r\n\r\n /**\r\n * Explicit state overrides are useful when the projected control\r\n * is managed by Angular Forms.\r\n */\r\n readonly invalid = input(false);\r\n readonly required = input(false);\r\n readonly disabled = input(false);\r\n readonly readonly = input(false);\r\n\r\n readonly hintVisible = computed(() => !this.invalid());\r\n\r\n readonly errorVisible = computed(() => this.invalid());\r\n}\r\n","<div\r\n class=\"mx-form-field\"\r\n [class.mx-form-field--float]=\"float()\"\r\n [class.mx-form-field--disabled]=\"disabled()\"\r\n [class.mx-form-field--readonly]=\"readonly()\"\r\n [class.mx-form-field--invalid]=\"invalid()\"\r\n [class.mx-form-field--required]=\"required()\">\r\n <div class=\"mx-form-field__before\">\r\n <div class=\"mx-form-field__prefix\">\r\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\r\n\r\n <span class=\"mx-form-field__label\">\r\n <span [aria-label]=\"label()\">{{ label() }}</span>\r\n </span>\r\n\r\n <div class=\"mx-form-field__after\">\r\n <div class=\"mx-form-field__suffix\">\r\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (hintVisible()) {\r\n <div class=\"mx-form-field__hint\">\r\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\r\n </div>\r\n}\r\n\r\n@if (errorVisible()) {\r\n <div class=\"mx-form-field__error-list\" role=\"alert\">\r\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\r\n </div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { MX_FORM_FIELD } from '../tokens/form-field.token';\r\n\r\ntype FormControlElement =\r\n | HTMLInputElement\r\n | HTMLSelectElement\r\n | HTMLTextAreaElement;\r\n\r\n@Directive({\r\n selector: '[ngxInput],ngx-input',\r\n standalone: true,\r\n host: {\r\n '[class.has-value]': 'hasValue()',\r\n },\r\n})\r\nexport class NgxInput implements AfterViewInit {\r\n private readonly el =\r\n inject<ElementRef<FormControlElement>>(ElementRef);\r\n\r\n private readonly ref = inject(MX_FORM_FIELD);\r\n\r\n readonly hasValue = signal(false);\r\n\r\n ngAfterViewInit(): void {\r\n // Covers initial values coming from [value], Reactive Forms,\r\n // template-driven forms, browser autofill, etc.\r\n queueMicrotask(() => this.syncValue());\r\n }\r\n\r\n @HostListener('input')\r\n protected onInput(): void {\r\n this.syncValue();\r\n }\r\n\r\n @HostListener('change')\r\n protected onChange(): void {\r\n this.syncValue();\r\n }\r\n\r\n @HostListener('blur')\r\n protected onBlur(): void {\r\n this.syncValue();\r\n }\r\n\r\n private syncValue(): void {\r\n const value = this.el.nativeElement.value;\r\n\r\n this.ref.value.set(value);\r\n\r\n this.hasValue.set(\r\n value !== null &&\r\n value !== undefined &&\r\n value !== '',\r\n );\r\n }\r\n}\r\n","import { Directive, ElementRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxError],ngx-error',\r\n standalone: true,\r\n})\r\nexport class NgxError {\r\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n}\r\n","import { Directive, ElementRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxHint],ngx-hint',\r\n standalone: true,\r\n})\r\nexport class NgxHint {\r\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n}\r\n","import { Directive, ElementRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxPrefix],ngx-prefix',\r\n standalone: true,\r\n})\r\nexport class NgxPrefix {\r\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n}\r\n","import { Directive, ElementRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxSuffix],ngx-suffix',\r\n standalone: true,\r\n})\r\nexport class NgxSuffix {\r\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-form-field.mjs","sources":["../../../projects/libs/form-field/tokens/form-field.token.ts","../../../projects/libs/form-field/components/form-field.ts","../../../projects/libs/form-field/components/form-field.html","../../../projects/libs/form-field/directives/ngx-input.directive.ts","../../../projects/libs/form-field/directives/ngx-error.directive.ts","../../../projects/libs/form-field/directives/ngx-hint.directive.ts","../../../projects/libs/form-field/directives/ngx-prefix.directive.ts","../../../projects/libs/form-field/directives/ngx-suffix.directive.ts","../../../projects/libs/form-field/ngx-kit-form-field.ts"],"sourcesContent":["import { InjectionToken, signal } from '@angular/core';\n\nexport const MX_FORM_FIELD = new InjectionToken<MgxFormFieldRef>('mx-form-field', {\n factory: () => new MgxFormFieldRef(),\n});\n\nexport class MgxFormFieldRef {\n readonly value = signal('');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n inject,\n} from '@angular/core';\n\nimport { MX_FORM_FIELD } from '../tokens/form-field.token';\n\n@Component({\n selector: 'ngx-form-field',\n standalone: true,\n templateUrl: './form-field.html',\n styleUrl: './form-field.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NgxFormField {\n protected readonly ref = inject(MX_FORM_FIELD);\n\n readonly label = input.required<string>();\n\n /**\n * Forces the label to float even when the control is empty.\n * Similar to Material's floatLabel behavior.\n */\n readonly float = input(false);\n\n /**\n * Explicit state overrides are useful when the projected control\n * is managed by Angular Forms.\n */\n readonly invalid = input(false);\n readonly required = input(false);\n readonly disabled = input(false);\n readonly readonly = input(false);\n\n readonly hintVisible = computed(() => !this.invalid());\n\n readonly errorVisible = computed(() => this.invalid());\n}\n","<div\n class=\"mx-form-field\"\n [class.mx-form-field--float]=\"float()\"\n [class.mx-form-field--disabled]=\"disabled()\"\n [class.mx-form-field--readonly]=\"readonly()\"\n [class.mx-form-field--invalid]=\"invalid()\"\n [class.mx-form-field--required]=\"required()\">\n <div class=\"mx-form-field__before\">\n <div class=\"mx-form-field__prefix\">\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\n\n <span class=\"mx-form-field__label\">\n <span [aria-label]=\"label()\">{{ label() }}</span>\n </span>\n\n <div class=\"mx-form-field__after\">\n <div class=\"mx-form-field__suffix\">\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\n </div>\n </div>\n</div>\n\n@if (hintVisible()) {\n <div class=\"mx-form-field__hint\">\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\n </div>\n}\n\n@if (errorVisible()) {\n <div class=\"mx-form-field__error-list\" role=\"alert\">\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\n </div>\n}\n","import { AfterViewInit, Directive, ElementRef, HostListener, inject, signal } from '@angular/core';\n\nimport { MX_FORM_FIELD } from '../tokens/form-field.token';\n\ntype FormControlElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n@Directive({\n selector: '[ngxInput],ngx-input',\n standalone: true,\n host: {\n '[class.has-value]': 'hasValue()',\n },\n})\nexport class NgxInput implements AfterViewInit {\n private readonly el = inject<ElementRef<FormControlElement>>(ElementRef);\n\n private readonly ref = inject(MX_FORM_FIELD);\n\n readonly hasValue = signal(false);\n\n ngAfterViewInit(): void {\n // Covers initial values coming from [value], Reactive Forms,\n // template-driven forms, browser autofill, etc.\n queueMicrotask(() => this.syncValue());\n }\n\n @HostListener('input')\n protected onInput(): void {\n this.syncValue();\n }\n\n @HostListener('change')\n protected onChange(): void {\n this.syncValue();\n }\n\n @HostListener('blur')\n protected onBlur(): void {\n this.syncValue();\n }\n\n private syncValue(): void {\n const value = this.el.nativeElement.value;\n\n this.ref.value.set(value);\n\n this.hasValue.set(value !== null && value !== undefined && value !== '');\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[ngxError],ngx-error',\n standalone: true,\n})\nexport class NgxError {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[ngxHint],ngx-hint',\n standalone: true,\n})\nexport class NgxHint {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[ngxPrefix],ngx-prefix',\n standalone: true,\n})\nexport class NgxPrefix {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[ngxSuffix],ngx-suffix',\n standalone: true,\n})\nexport class NgxSuffix {\n readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -334,11 +334,11 @@ class NgxImageViewerComponent {
334
334
  : ev.clientY;
335
335
  }
336
336
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxImageViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
337
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxImageViewerComponent, isStandalone: true, selector: "ngx-image-viewer", inputs: { images: { classPropertyName: "images", publicName: "images", isSignal: true, isRequired: true, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null }, toolbar: { classPropertyName: "toolbar", publicName: "toolbar", isSignal: true, isRequired: false, transformFunction: null }, minZoom: { classPropertyName: "minZoom", publicName: "minZoom", isSignal: true, isRequired: false, transformFunction: null }, maxZoom: { classPropertyName: "maxZoom", publicName: "maxZoom", isSignal: true, isRequired: false, transformFunction: null }, zoomStep: { classPropertyName: "zoomStep", publicName: "zoomStep", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed" }, host: { attributes: { "tabindex": "0" }, listeners: { "keydown": "onKeydown($event)" }, classAttribute: "ngx-image-viewer-host" }, viewQueries: [{ propertyName: "stageEl", first: true, predicate: ["stage"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ngx-iv-stage\" #stage [class.zoomed]=\"isZoomed()\">\r\n @if (toolbarConfig().close) {\r\n <button type=\"button\" class=\"ngx-iv-close\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\r\n }\r\n\r\n @if (activeImage(); as img) {\r\n <img\r\n class=\"ngx-iv-image\"\r\n [class.grab]=\"isZoomed()\"\r\n [src]=\"img.src\"\r\n [alt]=\"img.alt || ''\"\r\n draggable=\"false\"\r\n [style.transform]=\"stageTransform()\"\r\n (mousedown)=\"onPanPointerDown($event)\" />\r\n }\r\n\r\n @if (toolbarConfig().prevNext && images().length > 1) {\r\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--prev\" (click)=\"prev()\" aria-label=\"Previous\">\r\n \u2039\r\n </button>\r\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--next\" (click)=\"next()\" aria-label=\"Next\">\r\n \u203A\r\n </button>\r\n }\r\n\r\n @if (toolbarConfig().counter && images().length > 1) {\r\n <div class=\"ngx-iv-counter\">{{ activeIndex() + 1 }} / {{ images().length }}</div>\r\n }\r\n</div>\r\n\r\n@if (activeImage()?.caption) {\r\n <div class=\"ngx-iv-caption\">{{ activeImage()?.caption }}</div>\r\n}\r\n\r\n<div class=\"ngx-iv-toolbar\">\r\n @if (toolbarConfig().zoomOut) {\r\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">\uFF0D</button>\r\n }\r\n @if (toolbarConfig().zoomIn) {\r\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">\uFF0B</button>\r\n }\r\n @if (toolbarConfig().resetZoom) {\r\n <button type=\"button\" (click)=\"resetView()\" title=\"Reset zoom\">\u2922</button>\r\n }\r\n @if (toolbarConfig().rotateLeft) {\r\n <button type=\"button\" (click)=\"rotateLeft()\" title=\"Rotate left\">\u27F2</button>\r\n }\r\n @if (toolbarConfig().rotateRight) {\r\n <button type=\"button\" (click)=\"rotateRight()\" title=\"Rotate right\">\u27F3</button>\r\n }\r\n @if (toolbarConfig().download) {\r\n <button type=\"button\" (click)=\"download()\" title=\"Download\">\u2B73</button>\r\n }\r\n @if (toolbarConfig().print) {\r\n <button type=\"button\" (click)=\"print()\" title=\"Print\">\uD83D\uDDB6</button>\r\n }\r\n @if (toolbarConfig().fullscreen) {\r\n <button type=\"button\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">\u26F6</button>\r\n }\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;gap:.5rem;outline:none}.ngx-iv-stage{position:relative;block-size:420px;background:light-dark(#f3f4f6,#0b0b0d);border-radius:10px;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none}.ngx-iv-image{position:absolute;inset:0;margin:auto;max-inline-size:100%;max-block-size:100%;inline-size:auto;block-size:auto;object-fit:contain;cursor:default;transition:transform 60ms linear}.ngx-iv-image.grab{cursor:grab}.ngx-iv-image.grab:active{cursor:grabbing}.ngx-iv-nav{position:absolute;inset-block-start:50%;translate:0 -50%;inline-size:40px;block-size:40px;border-radius:50%;border:none;background:#00000073;color:#fff;font-size:1.5rem;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.ngx-iv-nav:hover{background:#000000a6}.ngx-iv-nav--prev{inset-inline-start:.6rem}.ngx-iv-nav--next{inset-inline-end:.6rem}.ngx-iv-counter{position:absolute;inset-block-end:.6rem;inset-inline-start:50%;translate:-50% 0;padding:.2rem .7rem;border-radius:999px;background:#00000080;color:#fff;font-size:.75rem}.ngx-iv-close{position:absolute;inset-block-start:.6rem;inset-inline-end:.6rem;inline-size:32px;block-size:32px;border-radius:50%;border:none;background:#00000073;color:#fff;cursor:pointer;z-index:2}.ngx-iv-caption{font-size:.85rem;color:light-dark(#4b5563,#a1a1aa);text-align:center}.ngx-iv-toolbar{display:flex;justify-content:center;flex-wrap:wrap;gap:.4rem}.ngx-iv-toolbar button{appearance:none;border:1px solid light-dark(#d1d5db,#3f3f46);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:8px;inline-size:36px;block-size:36px;font-size:1rem;cursor:pointer}.ngx-iv-toolbar button:hover{background:light-dark(#f3f4f6,#2c2c31)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
337
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxImageViewerComponent, isStandalone: true, selector: "ngx-image-viewer", inputs: { images: { classPropertyName: "images", publicName: "images", isSignal: true, isRequired: true, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null }, toolbar: { classPropertyName: "toolbar", publicName: "toolbar", isSignal: true, isRequired: false, transformFunction: null }, minZoom: { classPropertyName: "minZoom", publicName: "minZoom", isSignal: true, isRequired: false, transformFunction: null }, maxZoom: { classPropertyName: "maxZoom", publicName: "maxZoom", isSignal: true, isRequired: false, transformFunction: null }, zoomStep: { classPropertyName: "zoomStep", publicName: "zoomStep", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed" }, host: { attributes: { "tabindex": "0" }, listeners: { "keydown": "onKeydown($event)" }, classAttribute: "ngx-image-viewer-host" }, viewQueries: [{ propertyName: "stageEl", first: true, predicate: ["stage"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ngx-iv-stage\" #stage [class.zoomed]=\"isZoomed()\">\n @if (toolbarConfig().close) {\n <button type=\"button\" class=\"ngx-iv-close\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n\n @if (activeImage(); as img) {\n <img\n class=\"ngx-iv-image\"\n [class.grab]=\"isZoomed()\"\n [src]=\"img.src\"\n [alt]=\"img.alt || ''\"\n draggable=\"false\"\n [style.transform]=\"stageTransform()\"\n (mousedown)=\"onPanPointerDown($event)\" />\n }\n\n @if (toolbarConfig().prevNext && images().length > 1) {\n <button\n type=\"button\"\n class=\"ngx-iv-nav ngx-iv-nav--prev\"\n (click)=\"prev()\"\n aria-label=\"Previous\">\n \u2039\n </button>\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--next\" (click)=\"next()\" aria-label=\"Next\">\n \u203A\n </button>\n }\n\n @if (toolbarConfig().counter && images().length > 1) {\n <div class=\"ngx-iv-counter\">{{ activeIndex() + 1 }} / {{ images().length }}</div>\n }\n</div>\n\n@if (activeImage()?.caption) {\n <div class=\"ngx-iv-caption\">{{ activeImage()?.caption }}</div>\n}\n\n<div class=\"ngx-iv-toolbar\">\n @if (toolbarConfig().zoomOut) {\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">\uFF0D</button>\n }\n @if (toolbarConfig().zoomIn) {\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">\uFF0B</button>\n }\n @if (toolbarConfig().resetZoom) {\n <button type=\"button\" (click)=\"resetView()\" title=\"Reset zoom\">\u2922</button>\n }\n @if (toolbarConfig().rotateLeft) {\n <button type=\"button\" (click)=\"rotateLeft()\" title=\"Rotate left\">\u27F2</button>\n }\n @if (toolbarConfig().rotateRight) {\n <button type=\"button\" (click)=\"rotateRight()\" title=\"Rotate right\">\u27F3</button>\n }\n @if (toolbarConfig().download) {\n <button type=\"button\" (click)=\"download()\" title=\"Download\">\u2B73</button>\n }\n @if (toolbarConfig().print) {\n <button type=\"button\" (click)=\"print()\" title=\"Print\">\uD83D\uDDB6</button>\n }\n @if (toolbarConfig().fullscreen) {\n <button type=\"button\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">\u26F6</button>\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;gap:.5rem;outline:none}.ngx-iv-stage{position:relative;block-size:420px;background:light-dark(#f3f4f6,#0b0b0d);border-radius:10px;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none}.ngx-iv-image{position:absolute;inset:0;margin:auto;max-inline-size:100%;max-block-size:100%;inline-size:auto;block-size:auto;object-fit:contain;cursor:default;transition:transform 60ms linear}.ngx-iv-image.grab{cursor:grab}.ngx-iv-image.grab:active{cursor:grabbing}.ngx-iv-nav{position:absolute;inset-block-start:50%;translate:0 -50%;inline-size:40px;block-size:40px;border-radius:50%;border:none;background:#00000073;color:#fff;font-size:1.5rem;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.ngx-iv-nav:hover{background:#000000a6}.ngx-iv-nav--prev{inset-inline-start:.6rem}.ngx-iv-nav--next{inset-inline-end:.6rem}.ngx-iv-counter{position:absolute;inset-block-end:.6rem;inset-inline-start:50%;translate:-50% 0;padding:.2rem .7rem;border-radius:999px;background:#00000080;color:#fff;font-size:.75rem}.ngx-iv-close{position:absolute;inset-block-start:.6rem;inset-inline-end:.6rem;inline-size:32px;block-size:32px;border-radius:50%;border:none;background:#00000073;color:#fff;cursor:pointer;z-index:2}.ngx-iv-caption{font-size:.85rem;color:light-dark(#4b5563,#a1a1aa);text-align:center}.ngx-iv-toolbar{display:flex;justify-content:center;flex-wrap:wrap;gap:.4rem}.ngx-iv-toolbar button{appearance:none;border:1px solid light-dark(#d1d5db,#3f3f46);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:8px;inline-size:36px;block-size:36px;font-size:1rem;cursor:pointer}.ngx-iv-toolbar button:hover{background:light-dark(#f3f4f6,#2c2c31)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
338
338
  }
339
339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxImageViewerComponent, decorators: [{
340
340
  type: Component,
341
- args: [{ selector: 'ngx-image-viewer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-image-viewer-host', tabindex: '0' }, template: "<div class=\"ngx-iv-stage\" #stage [class.zoomed]=\"isZoomed()\">\r\n @if (toolbarConfig().close) {\r\n <button type=\"button\" class=\"ngx-iv-close\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\r\n }\r\n\r\n @if (activeImage(); as img) {\r\n <img\r\n class=\"ngx-iv-image\"\r\n [class.grab]=\"isZoomed()\"\r\n [src]=\"img.src\"\r\n [alt]=\"img.alt || ''\"\r\n draggable=\"false\"\r\n [style.transform]=\"stageTransform()\"\r\n (mousedown)=\"onPanPointerDown($event)\" />\r\n }\r\n\r\n @if (toolbarConfig().prevNext && images().length > 1) {\r\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--prev\" (click)=\"prev()\" aria-label=\"Previous\">\r\n \u2039\r\n </button>\r\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--next\" (click)=\"next()\" aria-label=\"Next\">\r\n \u203A\r\n </button>\r\n }\r\n\r\n @if (toolbarConfig().counter && images().length > 1) {\r\n <div class=\"ngx-iv-counter\">{{ activeIndex() + 1 }} / {{ images().length }}</div>\r\n }\r\n</div>\r\n\r\n@if (activeImage()?.caption) {\r\n <div class=\"ngx-iv-caption\">{{ activeImage()?.caption }}</div>\r\n}\r\n\r\n<div class=\"ngx-iv-toolbar\">\r\n @if (toolbarConfig().zoomOut) {\r\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">\uFF0D</button>\r\n }\r\n @if (toolbarConfig().zoomIn) {\r\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">\uFF0B</button>\r\n }\r\n @if (toolbarConfig().resetZoom) {\r\n <button type=\"button\" (click)=\"resetView()\" title=\"Reset zoom\">\u2922</button>\r\n }\r\n @if (toolbarConfig().rotateLeft) {\r\n <button type=\"button\" (click)=\"rotateLeft()\" title=\"Rotate left\">\u27F2</button>\r\n }\r\n @if (toolbarConfig().rotateRight) {\r\n <button type=\"button\" (click)=\"rotateRight()\" title=\"Rotate right\">\u27F3</button>\r\n }\r\n @if (toolbarConfig().download) {\r\n <button type=\"button\" (click)=\"download()\" title=\"Download\">\u2B73</button>\r\n }\r\n @if (toolbarConfig().print) {\r\n <button type=\"button\" (click)=\"print()\" title=\"Print\">\uD83D\uDDB6</button>\r\n }\r\n @if (toolbarConfig().fullscreen) {\r\n <button type=\"button\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">\u26F6</button>\r\n }\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;gap:.5rem;outline:none}.ngx-iv-stage{position:relative;block-size:420px;background:light-dark(#f3f4f6,#0b0b0d);border-radius:10px;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none}.ngx-iv-image{position:absolute;inset:0;margin:auto;max-inline-size:100%;max-block-size:100%;inline-size:auto;block-size:auto;object-fit:contain;cursor:default;transition:transform 60ms linear}.ngx-iv-image.grab{cursor:grab}.ngx-iv-image.grab:active{cursor:grabbing}.ngx-iv-nav{position:absolute;inset-block-start:50%;translate:0 -50%;inline-size:40px;block-size:40px;border-radius:50%;border:none;background:#00000073;color:#fff;font-size:1.5rem;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.ngx-iv-nav:hover{background:#000000a6}.ngx-iv-nav--prev{inset-inline-start:.6rem}.ngx-iv-nav--next{inset-inline-end:.6rem}.ngx-iv-counter{position:absolute;inset-block-end:.6rem;inset-inline-start:50%;translate:-50% 0;padding:.2rem .7rem;border-radius:999px;background:#00000080;color:#fff;font-size:.75rem}.ngx-iv-close{position:absolute;inset-block-start:.6rem;inset-inline-end:.6rem;inline-size:32px;block-size:32px;border-radius:50%;border:none;background:#00000073;color:#fff;cursor:pointer;z-index:2}.ngx-iv-caption{font-size:.85rem;color:light-dark(#4b5563,#a1a1aa);text-align:center}.ngx-iv-toolbar{display:flex;justify-content:center;flex-wrap:wrap;gap:.4rem}.ngx-iv-toolbar button{appearance:none;border:1px solid light-dark(#d1d5db,#3f3f46);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:8px;inline-size:36px;block-size:36px;font-size:1rem;cursor:pointer}.ngx-iv-toolbar button:hover{background:light-dark(#f3f4f6,#2c2c31)}\n"] }]
341
+ args: [{ selector: 'ngx-image-viewer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-image-viewer-host', tabindex: '0' }, template: "<div class=\"ngx-iv-stage\" #stage [class.zoomed]=\"isZoomed()\">\n @if (toolbarConfig().close) {\n <button type=\"button\" class=\"ngx-iv-close\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n\n @if (activeImage(); as img) {\n <img\n class=\"ngx-iv-image\"\n [class.grab]=\"isZoomed()\"\n [src]=\"img.src\"\n [alt]=\"img.alt || ''\"\n draggable=\"false\"\n [style.transform]=\"stageTransform()\"\n (mousedown)=\"onPanPointerDown($event)\" />\n }\n\n @if (toolbarConfig().prevNext && images().length > 1) {\n <button\n type=\"button\"\n class=\"ngx-iv-nav ngx-iv-nav--prev\"\n (click)=\"prev()\"\n aria-label=\"Previous\">\n \u2039\n </button>\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--next\" (click)=\"next()\" aria-label=\"Next\">\n \u203A\n </button>\n }\n\n @if (toolbarConfig().counter && images().length > 1) {\n <div class=\"ngx-iv-counter\">{{ activeIndex() + 1 }} / {{ images().length }}</div>\n }\n</div>\n\n@if (activeImage()?.caption) {\n <div class=\"ngx-iv-caption\">{{ activeImage()?.caption }}</div>\n}\n\n<div class=\"ngx-iv-toolbar\">\n @if (toolbarConfig().zoomOut) {\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">\uFF0D</button>\n }\n @if (toolbarConfig().zoomIn) {\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">\uFF0B</button>\n }\n @if (toolbarConfig().resetZoom) {\n <button type=\"button\" (click)=\"resetView()\" title=\"Reset zoom\">\u2922</button>\n }\n @if (toolbarConfig().rotateLeft) {\n <button type=\"button\" (click)=\"rotateLeft()\" title=\"Rotate left\">\u27F2</button>\n }\n @if (toolbarConfig().rotateRight) {\n <button type=\"button\" (click)=\"rotateRight()\" title=\"Rotate right\">\u27F3</button>\n }\n @if (toolbarConfig().download) {\n <button type=\"button\" (click)=\"download()\" title=\"Download\">\u2B73</button>\n }\n @if (toolbarConfig().print) {\n <button type=\"button\" (click)=\"print()\" title=\"Print\">\uD83D\uDDB6</button>\n }\n @if (toolbarConfig().fullscreen) {\n <button type=\"button\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">\u26F6</button>\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;gap:.5rem;outline:none}.ngx-iv-stage{position:relative;block-size:420px;background:light-dark(#f3f4f6,#0b0b0d);border-radius:10px;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none}.ngx-iv-image{position:absolute;inset:0;margin:auto;max-inline-size:100%;max-block-size:100%;inline-size:auto;block-size:auto;object-fit:contain;cursor:default;transition:transform 60ms linear}.ngx-iv-image.grab{cursor:grab}.ngx-iv-image.grab:active{cursor:grabbing}.ngx-iv-nav{position:absolute;inset-block-start:50%;translate:0 -50%;inline-size:40px;block-size:40px;border-radius:50%;border:none;background:#00000073;color:#fff;font-size:1.5rem;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.ngx-iv-nav:hover{background:#000000a6}.ngx-iv-nav--prev{inset-inline-start:.6rem}.ngx-iv-nav--next{inset-inline-end:.6rem}.ngx-iv-counter{position:absolute;inset-block-end:.6rem;inset-inline-start:50%;translate:-50% 0;padding:.2rem .7rem;border-radius:999px;background:#00000080;color:#fff;font-size:.75rem}.ngx-iv-close{position:absolute;inset-block-start:.6rem;inset-inline-end:.6rem;inline-size:32px;block-size:32px;border-radius:50%;border:none;background:#00000073;color:#fff;cursor:pointer;z-index:2}.ngx-iv-caption{font-size:.85rem;color:light-dark(#4b5563,#a1a1aa);text-align:center}.ngx-iv-toolbar{display:flex;justify-content:center;flex-wrap:wrap;gap:.4rem}.ngx-iv-toolbar button{appearance:none;border:1px solid light-dark(#d1d5db,#3f3f46);background:light-dark(#ffffff,#232327);color:light-dark(#374151,#d4d4d8);border-radius:8px;inline-size:36px;block-size:36px;font-size:1rem;cursor:pointer}.ngx-iv-toolbar button:hover{background:light-dark(#f3f4f6,#2c2c31)}\n"] }]
342
342
  }], ctorParameters: () => [], propDecorators: { images: [{ type: i0.Input, args: [{ isSignal: true, alias: "images", required: true }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], toolbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbar", required: false }] }], minZoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "minZoom", required: false }] }], maxZoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxZoom", required: false }] }], zoomStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoomStep", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], stageEl: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], onKeydown: [{
343
343
  type: HostListener,
344
344
  args: ['keydown', ['$event']]
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-gallery.mjs","sources":["../../../projects/libs/gallery/contracts/image-viewer-types.ts","../../../projects/libs/gallery/utils/download-print.ts","../../../projects/libs/gallery/utils/zoom-math.ts","../../../projects/libs/gallery/components/image-viewer.component.ts","../../../projects/libs/gallery/components/image-viewer.component.html","../../../projects/libs/gallery/services/image-viewer.service.ts","../../../projects/libs/gallery/ngx-kit-gallery.ts"],"sourcesContent":["export interface NgxImageViewerItem {\r\n src: string;\r\n alt?: string;\r\n caption?: string;\r\n /** نام فایل هنگام دانلود؛ نبود یعنی از روی src حدس زده می‌شه */\r\n downloadFileName?: string;\r\n}\r\n\r\n/**\r\n * هر دکمه‌ی نوار ابزار جدا فعال/غیرفعال می‌شه — دقیقاً طبق خواسته: «این\r\n * دکمه‌های کانفیگی باشه که هر کدوم خواست فعال کنه».\r\n */\r\nexport interface NgxImageViewerToolbarConfig {\r\n prevNext?: boolean;\r\n counter?: boolean;\r\n zoomIn?: boolean;\r\n zoomOut?: boolean;\r\n resetZoom?: boolean;\r\n rotateLeft?: boolean;\r\n rotateRight?: boolean;\r\n download?: boolean;\r\n print?: boolean;\r\n fullscreen?: boolean;\r\n close?: boolean;\r\n}\r\n\r\nexport const NGX_IMAGE_VIEWER_DEFAULT_TOOLBAR: Required<NgxImageViewerToolbarConfig> = {\r\n prevNext: true,\r\n counter: true,\r\n zoomIn: true,\r\n zoomOut: true,\r\n resetZoom: true,\r\n rotateLeft: true,\r\n rotateRight: true,\r\n download: true,\r\n print: true,\r\n fullscreen: true,\r\n close: false,\r\n};\r\n","/** دانلود تصویر با fetch→blob (نام‌گذاریِ درست فایل رو تضمین می‌کنه)؛ اگه CORS اجازه نداد، در تب جدید باز می‌شه */\r\nexport async function downloadImage(src: string, filename?: string): Promise<void> {\r\n try {\r\n const response = await fetch(src, { mode: 'cors' });\r\n if (!response.ok) throw new Error('fetch failed');\r\n const blob = await response.blob();\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename || guessFileName(src);\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n URL.revokeObjectURL(url);\r\n } catch {\r\n window.open(src, '_blank', 'noopener,noreferrer');\r\n }\r\n}\r\n\r\nfunction guessFileName(src: string): string {\r\n try {\r\n const url = new URL(src, typeof window !== 'undefined' ? window.location.href : undefined);\r\n const last = url.pathname.split('/').pop();\r\n return last || 'image';\r\n } catch {\r\n return 'image';\r\n }\r\n}\r\n\r\n/** یه پنجره‌ی جدید فقط با همون تصویر باز می‌کنه و بعد از لود، print می‌زنه؛ با DOM API (نه innerHTML) پس در برابر src مخرب امنه */\r\nexport function printImage(src: string): void {\r\n const win = window.open('', '_blank', 'noopener,noreferrer,width=800,height=600');\r\n if (!win) return;\r\n\r\n win.document.title = 'Print';\r\n const style = win.document.createElement('style');\r\n style.textContent =\r\n 'body{margin:0;display:flex;align-items:center;justify-content:center;min-height:100vh;background:#fff;}img{max-width:100%;max-height:100vh;}';\r\n win.document.head.appendChild(style);\r\n\r\n const img = win.document.createElement('img');\r\n img.onload = () => {\r\n win.focus();\r\n win.print();\r\n };\r\n img.src = src;\r\n win.document.body.appendChild(img);\r\n}\r\n","export interface PanZoomState {\r\n zoom: number;\r\n panX: number;\r\n panY: number;\r\n}\r\n\r\n/**\r\n * با تغییر zoom، pan رو طوری تنظیم می‌کنه که نقطه‌ی زیر cursor/انگشت‌ها\r\n * (نسبت به مرکز کانتینر) سرجاش بمونه — یعنی zoom-to-cursor به‌جای\r\n * zoom-to-center (که تجربه‌ی خیلی بهتری داره، دقیقاً مثل هر ویوئر حرفه‌ای).\r\n *\r\n * ریاضیِ پشتش: با transform=\"translate(panX,panY) scale(zoom)\"، موقعیتِ\r\n * صفحه‌ایِ یه نقطه‌ی محلیِ p (نسبت به مرکز) برابره با\r\n * center + pan + p*zoom. اول p رو از روی وضعیت فعلی حساب می‌کنیم، بعد pan\r\n * جدید رو طوری می‌سازیم که با zoom تازه، همون p به همون مختصات صفحه برسه.\r\n */\r\nexport function zoomAroundPoint(\r\n current: PanZoomState,\r\n newZoom: number,\r\n cursorX: number,\r\n cursorY: number,\r\n containerWidth: number,\r\n containerHeight: number,\r\n): PanZoomState {\r\n const centerX = containerWidth / 2;\r\n const centerY = containerHeight / 2;\r\n const localX = (cursorX - centerX - current.panX) / current.zoom;\r\n const localY = (cursorY - centerY - current.panY) / current.zoom;\r\n return {\r\n zoom: newZoom,\r\n panX: cursorX - centerX - localX * newZoom,\r\n panY: cursorY - centerY - localY * newZoom,\r\n };\r\n}\r\n\r\nexport function distanceBetweenTouches(a: Touch, b: Touch): number {\r\n return Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\r\n}\r\n\r\nexport function midpointOfTouches(a: Touch, b: Touch): { x: number; y: number } {\r\n return { x: (a.clientX + b.clientX) / 2, y: (a.clientY + b.clientY) / 2 };\r\n}\r\n\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n HostListener,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { startDragSession } from 'ngx-kit/shared';\r\nimport {\r\n NGX_IMAGE_VIEWER_DEFAULT_TOOLBAR,\r\n NgxImageViewerItem,\r\n NgxImageViewerToolbarConfig,\r\n} from '../contracts/image-viewer-types';\r\nimport { downloadImage, printImage } from '../utils/download-print';\r\nimport {\r\n clamp,\r\n distanceBetweenTouches,\r\n midpointOfTouches,\r\n zoomAroundPoint,\r\n} from '../utils/zoom-math';\r\n\r\n/**\r\n * ویوئر حرفه‌ایِ تصویر: یه لیست تصویر می‌گیره، اولی رو نشون می‌ده، با\r\n * دکمه‌های چپ/راست (مثل کاروسل) بین‌شون می‌ره، و یه نوار ابزار کاملاً\r\n * قابل‌تنظیم (هر دکمه جدا فعال/غیرفعال می‌شه) داره: زوم این/اوت/ریست،\r\n * چرخش، دانلود، پرینت، تمام‌صفحه.\r\n *\r\n * تعامل‌ها:\r\n * - اسکرول موس روی تصویر = زوم (نسبت به همون نقطه‌ی زیر cursor، نه مرکز)\r\n * - دو انگشتی روی تاچ = پینچ زوم\r\n * - وقتی زوم‌شده، درگ با موس یا تک‌انگشتی = پن\r\n * - کیبورد: ← → برای قبلی/بعدی، +/- برای زوم، Esc برای closed\r\n *\r\n * چون wheel/touchmove باید preventDefault بشن (وگرنه صفحه اسکرول/زوم\r\n * می‌شه) و انگیولار این ایونت‌ها رو به‌صورت پیش‌فرض passive رجیستر می‌کنه\r\n * (که توش preventDefault اثر نداره)، این‌ها با addEventListener دستی و\r\n * {passive:false} وصل می‌شن، نه با بایندینگ تمپلیت.\r\n *\r\n * می‌تونه هم مستقیم توی صفحه جا بگیره، هم توسط مصرف‌کننده داخل\r\n * ngx-kit/dialog (یا هر overlay دیگه) قرار بگیره — خودش به هیچ‌کدوم وابسته\r\n * نیست، فقط با closed خروجی به بیرون خبر می‌ده که «ببندم».\r\n */\r\n@Component({\r\n selector: 'ngx-image-viewer',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './image-viewer.component.html',\r\n styleUrl: './image-viewer.component.scss',\r\n host: { class: 'ngx-image-viewer-host', tabindex: '0' },\r\n})\r\nexport class NgxImageViewerComponent {\r\n images = input.required<NgxImageViewerItem[]>();\r\n startIndex = input<number>(0);\r\n toolbar = input<NgxImageViewerToolbarConfig>({});\r\n minZoom = input<number>(1);\r\n maxZoom = input<number>(6);\r\n zoomStep = input<number>(0.4);\r\n\r\n indexChange = output<number>();\r\n closed = output<void>();\r\n\r\n protected readonly activeIndex = signal(0);\r\n protected readonly zoom = signal(1);\r\n protected readonly panX = signal(0);\r\n protected readonly panY = signal(0);\r\n protected readonly rotation = signal(0);\r\n\r\n protected readonly activeImage = computed<NgxImageViewerItem | undefined>(\r\n () => this.images()[this.activeIndex()],\r\n );\r\n\r\n protected readonly toolbarConfig = computed(() => ({\r\n ...NGX_IMAGE_VIEWER_DEFAULT_TOOLBAR,\r\n ...this.toolbar(),\r\n }));\r\n\r\n protected readonly isZoomed = computed(() => this.zoom() > 1);\r\n\r\n protected readonly stageTransform = computed(\r\n () =>\r\n `translate(${this.panX()}px, ${this.panY()}px) scale(${this.zoom()}) rotate(${this.rotation()}deg)`,\r\n );\r\n\r\n private readonly stageEl = viewChild<ElementRef<HTMLElement>>('stage');\r\n private readonly hostElRef = inject(ElementRef<HTMLElement>);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private pinchStartDistance = 0;\r\n private pinchStartZoom = 1;\r\n private stopPanDrag?: () => void;\r\n\r\n constructor() {\r\n this.activeIndex.set(this.startIndex());\r\n\r\n // wheel/touch با addEventListener دستی + passive:false وصل می‌شن (دلیلش\r\n // بالای کلاس توضیح داده شده)؛ effect به‌صورت خودکار وقتی stageEl از\r\n // undefined به یه ElementRef واقعی تغییر کنه (یعنی بعد از اولین رندر)\r\n // دوباره اجرا می‌شه، پس نیازی به ngAfterViewInit نیست.\r\n effect((onCleanup) => {\r\n const stage = this.stageEl()?.nativeElement;\r\n if (!stage) return;\r\n\r\n const onWheel = (ev: WheelEvent) => {\r\n ev.preventDefault();\r\n const rect = stage.getBoundingClientRect();\r\n this.applyZoomAt(\r\n this.zoom() + (ev.deltaY < 0 ? 1 : -1) * this.zoomStep(),\r\n ev.clientX - rect.left,\r\n ev.clientY - rect.top,\r\n rect.width,\r\n rect.height,\r\n );\r\n };\r\n\r\n const onTouchStart = (ev: TouchEvent) => {\r\n if (ev.touches.length === 2) {\r\n this.stopPanDrag?.();\r\n this.pinchStartDistance = distanceBetweenTouches(ev.touches[0], ev.touches[1]);\r\n this.pinchStartZoom = this.zoom();\r\n } else if (ev.touches.length === 1 && this.isZoomed()) {\r\n this.beginPanDrag(ev);\r\n }\r\n };\r\n\r\n const onTouchMove = (ev: TouchEvent) => {\r\n if (ev.touches.length === 2 && this.pinchStartDistance > 0) {\r\n ev.preventDefault();\r\n const dist = distanceBetweenTouches(ev.touches[0], ev.touches[1]);\r\n const newZoom = (dist / this.pinchStartDistance) * this.pinchStartZoom;\r\n const rect = stage.getBoundingClientRect();\r\n const mid = midpointOfTouches(ev.touches[0], ev.touches[1]);\r\n this.applyZoomAt(newZoom, mid.x - rect.left, mid.y - rect.top, rect.width, rect.height);\r\n }\r\n };\r\n\r\n const onTouchEnd = () => {\r\n this.pinchStartDistance = 0;\r\n };\r\n\r\n stage.addEventListener('wheel', onWheel, { passive: false });\r\n stage.addEventListener('touchstart', onTouchStart, { passive: false });\r\n stage.addEventListener('touchmove', onTouchMove, { passive: false });\r\n stage.addEventListener('touchend', onTouchEnd);\r\n stage.addEventListener('touchcancel', onTouchEnd);\r\n\r\n onCleanup(() => {\r\n stage.removeEventListener('wheel', onWheel);\r\n stage.removeEventListener('touchstart', onTouchStart);\r\n stage.removeEventListener('touchmove', onTouchMove);\r\n stage.removeEventListener('touchend', onTouchEnd);\r\n stage.removeEventListener('touchcancel', onTouchEnd);\r\n });\r\n });\r\n\r\n this.destroyRef.onDestroy(() => this.stopPanDrag?.());\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n protected onKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'ArrowLeft') this.prev();\r\n else if (ev.key === 'ArrowRight') this.next();\r\n else if (ev.key === '+' || ev.key === '=') this.zoomIn();\r\n else if (ev.key === '-') this.zoomOut();\r\n else if (ev.key === 'Escape') this.closed.emit();\r\n else return;\r\n ev.preventDefault();\r\n }\r\n\r\n protected next(): void {\r\n const len = this.images().length;\r\n if (len) this.goTo((this.activeIndex() + 1) % len);\r\n }\r\n\r\n protected prev(): void {\r\n const len = this.images().length;\r\n if (len) this.goTo((this.activeIndex() - 1 + len) % len);\r\n }\r\n\r\n protected goTo(index: number): void {\r\n this.activeIndex.set(index);\r\n this.resetView();\r\n this.indexChange.emit(index);\r\n }\r\n\r\n protected zoomIn(): void {\r\n this.setZoomAtCenter(this.zoom() + this.zoomStep());\r\n }\r\n\r\n protected zoomOut(): void {\r\n this.setZoomAtCenter(this.zoom() - this.zoomStep());\r\n }\r\n\r\n protected resetView(): void {\r\n this.zoom.set(1);\r\n this.panX.set(0);\r\n this.panY.set(0);\r\n this.rotation.set(0);\r\n }\r\n\r\n protected rotateLeft(): void {\r\n this.rotation.update((r) => r - 90);\r\n }\r\n\r\n protected rotateRight(): void {\r\n this.rotation.update((r) => r + 90);\r\n }\r\n\r\n protected async download(): Promise<void> {\r\n const img = this.activeImage();\r\n if (img) await downloadImage(img.src, img.downloadFileName);\r\n }\r\n\r\n protected print(): void {\r\n const img = this.activeImage();\r\n if (img) printImage(img.src);\r\n }\r\n\r\n protected toggleFullscreen(): void {\r\n const el = this.hostElRef.nativeElement;\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen();\r\n } else {\r\n el.requestFullscreen?.();\r\n }\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n\r\n protected onPanPointerDown(ev: MouseEvent): void {\r\n if (!this.isZoomed()) return;\r\n this.beginPanDrag(ev);\r\n }\r\n\r\n private beginPanDrag(ev: MouseEvent | TouchEvent): void {\r\n ev.preventDefault();\r\n const startPanX = this.panX();\r\n const startPanY = this.panY();\r\n const startX = this.clientXOf(ev);\r\n const startY = this.clientYOf(ev);\r\n this.stopPanDrag?.();\r\n this.stopPanDrag = startDragSession({\r\n onMove: (moveEv) => {\r\n this.panX.set(startPanX + (this.clientXOf(moveEv) - startX));\r\n this.panY.set(startPanY + (this.clientYOf(moveEv) - startY));\r\n },\r\n onEnd: () => {\r\n this.stopPanDrag = undefined;\r\n },\r\n });\r\n }\r\n\r\n private setZoomAtCenter(newZoom: number): void {\r\n const stage = this.stageEl()?.nativeElement;\r\n if (!stage) {\r\n this.zoom.set(clamp(newZoom, this.minZoom(), this.maxZoom()));\r\n return;\r\n }\r\n const rect = stage.getBoundingClientRect();\r\n this.applyZoomAt(newZoom, rect.width / 2, rect.height / 2, rect.width, rect.height);\r\n }\r\n\r\n private applyZoomAt(\r\n rawZoom: number,\r\n x: number,\r\n y: number,\r\n containerWidth: number,\r\n containerHeight: number,\r\n ): void {\r\n const newZoom = clamp(rawZoom, this.minZoom(), this.maxZoom());\r\n if (newZoom === this.zoom()) return;\r\n const result = zoomAroundPoint(\r\n { zoom: this.zoom(), panX: this.panX(), panY: this.panY() },\r\n newZoom,\r\n x,\r\n y,\r\n containerWidth,\r\n containerHeight,\r\n );\r\n this.zoom.set(result.zoom);\r\n this.panX.set(result.panX);\r\n this.panY.set(result.panY);\r\n }\r\n\r\n private clientXOf(ev: MouseEvent | TouchEvent): number {\r\n return 'touches' in ev\r\n ? (ev.touches[0]?.clientX ?? ev.changedTouches[0]?.clientX ?? 0)\r\n : ev.clientX;\r\n }\r\n\r\n private clientYOf(ev: MouseEvent | TouchEvent): number {\r\n return 'touches' in ev\r\n ? (ev.touches[0]?.clientY ?? ev.changedTouches[0]?.clientY ?? 0)\r\n : ev.clientY;\r\n }\r\n}\r\n","<div class=\"ngx-iv-stage\" #stage [class.zoomed]=\"isZoomed()\">\r\n @if (toolbarConfig().close) {\r\n <button type=\"button\" class=\"ngx-iv-close\" (click)=\"close()\" aria-label=\"Close\">✕</button>\r\n }\r\n\r\n @if (activeImage(); as img) {\r\n <img\r\n class=\"ngx-iv-image\"\r\n [class.grab]=\"isZoomed()\"\r\n [src]=\"img.src\"\r\n [alt]=\"img.alt || ''\"\r\n draggable=\"false\"\r\n [style.transform]=\"stageTransform()\"\r\n (mousedown)=\"onPanPointerDown($event)\" />\r\n }\r\n\r\n @if (toolbarConfig().prevNext && images().length > 1) {\r\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--prev\" (click)=\"prev()\" aria-label=\"Previous\">\r\n ‹\r\n </button>\r\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--next\" (click)=\"next()\" aria-label=\"Next\">\r\n ›\r\n </button>\r\n }\r\n\r\n @if (toolbarConfig().counter && images().length > 1) {\r\n <div class=\"ngx-iv-counter\">{{ activeIndex() + 1 }} / {{ images().length }}</div>\r\n }\r\n</div>\r\n\r\n@if (activeImage()?.caption) {\r\n <div class=\"ngx-iv-caption\">{{ activeImage()?.caption }}</div>\r\n}\r\n\r\n<div class=\"ngx-iv-toolbar\">\r\n @if (toolbarConfig().zoomOut) {\r\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">-</button>\r\n }\r\n @if (toolbarConfig().zoomIn) {\r\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">+</button>\r\n }\r\n @if (toolbarConfig().resetZoom) {\r\n <button type=\"button\" (click)=\"resetView()\" title=\"Reset zoom\">⤢</button>\r\n }\r\n @if (toolbarConfig().rotateLeft) {\r\n <button type=\"button\" (click)=\"rotateLeft()\" title=\"Rotate left\">⟲</button>\r\n }\r\n @if (toolbarConfig().rotateRight) {\r\n <button type=\"button\" (click)=\"rotateRight()\" title=\"Rotate right\">⟳</button>\r\n }\r\n @if (toolbarConfig().download) {\r\n <button type=\"button\" (click)=\"download()\" title=\"Download\">⭳</button>\r\n }\r\n @if (toolbarConfig().print) {\r\n <button type=\"button\" (click)=\"print()\" title=\"Print\">🖶</button>\r\n }\r\n @if (toolbarConfig().fullscreen) {\r\n <button type=\"button\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">⛶</button>\r\n }\r\n</div>\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EmbeddedViewRef,\r\n EnvironmentInjector,\r\n Injectable,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgxImageViewerComponent } from '../components/image-viewer.component';\r\nimport { NgxImageViewerItem, NgxImageViewerToolbarConfig } from '../contracts/image-viewer-types';\r\n\r\nexport interface NgxImageViewerOpenOptions {\r\n startIndex?: number;\r\n toolbar?: NgxImageViewerToolbarConfig;\r\n minZoom?: number;\r\n maxZoom?: number;\r\n zoomStep?: number;\r\n}\r\n\r\n/**\r\n * راه میان‌بر برای وقتی که کاربر می‌خواد ویوئر رو داخل یه دیالوگِ تمام‌صفحه\r\n * باز کنه، بدون این‌که خودش دستی wire کنه. اگه کسی می‌خواد داخل دیالوگِ\r\n * خودش (مثلاً ngx-kit/dialog) بذارتش، کافیه مستقیم از NgxImageViewerComponent\r\n * استفاده کنه — این سرویس صرفاً یه میان‌بَره، وابستگی اجباری نیست.\r\n *\r\n * دقیقاً همون الگوی امن‌شده‌ی NgxMessageService: با Map<id, ComponentRef> و\r\n * detachView قبل از destroy، تا اون نشتی حافظه‌ای که قبلاً توی message\r\n * service پیدا و رفع شد، اینجا از اول تکرار نشه.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxImageViewerService {\r\n private readonly appRef = inject(ApplicationRef);\r\n private readonly envInjector = inject(EnvironmentInjector);\r\n private nextId = 0;\r\n private readonly openInstances = new Map<number, ComponentRef<NgxImageViewerComponent>>();\r\n\r\n open(\r\n images: NgxImageViewerItem[],\r\n options: NgxImageViewerOpenOptions = {},\r\n ): { close: () => void } {\r\n const componentRef = createComponent(NgxImageViewerComponent, {\r\n environmentInjector: this.envInjector,\r\n });\r\n\r\n componentRef.setInput('images', images);\r\n if (options.startIndex != null) componentRef.setInput('startIndex', options.startIndex);\r\n componentRef.setInput('toolbar', { close: true, ...options.toolbar });\r\n if (options.minZoom != null) componentRef.setInput('minZoom', options.minZoom);\r\n if (options.maxZoom != null) componentRef.setInput('maxZoom', options.maxZoom);\r\n if (options.zoomStep != null) componentRef.setInput('zoomStep', options.zoomStep);\r\n\r\n this.appRef.attachView(componentRef.hostView);\r\n const domElem = (componentRef.hostView as EmbeddedViewRef<unknown>).rootNodes[0] as HTMLElement;\r\n\r\n const dialog = document.createElement('dialog');\r\n dialog.className = 'ngx-image-viewer-dialog';\r\n dialog.appendChild(domElem);\r\n document.body.appendChild(dialog);\r\n dialog.showModal();\r\n domElem.focus?.();\r\n\r\n const id = this.nextId++;\r\n this.openInstances.set(id, componentRef);\r\n\r\n const close = () => {\r\n const ref = this.openInstances.get(id);\r\n if (!ref) return;\r\n try {\r\n if (dialog.open) dialog.close();\r\n } catch {\r\n /* noop */\r\n }\r\n this.appRef.detachView(ref.hostView);\r\n ref.destroy();\r\n dialog.remove();\r\n this.openInstances.delete(id);\r\n };\r\n\r\n componentRef.instance.closed.subscribe(close);\r\n dialog.addEventListener('cancel', close, { once: true });\r\n\r\n return { close };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AA0BO,MAAM,gCAAgC,GAA0C;AACrF,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,KAAK,EAAE,KAAK;;;ACrCd;AACO,eAAe,aAAa,CAAC,GAAW,EAAE,QAAiB,EAAA;AAChE,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,EAAE;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC;AACjD,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;QAClC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;QACZ,CAAC,CAAC,QAAQ,GAAG,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC;AAC3C,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,KAAK,EAAE;QACT,CAAC,CAAC,MAAM,EAAE;AACV,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;AAAE,IAAA,MAAM;QACN,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC;IACnD;AACF;AAEA,SAAS,aAAa,CAAC,GAAW,EAAA;AAChC,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;AAC1F,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;QAC1C,OAAO,IAAI,IAAI,OAAO;IACxB;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,OAAO;IAChB;AACF;AAEA;AACM,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,0CAA0C,CAAC;AACjF,IAAA,IAAI,CAAC,GAAG;QAAE;AAEV,IAAA,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACjD,IAAA,KAAK,CAAC,WAAW;AACf,QAAA,8IAA8I;IAChJ,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC7C,IAAA,GAAG,CAAC,MAAM,GAAG,MAAK;QAChB,GAAG,CAAC,KAAK,EAAE;QACX,GAAG,CAAC,KAAK,EAAE;AACb,IAAA,CAAC;AACD,IAAA,GAAG,CAAC,GAAG,GAAG,GAAG;IACb,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACpC;;ACzCA;;;;;;;;;AASG;AACG,SAAU,eAAe,CAC7B,OAAqB,EACrB,OAAe,EACf,OAAe,EACf,OAAe,EACf,cAAsB,EACtB,eAAuB,EAAA;AAEvB,IAAA,MAAM,OAAO,GAAG,cAAc,GAAG,CAAC;AAClC,IAAA,MAAM,OAAO,GAAG,eAAe,GAAG,CAAC;AACnC,IAAA,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;AAChE,IAAA,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;IAChE,OAAO;AACL,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO;AAC1C,QAAA,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO;KAC3C;AACH;AAEM,SAAU,sBAAsB,CAAC,CAAQ,EAAE,CAAQ,EAAA;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;AACjE;AAEM,SAAU,iBAAiB,CAAC,CAAQ,EAAE,CAAQ,EAAA;AAClD,IAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE;AAC3E;SAEgB,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AAC3D,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5C;;ACjBA;;;;;;;;;;;;;;;;;;;;AAoBG;MASU,uBAAuB,CAAA;IAClC,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAwB;IAC/C,UAAU,GAAG,KAAK,CAAS,CAAC;mFAAC;IAC7B,OAAO,GAAG,KAAK,CAA8B,EAAE;gFAAC;IAChD,OAAO,GAAG,KAAK,CAAS,CAAC;gFAAC;IAC1B,OAAO,GAAG,KAAK,CAAS,CAAC;gFAAC;IAC1B,QAAQ,GAAG,KAAK,CAAS,GAAG;iFAAC;IAE7B,WAAW,GAAG,MAAM,EAAU;IAC9B,MAAM,GAAG,MAAM,EAAQ;IAEJ,WAAW,GAAG,MAAM,CAAC,CAAC;oFAAC;IACvB,IAAI,GAAG,MAAM,CAAC,CAAC;6EAAC;IAChB,IAAI,GAAG,MAAM,CAAC,CAAC;6EAAC;IAChB,IAAI,GAAG,MAAM,CAAC,CAAC;6EAAC;IAChB,QAAQ,GAAG,MAAM,CAAC,CAAC;iFAAC;AAEpB,IAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oFACxC;AAEkB,IAAA,aAAa,GAAG,QAAQ,CAAC,OAAO;AACjD,QAAA,GAAG,gCAAgC;QACnC,GAAG,IAAI,CAAC,OAAO,EAAE;KAClB,CAAC;sFAAC;IAEgB,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;iFAAC;IAE1C,cAAc,GAAG,QAAQ,CAC1C,MACE,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,EAAE,CAAA,IAAA,EAAO,IAAI,CAAC,IAAI,EAAE,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,EAAE,CAAA,SAAA,EAAY,IAAI,CAAC,QAAQ,EAAE,CAAA,IAAA,CAAM;uFACtG;IAEgB,OAAO,GAAG,SAAS,CAA0B,OAAO;gFAAC;AACrD,IAAA,SAAS,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC3C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAExC,kBAAkB,GAAG,CAAC;IACtB,cAAc,GAAG,CAAC;AAClB,IAAA,WAAW;AAEnB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;;;;;AAMvC,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa;AAC3C,YAAA,IAAI,CAAC,KAAK;gBAAE;AAEZ,YAAA,MAAM,OAAO,GAAG,CAAC,EAAc,KAAI;gBACjC,EAAE,CAAC,cAAc,EAAE;AACnB,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;gBAC1C,IAAI,CAAC,WAAW,CACd,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EACxD,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EACtB,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EACrB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,CACZ;AACH,YAAA,CAAC;AAED,YAAA,MAAM,YAAY,GAAG,CAAC,EAAc,KAAI;gBACtC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,oBAAA,IAAI,CAAC,WAAW,IAAI;AACpB,oBAAA,IAAI,CAAC,kBAAkB,GAAG,sBAAsB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9E,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE;gBACnC;AAAO,qBAAA,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrD,oBAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvB;AACF,YAAA,CAAC;AAED,YAAA,MAAM,WAAW,GAAG,CAAC,EAAc,KAAI;AACrC,gBAAA,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE;oBAC1D,EAAE,CAAC,cAAc,EAAE;AACnB,oBAAA,MAAM,IAAI,GAAG,sBAAsB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjE,oBAAA,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,cAAc;AACtE,oBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;AAC1C,oBAAA,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;gBACzF;AACF,YAAA,CAAC;YAED,MAAM,UAAU,GAAG,MAAK;AACtB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC;AAC7B,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5D,YAAA,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtE,YAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACpE,YAAA,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;AAC9C,YAAA,KAAK,CAAC,gBAAgB,CAAC,aAAa,EAAE,UAAU,CAAC;YAEjD,SAAS,CAAC,MAAK;AACb,gBAAA,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;AAC3C,gBAAA,KAAK,CAAC,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC;AACrD,gBAAA,KAAK,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACnD,gBAAA,KAAK,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC;AACjD,gBAAA,KAAK,CAAC,mBAAmB,CAAC,aAAa,EAAE,UAAU,CAAC;AACtD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC;IACvD;AAGU,IAAA,SAAS,CAAC,EAAiB,EAAA;AACnC,QAAA,IAAI,EAAE,CAAC,GAAG,KAAK,WAAW;YAAE,IAAI,CAAC,IAAI,EAAE;AAClC,aAAA,IAAI,EAAE,CAAC,GAAG,KAAK,YAAY;YAAE,IAAI,CAAC,IAAI,EAAE;aACxC,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG;YAAE,IAAI,CAAC,MAAM,EAAE;AACnD,aAAA,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG;YAAE,IAAI,CAAC,OAAO,EAAE;AAClC,aAAA,IAAI,EAAE,CAAC,GAAG,KAAK,QAAQ;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;YAC3C;QACL,EAAE,CAAC,cAAc,EAAE;IACrB;IAEU,IAAI,GAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM;AAChC,QAAA,IAAI,GAAG;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;IACpD;IAEU,IAAI,GAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM;AAChC,QAAA,IAAI,GAAG;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;IAC1D;AAEU,IAAA,IAAI,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrD;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrD;IAEU,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACrC;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACrC;AAEU,IAAA,MAAM,QAAQ,GAAA;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,GAAG;YAAE,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC;IAC7D;IAEU,KAAK,GAAA;AACb,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,IAAI,GAAG;AAAE,YAAA,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B;IAEU,gBAAgB,GAAA;AACxB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AACvC,QAAA,IAAI,QAAQ,CAAC,iBAAiB,EAAE;YAC9B,QAAQ,CAAC,cAAc,EAAE;QAC3B;aAAO;AACL,YAAA,EAAE,CAAC,iBAAiB,IAAI;QAC1B;IACF;IAEU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEU,IAAA,gBAAgB,CAAC,EAAc,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;IACvB;AAEQ,IAAA,YAAY,CAAC,EAA2B,EAAA;QAC9C,EAAE,CAAC,cAAc,EAAE;AACnB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,WAAW,IAAI;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC;AAClC,YAAA,MAAM,EAAE,CAAC,MAAM,KAAI;AACjB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;YAC9B,CAAC;AACF,SAAA,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,OAAe,EAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa;QAC3C,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D;QACF;AACA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;QAC1C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;IACrF;IAEQ,WAAW,CACjB,OAAe,EACf,CAAS,EACT,CAAS,EACT,cAAsB,EACtB,eAAuB,EAAA;AAEvB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9D,QAAA,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE;YAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,eAAe,CAC5B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAC3D,OAAO,EACP,CAAC,EACD,CAAC,EACD,cAAc,EACd,eAAe,CAChB;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B;AAEQ,IAAA,SAAS,CAAC,EAA2B,EAAA;QAC3C,OAAO,SAAS,IAAI;eACf,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC;AAC/D,cAAE,EAAE,CAAC,OAAO;IAChB;AAEQ,IAAA,SAAS,CAAC,EAA2B,EAAA;QAC3C,OAAO,SAAS,IAAI;eACf,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC;AAC/D,cAAE,EAAE,CAAC,OAAO;IAChB;uGArPW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,ooCCzDpC,yxEA4DA,EAAA,MAAA,EAAA,CAAA,6tDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDHa,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBARnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EAGzC,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAA,QAAA,EAAA,yxEAAA,EAAA,MAAA,EAAA,CAAA,6tDAAA,CAAA,EAAA;owBAmCO,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA;sBA0EpE,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;AEhJrC;;;;;;;;;AASG;MAEU,qBAAqB,CAAA;AACf,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAClD,MAAM,GAAG,CAAC;AACD,IAAA,aAAa,GAAG,IAAI,GAAG,EAAiD;AAEzF,IAAA,IAAI,CACF,MAA4B,EAC5B,OAAA,GAAqC,EAAE,EAAA;AAEvC,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,uBAAuB,EAAE;YAC5D,mBAAmB,EAAE,IAAI,CAAC,WAAW;AACtC,SAAA,CAAC;AAEF,QAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;AACvC,QAAA,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI;YAAE,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;AACvF,QAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AACrE,QAAA,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI;YAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;AAC9E,QAAA,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI;YAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;AAC9E,QAAA,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI;YAAE,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC;QAEjF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC7C,MAAM,OAAO,GAAI,YAAY,CAAC,QAAqC,CAAC,SAAS,CAAC,CAAC,CAAgB;QAE/F,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,QAAA,MAAM,CAAC,SAAS,GAAG,yBAAyB;AAC5C,QAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;AAC3B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACjC,MAAM,CAAC,SAAS,EAAE;AAClB,QAAA,OAAO,CAAC,KAAK,IAAI;AAEjB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QACxB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC;QAExC,MAAM,KAAK,GAAG,MAAK;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AACtC,YAAA,IAAI,CAAC,GAAG;gBAAE;AACV,YAAA,IAAI;gBACF,IAAI,MAAM,CAAC,IAAI;oBAAE,MAAM,CAAC,KAAK,EAAE;YACjC;AAAE,YAAA,MAAM;;YAER;YACA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YACpC,GAAG,CAAC,OAAO,EAAE;YACb,MAAM,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/B,QAAA,CAAC;QAED,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;AAC7C,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAExD,OAAO,EAAE,KAAK,EAAE;IAClB;uGApDW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC9BlC;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-kit-gallery.mjs","sources":["../../../projects/libs/gallery/contracts/image-viewer-types.ts","../../../projects/libs/gallery/utils/download-print.ts","../../../projects/libs/gallery/utils/zoom-math.ts","../../../projects/libs/gallery/components/image-viewer.component.ts","../../../projects/libs/gallery/components/image-viewer.component.html","../../../projects/libs/gallery/services/image-viewer.service.ts","../../../projects/libs/gallery/ngx-kit-gallery.ts"],"sourcesContent":["export interface NgxImageViewerItem {\n src: string;\n alt?: string;\n caption?: string;\n /** نام فایل هنگام دانلود؛ نبود یعنی از روی src حدس زده می‌شه */\n downloadFileName?: string;\n}\n\n/**\n * هر دکمه‌ی نوار ابزار جدا فعال/غیرفعال می‌شه — دقیقاً طبق خواسته: «این\n * دکمه‌های کانفیگی باشه که هر کدوم خواست فعال کنه».\n */\nexport interface NgxImageViewerToolbarConfig {\n prevNext?: boolean;\n counter?: boolean;\n zoomIn?: boolean;\n zoomOut?: boolean;\n resetZoom?: boolean;\n rotateLeft?: boolean;\n rotateRight?: boolean;\n download?: boolean;\n print?: boolean;\n fullscreen?: boolean;\n close?: boolean;\n}\n\nexport const NGX_IMAGE_VIEWER_DEFAULT_TOOLBAR: Required<NgxImageViewerToolbarConfig> = {\n prevNext: true,\n counter: true,\n zoomIn: true,\n zoomOut: true,\n resetZoom: true,\n rotateLeft: true,\n rotateRight: true,\n download: true,\n print: true,\n fullscreen: true,\n close: false,\n};\n","/** دانلود تصویر با fetch→blob (نام‌گذاریِ درست فایل رو تضمین می‌کنه)؛ اگه CORS اجازه نداد، در تب جدید باز می‌شه */\nexport async function downloadImage(src: string, filename?: string): Promise<void> {\n try {\n const response = await fetch(src, { mode: 'cors' });\n if (!response.ok) throw new Error('fetch failed');\n const blob = await response.blob();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename || guessFileName(src);\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n } catch {\n window.open(src, '_blank', 'noopener,noreferrer');\n }\n}\n\nfunction guessFileName(src: string): string {\n try {\n const url = new URL(src, typeof window !== 'undefined' ? window.location.href : undefined);\n const last = url.pathname.split('/').pop();\n return last || 'image';\n } catch {\n return 'image';\n }\n}\n\n/** یه پنجره‌ی جدید فقط با همون تصویر باز می‌کنه و بعد از لود، print می‌زنه؛ با DOM API (نه innerHTML) پس در برابر src مخرب امنه */\nexport function printImage(src: string): void {\n const win = window.open('', '_blank', 'noopener,noreferrer,width=800,height=600');\n if (!win) return;\n\n win.document.title = 'Print';\n const style = win.document.createElement('style');\n style.textContent =\n 'body{margin:0;display:flex;align-items:center;justify-content:center;min-height:100vh;background:#fff;}img{max-width:100%;max-height:100vh;}';\n win.document.head.appendChild(style);\n\n const img = win.document.createElement('img');\n img.onload = () => {\n win.focus();\n win.print();\n };\n img.src = src;\n win.document.body.appendChild(img);\n}\n","export interface PanZoomState {\n zoom: number;\n panX: number;\n panY: number;\n}\n\n/**\n * با تغییر zoom، pan رو طوری تنظیم می‌کنه که نقطه‌ی زیر cursor/انگشت‌ها\n * (نسبت به مرکز کانتینر) سرجاش بمونه — یعنی zoom-to-cursor به‌جای\n * zoom-to-center (که تجربه‌ی خیلی بهتری داره، دقیقاً مثل هر ویوئر حرفه‌ای).\n *\n * ریاضیِ پشتش: با transform=\"translate(panX,panY) scale(zoom)\"، موقعیتِ\n * صفحه‌ایِ یه نقطه‌ی محلیِ p (نسبت به مرکز) برابره با\n * center + pan + p*zoom. اول p رو از روی وضعیت فعلی حساب می‌کنیم، بعد pan\n * جدید رو طوری می‌سازیم که با zoom تازه، همون p به همون مختصات صفحه برسه.\n */\nexport function zoomAroundPoint(\n current: PanZoomState,\n newZoom: number,\n cursorX: number,\n cursorY: number,\n containerWidth: number,\n containerHeight: number,\n): PanZoomState {\n const centerX = containerWidth / 2;\n const centerY = containerHeight / 2;\n const localX = (cursorX - centerX - current.panX) / current.zoom;\n const localY = (cursorY - centerY - current.panY) / current.zoom;\n return {\n zoom: newZoom,\n panX: cursorX - centerX - localX * newZoom,\n panY: cursorY - centerY - localY * newZoom,\n };\n}\n\nexport function distanceBetweenTouches(a: Touch, b: Touch): number {\n return Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);\n}\n\nexport function midpointOfTouches(a: Touch, b: Touch): { x: number; y: number } {\n return { x: (a.clientX + b.clientX) / 2, y: (a.clientY + b.clientY) / 2 };\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { startDragSession } from 'ngx-kit/shared';\nimport {\n NGX_IMAGE_VIEWER_DEFAULT_TOOLBAR,\n NgxImageViewerItem,\n NgxImageViewerToolbarConfig,\n} from '../contracts/image-viewer-types';\nimport { downloadImage, printImage } from '../utils/download-print';\nimport {\n clamp,\n distanceBetweenTouches,\n midpointOfTouches,\n zoomAroundPoint,\n} from '../utils/zoom-math';\n\n/**\n * ویوئر حرفه‌ایِ تصویر: یه لیست تصویر می‌گیره، اولی رو نشون می‌ده، با\n * دکمه‌های چپ/راست (مثل کاروسل) بین‌شون می‌ره، و یه نوار ابزار کاملاً\n * قابل‌تنظیم (هر دکمه جدا فعال/غیرفعال می‌شه) داره: زوم این/اوت/ریست،\n * چرخش، دانلود، پرینت، تمام‌صفحه.\n *\n * تعامل‌ها:\n * - اسکرول موس روی تصویر = زوم (نسبت به همون نقطه‌ی زیر cursor، نه مرکز)\n * - دو انگشتی روی تاچ = پینچ زوم\n * - وقتی زوم‌شده، درگ با موس یا تک‌انگشتی = پن\n * - کیبورد: ← → برای قبلی/بعدی، +/- برای زوم، Esc برای closed\n *\n * چون wheel/touchmove باید preventDefault بشن (وگرنه صفحه اسکرول/زوم\n * می‌شه) و انگیولار این ایونت‌ها رو به‌صورت پیش‌فرض passive رجیستر می‌کنه\n * (که توش preventDefault اثر نداره)، این‌ها با addEventListener دستی و\n * {passive:false} وصل می‌شن، نه با بایندینگ تمپلیت.\n *\n * می‌تونه هم مستقیم توی صفحه جا بگیره، هم توسط مصرف‌کننده داخل\n * ngx-kit/dialog (یا هر overlay دیگه) قرار بگیره — خودش به هیچ‌کدوم وابسته\n * نیست، فقط با closed خروجی به بیرون خبر می‌ده که «ببندم».\n */\n@Component({\n selector: 'ngx-image-viewer',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './image-viewer.component.html',\n styleUrl: './image-viewer.component.scss',\n host: { class: 'ngx-image-viewer-host', tabindex: '0' },\n})\nexport class NgxImageViewerComponent {\n images = input.required<NgxImageViewerItem[]>();\n startIndex = input<number>(0);\n toolbar = input<NgxImageViewerToolbarConfig>({});\n minZoom = input<number>(1);\n maxZoom = input<number>(6);\n zoomStep = input<number>(0.4);\n\n indexChange = output<number>();\n closed = output<void>();\n\n protected readonly activeIndex = signal(0);\n protected readonly zoom = signal(1);\n protected readonly panX = signal(0);\n protected readonly panY = signal(0);\n protected readonly rotation = signal(0);\n\n protected readonly activeImage = computed<NgxImageViewerItem | undefined>(\n () => this.images()[this.activeIndex()],\n );\n\n protected readonly toolbarConfig = computed(() => ({\n ...NGX_IMAGE_VIEWER_DEFAULT_TOOLBAR,\n ...this.toolbar(),\n }));\n\n protected readonly isZoomed = computed(() => this.zoom() > 1);\n\n protected readonly stageTransform = computed(\n () =>\n `translate(${this.panX()}px, ${this.panY()}px) scale(${this.zoom()}) rotate(${this.rotation()}deg)`,\n );\n\n private readonly stageEl = viewChild<ElementRef<HTMLElement>>('stage');\n private readonly hostElRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n private pinchStartDistance = 0;\n private pinchStartZoom = 1;\n private stopPanDrag?: () => void;\n\n constructor() {\n this.activeIndex.set(this.startIndex());\n\n // wheel/touch با addEventListener دستی + passive:false وصل می‌شن (دلیلش\n // بالای کلاس توضیح داده شده)؛ effect به‌صورت خودکار وقتی stageEl از\n // undefined به یه ElementRef واقعی تغییر کنه (یعنی بعد از اولین رندر)\n // دوباره اجرا می‌شه، پس نیازی به ngAfterViewInit نیست.\n effect((onCleanup) => {\n const stage = this.stageEl()?.nativeElement;\n if (!stage) return;\n\n const onWheel = (ev: WheelEvent) => {\n ev.preventDefault();\n const rect = stage.getBoundingClientRect();\n this.applyZoomAt(\n this.zoom() + (ev.deltaY < 0 ? 1 : -1) * this.zoomStep(),\n ev.clientX - rect.left,\n ev.clientY - rect.top,\n rect.width,\n rect.height,\n );\n };\n\n const onTouchStart = (ev: TouchEvent) => {\n if (ev.touches.length === 2) {\n this.stopPanDrag?.();\n this.pinchStartDistance = distanceBetweenTouches(ev.touches[0], ev.touches[1]);\n this.pinchStartZoom = this.zoom();\n } else if (ev.touches.length === 1 && this.isZoomed()) {\n this.beginPanDrag(ev);\n }\n };\n\n const onTouchMove = (ev: TouchEvent) => {\n if (ev.touches.length === 2 && this.pinchStartDistance > 0) {\n ev.preventDefault();\n const dist = distanceBetweenTouches(ev.touches[0], ev.touches[1]);\n const newZoom = (dist / this.pinchStartDistance) * this.pinchStartZoom;\n const rect = stage.getBoundingClientRect();\n const mid = midpointOfTouches(ev.touches[0], ev.touches[1]);\n this.applyZoomAt(newZoom, mid.x - rect.left, mid.y - rect.top, rect.width, rect.height);\n }\n };\n\n const onTouchEnd = () => {\n this.pinchStartDistance = 0;\n };\n\n stage.addEventListener('wheel', onWheel, { passive: false });\n stage.addEventListener('touchstart', onTouchStart, { passive: false });\n stage.addEventListener('touchmove', onTouchMove, { passive: false });\n stage.addEventListener('touchend', onTouchEnd);\n stage.addEventListener('touchcancel', onTouchEnd);\n\n onCleanup(() => {\n stage.removeEventListener('wheel', onWheel);\n stage.removeEventListener('touchstart', onTouchStart);\n stage.removeEventListener('touchmove', onTouchMove);\n stage.removeEventListener('touchend', onTouchEnd);\n stage.removeEventListener('touchcancel', onTouchEnd);\n });\n });\n\n this.destroyRef.onDestroy(() => this.stopPanDrag?.());\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'ArrowLeft') this.prev();\n else if (ev.key === 'ArrowRight') this.next();\n else if (ev.key === '+' || ev.key === '=') this.zoomIn();\n else if (ev.key === '-') this.zoomOut();\n else if (ev.key === 'Escape') this.closed.emit();\n else return;\n ev.preventDefault();\n }\n\n protected next(): void {\n const len = this.images().length;\n if (len) this.goTo((this.activeIndex() + 1) % len);\n }\n\n protected prev(): void {\n const len = this.images().length;\n if (len) this.goTo((this.activeIndex() - 1 + len) % len);\n }\n\n protected goTo(index: number): void {\n this.activeIndex.set(index);\n this.resetView();\n this.indexChange.emit(index);\n }\n\n protected zoomIn(): void {\n this.setZoomAtCenter(this.zoom() + this.zoomStep());\n }\n\n protected zoomOut(): void {\n this.setZoomAtCenter(this.zoom() - this.zoomStep());\n }\n\n protected resetView(): void {\n this.zoom.set(1);\n this.panX.set(0);\n this.panY.set(0);\n this.rotation.set(0);\n }\n\n protected rotateLeft(): void {\n this.rotation.update((r) => r - 90);\n }\n\n protected rotateRight(): void {\n this.rotation.update((r) => r + 90);\n }\n\n protected async download(): Promise<void> {\n const img = this.activeImage();\n if (img) await downloadImage(img.src, img.downloadFileName);\n }\n\n protected print(): void {\n const img = this.activeImage();\n if (img) printImage(img.src);\n }\n\n protected toggleFullscreen(): void {\n const el = this.hostElRef.nativeElement;\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n el.requestFullscreen?.();\n }\n }\n\n protected close(): void {\n this.closed.emit();\n }\n\n protected onPanPointerDown(ev: MouseEvent): void {\n if (!this.isZoomed()) return;\n this.beginPanDrag(ev);\n }\n\n private beginPanDrag(ev: MouseEvent | TouchEvent): void {\n ev.preventDefault();\n const startPanX = this.panX();\n const startPanY = this.panY();\n const startX = this.clientXOf(ev);\n const startY = this.clientYOf(ev);\n this.stopPanDrag?.();\n this.stopPanDrag = startDragSession({\n onMove: (moveEv) => {\n this.panX.set(startPanX + (this.clientXOf(moveEv) - startX));\n this.panY.set(startPanY + (this.clientYOf(moveEv) - startY));\n },\n onEnd: () => {\n this.stopPanDrag = undefined;\n },\n });\n }\n\n private setZoomAtCenter(newZoom: number): void {\n const stage = this.stageEl()?.nativeElement;\n if (!stage) {\n this.zoom.set(clamp(newZoom, this.minZoom(), this.maxZoom()));\n return;\n }\n const rect = stage.getBoundingClientRect();\n this.applyZoomAt(newZoom, rect.width / 2, rect.height / 2, rect.width, rect.height);\n }\n\n private applyZoomAt(\n rawZoom: number,\n x: number,\n y: number,\n containerWidth: number,\n containerHeight: number,\n ): void {\n const newZoom = clamp(rawZoom, this.minZoom(), this.maxZoom());\n if (newZoom === this.zoom()) return;\n const result = zoomAroundPoint(\n { zoom: this.zoom(), panX: this.panX(), panY: this.panY() },\n newZoom,\n x,\n y,\n containerWidth,\n containerHeight,\n );\n this.zoom.set(result.zoom);\n this.panX.set(result.panX);\n this.panY.set(result.panY);\n }\n\n private clientXOf(ev: MouseEvent | TouchEvent): number {\n return 'touches' in ev\n ? (ev.touches[0]?.clientX ?? ev.changedTouches[0]?.clientX ?? 0)\n : ev.clientX;\n }\n\n private clientYOf(ev: MouseEvent | TouchEvent): number {\n return 'touches' in ev\n ? (ev.touches[0]?.clientY ?? ev.changedTouches[0]?.clientY ?? 0)\n : ev.clientY;\n }\n}\n","<div class=\"ngx-iv-stage\" #stage [class.zoomed]=\"isZoomed()\">\n @if (toolbarConfig().close) {\n <button type=\"button\" class=\"ngx-iv-close\" (click)=\"close()\" aria-label=\"Close\">✕</button>\n }\n\n @if (activeImage(); as img) {\n <img\n class=\"ngx-iv-image\"\n [class.grab]=\"isZoomed()\"\n [src]=\"img.src\"\n [alt]=\"img.alt || ''\"\n draggable=\"false\"\n [style.transform]=\"stageTransform()\"\n (mousedown)=\"onPanPointerDown($event)\" />\n }\n\n @if (toolbarConfig().prevNext && images().length > 1) {\n <button\n type=\"button\"\n class=\"ngx-iv-nav ngx-iv-nav--prev\"\n (click)=\"prev()\"\n aria-label=\"Previous\">\n ‹\n </button>\n <button type=\"button\" class=\"ngx-iv-nav ngx-iv-nav--next\" (click)=\"next()\" aria-label=\"Next\">\n ›\n </button>\n }\n\n @if (toolbarConfig().counter && images().length > 1) {\n <div class=\"ngx-iv-counter\">{{ activeIndex() + 1 }} / {{ images().length }}</div>\n }\n</div>\n\n@if (activeImage()?.caption) {\n <div class=\"ngx-iv-caption\">{{ activeImage()?.caption }}</div>\n}\n\n<div class=\"ngx-iv-toolbar\">\n @if (toolbarConfig().zoomOut) {\n <button type=\"button\" (click)=\"zoomOut()\" title=\"Zoom out\">-</button>\n }\n @if (toolbarConfig().zoomIn) {\n <button type=\"button\" (click)=\"zoomIn()\" title=\"Zoom in\">+</button>\n }\n @if (toolbarConfig().resetZoom) {\n <button type=\"button\" (click)=\"resetView()\" title=\"Reset zoom\">⤢</button>\n }\n @if (toolbarConfig().rotateLeft) {\n <button type=\"button\" (click)=\"rotateLeft()\" title=\"Rotate left\">⟲</button>\n }\n @if (toolbarConfig().rotateRight) {\n <button type=\"button\" (click)=\"rotateRight()\" title=\"Rotate right\">⟳</button>\n }\n @if (toolbarConfig().download) {\n <button type=\"button\" (click)=\"download()\" title=\"Download\">⭳</button>\n }\n @if (toolbarConfig().print) {\n <button type=\"button\" (click)=\"print()\" title=\"Print\">🖶</button>\n }\n @if (toolbarConfig().fullscreen) {\n <button type=\"button\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">⛶</button>\n }\n</div>\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EmbeddedViewRef,\n EnvironmentInjector,\n Injectable,\n inject,\n} from '@angular/core';\nimport { NgxImageViewerComponent } from '../components/image-viewer.component';\nimport { NgxImageViewerItem, NgxImageViewerToolbarConfig } from '../contracts/image-viewer-types';\n\nexport interface NgxImageViewerOpenOptions {\n startIndex?: number;\n toolbar?: NgxImageViewerToolbarConfig;\n minZoom?: number;\n maxZoom?: number;\n zoomStep?: number;\n}\n\n/**\n * راه میان‌بر برای وقتی که کاربر می‌خواد ویوئر رو داخل یه دیالوگِ تمام‌صفحه\n * باز کنه، بدون این‌که خودش دستی wire کنه. اگه کسی می‌خواد داخل دیالوگِ\n * خودش (مثلاً ngx-kit/dialog) بذارتش، کافیه مستقیم از NgxImageViewerComponent\n * استفاده کنه — این سرویس صرفاً یه میان‌بَره، وابستگی اجباری نیست.\n *\n * دقیقاً همون الگوی امن‌شده‌ی NgxMessageService: با Map<id, ComponentRef> و\n * detachView قبل از destroy، تا اون نشتی حافظه‌ای که قبلاً توی message\n * service پیدا و رفع شد، اینجا از اول تکرار نشه.\n */\n@Injectable({ providedIn: 'root' })\nexport class NgxImageViewerService {\n private readonly appRef = inject(ApplicationRef);\n private readonly envInjector = inject(EnvironmentInjector);\n private nextId = 0;\n private readonly openInstances = new Map<number, ComponentRef<NgxImageViewerComponent>>();\n\n open(\n images: NgxImageViewerItem[],\n options: NgxImageViewerOpenOptions = {},\n ): { close: () => void } {\n const componentRef = createComponent(NgxImageViewerComponent, {\n environmentInjector: this.envInjector,\n });\n\n componentRef.setInput('images', images);\n if (options.startIndex != null) componentRef.setInput('startIndex', options.startIndex);\n componentRef.setInput('toolbar', { close: true, ...options.toolbar });\n if (options.minZoom != null) componentRef.setInput('minZoom', options.minZoom);\n if (options.maxZoom != null) componentRef.setInput('maxZoom', options.maxZoom);\n if (options.zoomStep != null) componentRef.setInput('zoomStep', options.zoomStep);\n\n this.appRef.attachView(componentRef.hostView);\n const domElem = (componentRef.hostView as EmbeddedViewRef<unknown>).rootNodes[0] as HTMLElement;\n\n const dialog = document.createElement('dialog');\n dialog.className = 'ngx-image-viewer-dialog';\n dialog.appendChild(domElem);\n document.body.appendChild(dialog);\n dialog.showModal();\n domElem.focus?.();\n\n const id = this.nextId++;\n this.openInstances.set(id, componentRef);\n\n const close = () => {\n const ref = this.openInstances.get(id);\n if (!ref) return;\n try {\n if (dialog.open) dialog.close();\n } catch {\n /* noop */\n }\n this.appRef.detachView(ref.hostView);\n ref.destroy();\n dialog.remove();\n this.openInstances.delete(id);\n };\n\n componentRef.instance.closed.subscribe(close);\n dialog.addEventListener('cancel', close, { once: true });\n\n return { close };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}