@radix-ng/primitives 1.0.5 → 1.0.6

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 (123) hide show
  1. package/fesm2022/radix-ng-primitives-accordion.mjs +35 -27
  2. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  3. package/fesm2022/radix-ng-primitives-alert-dialog.mjs +34 -34
  4. package/fesm2022/radix-ng-primitives-arrow.mjs +3 -3
  5. package/fesm2022/radix-ng-primitives-aspect-ratio.mjs +5 -4
  6. package/fesm2022/radix-ng-primitives-aspect-ratio.mjs.map +1 -1
  7. package/fesm2022/radix-ng-primitives-autocomplete.mjs +175 -125
  8. package/fesm2022/radix-ng-primitives-autocomplete.mjs.map +1 -1
  9. package/fesm2022/radix-ng-primitives-avatar.mjs +25 -19
  10. package/fesm2022/radix-ng-primitives-avatar.mjs.map +1 -1
  11. package/fesm2022/radix-ng-primitives-button.mjs +11 -7
  12. package/fesm2022/radix-ng-primitives-button.mjs.map +1 -1
  13. package/fesm2022/radix-ng-primitives-calendar.mjs +140 -90
  14. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  15. package/fesm2022/radix-ng-primitives-checkbox.mjs +61 -40
  16. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  17. package/fesm2022/radix-ng-primitives-collapsible.mjs +35 -24
  18. package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
  19. package/fesm2022/radix-ng-primitives-combobox.mjs +278 -177
  20. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -1
  21. package/fesm2022/radix-ng-primitives-composite.mjs +50 -33
  22. package/fesm2022/radix-ng-primitives-composite.mjs.map +1 -1
  23. package/fesm2022/radix-ng-primitives-config.mjs +7 -5
  24. package/fesm2022/radix-ng-primitives-config.mjs.map +1 -1
  25. package/fesm2022/radix-ng-primitives-context-menu.mjs +48 -22
  26. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  27. package/fesm2022/radix-ng-primitives-core.mjs +44 -28
  28. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  29. package/fesm2022/radix-ng-primitives-cropper.mjs +73 -45
  30. package/fesm2022/radix-ng-primitives-cropper.mjs.map +1 -1
  31. package/fesm2022/radix-ng-primitives-date-field.mjs +70 -40
  32. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  33. package/fesm2022/radix-ng-primitives-dialog.mjs +93 -67
  34. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  35. package/fesm2022/radix-ng-primitives-direction-provider.mjs +5 -4
  36. package/fesm2022/radix-ng-primitives-direction-provider.mjs.map +1 -1
  37. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs +20 -16
  38. package/fesm2022/radix-ng-primitives-dismissable-layer.mjs.map +1 -1
  39. package/fesm2022/radix-ng-primitives-drawer.mjs +107 -81
  40. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  41. package/fesm2022/radix-ng-primitives-editable.mjs +53 -39
  42. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  43. package/fesm2022/radix-ng-primitives-field.mjs +69 -42
  44. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-fieldset.mjs +8 -7
  46. package/fesm2022/radix-ng-primitives-fieldset.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs +77 -40
  48. package/fesm2022/radix-ng-primitives-floating-focus-manager.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-focus-guards.mjs +3 -3
  50. package/fesm2022/radix-ng-primitives-focus-scope.mjs +7 -5
  51. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-form.mjs +25 -16
  53. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-input.mjs +41 -22
  55. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-label.mjs +7 -5
  57. package/fesm2022/radix-ng-primitives-label.mjs.map +1 -1
  58. package/fesm2022/radix-ng-primitives-menu.mjs +274 -154
  59. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-menubar.mjs +35 -17
  61. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-meter.mjs +41 -30
  63. package/fesm2022/radix-ng-primitives-meter.mjs.map +1 -1
  64. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +220 -183
  65. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  66. package/fesm2022/radix-ng-primitives-number-field.mjs +87 -59
  67. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  68. package/fesm2022/radix-ng-primitives-pagination.mjs +48 -38
  69. package/fesm2022/radix-ng-primitives-pagination.mjs.map +1 -1
  70. package/fesm2022/radix-ng-primitives-popover.mjs +150 -107
  71. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  72. package/fesm2022/radix-ng-primitives-popper.mjs +79 -47
  73. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  74. package/fesm2022/radix-ng-primitives-portal.mjs +20 -13
  75. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  76. package/fesm2022/radix-ng-primitives-presence.mjs +3 -3
  77. package/fesm2022/radix-ng-primitives-preview-card.mjs +119 -74
  78. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  79. package/fesm2022/radix-ng-primitives-progress.mjs +43 -31
  80. package/fesm2022/radix-ng-primitives-progress.mjs.map +1 -1
  81. package/fesm2022/radix-ng-primitives-radio.mjs +58 -35
  82. package/fesm2022/radix-ng-primitives-radio.mjs.map +1 -1
  83. package/fesm2022/radix-ng-primitives-scroll-area.mjs +54 -38
  84. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -1
  85. package/fesm2022/radix-ng-primitives-select.mjs +595 -102
  86. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  87. package/fesm2022/radix-ng-primitives-separator.mjs +7 -5
  88. package/fesm2022/radix-ng-primitives-separator.mjs.map +1 -1
  89. package/fesm2022/radix-ng-primitives-slider.mjs +101 -63
  90. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  91. package/fesm2022/radix-ng-primitives-stepper.mjs +53 -39
  92. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  93. package/fesm2022/radix-ng-primitives-switch.mjs +23 -18
  94. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  95. package/fesm2022/radix-ng-primitives-tabs.mjs +72 -47
  96. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  97. package/fesm2022/radix-ng-primitives-time-field.mjs +72 -41
  98. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  99. package/fesm2022/radix-ng-primitives-toast.mjs +75 -56
  100. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -1
  101. package/fesm2022/radix-ng-primitives-toggle-group.mjs +29 -19
  102. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  103. package/fesm2022/radix-ng-primitives-toggle.mjs +16 -11
  104. package/fesm2022/radix-ng-primitives-toggle.mjs.map +1 -1
  105. package/fesm2022/radix-ng-primitives-toolbar.mjs +38 -30
  106. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  107. package/fesm2022/radix-ng-primitives-tooltip.mjs +118 -63
  108. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  109. package/fesm2022/radix-ng-primitives-visually-hidden.mjs +31 -20
  110. package/fesm2022/radix-ng-primitives-visually-hidden.mjs.map +1 -1
  111. package/package.json +2 -2
  112. package/types/radix-ng-primitives-autocomplete.d.ts +3 -1
  113. package/types/radix-ng-primitives-combobox.d.ts +28 -9
  114. package/types/radix-ng-primitives-context-menu.d.ts +2 -0
  115. package/types/radix-ng-primitives-dialog.d.ts +6 -3
  116. package/types/radix-ng-primitives-floating-focus-manager.d.ts +11 -0
  117. package/types/radix-ng-primitives-menu.d.ts +47 -15
  118. package/types/radix-ng-primitives-menubar.d.ts +6 -1
  119. package/types/radix-ng-primitives-navigation-menu.d.ts +8 -6
  120. package/types/radix-ng-primitives-popover.d.ts +12 -4
  121. package/types/radix-ng-primitives-preview-card.d.ts +18 -5
  122. package/types/radix-ng-primitives-select.d.ts +186 -391
  123. package/types/radix-ng-primitives-tooltip.d.ts +17 -3
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, input, Component, inject, ElementRef, Injector, PLATFORM_ID, numberAttribute, booleanAttribute, output, signal, computed, afterNextRender, effect, untracked, NgModule } from '@angular/core';
2
+ import { Directive, input, ChangeDetectionStrategy, Component, inject, ElementRef, Injector, PLATFORM_ID, numberAttribute, booleanAttribute, output, signal, computed, afterNextRender, effect, untracked, NgModule } from '@angular/core';
3
3
  import { createContext, clamp, injectId, resizeEffect } from '@radix-ng/primitives/core';
4
4
  import { isPlatformBrowser } from '@angular/common';
5
5
 
@@ -9,10 +9,10 @@ class RdxCropperCropAreaDirective {
9
9
  constructor() {
10
10
  this.rootContext = injectCropperRootContext();
11
11
  }
12
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperCropAreaDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
13
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxCropperCropAreaDirective, isStandalone: true, selector: "[rdxCropperCropArea]", host: { properties: { "style": "rootContext.cropAreaStyle()" } }, ngImport: i0 }); }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperCropAreaDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
13
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: RdxCropperCropAreaDirective, isStandalone: true, selector: "[rdxCropperCropArea]", host: { properties: { "style": "rootContext.cropAreaStyle()" } }, ngImport: i0 }); }
14
14
  }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperCropAreaDirective, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperCropAreaDirective, decorators: [{
16
16
  type: Directive,
17
17
  args: [{
18
18
  selector: '[rdxCropperCropArea]',
@@ -26,10 +26,10 @@ class RdxCropperDescriptionDirective {
26
26
  constructor() {
27
27
  this.rootContext = injectCropperRootContext();
28
28
  }
29
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
30
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxCropperDescriptionDirective, isStandalone: true, selector: "[rdxCropperDescription]", host: { properties: { "attr.id": "rootContext.descriptionId" } }, ngImport: i0 }); }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
30
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: RdxCropperDescriptionDirective, isStandalone: true, selector: "[rdxCropperDescription]", host: { properties: { "attr.id": "rootContext.descriptionId" } }, ngImport: i0 }); }
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperDescriptionDirective, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperDescriptionDirective, decorators: [{
33
33
  type: Directive,
34
34
  args: [{
35
35
  selector: '[rdxCropperDescription]',
@@ -42,17 +42,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
42
42
  class RdxCropperImageComponent {
43
43
  constructor() {
44
44
  this.rootContext = injectCropperRootContext();
45
- this.imgClass = input(...(ngDevMode ? [undefined, { debugName: "imgClass" }] : /* istanbul ignore next */ []));
46
- this.imgStyles = input(...(ngDevMode ? [undefined, { debugName: "imgStyles" }] : /* istanbul ignore next */ []));
45
+ this.imgClass = input(/* @ts-ignore */
46
+ ...(ngDevMode ? [undefined, { debugName: "imgClass" }] : /* istanbul ignore next */ []));
47
+ this.imgStyles = input(/* @ts-ignore */
48
+ ...(ngDevMode ? [undefined, { debugName: "imgStyles" }] : /* istanbul ignore next */ []));
47
49
  /**
48
50
  * `alt` text for the rendered image. Defaults to `''` (decorative — screen readers skip it, since
49
51
  * the cropper widget describes itself via the root's label/description). Set a non-empty value to
50
52
  * give the image a meaningful accessible name.
51
53
  */
52
- this.imgAlt = input('', ...(ngDevMode ? [{ debugName: "imgAlt" }] : /* istanbul ignore next */ []));
54
+ this.imgAlt = input('', /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "imgAlt" }] : /* istanbul ignore next */ []));
53
56
  }
54
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
55
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: RdxCropperImageComponent, isStandalone: true, selector: "[rdxCropperImage]", inputs: { imgClass: { classPropertyName: "imgClass", publicName: "imgClass", isSignal: true, isRequired: false, transformFunction: null }, imgStyles: { classPropertyName: "imgStyles", publicName: "imgStyles", isSignal: true, isRequired: false, transformFunction: null }, imgAlt: { classPropertyName: "imgAlt", publicName: "imgAlt", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style": "rootContext.imageWrapperStyle()" } }, ngImport: i0, template: `
57
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
58
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: RdxCropperImageComponent, isStandalone: true, selector: "[rdxCropperImage]", inputs: { imgClass: { classPropertyName: "imgClass", publicName: "imgClass", isSignal: true, isRequired: false, transformFunction: null }, imgStyles: { classPropertyName: "imgStyles", publicName: "imgStyles", isSignal: true, isRequired: false, transformFunction: null }, imgAlt: { classPropertyName: "imgAlt", publicName: "imgAlt", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style": "rootContext.imageWrapperStyle()" } }, ngImport: i0, template: `
56
59
  <img
57
60
  [class]="imgClass()"
58
61
  [src]="rootContext.image()"
@@ -60,11 +63,12 @@ class RdxCropperImageComponent {
60
63
  [draggable]="false"
61
64
  [alt]="imgAlt()"
62
65
  />
63
- `, isInline: true }); }
66
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.Eager }); }
64
67
  }
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperImageComponent, decorators: [{
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperImageComponent, decorators: [{
66
69
  type: Component,
67
70
  args: [{
71
+ changeDetection: ChangeDetectionStrategy.Eager,
68
72
  selector: '[rdxCropperImage]',
69
73
  host: {
70
74
  '[style]': 'rootContext.imageWrapperStyle()'
@@ -159,7 +163,8 @@ class RdxCropperRootDirective {
159
163
  this.injector = inject(Injector);
160
164
  this.isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
161
165
  this.CROPPER_DESC_WARN_MESSAGE = `Warning: \`Cropper\` requires a description element for accessibility.`;
162
- this.image = input.required(...(ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []));
166
+ this.image = input.required(/* @ts-ignore */
167
+ ...(ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []));
163
168
  this.cropPadding = input(25, { ...(ngDevMode ? { debugName: "cropPadding" } : /* istanbul ignore next */ {}), transform: numberAttribute });
164
169
  this.aspectRatio = input(1, { ...(ngDevMode ? { debugName: "aspectRatio" } : /* istanbul ignore next */ {}), transform: numberAttribute });
165
170
  this.minZoom = input(1, { ...(ngDevMode ? { debugName: "minZoom" } : /* istanbul ignore next */ {}), transform: numberAttribute });
@@ -171,16 +176,20 @@ class RdxCropperRootDirective {
171
176
  this.zoomKeyboardStep = input(0.1, { ...(ngDevMode ? { debugName: "zoomKeyboardStep" } : /* istanbul ignore next */ {}), transform: numberAttribute });
172
177
  this.zoom = input(undefined, { ...(ngDevMode ? { debugName: "zoom" } : /* istanbul ignore next */ {}), transform: numberAttribute });
173
178
  /** Accessible name for the cropper widget. */
174
- this.ariaLabel = input('Interactive image cropper', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
179
+ this.ariaLabel = input('Interactive image cropper', /* @ts-ignore */
180
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
175
181
  /** Disables all interaction (drag, wheel/pinch zoom, keyboard); exposed as `data-disabled`. */
176
182
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
177
183
  this.onCropChange = output();
178
184
  this.onZoomChange = output();
179
185
  // State signals
180
- this.imgWidth = signal(null, ...(ngDevMode ? [{ debugName: "imgWidth" }] : /* istanbul ignore next */ []));
181
- this.imgHeight = signal(null, ...(ngDevMode ? [{ debugName: "imgHeight" }] : /* istanbul ignore next */ []));
186
+ this.imgWidth = signal(null, /* @ts-ignore */
187
+ ...(ngDevMode ? [{ debugName: "imgWidth" }] : /* istanbul ignore next */ []));
188
+ this.imgHeight = signal(null, /* @ts-ignore */
189
+ ...(ngDevMode ? [{ debugName: "imgHeight" }] : /* istanbul ignore next */ []));
182
190
  /** Raw content-box size (px) of the root, fed by the ResizeObserver / initial measure. */
183
- this.containerSize = signal({ width: 0, height: 0 }, ...(ngDevMode ? [{ debugName: "containerSize" }] : /* istanbul ignore next */ []));
191
+ this.containerSize = signal({ width: 0, height: 0 }, /* @ts-ignore */
192
+ ...(ngDevMode ? [{ debugName: "containerSize" }] : /* istanbul ignore next */ []));
184
193
  /**
185
194
  * Crop-area size derived from the container minus padding, fitted to `aspectRatio`. A `computed`
186
195
  * (not a written signal) so it stays reactive to `aspectRatio` / `cropPadding` changes, not only
@@ -199,20 +208,30 @@ class RdxCropperRootDirective {
199
208
  return { width: maxPossibleHeight * aspectRatio, height: maxPossibleHeight };
200
209
  }
201
210
  return { width: maxPossibleWidth, height: maxPossibleWidth / aspectRatio };
202
- }, ...(ngDevMode ? [{ debugName: "cropAreaSize" }] : /* istanbul ignore next */ []));
203
- this.cropAreaWidth = computed(() => this.cropAreaSize().width, ...(ngDevMode ? [{ debugName: "cropAreaWidth" }] : /* istanbul ignore next */ []));
204
- this.cropAreaHeight = computed(() => this.cropAreaSize().height, ...(ngDevMode ? [{ debugName: "cropAreaHeight" }] : /* istanbul ignore next */ []));
205
- this.imageWrapperWidth = signal(0, ...(ngDevMode ? [{ debugName: "imageWrapperWidth" }] : /* istanbul ignore next */ []));
206
- this.imageWrapperHeight = signal(0, ...(ngDevMode ? [{ debugName: "imageWrapperHeight" }] : /* istanbul ignore next */ []));
211
+ }, /* @ts-ignore */
212
+ ...(ngDevMode ? [{ debugName: "cropAreaSize" }] : /* istanbul ignore next */ []));
213
+ this.cropAreaWidth = computed(() => this.cropAreaSize().width, /* @ts-ignore */
214
+ ...(ngDevMode ? [{ debugName: "cropAreaWidth" }] : /* istanbul ignore next */ []));
215
+ this.cropAreaHeight = computed(() => this.cropAreaSize().height, /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "cropAreaHeight" }] : /* istanbul ignore next */ []));
217
+ this.imageWrapperWidth = signal(0, /* @ts-ignore */
218
+ ...(ngDevMode ? [{ debugName: "imageWrapperWidth" }] : /* istanbul ignore next */ []));
219
+ this.imageWrapperHeight = signal(0, /* @ts-ignore */
220
+ ...(ngDevMode ? [{ debugName: "imageWrapperHeight" }] : /* istanbul ignore next */ []));
207
221
  /** Raw (unclamped) pan-offset intent (px) written by gestures; clamping lives in `clampedOffset`. */
208
- this.offset = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
209
- this.internalZoom = signal(this.minZoom(), ...(ngDevMode ? [{ debugName: "internalZoom" }] : /* istanbul ignore next */ []));
210
- this.isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
222
+ this.offset = signal({ x: 0, y: 0 }, /* @ts-ignore */
223
+ ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
224
+ this.internalZoom = signal(this.minZoom(), /* @ts-ignore */
225
+ ...(ngDevMode ? [{ debugName: "internalZoom" }] : /* istanbul ignore next */ []));
226
+ this.isDragging = signal(false, /* @ts-ignore */
227
+ ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
211
228
  // SSR-stable, deterministic id (the project's CDK-free `_IdGenerator` replacement) so the
212
229
  // `aria-describedby` reference matches between server and client renders.
213
230
  this.descriptionId = injectId('rdx-cropper-description-');
214
- this.isZoomControlled = computed(() => this.zoom() !== undefined, ...(ngDevMode ? [{ debugName: "isZoomControlled" }] : /* istanbul ignore next */ []));
215
- this.effectiveZoom = computed(() => (this.isZoomControlled() ? this.zoom() : this.internalZoom()), ...(ngDevMode ? [{ debugName: "effectiveZoom" }] : /* istanbul ignore next */ []));
231
+ this.isZoomControlled = computed(() => this.zoom() !== undefined, /* @ts-ignore */
232
+ ...(ngDevMode ? [{ debugName: "isZoomControlled" }] : /* istanbul ignore next */ []));
233
+ this.effectiveZoom = computed(() => (this.isZoomControlled() ? this.zoom() : this.internalZoom()), /* @ts-ignore */
234
+ ...(ngDevMode ? [{ debugName: "effectiveZoom" }] : /* istanbul ignore next */ []));
216
235
  /**
217
236
  * The applied pan offset (px): the raw intent clamped to keep the image covering the crop window
218
237
  * at the current geometry/zoom. Derived (not an effect) so it self-corrects when the container
@@ -230,13 +249,20 @@ class RdxCropperRootDirective {
230
249
  height: this.imgHeight()
231
250
  }), { ...(ngDevMode ? { debugName: "cropData" } : /* istanbul ignore next */ {}), equal: areaEqual });
232
251
  // Refs
233
- this.dragStartPoint = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "dragStartPoint" }] : /* istanbul ignore next */ []));
234
- this.dragStartOffset = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "dragStartOffset" }] : /* istanbul ignore next */ []));
235
- this.latestZoom = signal(this.minZoom(), ...(ngDevMode ? [{ debugName: "latestZoom" }] : /* istanbul ignore next */ []));
236
- this.initialPinchDistance = signal(0, ...(ngDevMode ? [{ debugName: "initialPinchDistance" }] : /* istanbul ignore next */ []));
237
- this.initialPinchZoom = signal(1, ...(ngDevMode ? [{ debugName: "initialPinchZoom" }] : /* istanbul ignore next */ []));
238
- this.isPinching = signal(false, ...(ngDevMode ? [{ debugName: "isPinching" }] : /* istanbul ignore next */ []));
239
- this.hasWarned = signal(false, ...(ngDevMode ? [{ debugName: "hasWarned" }] : /* istanbul ignore next */ []));
252
+ this.dragStartPoint = signal({ x: 0, y: 0 }, /* @ts-ignore */
253
+ ...(ngDevMode ? [{ debugName: "dragStartPoint" }] : /* istanbul ignore next */ []));
254
+ this.dragStartOffset = signal({ x: 0, y: 0 }, /* @ts-ignore */
255
+ ...(ngDevMode ? [{ debugName: "dragStartOffset" }] : /* istanbul ignore next */ []));
256
+ this.latestZoom = signal(this.minZoom(), /* @ts-ignore */
257
+ ...(ngDevMode ? [{ debugName: "latestZoom" }] : /* istanbul ignore next */ []));
258
+ this.initialPinchDistance = signal(0, /* @ts-ignore */
259
+ ...(ngDevMode ? [{ debugName: "initialPinchDistance" }] : /* istanbul ignore next */ []));
260
+ this.initialPinchZoom = signal(1, /* @ts-ignore */
261
+ ...(ngDevMode ? [{ debugName: "initialPinchZoom" }] : /* istanbul ignore next */ []));
262
+ this.isPinching = signal(false, /* @ts-ignore */
263
+ ...(ngDevMode ? [{ debugName: "isPinching" }] : /* istanbul ignore next */ []));
264
+ this.hasWarned = signal(false, /* @ts-ignore */
265
+ ...(ngDevMode ? [{ debugName: "hasWarned" }] : /* istanbul ignore next */ []));
240
266
  /**
241
267
  * Inline style for the image wrapper: measured size, centered in the root, then translated and
242
268
  * scaled by the current pan offset and zoom. A `computed` (not a method) so the `[style]` binding
@@ -257,12 +283,14 @@ class RdxCropperRootDirective {
257
283
  top: `calc(50% - ${wrapperH / 2}px)`,
258
284
  willChange: 'transform'
259
285
  };
260
- }, ...(ngDevMode ? [{ debugName: "imageWrapperStyle" }] : /* istanbul ignore next */ []));
286
+ }, /* @ts-ignore */
287
+ ...(ngDevMode ? [{ debugName: "imageWrapperStyle" }] : /* istanbul ignore next */ []));
261
288
  /** Inline style for the crop-area overlay (its measured width/height). */
262
289
  this.cropAreaStyle = computed(() => ({
263
290
  width: `${this.cropAreaWidth()}px`,
264
291
  height: `${this.cropAreaHeight()}px`
265
- }), ...(ngDevMode ? [{ debugName: "cropAreaStyle" }] : /* istanbul ignore next */ []));
292
+ }), /* @ts-ignore */
293
+ ...(ngDevMode ? [{ debugName: "cropAreaStyle" }] : /* istanbul ignore next */ []));
266
294
  afterNextRender(() => {
267
295
  this.initializeContainerDimensions();
268
296
  });
@@ -604,10 +632,10 @@ class RdxCropperRootDirective {
604
632
  // Anchor at the crop center (pointer 0,0 relative to center) against the live zoom/offset.
605
633
  this.zoomToPoint(0, 0, this.effectiveZoom() + delta, this.effectiveZoom(), this.clampedOffset());
606
634
  }
607
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
608
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxCropperRootDirective, isStandalone: true, selector: "[rdxCropperRoot]", inputs: { image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: true, transformFunction: null }, cropPadding: { classPropertyName: "cropPadding", publicName: "cropPadding", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", 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 }, zoomSensitivity: { classPropertyName: "zoomSensitivity", publicName: "zoomSensitivity", isSignal: true, isRequired: false, transformFunction: null }, keyboardStep: { classPropertyName: "keyboardStep", publicName: "keyboardStep", isSignal: true, isRequired: false, transformFunction: null }, zoomKeyboardStep: { classPropertyName: "zoomKeyboardStep", publicName: "zoomKeyboardStep", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCropChange: "onCropChange", onZoomChange: "onZoomChange" }, host: { attributes: { "role": "application" }, properties: { "attr.tabindex": "disabled() ? -1 : 0", "attr.aria-label": "ariaLabel()", "attr.aria-describedby": "descriptionId", "attr.aria-disabled": "disabled() ? \"true\" : undefined", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-dragging": "isDragging() ? \"\" : undefined" } }, providers: [provideCropperRootContext(rootContext)], ngImport: i0 }); }
635
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
636
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: RdxCropperRootDirective, isStandalone: true, selector: "[rdxCropperRoot]", inputs: { image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: true, transformFunction: null }, cropPadding: { classPropertyName: "cropPadding", publicName: "cropPadding", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", 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 }, zoomSensitivity: { classPropertyName: "zoomSensitivity", publicName: "zoomSensitivity", isSignal: true, isRequired: false, transformFunction: null }, keyboardStep: { classPropertyName: "keyboardStep", publicName: "keyboardStep", isSignal: true, isRequired: false, transformFunction: null }, zoomKeyboardStep: { classPropertyName: "zoomKeyboardStep", publicName: "zoomKeyboardStep", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCropChange: "onCropChange", onZoomChange: "onZoomChange" }, host: { attributes: { "role": "application" }, properties: { "attr.tabindex": "disabled() ? -1 : 0", "attr.aria-label": "ariaLabel()", "attr.aria-describedby": "descriptionId", "attr.aria-disabled": "disabled() ? \"true\" : undefined", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-dragging": "isDragging() ? \"\" : undefined" } }, providers: [provideCropperRootContext(rootContext)], ngImport: i0 }); }
609
637
  }
610
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperRootDirective, decorators: [{
638
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperRootDirective, decorators: [{
611
639
  type: Directive,
612
640
  args: [{
613
641
  selector: '[rdxCropperRoot]',
@@ -635,17 +663,17 @@ const _imports = [
635
663
  RdxCropperDescriptionDirective
636
664
  ];
637
665
  class RdxCropperModule {
638
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
639
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperModule, imports: [RdxCropperRootDirective,
666
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
667
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperModule, imports: [RdxCropperRootDirective,
640
668
  RdxCropperImageComponent,
641
669
  RdxCropperCropAreaDirective,
642
670
  RdxCropperDescriptionDirective], exports: [RdxCropperRootDirective,
643
671
  RdxCropperImageComponent,
644
672
  RdxCropperCropAreaDirective,
645
673
  RdxCropperDescriptionDirective] }); }
646
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperModule }); }
674
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperModule }); }
647
675
  }
648
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxCropperModule, decorators: [{
676
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: RdxCropperModule, decorators: [{
649
677
  type: NgModule,
650
678
  args: [{
651
679
  imports: [..._imports],
@@ -1 +1 @@
1
- {"version":3,"file":"radix-ng-primitives-cropper.mjs","sources":["../../../packages/primitives/cropper/src/cropper-context.token.ts","../../../packages/primitives/cropper/src/cropper-crop-area.directive.ts","../../../packages/primitives/cropper/src/cropper-description.directive.ts","../../../packages/primitives/cropper/src/cropper-image.component.ts","../../../packages/primitives/cropper/src/cropper-math.ts","../../../packages/primitives/cropper/src/cropper-root.directive.ts","../../../packages/primitives/cropper/index.ts","../../../packages/primitives/cropper/radix-ng-primitives-cropper.ts"],"sourcesContent":["import { InputSignal, Signal } from '@angular/core';\nimport { createContext } from '@radix-ng/primitives/core';\n\nexport interface CropperRootContext {\n image: InputSignal<string>;\n imageWrapperStyle: Signal<Record<string, string>>;\n cropAreaStyle: Signal<Record<string, string>>;\n descriptionId: string;\n}\n\nexport const [injectCropperRootContext, provideCropperRootContext] = createContext<CropperRootContext>(\n 'CropperRoot',\n 'components/cropper'\n);\n","import { Directive } from '@angular/core';\nimport { injectCropperRootContext } from './cropper-context.token';\n\n@Directive({\n selector: '[rdxCropperCropArea]',\n host: {\n '[style]': 'rootContext.cropAreaStyle()'\n }\n})\nexport class RdxCropperCropAreaDirective {\n readonly rootContext = injectCropperRootContext();\n}\n","import { Directive } from '@angular/core';\nimport { injectCropperRootContext } from './cropper-context.token';\n\n@Directive({\n selector: '[rdxCropperDescription]',\n host: {\n '[attr.id]': 'rootContext.descriptionId'\n }\n})\nexport class RdxCropperDescriptionDirective {\n readonly rootContext = injectCropperRootContext();\n}\n","import { Component, input } from '@angular/core';\nimport { injectCropperRootContext } from './cropper-context.token';\n\n@Component({\n selector: '[rdxCropperImage]',\n host: {\n '[style]': 'rootContext.imageWrapperStyle()'\n },\n template: `\n <img\n [class]=\"imgClass()\"\n [src]=\"rootContext.image()\"\n [style]=\"imgStyles()\"\n [draggable]=\"false\"\n [alt]=\"imgAlt()\"\n />\n `\n})\nexport class RdxCropperImageComponent {\n protected readonly rootContext = injectCropperRootContext();\n\n readonly imgClass = input<string>();\n\n readonly imgStyles = input<string>();\n\n /**\n * `alt` text for the rendered image. Defaults to `''` (decorative — screen readers skip it, since\n * the cropper widget describes itself via the root's label/description). Set a non-empty value to\n * give the image a meaningful accessible name.\n */\n readonly imgAlt = input('');\n}\n","import { clamp } from '@radix-ng/primitives/core';\n\n/** A crop rectangle in the source image's natural-pixel coordinate space. */\nexport type Area = { x: number; y: number; width: number; height: number };\n\n/** The rendered geometry the crop math operates on (all in CSS px, wrapper measured at zoom 1). */\nexport interface CropperGeometry {\n /** Image-wrapper width at zoom 1. */\n wrapperWidth: number;\n /** Image-wrapper height at zoom 1. */\n wrapperHeight: number;\n /** Crop window width. */\n cropWidth: number;\n /** Crop window height. */\n cropHeight: number;\n}\n\n/**\n * Clamp a pan offset so the zoomed image always fully covers the crop window — the user can never\n * drag an image edge inside the crop frame. The offset is measured from the centered position, so the\n * allowed travel on each axis is half the overflow of the scaled wrapper past the crop window.\n *\n * Returns `{ x: 0, y: 0 }` when the geometry is not ready yet (any dimension `<= 0`).\n */\nexport function restrictOffset(\n offsetX: number,\n offsetY: number,\n zoom: number,\n geometry: CropperGeometry\n): { x: number; y: number } {\n const { wrapperWidth, wrapperHeight, cropWidth, cropHeight } = geometry;\n\n if (wrapperWidth <= 0 || wrapperHeight <= 0 || cropWidth <= 0 || cropHeight <= 0) {\n return { x: 0, y: 0 };\n }\n\n const maxDragX = Math.max(0, (wrapperWidth * zoom - cropWidth) / 2);\n const maxDragY = Math.max(0, (wrapperHeight * zoom - cropHeight) / 2);\n\n return {\n x: clamp(offsetX, -maxDragX, maxDragX),\n y: clamp(offsetY, -maxDragY, maxDragY)\n };\n}\n\n/**\n * Project the current pan/zoom into a crop rectangle in the source image's natural pixels.\n *\n * The wrapper is centered in the crop window and scaled by `zoom`; `baseScale` converts rendered px\n * back to natural px. The result is rounded and clamped to the image bounds.\n *\n * Returns `null` when the geometry/image is not ready (any dimension `<= 0` or no image), or when the\n * computed crop collapses to zero area.\n */\nexport function calculateCropData(\n offsetX: number,\n offsetY: number,\n zoom: number,\n geometry: CropperGeometry,\n image: { width: number | null; height: number | null }\n): Area | null {\n const { wrapperWidth, wrapperHeight, cropWidth, cropHeight } = geometry;\n const imgW = image.width;\n const imgH = image.height;\n\n if (!imgW || !imgH || wrapperWidth <= 0 || wrapperHeight <= 0 || cropWidth <= 0 || cropHeight <= 0) {\n return null;\n }\n\n const scaledWrapperWidth = wrapperWidth * zoom;\n const scaledWrapperHeight = wrapperHeight * zoom;\n const topLeftOffsetX = offsetX + (cropWidth - scaledWrapperWidth) / 2;\n const topLeftOffsetY = offsetY + (cropHeight - scaledWrapperHeight) / 2;\n const baseScale = imgW / wrapperWidth;\n\n if (isNaN(baseScale) || baseScale === 0) {\n return null;\n }\n\n const sx = (-topLeftOffsetX * baseScale) / zoom;\n const sy = (-topLeftOffsetY * baseScale) / zoom;\n const sWidth = (cropWidth * baseScale) / zoom;\n const sHeight = (cropHeight * baseScale) / zoom;\n\n const finalX = clamp(Math.round(sx), 0, imgW);\n const finalY = clamp(Math.round(sy), 0, imgH);\n const finalWidth = clamp(Math.round(sWidth), 0, imgW - finalX);\n const finalHeight = clamp(Math.round(sHeight), 0, imgH - finalY);\n\n if (finalWidth <= 0 || finalHeight <= 0) {\n return null;\n }\n\n return { x: finalX, y: finalY, width: finalWidth, height: finalHeight };\n}\n","// Based on https://github.com/origin-space/image-cropper/blob/main/src/Cropper.tsx\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n signal,\n untracked\n} from '@angular/core';\nimport { BooleanInput, clamp, injectId, NumberInput, resizeEffect } from '@radix-ng/primitives/core';\nimport { CropperRootContext, provideCropperRootContext } from './cropper-context.token';\nimport {\n Area,\n calculateCropData as computeCropData,\n restrictOffset as computeRestrictedOffset,\n CropperGeometry\n} from './cropper-math';\n\nexport type { Area };\n\n/** Value equality for an `Area` so the crop `computed` only notifies when the rectangle changes. */\nconst areaEqual = (a: Area | null, b: Area | null): boolean =>\n a === b || (!!a && !!b && a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height);\n\n/** Value equality for an `{x,y}` point so the clamped-offset `computed` only notifies on real moves. */\nconst pointEqual = (a: { x: number; y: number }, b: { x: number; y: number }): boolean => a.x === b.x && a.y === b.y;\n\n/** Exposes the root's public state to the child parts (image, crop-area, description). */\nconst rootContext = (): CropperRootContext => {\n const instance = inject(RdxCropperRootDirective);\n return {\n image: instance.image,\n imageWrapperStyle: instance.imageWrapperStyle,\n cropAreaStyle: instance.cropAreaStyle,\n descriptionId: instance.descriptionId\n };\n};\n\n@Directive({\n selector: '[rdxCropperRoot]',\n providers: [provideCropperRootContext(rootContext)],\n host: {\n // `application` so a screen reader passes arrow/+/- keys straight to our handlers (pan + zoom)\n // instead of intercepting them for browse-mode navigation; instructions come via the\n // description element referenced by `aria-describedby`. The slider-style `aria-value*`\n // attributes were removed — they are only honored on range roles, so they were dead here.\n role: 'application',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-describedby]': 'descriptionId',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : undefined',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '[attr.data-dragging]': 'isDragging() ? \"\" : undefined'\n }\n})\nexport class RdxCropperRootDirective {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly CROPPER_DESC_WARN_MESSAGE = `Warning: \\`Cropper\\` requires a description element for accessibility.`;\n\n readonly image = input.required<string>();\n readonly cropPadding = input(25, { transform: numberAttribute });\n readonly aspectRatio = input(1, { transform: numberAttribute });\n readonly minZoom = input(1, { transform: numberAttribute });\n readonly maxZoom = input(3, { transform: numberAttribute });\n readonly zoomSensitivity = input(0.005, { transform: numberAttribute });\n /** Pan distance (px) per arrow-key press. */\n readonly keyboardStep = input(10, { transform: numberAttribute });\n /** Zoom delta per `+` / `-` / `PageUp` / `PageDown` press. */\n readonly zoomKeyboardStep = input(0.1, { transform: numberAttribute });\n readonly zoom = input<number, NumberInput>(undefined, { transform: numberAttribute });\n /** Accessible name for the cropper widget. */\n readonly ariaLabel = input('Interactive image cropper');\n /** Disables all interaction (drag, wheel/pinch zoom, keyboard); exposed as `data-disabled`. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly onCropChange = output<Area | null>();\n readonly onZoomChange = output<number>();\n\n // State signals\n private readonly imgWidth = signal<number | null>(null);\n private readonly imgHeight = signal<number | null>(null);\n /** Raw content-box size (px) of the root, fed by the ResizeObserver / initial measure. */\n private readonly containerSize = signal({ width: 0, height: 0 });\n /**\n * Crop-area size derived from the container minus padding, fitted to `aspectRatio`. A `computed`\n * (not a written signal) so it stays reactive to `aspectRatio` / `cropPadding` changes, not only\n * to container resizes — previously these inputs were read inside the ResizeObserver closure and\n * never recomputed until the next resize.\n */\n private readonly cropAreaSize = computed(() => {\n const { width, height } = this.containerSize();\n if (width <= 0 || height <= 0) {\n return { width: 0, height: 0 };\n }\n\n const maxPossibleWidth = Math.max(0, width - this.cropPadding() * 2);\n const maxPossibleHeight = Math.max(0, height - this.cropPadding() * 2);\n const aspectRatio = this.aspectRatio();\n\n if (maxPossibleWidth / aspectRatio >= maxPossibleHeight) {\n return { width: maxPossibleHeight * aspectRatio, height: maxPossibleHeight };\n }\n return { width: maxPossibleWidth, height: maxPossibleWidth / aspectRatio };\n });\n private readonly cropAreaWidth = computed(() => this.cropAreaSize().width);\n private readonly cropAreaHeight = computed(() => this.cropAreaSize().height);\n private readonly imageWrapperWidth = signal(0);\n private readonly imageWrapperHeight = signal(0);\n /** Raw (unclamped) pan-offset intent (px) written by gestures; clamping lives in `clampedOffset`. */\n private readonly offset = signal({ x: 0, y: 0 });\n private readonly internalZoom = signal(this.minZoom());\n protected readonly isDragging = signal(false);\n // SSR-stable, deterministic id (the project's CDK-free `_IdGenerator` replacement) so the\n // `aria-describedby` reference matches between server and client renders.\n readonly descriptionId = injectId('rdx-cropper-description-');\n\n private readonly isZoomControlled = computed(() => this.zoom() !== undefined);\n protected readonly effectiveZoom = computed(() => (this.isZoomControlled() ? this.zoom()! : this.internalZoom()));\n\n /**\n * The applied pan offset (px): the raw intent clamped to keep the image covering the crop window\n * at the current geometry/zoom. Derived (not an effect) so it self-corrects when the container\n * resizes or the zoom/aspect-ratio changes — no write-back, no `untracked` re-entrancy. This is the\n * value the view renders and the crop math reads.\n */\n private readonly clampedOffset = computed(\n () => this.restrictOffset(this.offset().x, this.offset().y, this.effectiveZoom()),\n { equal: pointEqual }\n );\n\n /**\n * Crop rectangle derived from the rendered pan/zoom — the single source of truth for emission.\n * `onCropChange` fires from one effect watching this, so interactions/handlers never emit directly\n * (which previously double-emitted). Value equality keeps it from notifying on equal results.\n */\n private readonly cropData = computed<Area | null>(\n () =>\n computeCropData(this.clampedOffset().x, this.clampedOffset().y, this.effectiveZoom(), this.geometry(), {\n width: this.imgWidth(),\n height: this.imgHeight()\n }),\n { equal: areaEqual }\n );\n\n // Refs\n private readonly dragStartPoint = signal({ x: 0, y: 0 });\n private readonly dragStartOffset = signal({ x: 0, y: 0 });\n private readonly latestZoom = signal(this.minZoom());\n private readonly initialPinchDistance = signal(0);\n private readonly initialPinchZoom = signal(1);\n private readonly isPinching = signal(false);\n private readonly hasWarned = signal(false);\n\n constructor() {\n afterNextRender(() => {\n this.initializeContainerDimensions();\n });\n\n this.setupImageLoadEffect();\n this.setupDimensionsEffects();\n this.setupAccessibilityWarningEffect();\n this.setupEventListenersEffect();\n\n effect(() => {\n this.latestZoom.set(this.effectiveZoom());\n });\n\n // Single source of crop emission: emit whenever the derived crop rectangle changes.\n effect(() => {\n const data = this.cropData();\n untracked(() => this.onCropChange.emit(data));\n });\n }\n\n private updateZoom(newZoomValue: number): number {\n const clampedZoom = clamp(newZoomValue, this.minZoom(), this.maxZoom());\n\n this.onZoomChange.emit(clampedZoom);\n\n if (!this.isZoomControlled()) {\n this.internalZoom.set(clampedZoom);\n }\n return clampedZoom;\n }\n\n private initializeContainerDimensions() {\n const element = this.elementRef.nativeElement;\n if (element && element.clientWidth > 0 && element.clientHeight > 0) {\n // Seed the size for the first paint; the ResizeObserver keeps it in sync afterwards.\n this.containerSize.set({ width: element.clientWidth, height: element.clientHeight });\n }\n }\n\n private setupImageLoadEffect() {\n effect(() => {\n const image = this.image();\n this.offset.set({ x: 0, y: 0 });\n\n if (!this.isZoomControlled()) {\n this.internalZoom.set(this.minZoom());\n }\n\n if (!image || !this.isBrowser) {\n this.imgWidth.set(null);\n this.imgHeight.set(null);\n return;\n }\n\n let isMounted = true;\n const img = new Image();\n img.onload = () => {\n if (isMounted) {\n this.imgWidth.set(img.naturalWidth);\n this.imgHeight.set(img.naturalHeight);\n }\n };\n img.onerror = () => {\n if (isMounted) {\n this.imgWidth.set(null);\n this.imgHeight.set(null);\n }\n };\n img.src = image;\n\n return () => {\n isMounted = false;\n };\n });\n }\n\n private setupDimensionsEffects(): void {\n // Track the container's content-box size via the shared resize-observer effect; `cropAreaSize`\n // derives crop dimensions from it reactively (so changing `aspectRatio` / `cropPadding`\n // recomputes without waiting for a resize). `element` is null on the server, so no observer is\n // constructed (SSR-safe).\n resizeEffect({\n injector: this.injector,\n element: computed(() => (this.isBrowser ? this.elementRef.nativeElement : null)),\n onResize: (entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (width > 0 && height > 0) this.containerSize.set({ width, height });\n }\n }\n });\n\n // Update image wrapper dimensions when crop area or image dimensions change\n effect(() => {\n const cropW = this.cropAreaWidth();\n const cropH = this.cropAreaHeight();\n const imgW = this.imgWidth();\n const imgH = this.imgHeight();\n\n if (cropW <= 0 || cropH <= 0 || !imgW || !imgH) {\n this.imageWrapperWidth.set(0);\n this.imageWrapperHeight.set(0);\n return;\n }\n\n const naturalAspect = imgW / imgH;\n const cropAspect = cropW / cropH;\n let targetWrapperWidth: number, targetWrapperHeight: number;\n\n if (naturalAspect >= cropAspect) {\n targetWrapperHeight = cropH;\n targetWrapperWidth = targetWrapperHeight * naturalAspect;\n } else {\n targetWrapperWidth = cropW;\n targetWrapperHeight = targetWrapperWidth / naturalAspect;\n }\n\n this.imageWrapperWidth.set(targetWrapperWidth);\n this.imageWrapperHeight.set(targetWrapperHeight);\n });\n }\n\n /** Current rendered geometry the crop math operates on, read from the state signals. */\n private geometry(): CropperGeometry {\n return {\n wrapperWidth: this.imageWrapperWidth(),\n wrapperHeight: this.imageWrapperHeight(),\n cropWidth: this.cropAreaWidth(),\n cropHeight: this.cropAreaHeight()\n };\n }\n\n private restrictOffset(dragOffsetX: number, dragOffsetY: number, currentZoom: number): { x: number; y: number } {\n return computeRestrictedOffset(dragOffsetX, dragOffsetY, currentZoom, this.geometry());\n }\n\n private setupAccessibilityWarningEffect(): void {\n if (!this.isBrowser) return;\n\n effect(() => {\n const checkTimeout = setTimeout(() => {\n if (this.elementRef.nativeElement && !this.hasWarned()) {\n const hasDescription = document.getElementById(this.descriptionId);\n if (!hasDescription) {\n console.warn(this.CROPPER_DESC_WARN_MESSAGE);\n this.hasWarned.set(true);\n }\n }\n }, 100);\n\n return () => clearTimeout(checkTimeout);\n });\n }\n\n /**\n * Single attachment point for every interaction listener. Re-runs on `disabled()`, so a disabled\n * cropper has NO interaction listeners bound at all — there is no per-handler `disabled` check to\n * forget, and a new gesture path can't accidentally bypass the gate. Uses `{ passive: false }` so\n * the handlers can `preventDefault()` (wheel/touch scrolling, arrow-key page scroll).\n */\n private setupEventListenersEffect(): void {\n if (!this.isBrowser) return;\n\n effect((onCleanup) => {\n const node = this.elementRef.nativeElement;\n if (!node || this.disabled()) return;\n\n const options: AddEventListenerOptions = { passive: false };\n\n const mouseDownHandler = (e: MouseEvent) => this.onMouseDown(e);\n const keyDownHandler = (e: KeyboardEvent) => this.onKeyDown(e);\n const wheelHandler = (e: WheelEvent) => this.handleWheel(e);\n const touchStartHandler = (e: TouchEvent) => this.handleTouchStart(e);\n const touchMoveHandler = (e: TouchEvent) => this.handleTouchMove(e);\n const touchEndHandler = (e: TouchEvent) => this.handleTouchEnd(e);\n\n node.addEventListener('mousedown', mouseDownHandler, options);\n node.addEventListener('keydown', keyDownHandler, options);\n node.addEventListener('wheel', wheelHandler, options);\n node.addEventListener('touchstart', touchStartHandler, options);\n node.addEventListener('touchmove', touchMoveHandler, options);\n node.addEventListener('touchend', touchEndHandler, options);\n node.addEventListener('touchcancel', touchEndHandler, options);\n\n onCleanup(() => {\n node.removeEventListener('mousedown', mouseDownHandler, options);\n node.removeEventListener('keydown', keyDownHandler, options);\n node.removeEventListener('wheel', wheelHandler, options);\n node.removeEventListener('touchstart', touchStartHandler, options);\n node.removeEventListener('touchmove', touchMoveHandler, options);\n node.removeEventListener('touchend', touchEndHandler, options);\n node.removeEventListener('touchcancel', touchEndHandler, options);\n });\n });\n }\n\n private onMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n e.preventDefault();\n this.isDragging.set(true);\n this.isPinching.set(false);\n this.dragStartPoint.set({ x: e.clientX, y: e.clientY });\n this.dragStartOffset.set(this.clampedOffset());\n\n const handleMouseMove = (ev: MouseEvent) => {\n const deltaX = ev.clientX - this.dragStartPoint().x;\n const deltaY = ev.clientY - this.dragStartPoint().y;\n this.offset.set({ x: this.dragStartOffset().x + deltaX, y: this.dragStartOffset().y + deltaY });\n };\n\n const handleMouseUp = () => {\n this.isDragging.set(false);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n /**\n * Zoom toward an anchor point (coordinates relative to the root's center). `fromZoom`/`fromOffset`\n * are the zoom/offset the anchor is measured against — the live state for wheel/keyboard, the\n * gesture-start baseline for pinch. Emits the zoom request via {@link updateZoom}, then re-anchors\n * the pan offset **only when the zoom is uncontrolled**: in controlled mode the rendered zoom does\n * not change until the parent writes `zoom` back, so writing an offset for a not-yet-applied zoom\n * would pan the image without rescaling it (`clampedOffset` re-derives once the new zoom applies).\n */\n private zoomToPoint(\n pointerX: number,\n pointerY: number,\n targetZoom: number,\n fromZoom: number,\n fromOffset: { x: number; y: number }\n ): void {\n const clampedZoom = clamp(targetZoom, this.minZoom(), this.maxZoom());\n if (clampedZoom === this.effectiveZoom()) return;\n\n const imagePointX = (pointerX - fromOffset.x) / fromZoom;\n const imagePointY = (pointerY - fromOffset.y) / fromZoom;\n\n const finalNewZoom = this.updateZoom(clampedZoom);\n if (this.isZoomControlled()) return;\n\n this.offset.set({ x: pointerX - imagePointX * finalNewZoom, y: pointerY - imagePointY * finalNewZoom });\n }\n\n private handleWheel(e: WheelEvent): void {\n e.preventDefault();\n e.stopPropagation();\n if (!this.elementRef.nativeElement || this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n\n const delta = e.deltaY * -this.zoomSensitivity();\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n const pointerX = e.clientX - rect.left - rect.width / 2;\n const pointerY = e.clientY - rect.top - rect.height / 2;\n\n this.zoomToPoint(pointerX, pointerY, this.effectiveZoom() + delta, this.effectiveZoom(), this.clampedOffset());\n }\n\n private getPinchDistance(touches: TouchList): number {\n return Math.sqrt(\n Math.pow(touches[1].clientX - touches[0].clientX, 2) + Math.pow(touches[1].clientY - touches[0].clientY, 2)\n );\n }\n\n private getPinchCenter(touches: TouchList): { x: number; y: number } {\n return {\n x: (touches[0].clientX + touches[1].clientX) / 2,\n y: (touches[0].clientY + touches[1].clientY) / 2\n };\n }\n\n private handleTouchStart(e: TouchEvent): void {\n if (this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n e.preventDefault();\n const touches = e.touches;\n\n if (touches.length === 1) {\n this.isDragging.set(true);\n this.isPinching.set(false);\n this.dragStartPoint.set({ x: touches[0].clientX, y: touches[0].clientY });\n this.dragStartOffset.set(this.clampedOffset());\n } else if (touches.length === 2) {\n this.isDragging.set(false);\n this.isPinching.set(true);\n this.initialPinchDistance.set(this.getPinchDistance(touches));\n this.initialPinchZoom.set(this.latestZoom());\n this.dragStartOffset.set(this.clampedOffset());\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n e.preventDefault();\n const touches = e.touches;\n\n if (touches.length === 1 && this.isDragging() && !this.isPinching()) {\n const deltaX = touches[0].clientX - this.dragStartPoint().x;\n const deltaY = touches[0].clientY - this.dragStartPoint().y;\n this.offset.set({ x: this.dragStartOffset().x + deltaX, y: this.dragStartOffset().y + deltaY });\n } else if (touches.length === 2 && this.isPinching()) {\n const scale = this.getPinchDistance(touches) / this.initialPinchDistance();\n const pinchCenter = this.getPinchCenter(touches);\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n const pinchCenterX = pinchCenter.x - rect.left - rect.width / 2;\n const pinchCenterY = pinchCenter.y - rect.top - rect.height / 2;\n\n // Pinch is baseline-relative: anchor against the zoom/offset captured at gesture start.\n this.zoomToPoint(\n pinchCenterX,\n pinchCenterY,\n this.initialPinchZoom() * scale,\n this.initialPinchZoom(),\n this.dragStartOffset()\n );\n }\n }\n\n private handleTouchEnd(e: TouchEvent): void {\n e.preventDefault();\n const touches = e.touches;\n\n if (this.isPinching() && touches.length < 2) {\n this.isPinching.set(false);\n\n if (touches.length === 1) {\n this.isDragging.set(true);\n this.dragStartPoint.set({ x: touches[0].clientX, y: touches[0].clientY });\n this.dragStartOffset.set(this.clampedOffset());\n } else {\n this.isDragging.set(false);\n }\n } else if (this.isDragging() && touches.length === 0) {\n this.isDragging.set(false);\n }\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (this.imageWrapperWidth() <= 0) return;\n\n const base = this.clampedOffset();\n let targetOffsetX = base.x;\n let targetOffsetY = base.y;\n // eslint-disable-next-line no-useless-assignment\n let moved = false;\n\n switch (e.key) {\n case 'ArrowUp':\n targetOffsetY += this.keyboardStep();\n moved = true;\n break;\n case 'ArrowDown':\n targetOffsetY -= this.keyboardStep();\n moved = true;\n break;\n case 'ArrowLeft':\n targetOffsetX += this.keyboardStep();\n moved = true;\n break;\n case 'ArrowRight':\n targetOffsetX -= this.keyboardStep();\n moved = true;\n break;\n case '+':\n case '=':\n case 'PageUp':\n e.preventDefault();\n this.zoomFromCenter(this.zoomKeyboardStep());\n return;\n case '-':\n case '_':\n case 'PageDown':\n e.preventDefault();\n this.zoomFromCenter(-this.zoomKeyboardStep());\n return;\n default:\n return;\n }\n\n if (moved) {\n e.preventDefault();\n // Write the raw target; `clampedOffset` clamps it (and dedups a no-op at the boundary).\n this.offset.set({ x: targetOffsetX, y: targetOffsetY });\n }\n }\n\n /** Zoom by `delta` keeping the crop center fixed (the keyboard counterpart of wheel/pinch zoom). */\n private zoomFromCenter(delta: number): void {\n if (this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n // Anchor at the crop center (pointer 0,0 relative to center) against the live zoom/offset.\n this.zoomToPoint(0, 0, this.effectiveZoom() + delta, this.effectiveZoom(), this.clampedOffset());\n }\n\n /**\n * Inline style for the image wrapper: measured size, centered in the root, then translated and\n * scaled by the current pan offset and zoom. A `computed` (not a method) so the `[style]` binding\n * only re-applies when an input actually changes — a per-change-detection method call would\n * allocate a new object every tick and force a constant re-bind.\n */\n readonly imageWrapperStyle = computed<Record<string, string>>(() => {\n const wrapperW = this.imageWrapperWidth();\n const wrapperH = this.imageWrapperHeight();\n const { x: offsetX, y: offsetY } = this.clampedOffset();\n const zoom = this.effectiveZoom();\n\n return {\n width: `${wrapperW}px`,\n height: `${wrapperH}px`,\n transform: `translate3d(${offsetX}px, ${offsetY}px, 0px) scale(${zoom})`,\n position: 'absolute',\n left: `calc(50% - ${wrapperW / 2}px)`,\n top: `calc(50% - ${wrapperH / 2}px)`,\n willChange: 'transform'\n };\n });\n\n /** Inline style for the crop-area overlay (its measured width/height). */\n readonly cropAreaStyle = computed<Record<string, string>>(() => ({\n width: `${this.cropAreaWidth()}px`,\n height: `${this.cropAreaHeight()}px`\n }));\n}\n","import { NgModule } from '@angular/core';\nimport { RdxCropperCropAreaDirective } from './src/cropper-crop-area.directive';\nimport { RdxCropperDescriptionDirective } from './src/cropper-description.directive';\nimport { RdxCropperImageComponent } from './src/cropper-image.component';\nimport { RdxCropperRootDirective } from './src/cropper-root.directive';\n\nexport * from './src/cropper-context.token';\nexport * from './src/cropper-crop-area.directive';\nexport * from './src/cropper-description.directive';\nexport * from './src/cropper-image.component';\nexport * from './src/cropper-root.directive';\n\nconst _imports = [\n RdxCropperRootDirective,\n RdxCropperImageComponent,\n RdxCropperCropAreaDirective,\n RdxCropperDescriptionDirective\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxCropperModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["computeCropData","computeRestrictedOffset"],"mappings":"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"}
1
+ {"version":3,"file":"radix-ng-primitives-cropper.mjs","sources":["../../../packages/primitives/cropper/src/cropper-context.token.ts","../../../packages/primitives/cropper/src/cropper-crop-area.directive.ts","../../../packages/primitives/cropper/src/cropper-description.directive.ts","../../../packages/primitives/cropper/src/cropper-image.component.ts","../../../packages/primitives/cropper/src/cropper-math.ts","../../../packages/primitives/cropper/src/cropper-root.directive.ts","../../../packages/primitives/cropper/index.ts","../../../packages/primitives/cropper/radix-ng-primitives-cropper.ts"],"sourcesContent":["import { InputSignal, Signal } from '@angular/core';\nimport { createContext } from '@radix-ng/primitives/core';\n\nexport interface CropperRootContext {\n image: InputSignal<string>;\n imageWrapperStyle: Signal<Record<string, string>>;\n cropAreaStyle: Signal<Record<string, string>>;\n descriptionId: string;\n}\n\nexport const [injectCropperRootContext, provideCropperRootContext] = createContext<CropperRootContext>(\n 'CropperRoot',\n 'components/cropper'\n);\n","import { Directive } from '@angular/core';\nimport { injectCropperRootContext } from './cropper-context.token';\n\n@Directive({\n selector: '[rdxCropperCropArea]',\n host: {\n '[style]': 'rootContext.cropAreaStyle()'\n }\n})\nexport class RdxCropperCropAreaDirective {\n readonly rootContext = injectCropperRootContext();\n}\n","import { Directive } from '@angular/core';\nimport { injectCropperRootContext } from './cropper-context.token';\n\n@Directive({\n selector: '[rdxCropperDescription]',\n host: {\n '[attr.id]': 'rootContext.descriptionId'\n }\n})\nexport class RdxCropperDescriptionDirective {\n readonly rootContext = injectCropperRootContext();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { injectCropperRootContext } from './cropper-context.token';\n\n@Component({\n changeDetection: ChangeDetectionStrategy.Eager,\n selector: '[rdxCropperImage]',\n host: {\n '[style]': 'rootContext.imageWrapperStyle()'\n },\n template: `\n <img\n [class]=\"imgClass()\"\n [src]=\"rootContext.image()\"\n [style]=\"imgStyles()\"\n [draggable]=\"false\"\n [alt]=\"imgAlt()\"\n />\n `\n})\nexport class RdxCropperImageComponent {\n protected readonly rootContext = injectCropperRootContext();\n\n readonly imgClass = input<string>();\n\n readonly imgStyles = input<string>();\n\n /**\n * `alt` text for the rendered image. Defaults to `''` (decorative — screen readers skip it, since\n * the cropper widget describes itself via the root's label/description). Set a non-empty value to\n * give the image a meaningful accessible name.\n */\n readonly imgAlt = input('');\n}\n","import { clamp } from '@radix-ng/primitives/core';\n\n/** A crop rectangle in the source image's natural-pixel coordinate space. */\nexport type Area = { x: number; y: number; width: number; height: number };\n\n/** The rendered geometry the crop math operates on (all in CSS px, wrapper measured at zoom 1). */\nexport interface CropperGeometry {\n /** Image-wrapper width at zoom 1. */\n wrapperWidth: number;\n /** Image-wrapper height at zoom 1. */\n wrapperHeight: number;\n /** Crop window width. */\n cropWidth: number;\n /** Crop window height. */\n cropHeight: number;\n}\n\n/**\n * Clamp a pan offset so the zoomed image always fully covers the crop window — the user can never\n * drag an image edge inside the crop frame. The offset is measured from the centered position, so the\n * allowed travel on each axis is half the overflow of the scaled wrapper past the crop window.\n *\n * Returns `{ x: 0, y: 0 }` when the geometry is not ready yet (any dimension `<= 0`).\n */\nexport function restrictOffset(\n offsetX: number,\n offsetY: number,\n zoom: number,\n geometry: CropperGeometry\n): { x: number; y: number } {\n const { wrapperWidth, wrapperHeight, cropWidth, cropHeight } = geometry;\n\n if (wrapperWidth <= 0 || wrapperHeight <= 0 || cropWidth <= 0 || cropHeight <= 0) {\n return { x: 0, y: 0 };\n }\n\n const maxDragX = Math.max(0, (wrapperWidth * zoom - cropWidth) / 2);\n const maxDragY = Math.max(0, (wrapperHeight * zoom - cropHeight) / 2);\n\n return {\n x: clamp(offsetX, -maxDragX, maxDragX),\n y: clamp(offsetY, -maxDragY, maxDragY)\n };\n}\n\n/**\n * Project the current pan/zoom into a crop rectangle in the source image's natural pixels.\n *\n * The wrapper is centered in the crop window and scaled by `zoom`; `baseScale` converts rendered px\n * back to natural px. The result is rounded and clamped to the image bounds.\n *\n * Returns `null` when the geometry/image is not ready (any dimension `<= 0` or no image), or when the\n * computed crop collapses to zero area.\n */\nexport function calculateCropData(\n offsetX: number,\n offsetY: number,\n zoom: number,\n geometry: CropperGeometry,\n image: { width: number | null; height: number | null }\n): Area | null {\n const { wrapperWidth, wrapperHeight, cropWidth, cropHeight } = geometry;\n const imgW = image.width;\n const imgH = image.height;\n\n if (!imgW || !imgH || wrapperWidth <= 0 || wrapperHeight <= 0 || cropWidth <= 0 || cropHeight <= 0) {\n return null;\n }\n\n const scaledWrapperWidth = wrapperWidth * zoom;\n const scaledWrapperHeight = wrapperHeight * zoom;\n const topLeftOffsetX = offsetX + (cropWidth - scaledWrapperWidth) / 2;\n const topLeftOffsetY = offsetY + (cropHeight - scaledWrapperHeight) / 2;\n const baseScale = imgW / wrapperWidth;\n\n if (isNaN(baseScale) || baseScale === 0) {\n return null;\n }\n\n const sx = (-topLeftOffsetX * baseScale) / zoom;\n const sy = (-topLeftOffsetY * baseScale) / zoom;\n const sWidth = (cropWidth * baseScale) / zoom;\n const sHeight = (cropHeight * baseScale) / zoom;\n\n const finalX = clamp(Math.round(sx), 0, imgW);\n const finalY = clamp(Math.round(sy), 0, imgH);\n const finalWidth = clamp(Math.round(sWidth), 0, imgW - finalX);\n const finalHeight = clamp(Math.round(sHeight), 0, imgH - finalY);\n\n if (finalWidth <= 0 || finalHeight <= 0) {\n return null;\n }\n\n return { x: finalX, y: finalY, width: finalWidth, height: finalHeight };\n}\n","// Based on https://github.com/origin-space/image-cropper/blob/main/src/Cropper.tsx\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n signal,\n untracked\n} from '@angular/core';\nimport { BooleanInput, clamp, injectId, NumberInput, resizeEffect } from '@radix-ng/primitives/core';\nimport { CropperRootContext, provideCropperRootContext } from './cropper-context.token';\nimport {\n Area,\n calculateCropData as computeCropData,\n restrictOffset as computeRestrictedOffset,\n CropperGeometry\n} from './cropper-math';\n\nexport type { Area };\n\n/** Value equality for an `Area` so the crop `computed` only notifies when the rectangle changes. */\nconst areaEqual = (a: Area | null, b: Area | null): boolean =>\n a === b || (!!a && !!b && a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height);\n\n/** Value equality for an `{x,y}` point so the clamped-offset `computed` only notifies on real moves. */\nconst pointEqual = (a: { x: number; y: number }, b: { x: number; y: number }): boolean => a.x === b.x && a.y === b.y;\n\n/** Exposes the root's public state to the child parts (image, crop-area, description). */\nconst rootContext = (): CropperRootContext => {\n const instance = inject(RdxCropperRootDirective);\n return {\n image: instance.image,\n imageWrapperStyle: instance.imageWrapperStyle,\n cropAreaStyle: instance.cropAreaStyle,\n descriptionId: instance.descriptionId\n };\n};\n\n@Directive({\n selector: '[rdxCropperRoot]',\n providers: [provideCropperRootContext(rootContext)],\n host: {\n // `application` so a screen reader passes arrow/+/- keys straight to our handlers (pan + zoom)\n // instead of intercepting them for browse-mode navigation; instructions come via the\n // description element referenced by `aria-describedby`. The slider-style `aria-value*`\n // attributes were removed — they are only honored on range roles, so they were dead here.\n role: 'application',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-describedby]': 'descriptionId',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : undefined',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '[attr.data-dragging]': 'isDragging() ? \"\" : undefined'\n }\n})\nexport class RdxCropperRootDirective {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly CROPPER_DESC_WARN_MESSAGE = `Warning: \\`Cropper\\` requires a description element for accessibility.`;\n\n readonly image = input.required<string>();\n readonly cropPadding = input(25, { transform: numberAttribute });\n readonly aspectRatio = input(1, { transform: numberAttribute });\n readonly minZoom = input(1, { transform: numberAttribute });\n readonly maxZoom = input(3, { transform: numberAttribute });\n readonly zoomSensitivity = input(0.005, { transform: numberAttribute });\n /** Pan distance (px) per arrow-key press. */\n readonly keyboardStep = input(10, { transform: numberAttribute });\n /** Zoom delta per `+` / `-` / `PageUp` / `PageDown` press. */\n readonly zoomKeyboardStep = input(0.1, { transform: numberAttribute });\n readonly zoom = input<number, NumberInput>(undefined, { transform: numberAttribute });\n /** Accessible name for the cropper widget. */\n readonly ariaLabel = input('Interactive image cropper');\n /** Disables all interaction (drag, wheel/pinch zoom, keyboard); exposed as `data-disabled`. */\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly onCropChange = output<Area | null>();\n readonly onZoomChange = output<number>();\n\n // State signals\n private readonly imgWidth = signal<number | null>(null);\n private readonly imgHeight = signal<number | null>(null);\n /** Raw content-box size (px) of the root, fed by the ResizeObserver / initial measure. */\n private readonly containerSize = signal({ width: 0, height: 0 });\n /**\n * Crop-area size derived from the container minus padding, fitted to `aspectRatio`. A `computed`\n * (not a written signal) so it stays reactive to `aspectRatio` / `cropPadding` changes, not only\n * to container resizes — previously these inputs were read inside the ResizeObserver closure and\n * never recomputed until the next resize.\n */\n private readonly cropAreaSize = computed(() => {\n const { width, height } = this.containerSize();\n if (width <= 0 || height <= 0) {\n return { width: 0, height: 0 };\n }\n\n const maxPossibleWidth = Math.max(0, width - this.cropPadding() * 2);\n const maxPossibleHeight = Math.max(0, height - this.cropPadding() * 2);\n const aspectRatio = this.aspectRatio();\n\n if (maxPossibleWidth / aspectRatio >= maxPossibleHeight) {\n return { width: maxPossibleHeight * aspectRatio, height: maxPossibleHeight };\n }\n return { width: maxPossibleWidth, height: maxPossibleWidth / aspectRatio };\n });\n private readonly cropAreaWidth = computed(() => this.cropAreaSize().width);\n private readonly cropAreaHeight = computed(() => this.cropAreaSize().height);\n private readonly imageWrapperWidth = signal(0);\n private readonly imageWrapperHeight = signal(0);\n /** Raw (unclamped) pan-offset intent (px) written by gestures; clamping lives in `clampedOffset`. */\n private readonly offset = signal({ x: 0, y: 0 });\n private readonly internalZoom = signal(this.minZoom());\n protected readonly isDragging = signal(false);\n // SSR-stable, deterministic id (the project's CDK-free `_IdGenerator` replacement) so the\n // `aria-describedby` reference matches between server and client renders.\n readonly descriptionId = injectId('rdx-cropper-description-');\n\n private readonly isZoomControlled = computed(() => this.zoom() !== undefined);\n protected readonly effectiveZoom = computed(() => (this.isZoomControlled() ? this.zoom()! : this.internalZoom()));\n\n /**\n * The applied pan offset (px): the raw intent clamped to keep the image covering the crop window\n * at the current geometry/zoom. Derived (not an effect) so it self-corrects when the container\n * resizes or the zoom/aspect-ratio changes — no write-back, no `untracked` re-entrancy. This is the\n * value the view renders and the crop math reads.\n */\n private readonly clampedOffset = computed(\n () => this.restrictOffset(this.offset().x, this.offset().y, this.effectiveZoom()),\n { equal: pointEqual }\n );\n\n /**\n * Crop rectangle derived from the rendered pan/zoom — the single source of truth for emission.\n * `onCropChange` fires from one effect watching this, so interactions/handlers never emit directly\n * (which previously double-emitted). Value equality keeps it from notifying on equal results.\n */\n private readonly cropData = computed<Area | null>(\n () =>\n computeCropData(this.clampedOffset().x, this.clampedOffset().y, this.effectiveZoom(), this.geometry(), {\n width: this.imgWidth(),\n height: this.imgHeight()\n }),\n { equal: areaEqual }\n );\n\n // Refs\n private readonly dragStartPoint = signal({ x: 0, y: 0 });\n private readonly dragStartOffset = signal({ x: 0, y: 0 });\n private readonly latestZoom = signal(this.minZoom());\n private readonly initialPinchDistance = signal(0);\n private readonly initialPinchZoom = signal(1);\n private readonly isPinching = signal(false);\n private readonly hasWarned = signal(false);\n\n constructor() {\n afterNextRender(() => {\n this.initializeContainerDimensions();\n });\n\n this.setupImageLoadEffect();\n this.setupDimensionsEffects();\n this.setupAccessibilityWarningEffect();\n this.setupEventListenersEffect();\n\n effect(() => {\n this.latestZoom.set(this.effectiveZoom());\n });\n\n // Single source of crop emission: emit whenever the derived crop rectangle changes.\n effect(() => {\n const data = this.cropData();\n untracked(() => this.onCropChange.emit(data));\n });\n }\n\n private updateZoom(newZoomValue: number): number {\n const clampedZoom = clamp(newZoomValue, this.minZoom(), this.maxZoom());\n\n this.onZoomChange.emit(clampedZoom);\n\n if (!this.isZoomControlled()) {\n this.internalZoom.set(clampedZoom);\n }\n return clampedZoom;\n }\n\n private initializeContainerDimensions() {\n const element = this.elementRef.nativeElement;\n if (element && element.clientWidth > 0 && element.clientHeight > 0) {\n // Seed the size for the first paint; the ResizeObserver keeps it in sync afterwards.\n this.containerSize.set({ width: element.clientWidth, height: element.clientHeight });\n }\n }\n\n private setupImageLoadEffect() {\n effect(() => {\n const image = this.image();\n this.offset.set({ x: 0, y: 0 });\n\n if (!this.isZoomControlled()) {\n this.internalZoom.set(this.minZoom());\n }\n\n if (!image || !this.isBrowser) {\n this.imgWidth.set(null);\n this.imgHeight.set(null);\n return;\n }\n\n let isMounted = true;\n const img = new Image();\n img.onload = () => {\n if (isMounted) {\n this.imgWidth.set(img.naturalWidth);\n this.imgHeight.set(img.naturalHeight);\n }\n };\n img.onerror = () => {\n if (isMounted) {\n this.imgWidth.set(null);\n this.imgHeight.set(null);\n }\n };\n img.src = image;\n\n return () => {\n isMounted = false;\n };\n });\n }\n\n private setupDimensionsEffects(): void {\n // Track the container's content-box size via the shared resize-observer effect; `cropAreaSize`\n // derives crop dimensions from it reactively (so changing `aspectRatio` / `cropPadding`\n // recomputes without waiting for a resize). `element` is null on the server, so no observer is\n // constructed (SSR-safe).\n resizeEffect({\n injector: this.injector,\n element: computed(() => (this.isBrowser ? this.elementRef.nativeElement : null)),\n onResize: (entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (width > 0 && height > 0) this.containerSize.set({ width, height });\n }\n }\n });\n\n // Update image wrapper dimensions when crop area or image dimensions change\n effect(() => {\n const cropW = this.cropAreaWidth();\n const cropH = this.cropAreaHeight();\n const imgW = this.imgWidth();\n const imgH = this.imgHeight();\n\n if (cropW <= 0 || cropH <= 0 || !imgW || !imgH) {\n this.imageWrapperWidth.set(0);\n this.imageWrapperHeight.set(0);\n return;\n }\n\n const naturalAspect = imgW / imgH;\n const cropAspect = cropW / cropH;\n let targetWrapperWidth: number, targetWrapperHeight: number;\n\n if (naturalAspect >= cropAspect) {\n targetWrapperHeight = cropH;\n targetWrapperWidth = targetWrapperHeight * naturalAspect;\n } else {\n targetWrapperWidth = cropW;\n targetWrapperHeight = targetWrapperWidth / naturalAspect;\n }\n\n this.imageWrapperWidth.set(targetWrapperWidth);\n this.imageWrapperHeight.set(targetWrapperHeight);\n });\n }\n\n /** Current rendered geometry the crop math operates on, read from the state signals. */\n private geometry(): CropperGeometry {\n return {\n wrapperWidth: this.imageWrapperWidth(),\n wrapperHeight: this.imageWrapperHeight(),\n cropWidth: this.cropAreaWidth(),\n cropHeight: this.cropAreaHeight()\n };\n }\n\n private restrictOffset(dragOffsetX: number, dragOffsetY: number, currentZoom: number): { x: number; y: number } {\n return computeRestrictedOffset(dragOffsetX, dragOffsetY, currentZoom, this.geometry());\n }\n\n private setupAccessibilityWarningEffect(): void {\n if (!this.isBrowser) return;\n\n effect(() => {\n const checkTimeout = setTimeout(() => {\n if (this.elementRef.nativeElement && !this.hasWarned()) {\n const hasDescription = document.getElementById(this.descriptionId);\n if (!hasDescription) {\n console.warn(this.CROPPER_DESC_WARN_MESSAGE);\n this.hasWarned.set(true);\n }\n }\n }, 100);\n\n return () => clearTimeout(checkTimeout);\n });\n }\n\n /**\n * Single attachment point for every interaction listener. Re-runs on `disabled()`, so a disabled\n * cropper has NO interaction listeners bound at all — there is no per-handler `disabled` check to\n * forget, and a new gesture path can't accidentally bypass the gate. Uses `{ passive: false }` so\n * the handlers can `preventDefault()` (wheel/touch scrolling, arrow-key page scroll).\n */\n private setupEventListenersEffect(): void {\n if (!this.isBrowser) return;\n\n effect((onCleanup) => {\n const node = this.elementRef.nativeElement;\n if (!node || this.disabled()) return;\n\n const options: AddEventListenerOptions = { passive: false };\n\n const mouseDownHandler = (e: MouseEvent) => this.onMouseDown(e);\n const keyDownHandler = (e: KeyboardEvent) => this.onKeyDown(e);\n const wheelHandler = (e: WheelEvent) => this.handleWheel(e);\n const touchStartHandler = (e: TouchEvent) => this.handleTouchStart(e);\n const touchMoveHandler = (e: TouchEvent) => this.handleTouchMove(e);\n const touchEndHandler = (e: TouchEvent) => this.handleTouchEnd(e);\n\n node.addEventListener('mousedown', mouseDownHandler, options);\n node.addEventListener('keydown', keyDownHandler, options);\n node.addEventListener('wheel', wheelHandler, options);\n node.addEventListener('touchstart', touchStartHandler, options);\n node.addEventListener('touchmove', touchMoveHandler, options);\n node.addEventListener('touchend', touchEndHandler, options);\n node.addEventListener('touchcancel', touchEndHandler, options);\n\n onCleanup(() => {\n node.removeEventListener('mousedown', mouseDownHandler, options);\n node.removeEventListener('keydown', keyDownHandler, options);\n node.removeEventListener('wheel', wheelHandler, options);\n node.removeEventListener('touchstart', touchStartHandler, options);\n node.removeEventListener('touchmove', touchMoveHandler, options);\n node.removeEventListener('touchend', touchEndHandler, options);\n node.removeEventListener('touchcancel', touchEndHandler, options);\n });\n });\n }\n\n private onMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n e.preventDefault();\n this.isDragging.set(true);\n this.isPinching.set(false);\n this.dragStartPoint.set({ x: e.clientX, y: e.clientY });\n this.dragStartOffset.set(this.clampedOffset());\n\n const handleMouseMove = (ev: MouseEvent) => {\n const deltaX = ev.clientX - this.dragStartPoint().x;\n const deltaY = ev.clientY - this.dragStartPoint().y;\n this.offset.set({ x: this.dragStartOffset().x + deltaX, y: this.dragStartOffset().y + deltaY });\n };\n\n const handleMouseUp = () => {\n this.isDragging.set(false);\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n /**\n * Zoom toward an anchor point (coordinates relative to the root's center). `fromZoom`/`fromOffset`\n * are the zoom/offset the anchor is measured against — the live state for wheel/keyboard, the\n * gesture-start baseline for pinch. Emits the zoom request via {@link updateZoom}, then re-anchors\n * the pan offset **only when the zoom is uncontrolled**: in controlled mode the rendered zoom does\n * not change until the parent writes `zoom` back, so writing an offset for a not-yet-applied zoom\n * would pan the image without rescaling it (`clampedOffset` re-derives once the new zoom applies).\n */\n private zoomToPoint(\n pointerX: number,\n pointerY: number,\n targetZoom: number,\n fromZoom: number,\n fromOffset: { x: number; y: number }\n ): void {\n const clampedZoom = clamp(targetZoom, this.minZoom(), this.maxZoom());\n if (clampedZoom === this.effectiveZoom()) return;\n\n const imagePointX = (pointerX - fromOffset.x) / fromZoom;\n const imagePointY = (pointerY - fromOffset.y) / fromZoom;\n\n const finalNewZoom = this.updateZoom(clampedZoom);\n if (this.isZoomControlled()) return;\n\n this.offset.set({ x: pointerX - imagePointX * finalNewZoom, y: pointerY - imagePointY * finalNewZoom });\n }\n\n private handleWheel(e: WheelEvent): void {\n e.preventDefault();\n e.stopPropagation();\n if (!this.elementRef.nativeElement || this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n\n const delta = e.deltaY * -this.zoomSensitivity();\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n const pointerX = e.clientX - rect.left - rect.width / 2;\n const pointerY = e.clientY - rect.top - rect.height / 2;\n\n this.zoomToPoint(pointerX, pointerY, this.effectiveZoom() + delta, this.effectiveZoom(), this.clampedOffset());\n }\n\n private getPinchDistance(touches: TouchList): number {\n return Math.sqrt(\n Math.pow(touches[1].clientX - touches[0].clientX, 2) + Math.pow(touches[1].clientY - touches[0].clientY, 2)\n );\n }\n\n private getPinchCenter(touches: TouchList): { x: number; y: number } {\n return {\n x: (touches[0].clientX + touches[1].clientX) / 2,\n y: (touches[0].clientY + touches[1].clientY) / 2\n };\n }\n\n private handleTouchStart(e: TouchEvent): void {\n if (this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n e.preventDefault();\n const touches = e.touches;\n\n if (touches.length === 1) {\n this.isDragging.set(true);\n this.isPinching.set(false);\n this.dragStartPoint.set({ x: touches[0].clientX, y: touches[0].clientY });\n this.dragStartOffset.set(this.clampedOffset());\n } else if (touches.length === 2) {\n this.isDragging.set(false);\n this.isPinching.set(true);\n this.initialPinchDistance.set(this.getPinchDistance(touches));\n this.initialPinchZoom.set(this.latestZoom());\n this.dragStartOffset.set(this.clampedOffset());\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n e.preventDefault();\n const touches = e.touches;\n\n if (touches.length === 1 && this.isDragging() && !this.isPinching()) {\n const deltaX = touches[0].clientX - this.dragStartPoint().x;\n const deltaY = touches[0].clientY - this.dragStartPoint().y;\n this.offset.set({ x: this.dragStartOffset().x + deltaX, y: this.dragStartOffset().y + deltaY });\n } else if (touches.length === 2 && this.isPinching()) {\n const scale = this.getPinchDistance(touches) / this.initialPinchDistance();\n const pinchCenter = this.getPinchCenter(touches);\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n const pinchCenterX = pinchCenter.x - rect.left - rect.width / 2;\n const pinchCenterY = pinchCenter.y - rect.top - rect.height / 2;\n\n // Pinch is baseline-relative: anchor against the zoom/offset captured at gesture start.\n this.zoomToPoint(\n pinchCenterX,\n pinchCenterY,\n this.initialPinchZoom() * scale,\n this.initialPinchZoom(),\n this.dragStartOffset()\n );\n }\n }\n\n private handleTouchEnd(e: TouchEvent): void {\n e.preventDefault();\n const touches = e.touches;\n\n if (this.isPinching() && touches.length < 2) {\n this.isPinching.set(false);\n\n if (touches.length === 1) {\n this.isDragging.set(true);\n this.dragStartPoint.set({ x: touches[0].clientX, y: touches[0].clientY });\n this.dragStartOffset.set(this.clampedOffset());\n } else {\n this.isDragging.set(false);\n }\n } else if (this.isDragging() && touches.length === 0) {\n this.isDragging.set(false);\n }\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (this.imageWrapperWidth() <= 0) return;\n\n const base = this.clampedOffset();\n let targetOffsetX = base.x;\n let targetOffsetY = base.y;\n // eslint-disable-next-line no-useless-assignment\n let moved = false;\n\n switch (e.key) {\n case 'ArrowUp':\n targetOffsetY += this.keyboardStep();\n moved = true;\n break;\n case 'ArrowDown':\n targetOffsetY -= this.keyboardStep();\n moved = true;\n break;\n case 'ArrowLeft':\n targetOffsetX += this.keyboardStep();\n moved = true;\n break;\n case 'ArrowRight':\n targetOffsetX -= this.keyboardStep();\n moved = true;\n break;\n case '+':\n case '=':\n case 'PageUp':\n e.preventDefault();\n this.zoomFromCenter(this.zoomKeyboardStep());\n return;\n case '-':\n case '_':\n case 'PageDown':\n e.preventDefault();\n this.zoomFromCenter(-this.zoomKeyboardStep());\n return;\n default:\n return;\n }\n\n if (moved) {\n e.preventDefault();\n // Write the raw target; `clampedOffset` clamps it (and dedups a no-op at the boundary).\n this.offset.set({ x: targetOffsetX, y: targetOffsetY });\n }\n }\n\n /** Zoom by `delta` keeping the crop center fixed (the keyboard counterpart of wheel/pinch zoom). */\n private zoomFromCenter(delta: number): void {\n if (this.imageWrapperWidth() <= 0 || this.imageWrapperHeight() <= 0) return;\n // Anchor at the crop center (pointer 0,0 relative to center) against the live zoom/offset.\n this.zoomToPoint(0, 0, this.effectiveZoom() + delta, this.effectiveZoom(), this.clampedOffset());\n }\n\n /**\n * Inline style for the image wrapper: measured size, centered in the root, then translated and\n * scaled by the current pan offset and zoom. A `computed` (not a method) so the `[style]` binding\n * only re-applies when an input actually changes — a per-change-detection method call would\n * allocate a new object every tick and force a constant re-bind.\n */\n readonly imageWrapperStyle = computed<Record<string, string>>(() => {\n const wrapperW = this.imageWrapperWidth();\n const wrapperH = this.imageWrapperHeight();\n const { x: offsetX, y: offsetY } = this.clampedOffset();\n const zoom = this.effectiveZoom();\n\n return {\n width: `${wrapperW}px`,\n height: `${wrapperH}px`,\n transform: `translate3d(${offsetX}px, ${offsetY}px, 0px) scale(${zoom})`,\n position: 'absolute',\n left: `calc(50% - ${wrapperW / 2}px)`,\n top: `calc(50% - ${wrapperH / 2}px)`,\n willChange: 'transform'\n };\n });\n\n /** Inline style for the crop-area overlay (its measured width/height). */\n readonly cropAreaStyle = computed<Record<string, string>>(() => ({\n width: `${this.cropAreaWidth()}px`,\n height: `${this.cropAreaHeight()}px`\n }));\n}\n","import { NgModule } from '@angular/core';\nimport { RdxCropperCropAreaDirective } from './src/cropper-crop-area.directive';\nimport { RdxCropperDescriptionDirective } from './src/cropper-description.directive';\nimport { RdxCropperImageComponent } from './src/cropper-image.component';\nimport { RdxCropperRootDirective } from './src/cropper-root.directive';\n\nexport * from './src/cropper-context.token';\nexport * from './src/cropper-crop-area.directive';\nexport * from './src/cropper-description.directive';\nexport * from './src/cropper-image.component';\nexport * from './src/cropper-root.directive';\n\nconst _imports = [\n RdxCropperRootDirective,\n RdxCropperImageComponent,\n RdxCropperCropAreaDirective,\n RdxCropperDescriptionDirective\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxCropperModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["computeCropData","computeRestrictedOffset"],"mappings":"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"}