@ngneers/controls 0.0.1-next.0 → 0.0.1-next.2

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 (119) hide show
  1. package/fesm2022/ngneers-controls-api-ng.mjs +11 -18
  2. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-resize.mjs +7 -0
  4. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-badge.mjs +160 -0
  6. package/fesm2022/ngneers-controls-badge.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-base.mjs +85 -8
  8. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  9. package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs → ngneers-controls-calendar-time-paM6WVpV.mjs} +2 -2
  10. package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs.map → ngneers-controls-calendar-time-paM6WVpV.mjs.map} +1 -1
  11. package/fesm2022/ngneers-controls-calendar.mjs +13 -6
  12. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-checkbox.mjs +3 -3
  14. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-color-picker.mjs +336 -0
  16. package/fesm2022/ngneers-controls-color-picker.mjs.map +1 -0
  17. package/fesm2022/ngneers-controls-default-icons.mjs +5 -0
  18. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -1
  19. package/fesm2022/ngneers-controls-directives.mjs +64 -7
  20. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -5
  22. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-errors.mjs +203 -148
  24. package/fesm2022/ngneers-controls-errors.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-filter.mjs +2 -2
  26. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-hint.mjs +18 -1
  28. package/fesm2022/ngneers-controls-hint.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-i18n-translations-de.mjs +17 -0
  30. package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-i18n-translations-en.mjs +19 -0
  32. package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-icon.mjs +23 -6
  34. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-input-field.mjs +18 -2
  36. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  37. package/fesm2022/ngneers-controls-input.mjs +49 -9
  38. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  39. package/fesm2022/ngneers-controls-list-box.mjs +2 -2
  40. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  41. package/fesm2022/ngneers-controls-mask-input.mjs +4 -1
  42. package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-number-input.mjs +4 -4
  44. package/fesm2022/ngneers-controls-number-input.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-otp.mjs +263 -0
  46. package/fesm2022/ngneers-controls-otp.mjs.map +1 -0
  47. package/fesm2022/ngneers-controls-paginator.mjs +36 -9
  48. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-radio.mjs +4 -4
  50. package/fesm2022/ngneers-controls-radio.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-rating.mjs +180 -0
  52. package/fesm2022/ngneers-controls-rating.mjs.map +1 -0
  53. package/fesm2022/ngneers-controls-scroll-shadow.mjs +33 -7
  54. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-scroller.mjs +4 -2
  56. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-select-button.mjs +2 -1
  58. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-select.mjs +24 -4
  60. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-slider.mjs +3 -3
  62. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-splitter.mjs +43 -12
  64. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-stepper.mjs +142 -0
  66. package/fesm2022/ngneers-controls-stepper.mjs.map +1 -0
  67. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  68. package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-table.mjs +282 -15
  70. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-tabs.mjs +2 -2
  72. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-toggle-button.mjs +3 -3
  74. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-tooltip.mjs +16 -28
  76. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-tree.mjs +2 -2
  78. package/fesm2022/ngneers-controls-tree.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-utils.mjs +138 -1
  80. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  81. package/package.json +22 -2
  82. package/types/ngneers-controls-api-ng.d.ts +12 -9
  83. package/types/ngneers-controls-badge.d.ts +67 -0
  84. package/types/ngneers-controls-base.d.ts +61 -4
  85. package/types/ngneers-controls-breadcrumb.d.ts +17 -0
  86. package/types/ngneers-controls-calendar.d.ts +24 -6
  87. package/types/ngneers-controls-chip.d.ts +17 -0
  88. package/types/ngneers-controls-color-picker.d.ts +119 -0
  89. package/types/ngneers-controls-dialog.d.ts +17 -0
  90. package/types/ngneers-controls-directives.d.ts +31 -2
  91. package/types/ngneers-controls-drawer.d.ts +17 -0
  92. package/types/ngneers-controls-edit-inplace.d.ts +23 -0
  93. package/types/ngneers-controls-errors.d.ts +105 -16
  94. package/types/ngneers-controls-filter.d.ts +30 -13
  95. package/types/ngneers-controls-hint.d.ts +8 -1
  96. package/types/ngneers-controls-i18n-translations-de.d.ts +17 -0
  97. package/types/ngneers-controls-i18n-translations-en.d.ts +17 -0
  98. package/types/ngneers-controls-i18n.d.ts +17 -0
  99. package/types/ngneers-controls-icon.d.ts +2 -2
  100. package/types/ngneers-controls-input-field.d.ts +28 -2
  101. package/types/ngneers-controls-input.d.ts +35 -3
  102. package/types/ngneers-controls-list-box.d.ts +17 -0
  103. package/types/ngneers-controls-mask-input.d.ts +17 -0
  104. package/types/ngneers-controls-otp.d.ts +262 -0
  105. package/types/ngneers-controls-paginator.d.ts +34 -3
  106. package/types/ngneers-controls-rating.d.ts +69 -0
  107. package/types/ngneers-controls-scroll-shadow.d.ts +11 -2
  108. package/types/ngneers-controls-scroller.d.ts +3 -1
  109. package/types/ngneers-controls-select.d.ts +30 -3
  110. package/types/ngneers-controls-snackbar.d.ts +17 -0
  111. package/types/ngneers-controls-splitter.d.ts +26 -2
  112. package/types/ngneers-controls-state.d.ts +2 -2
  113. package/types/ngneers-controls-stepper.d.ts +68 -0
  114. package/types/ngneers-controls-table.d.ts +276 -169
  115. package/types/ngneers-controls-toast.d.ts +17 -0
  116. package/types/ngneers-controls-tooltip.d.ts +0 -1
  117. package/types/ngneers-controls-tree.d.ts +17 -0
  118. package/types/ngneers-controls-upload.d.ts +17 -0
  119. package/types/ngneers-controls-utils.d.ts +27 -2
@@ -451,6 +451,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
451
451
  }]
452
452
  }], ctorParameters: () => [], propDecorators: { ngnResizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnResizable", required: false }] }], ngnResizableSizeLimits: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnResizableSizeLimits", required: false }] }] } });
453
453
 
454
+ /** Remaining scrollable distance to the end, clamped at 0. Pure for testing. */
455
+ function computeDistanceFromEnd(scrollSize, clientSize, scrollPos) {
456
+ return Math.max(0, scrollSize - clientSize - scrollPos);
457
+ }
458
+ /** Whether the current end-distance is within the trigger threshold. Pure for testing. */
459
+ function isWithinEndZone(distanceFromEnd, threshold) {
460
+ return distanceFromEnd <= threshold;
461
+ }
454
462
  class NgnScrollAmount {
455
463
  _el = inject(ElementRef);
456
464
  /**
@@ -458,41 +466,90 @@ class NgnScrollAmount {
458
466
  * dimensions are tracked on this element instead of the host element.
459
467
  */
460
468
  container = input(undefined, { ...(ngDevMode ? { debugName: "container" } : /* istanbul ignore next */ {}), alias: 'ngnScrollAmountContainer' });
469
+ /**
470
+ * Distance (px) from the end at which {@link endReached} fires.
471
+ * @default 0
472
+ */
473
+ endThreshold = input(0, { ...(ngDevMode ? { debugName: "endThreshold" } : /* istanbul ignore next */ {}), alias: 'ngnScrollAmountEndThreshold' });
474
+ /**
475
+ * Fires once when scrolling crosses within {@link endThreshold} of the bottom
476
+ * (edge-triggered). For simple "load more" lists; guarded consumers should
477
+ * read {@link distanceFromEnd} instead.
478
+ */
479
+ endReached = output();
461
480
  scrollTarget = computed(() => this.container() ?? this._el.nativeElement, /* @ts-ignore */
462
481
  ...(ngDevMode ? [{ debugName: "scrollTarget" }] : /* istanbul ignore next */ []));
463
482
  scrollTop = signal(this._el.nativeElement.scrollTop, /* @ts-ignore */
464
483
  ...(ngDevMode ? [{ debugName: "scrollTop" }] : /* istanbul ignore next */ []));
465
484
  scrollLeft = signal(this._el.nativeElement.scrollLeft, /* @ts-ignore */
466
485
  ...(ngDevMode ? [{ debugName: "scrollLeft" }] : /* istanbul ignore next */ []));
486
+ _containerSize = elementSizeSignal(this.scrollTarget);
487
+ _hostSize = elementSizeSignal(this._el);
488
+ scrollHeight = signal(this._el.nativeElement.scrollHeight, /* @ts-ignore */
489
+ ...(ngDevMode ? [{ debugName: "scrollHeight" }] : /* istanbul ignore next */ []));
490
+ clientHeight = signal(this._el.nativeElement.clientHeight, /* @ts-ignore */
491
+ ...(ngDevMode ? [{ debugName: "clientHeight" }] : /* istanbul ignore next */ []));
492
+ scrollWidth = signal(this._el.nativeElement.scrollWidth, /* @ts-ignore */
493
+ ...(ngDevMode ? [{ debugName: "scrollWidth" }] : /* istanbul ignore next */ []));
494
+ clientWidth = signal(this._el.nativeElement.clientWidth, /* @ts-ignore */
495
+ ...(ngDevMode ? [{ debugName: "clientWidth" }] : /* istanbul ignore next */ []));
496
+ /** Remaining vertical scroll distance to the bottom (px), clamped at 0. */
497
+ distanceFromEnd = computed(() => computeDistanceFromEnd(this.scrollHeight(), this.clientHeight(), this.scrollTop()), /* @ts-ignore */
498
+ ...(ngDevMode ? [{ debugName: "distanceFromEnd" }] : /* istanbul ignore next */ []));
499
+ /** Remaining horizontal scroll distance to the right edge (px), clamped at 0. */
500
+ distanceFromRight = computed(() => computeDistanceFromEnd(this.scrollWidth(), this.clientWidth(), this.scrollLeft()), /* @ts-ignore */
501
+ ...(ngDevMode ? [{ debugName: "distanceFromRight" }] : /* istanbul ignore next */ []));
467
502
  _scrollEvent = domEventObservable(this.scrollTarget, 'scroll');
503
+ /** Syncs the vertical scroll-size signals. */
504
+ _syncVerticalGeometry(target) {
505
+ this.scrollHeight.set(target.scrollHeight);
506
+ this.clientHeight.set(target.clientHeight);
507
+ }
508
+ /** Syncs all four scroll-geometry signals off `target`. */
509
+ _syncGeometry(target) {
510
+ this._syncVerticalGeometry(target);
511
+ this.scrollWidth.set(target.scrollWidth);
512
+ this.clientWidth.set(target.clientWidth);
513
+ }
468
514
  constructor() {
469
515
  afterRenderEffect(() => {
470
516
  const obs = this._scrollEvent.pipe(map(e => {
471
517
  const target = e.target;
472
- return {
473
- top: target.scrollTop,
474
- left: target.scrollLeft,
475
- };
518
+ return { top: target.scrollTop, left: target.scrollLeft, el: target };
476
519
  }));
477
520
  obs.subscribe(scroll => {
478
521
  this.scrollTop.set(scroll.top);
479
522
  this.scrollLeft.set(scroll.left);
523
+ this._syncVerticalGeometry(scroll.el);
480
524
  });
481
525
  });
526
+ // Resync geometry on container resize or host content growth.
527
+ afterRenderEffect(() => {
528
+ this._containerSize();
529
+ this._hostSize();
530
+ this._syncGeometry(this.scrollTarget());
531
+ });
532
+ let wasInZone = false;
533
+ effect(() => {
534
+ const inZone = isWithinEndZone(this.distanceFromEnd(), this.endThreshold());
535
+ if (inZone && !wasInZone)
536
+ this.endReached.emit();
537
+ wasInZone = inZone;
538
+ });
482
539
  }
483
540
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnScrollAmount, deps: [], target: i0.ɵɵFactoryTarget.Directive });
484
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: NgnScrollAmount, isStandalone: true, selector: "[ngnScrollAmount]", inputs: { container: { classPropertyName: "container", publicName: "ngnScrollAmountContainer", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
541
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: NgnScrollAmount, isStandalone: true, selector: "[ngnScrollAmount]", inputs: { container: { classPropertyName: "container", publicName: "ngnScrollAmountContainer", isSignal: true, isRequired: false, transformFunction: null }, endThreshold: { classPropertyName: "endThreshold", publicName: "ngnScrollAmountEndThreshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { endReached: "endReached" }, ngImport: i0 });
485
542
  }
486
543
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnScrollAmount, decorators: [{
487
544
  type: Directive,
488
545
  args: [{
489
546
  selector: '[ngnScrollAmount]',
490
547
  }]
491
- }], ctorParameters: () => [], propDecorators: { container: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnScrollAmountContainer", required: false }] }] } });
548
+ }], ctorParameters: () => [], propDecorators: { container: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnScrollAmountContainer", required: false }] }], endThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnScrollAmountEndThreshold", required: false }] }], endReached: [{ type: i0.Output, args: ["endReached"] }] } });
492
549
 
493
550
  /**
494
551
  * Generated bundle index. Do not edit.
495
552
  */
496
553
 
497
- export { NgnAutofocus, NgnDrag, NgnDragScroll, NgnMovable, NgnResizable, NgnScrollAmount };
554
+ export { NgnAutofocus, NgnDrag, NgnDragScroll, NgnMovable, NgnResizable, NgnScrollAmount, computeDistanceFromEnd, isWithinEndZone };
498
555
  //# sourceMappingURL=ngneers-controls-directives.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-directives.mjs","sources":["../../src/directives/autofocus.ts","../../src/directives/drag/drag-base.ts","../../src/directives/drag/drag-scroll.ts","../../src/directives/drag/drag.ts","../../src/directives/movable.ts","../../src/directives/resizable.ts","../../src/directives/scroll-amount.ts","../../src/directives/ngneers-controls-directives.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\n\n@Directive({ selector: '[ngnAutofocus]' })\nexport class NgnAutofocus {\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly _focused = signal(false);\n private readonly _isInitialized = signal(false);\n\n /**\n * Whether to focus the host element once it has rendered. Set to `false` to\n * disable autofocus without removing the directive.\n * @default true\n */\n public readonly ngnAutofocus = input(true, { transform: booleanAttribute });\n\n constructor() {\n effect(() => {\n if (!this.ngnAutofocus()) {\n this._focused.set(false);\n }\n });\n effect(() => {\n this.autoFocus();\n });\n\n /**\n * `afterNextRender` only runs in the browser, never during server-side\n * prerendering — guarding against `getClientRects`/`focus` calls on a\n * server DOM element that lacks them.\n *\n * The additional microtask ensures that the control is rendered and the\n * ngn-control-initializing class is removed before trying to focus the element.\n */\n afterNextRender(() => {\n if (this._el.nativeElement.getClientRects().length === 0) {\n queueMicrotask(() => {\n this._isInitialized.set(true);\n });\n } else {\n this._isInitialized.set(true);\n }\n });\n }\n\n private autoFocus() {\n if (!this._isInitialized()) {\n return;\n }\n if (!this.ngnAutofocus()) {\n return;\n }\n if (this._focused()) {\n return;\n }\n this._el.nativeElement.focus();\n this._focused.set(true);\n }\n}\n","import {\n afterRenderEffect,\n Directive,\n DOCUMENT,\n ElementRef,\n inject,\n output,\n signal,\n} from '@angular/core';\nimport { domEventHandler, domEventObservable, Platform } from '@ngneers/controls/api/ng';\n\nimport type { NgnDragInfo } from './types';\n\n@Directive()\nexport abstract class NgnDragBase {\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _document = inject(DOCUMENT);\n private readonly _isBrowser = inject(Platform).isBrowser;\n\n private _pointerDown = false;\n private _startX?: number = undefined;\n private _startY?: number = undefined;\n private _dragged = false;\n\n protected readonly isDragging = signal(false);\n /**\n * Emits once when a drag gesture begins, i.e. after the pointer has moved past\n * the small activation threshold following a pointerdown.\n */\n public readonly dragStart = output<void>();\n /**\n * Emits once when the drag gesture ends (pointer released).\n */\n public readonly dragEnd = output<void>();\n /**\n * Emits on every pointer move while dragging, carrying the frame delta and\n * absolute pointer position. See {@link NgnDragInfo}.\n */\n public readonly dragged = output<NgnDragInfo>();\n\n private readonly _pointerDownEvent = domEventObservable(this.el.nativeElement, 'pointerdown');\n private readonly _pointerMoveEvent = domEventObservable(this._document, 'pointermove');\n private readonly _pointerUpEvent = domEventObservable(this._document, 'pointerup');\n\n constructor() {\n if (!this._isBrowser) {\n return;\n }\n domEventHandler(this.el.nativeElement, 'touchmove', e => {\n if (e.cancelable) {\n e.preventDefault();\n }\n });\n // Swallow the click that the browser synthesizes after a drag-release so it\n // does not trigger click handlers (e.g. selecting a tab). Capture phase so\n // it runs before bubbling handlers on descendant elements.\n domEventHandler(\n this.el.nativeElement,\n 'click',\n e => {\n if (this._dragged) {\n this._dragged = false;\n e.preventDefault();\n e.stopPropagation();\n }\n },\n undefined,\n { capture: true }\n );\n afterRenderEffect(() => {\n this._pointerDownEvent.subscribe(event => {\n this._pointerDown = true;\n this._dragged = false;\n this._startX = (event as PointerEvent).clientX;\n this._startY = (event as PointerEvent).clientY;\n });\n this._pointerUpEvent.subscribe(() => {\n if (!this._pointerDown) {\n return;\n }\n this._pointerDown = false;\n this._startX = undefined;\n this._startY = undefined;\n this.isDragging.set(false);\n this.dragEnd.emit();\n });\n\n this._pointerMoveEvent.subscribe(event => {\n if (!this._pointerDown) {\n return;\n }\n this.handleDrag(event);\n });\n });\n }\n\n protected abstract onDragged(delta: NgnDragInfo): void;\n\n private onDraggedInt(delta: NgnDragInfo) {\n this.dragged.emit(delta);\n this.onDragged(delta);\n }\n\n private handleDrag(event: Event) {\n const { clientX, clientY } = event as PointerEvent;\n if (this._startX === undefined || this._startY === undefined) {\n throw new Error('Start positions are undefined');\n }\n const deltaX = clientX - this._startX;\n const deltaY = clientY - this._startY;\n if (!this.isDragging()) {\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\n if (distance < 5) {\n return;\n }\n this.isDragging.set(true);\n this._dragged = true;\n this.dragStart.emit();\n }\n if (!this.isDragging()) {\n return;\n }\n this._startX = clientX;\n this._startY = clientY;\n this.onDraggedInt({ deltaX: deltaX, deltaY: deltaY, absoluteX: clientX, absoluteY: clientY });\n }\n}\n","import { Directive } from '@angular/core';\n\nimport { NgnDragBase } from './drag-base';\n\nimport type { NgnDragInfo } from './types';\n\n@Directive({\n selector: '[ngnDragScroll]',\n})\nexport class NgnDragScroll extends NgnDragBase {\n protected onDragged(delta: NgnDragInfo): void {\n this.el.nativeElement.scrollBy({\n left: -delta.deltaX,\n top: -delta.deltaY,\n behavior: 'auto',\n });\n }\n}\n","import { Directive } from '@angular/core';\n\nimport { NgnDragBase } from './drag-base';\n\nimport type { NgnDragInfo } from './types';\n\n@Directive({\n selector: '[ngnDrag]',\n})\nexport class NgnDrag extends NgnDragBase {\n protected onDragged(delta: NgnDragInfo): void {\n // do nothing\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { domEventHandler, domEventSignal } from '@ngneers/controls/api/ng';\nimport { NgnBase } from '@ngneers/controls/base';\nimport { signalWithPrevious } from '@ngneers/controls/utils-ng';\nimport { movableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\n\n@Directive({\n selector: '[ngnMovable]',\n})\nexport class NgnMovable extends NgnBase<'movable'> {\n protected readonly theme = this.injectThemeTemplate(movableDirectiveTemplate, {\n movable: () => this.ngnMovable(),\n moved: () => this.dragged(),\n });\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly _document = inject(DOCUMENT);\n\n /**\n * Whether the element is movable.\n * @default true\n */\n public readonly ngnMovable = input(true, { transform: booleanAttribute });\n\n /**\n * The handle element used to drag the element. If omitted, the entire element will be used as the drag handle.\n * @default null\n */\n public readonly ngnMovableDragHandle = input<HTMLElement | null>(null);\n\n /**\n * When `true`, the cursor will change to indicate that the element / drag handle is movable.\n * @default true\n */\n public readonly ngnMovableChangeCursor = input(true, { transform: booleanAttribute });\n\n /**\n * When `true`, the movement will be limited to the viewport.\n * @default true\n */\n public readonly ngnMovableLimitToViewport = input(true, { transform: booleanAttribute });\n\n private readonly _ngnMovableDragHandleWithPrevious = signalWithPrevious(\n this.ngnMovableDragHandle,\n null\n );\n\n private readonly _eventElement = computed(() => {\n const handle = this.ngnMovableDragHandle();\n return handle ?? this._el.nativeElement;\n });\n\n protected readonly dragged = signal(false);\n\n private readonly _pointerDownSignal = domEventSignal(this._eventElement, 'pointerdown');\n private readonly _pointerMoveSignal = domEventSignal(this._document, 'pointermove');\n private readonly _pointerUpSignal = domEventSignal(this._document, 'pointerup');\n\n private readonly _isDragging = signal(false);\n private _startX = 0;\n private _startY = 0;\n\n constructor() {\n super();\n\n domEventHandler(this._el.nativeElement, 'touchmove', e => {\n if (!this.ngnMovable()) {\n return;\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n return;\n }\n const pointerDown = this._pointerDownSignal();\n // check if primary button or touch\n if (pointerDown && (pointerDown.button === 0 || pointerDown.pointerType === 'touch')) {\n this._isDragging.set(true);\n this._startX = pointerDown.clientX - this._el.nativeElement.offsetLeft;\n this._startY = pointerDown.clientY - this._el.nativeElement.offsetTop;\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n return;\n }\n const pointerMove = this._pointerMoveSignal();\n if (pointerMove && untracked(this._isDragging)) {\n this.dragged.set(true);\n const newLeft = pointerMove.clientX - this._startX;\n const newTop = pointerMove.clientY - this._startY;\n\n if (this.ngnMovableLimitToViewport()) {\n const documentRect = this._document.documentElement.getBoundingClientRect();\n const elRect = this._el.nativeElement.getBoundingClientRect();\n\n const clampedLeft = Math.min(Math.max(newLeft, 0), documentRect.width - elRect.width);\n const clampedTop = Math.min(Math.max(newTop, 0), documentRect.height - elRect.height);\n\n this._el.nativeElement.style.left = `${clampedLeft}px`;\n this._el.nativeElement.style.top = `${clampedTop}px`;\n } else {\n this._el.nativeElement.style.left = `${pointerMove.clientX - this._startX}px`;\n this._el.nativeElement.style.top = `${pointerMove.clientY - this._startY}px`;\n }\n\n this._el.nativeElement.style.width = `${this._el.nativeElement.offsetWidth}px`;\n this._el.nativeElement.style.height = `${this._el.nativeElement.offsetHeight}px`;\n if (\n !['fixed', 'absolute', 'static'].includes(\n getComputedStyle(this._el.nativeElement).position\n )\n ) {\n this._el.nativeElement.style.position = 'fixed';\n }\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n return;\n }\n const pointerUp = this._pointerUpSignal();\n if (pointerUp && untracked(this._isDragging)) {\n this._isDragging.set(false);\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n this._isDragging.set(false);\n }\n });\n\n effect(() => {\n this.refreshCursor();\n });\n }\n\n public bakePosition() {\n this._el.nativeElement.style.left = `${this._el.nativeElement.offsetLeft}px`;\n this._el.nativeElement.style.top = `${this._el.nativeElement.offsetTop}px`;\n if (\n !['fixed', 'absolute', 'static'].includes(getComputedStyle(this._el.nativeElement).position)\n ) {\n this._el.nativeElement.style.position = 'fixed';\n }\n this.dragged.set(true);\n }\n\n private refreshCursor() {\n const handle = this._ngnMovableDragHandleWithPrevious();\n if (handle.previous && handle.previous !== handle.current) {\n handle.previous.classList.remove(\n this.theme.class('drag-handle-grab'),\n this.theme.class('drag-handle-grabbing')\n );\n }\n if (!this.ngnMovable() || !this.ngnMovableChangeCursor()) {\n handle.current?.classList.remove(\n this.theme.class('drag-handle-grab'),\n this.theme.class('drag-handle-grabbing')\n );\n return;\n }\n if (this._isDragging()) {\n handle.current?.classList.add(this.theme.class('drag-handle-grabbing'));\n handle.current?.classList.remove(this.theme.class('drag-handle-grab'));\n } else {\n handle.current?.classList.add(this.theme.class('drag-handle-grab'));\n handle.current?.classList.remove(this.theme.class('drag-handle-grabbing'));\n }\n }\n}\n","import { Directive, DOCUMENT, effect, ElementRef, inject, input, signal } from '@angular/core';\nimport {\n domEventSignal,\n elementSizeSignal,\n injectThemeTemplate,\n Platform,\n} from '@ngneers/controls/api/ng';\nimport { resizableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\n\nimport { NgnMovable } from './movable';\n\n@Directive({\n selector: '[ngnResizable]',\n host: {\n '[class]': 'theme.classes({ resizable: !!ngnResizable(), resized: resized()})',\n },\n})\nexport class NgnResizable {\n protected readonly theme = injectThemeTemplate(resizableDirectiveTemplate);\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly _isBrowser = inject(Platform).isBrowser;\n private readonly _document = inject(DOCUMENT);\n private readonly _ngnMovable = inject(NgnMovable, { optional: true });\n private _isPointerDown = false;\n\n /**\n * Whether the element is resizable. The empty string (bare attribute) enables it.\n * @default true\n */\n public readonly ngnResizable = input<boolean | null | undefined | ''>(true);\n /**\n * Minimum and maximum size constraints for the resizable element. Number values\n * are treated as pixels; strings are used as-is. Any bound left `null`/`undefined`\n * is unconstrained (the effective maximum is still clamped to the viewport).\n */\n public readonly ngnResizableSizeLimits = input<{\n minWidth: string | number | null | undefined;\n minHeight: string | number | null | undefined;\n maxWidth: string | number | null | undefined;\n maxHeight: string | number | null | undefined;\n }>();\n\n protected readonly resized = signal(false);\n\n private readonly _pointerDownSignal = domEventSignal(this._el, 'pointerdown');\n private readonly _pointerUpSignal = domEventSignal(this._document, 'pointerup');\n\n private readonly _resizeEvent = elementSizeSignal(this._el);\n\n /**\n * Formats a size value from string | number | null | undefined to a CSS string.\n * @param value The size value to format\n * @returns The formatted CSS string or null if the value is null/undefined\n */\n private formatSizeValue(value: string | number | null | undefined): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n return typeof value === 'number' ? `${value}px` : value;\n }\n\n constructor() {\n effect(() => {\n if (this._pointerDownSignal()) {\n this._isPointerDown = true;\n }\n });\n\n effect(() => {\n if (this._pointerUpSignal()) {\n this._isPointerDown = false;\n }\n });\n\n effect(() => {\n if (!this._isBrowser) {\n return;\n }\n const _size = this._resizeEvent(); // just as the trigger\n if (!this._isPointerDown) {\n // only react to resize events when the pointer is down (user is resizing)\n return;\n }\n\n // If the element is also movable, bake its position to avoid misplacement after resizing\n this._ngnMovable?.bakePosition();\n\n // calculate the max width & height of the element based on the size, position & body\n\n const bodyWidth = this._document.body.clientWidth;\n const bodyHeight = this._document.body.clientHeight;\n\n const elRect = this._el.nativeElement.getBoundingClientRect();\n\n const maxWidth = bodyWidth - elRect.left;\n const maxHeight = bodyHeight - elRect.top;\n\n const inputMaxWidth = this.ngnResizableSizeLimits()?.maxWidth;\n const inputMaxHeight = this.ngnResizableSizeLimits()?.maxHeight;\n const formattedMaxWidth = this.formatSizeValue(inputMaxWidth);\n const formattedMaxHeight = this.formatSizeValue(inputMaxHeight);\n\n this._el.nativeElement.style.maxWidth = formattedMaxWidth\n ? `min(${formattedMaxWidth}, ${maxWidth}px)`\n : `${maxWidth}px`;\n this._el.nativeElement.style.maxHeight = formattedMaxHeight\n ? `min(${formattedMaxHeight}, ${maxHeight}px)`\n : `${maxHeight}px`;\n\n const inputMinWidth = this.ngnResizableSizeLimits()?.minWidth;\n const inputMinHeight = this.ngnResizableSizeLimits()?.minHeight;\n const formattedMinWidth = this.formatSizeValue(inputMinWidth);\n const formattedMinHeight = this.formatSizeValue(inputMinHeight);\n\n if (formattedMinWidth) {\n this._el.nativeElement.style.minWidth = formattedMinWidth;\n }\n if (formattedMinHeight) {\n this._el.nativeElement.style.minHeight = formattedMinHeight;\n }\n\n this.resized.set(true);\n });\n }\n}\n","import {\n afterRenderEffect,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { domEventObservable } from '@ngneers/controls/api/ng';\nimport { map } from 'rxjs';\n\n@Directive({\n selector: '[ngnScrollAmount]',\n})\nexport class NgnScrollAmount {\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Optional external scroll container. When set, scroll events and\n * dimensions are tracked on this element instead of the host element.\n */\n public readonly container = input<HTMLElement | undefined>(undefined, {\n alias: 'ngnScrollAmountContainer',\n });\n\n public readonly scrollTarget = computed(() => this.container() ?? this._el.nativeElement);\n public readonly scrollTop = signal(this._el.nativeElement.scrollTop);\n public readonly scrollLeft = signal(this._el.nativeElement.scrollLeft);\n\n private readonly _scrollEvent = domEventObservable(this.scrollTarget, 'scroll');\n\n constructor() {\n afterRenderEffect(() => {\n const obs = this._scrollEvent.pipe(\n map(e => {\n const target = e.target as HTMLElement;\n return {\n top: target.scrollTop,\n left: target.scrollLeft,\n };\n })\n );\n obs.subscribe(scroll => {\n this.scrollTop.set(scroll.top);\n this.scrollLeft.set(scroll.left);\n });\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-directives.mjs","sources":["../../src/directives/autofocus.ts","../../src/directives/drag/drag-base.ts","../../src/directives/drag/drag-scroll.ts","../../src/directives/drag/drag.ts","../../src/directives/movable.ts","../../src/directives/resizable.ts","../../src/directives/scroll-amount.ts","../../src/directives/ngneers-controls-directives.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n} from '@angular/core';\n\n@Directive({ selector: '[ngnAutofocus]' })\nexport class NgnAutofocus {\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly _focused = signal(false);\n private readonly _isInitialized = signal(false);\n\n /**\n * Whether to focus the host element once it has rendered. Set to `false` to\n * disable autofocus without removing the directive.\n * @default true\n */\n public readonly ngnAutofocus = input(true, { transform: booleanAttribute });\n\n constructor() {\n effect(() => {\n if (!this.ngnAutofocus()) {\n this._focused.set(false);\n }\n });\n effect(() => {\n this.autoFocus();\n });\n\n /**\n * `afterNextRender` only runs in the browser, never during server-side\n * prerendering — guarding against `getClientRects`/`focus` calls on a\n * server DOM element that lacks them.\n *\n * The additional microtask ensures that the control is rendered and the\n * ngn-control-initializing class is removed before trying to focus the element.\n */\n afterNextRender(() => {\n if (this._el.nativeElement.getClientRects().length === 0) {\n queueMicrotask(() => {\n this._isInitialized.set(true);\n });\n } else {\n this._isInitialized.set(true);\n }\n });\n }\n\n private autoFocus() {\n if (!this._isInitialized()) {\n return;\n }\n if (!this.ngnAutofocus()) {\n return;\n }\n if (this._focused()) {\n return;\n }\n this._el.nativeElement.focus();\n this._focused.set(true);\n }\n}\n","import {\n afterRenderEffect,\n Directive,\n DOCUMENT,\n ElementRef,\n inject,\n output,\n signal,\n} from '@angular/core';\nimport { domEventHandler, domEventObservable, Platform } from '@ngneers/controls/api/ng';\n\nimport type { NgnDragInfo } from './types';\n\n@Directive()\nexport abstract class NgnDragBase {\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _document = inject(DOCUMENT);\n private readonly _isBrowser = inject(Platform).isBrowser;\n\n private _pointerDown = false;\n private _startX?: number = undefined;\n private _startY?: number = undefined;\n private _dragged = false;\n\n protected readonly isDragging = signal(false);\n /**\n * Emits once when a drag gesture begins, i.e. after the pointer has moved past\n * the small activation threshold following a pointerdown.\n */\n public readonly dragStart = output<void>();\n /**\n * Emits once when the drag gesture ends (pointer released).\n */\n public readonly dragEnd = output<void>();\n /**\n * Emits on every pointer move while dragging, carrying the frame delta and\n * absolute pointer position. See {@link NgnDragInfo}.\n */\n public readonly dragged = output<NgnDragInfo>();\n\n private readonly _pointerDownEvent = domEventObservable(this.el.nativeElement, 'pointerdown');\n private readonly _pointerMoveEvent = domEventObservable(this._document, 'pointermove');\n private readonly _pointerUpEvent = domEventObservable(this._document, 'pointerup');\n\n constructor() {\n if (!this._isBrowser) {\n return;\n }\n domEventHandler(this.el.nativeElement, 'touchmove', e => {\n if (e.cancelable) {\n e.preventDefault();\n }\n });\n // Swallow the click that the browser synthesizes after a drag-release so it\n // does not trigger click handlers (e.g. selecting a tab). Capture phase so\n // it runs before bubbling handlers on descendant elements.\n domEventHandler(\n this.el.nativeElement,\n 'click',\n e => {\n if (this._dragged) {\n this._dragged = false;\n e.preventDefault();\n e.stopPropagation();\n }\n },\n undefined,\n { capture: true }\n );\n afterRenderEffect(() => {\n this._pointerDownEvent.subscribe(event => {\n this._pointerDown = true;\n this._dragged = false;\n this._startX = (event as PointerEvent).clientX;\n this._startY = (event as PointerEvent).clientY;\n });\n this._pointerUpEvent.subscribe(() => {\n if (!this._pointerDown) {\n return;\n }\n this._pointerDown = false;\n this._startX = undefined;\n this._startY = undefined;\n this.isDragging.set(false);\n this.dragEnd.emit();\n });\n\n this._pointerMoveEvent.subscribe(event => {\n if (!this._pointerDown) {\n return;\n }\n this.handleDrag(event);\n });\n });\n }\n\n protected abstract onDragged(delta: NgnDragInfo): void;\n\n private onDraggedInt(delta: NgnDragInfo) {\n this.dragged.emit(delta);\n this.onDragged(delta);\n }\n\n private handleDrag(event: Event) {\n const { clientX, clientY } = event as PointerEvent;\n if (this._startX === undefined || this._startY === undefined) {\n throw new Error('Start positions are undefined');\n }\n const deltaX = clientX - this._startX;\n const deltaY = clientY - this._startY;\n if (!this.isDragging()) {\n const distance = Math.sqrt(deltaX ** 2 + deltaY ** 2);\n if (distance < 5) {\n return;\n }\n this.isDragging.set(true);\n this._dragged = true;\n this.dragStart.emit();\n }\n if (!this.isDragging()) {\n return;\n }\n this._startX = clientX;\n this._startY = clientY;\n this.onDraggedInt({ deltaX: deltaX, deltaY: deltaY, absoluteX: clientX, absoluteY: clientY });\n }\n}\n","import { Directive } from '@angular/core';\n\nimport { NgnDragBase } from './drag-base';\n\nimport type { NgnDragInfo } from './types';\n\n@Directive({\n selector: '[ngnDragScroll]',\n})\nexport class NgnDragScroll extends NgnDragBase {\n protected onDragged(delta: NgnDragInfo): void {\n this.el.nativeElement.scrollBy({\n left: -delta.deltaX,\n top: -delta.deltaY,\n behavior: 'auto',\n });\n }\n}\n","import { Directive } from '@angular/core';\n\nimport { NgnDragBase } from './drag-base';\n\nimport type { NgnDragInfo } from './types';\n\n@Directive({\n selector: '[ngnDrag]',\n})\nexport class NgnDrag extends NgnDragBase {\n protected onDragged(delta: NgnDragInfo): void {\n // do nothing\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { domEventHandler, domEventSignal } from '@ngneers/controls/api/ng';\nimport { NgnBase } from '@ngneers/controls/base';\nimport { signalWithPrevious } from '@ngneers/controls/utils-ng';\nimport { movableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\n\n@Directive({\n selector: '[ngnMovable]',\n})\nexport class NgnMovable extends NgnBase<'movable'> {\n protected readonly theme = this.injectThemeTemplate(movableDirectiveTemplate, {\n movable: () => this.ngnMovable(),\n moved: () => this.dragged(),\n });\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly _document = inject(DOCUMENT);\n\n /**\n * Whether the element is movable.\n * @default true\n */\n public readonly ngnMovable = input(true, { transform: booleanAttribute });\n\n /**\n * The handle element used to drag the element. If omitted, the entire element will be used as the drag handle.\n * @default null\n */\n public readonly ngnMovableDragHandle = input<HTMLElement | null>(null);\n\n /**\n * When `true`, the cursor will change to indicate that the element / drag handle is movable.\n * @default true\n */\n public readonly ngnMovableChangeCursor = input(true, { transform: booleanAttribute });\n\n /**\n * When `true`, the movement will be limited to the viewport.\n * @default true\n */\n public readonly ngnMovableLimitToViewport = input(true, { transform: booleanAttribute });\n\n private readonly _ngnMovableDragHandleWithPrevious = signalWithPrevious(\n this.ngnMovableDragHandle,\n null\n );\n\n private readonly _eventElement = computed(() => {\n const handle = this.ngnMovableDragHandle();\n return handle ?? this._el.nativeElement;\n });\n\n protected readonly dragged = signal(false);\n\n private readonly _pointerDownSignal = domEventSignal(this._eventElement, 'pointerdown');\n private readonly _pointerMoveSignal = domEventSignal(this._document, 'pointermove');\n private readonly _pointerUpSignal = domEventSignal(this._document, 'pointerup');\n\n private readonly _isDragging = signal(false);\n private _startX = 0;\n private _startY = 0;\n\n constructor() {\n super();\n\n domEventHandler(this._el.nativeElement, 'touchmove', e => {\n if (!this.ngnMovable()) {\n return;\n }\n if (e.cancelable) {\n e.preventDefault();\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n return;\n }\n const pointerDown = this._pointerDownSignal();\n // check if primary button or touch\n if (pointerDown && (pointerDown.button === 0 || pointerDown.pointerType === 'touch')) {\n this._isDragging.set(true);\n this._startX = pointerDown.clientX - this._el.nativeElement.offsetLeft;\n this._startY = pointerDown.clientY - this._el.nativeElement.offsetTop;\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n return;\n }\n const pointerMove = this._pointerMoveSignal();\n if (pointerMove && untracked(this._isDragging)) {\n this.dragged.set(true);\n const newLeft = pointerMove.clientX - this._startX;\n const newTop = pointerMove.clientY - this._startY;\n\n if (this.ngnMovableLimitToViewport()) {\n const documentRect = this._document.documentElement.getBoundingClientRect();\n const elRect = this._el.nativeElement.getBoundingClientRect();\n\n const clampedLeft = Math.min(Math.max(newLeft, 0), documentRect.width - elRect.width);\n const clampedTop = Math.min(Math.max(newTop, 0), documentRect.height - elRect.height);\n\n this._el.nativeElement.style.left = `${clampedLeft}px`;\n this._el.nativeElement.style.top = `${clampedTop}px`;\n } else {\n this._el.nativeElement.style.left = `${pointerMove.clientX - this._startX}px`;\n this._el.nativeElement.style.top = `${pointerMove.clientY - this._startY}px`;\n }\n\n this._el.nativeElement.style.width = `${this._el.nativeElement.offsetWidth}px`;\n this._el.nativeElement.style.height = `${this._el.nativeElement.offsetHeight}px`;\n if (\n !['fixed', 'absolute', 'static'].includes(\n getComputedStyle(this._el.nativeElement).position\n )\n ) {\n this._el.nativeElement.style.position = 'fixed';\n }\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n return;\n }\n const pointerUp = this._pointerUpSignal();\n if (pointerUp && untracked(this._isDragging)) {\n this._isDragging.set(false);\n }\n });\n\n effect(() => {\n if (!this.ngnMovable()) {\n this._isDragging.set(false);\n }\n });\n\n effect(() => {\n this.refreshCursor();\n });\n }\n\n public bakePosition() {\n this._el.nativeElement.style.left = `${this._el.nativeElement.offsetLeft}px`;\n this._el.nativeElement.style.top = `${this._el.nativeElement.offsetTop}px`;\n if (\n !['fixed', 'absolute', 'static'].includes(getComputedStyle(this._el.nativeElement).position)\n ) {\n this._el.nativeElement.style.position = 'fixed';\n }\n this.dragged.set(true);\n }\n\n private refreshCursor() {\n const handle = this._ngnMovableDragHandleWithPrevious();\n if (handle.previous && handle.previous !== handle.current) {\n handle.previous.classList.remove(\n this.theme.class('drag-handle-grab'),\n this.theme.class('drag-handle-grabbing')\n );\n }\n if (!this.ngnMovable() || !this.ngnMovableChangeCursor()) {\n handle.current?.classList.remove(\n this.theme.class('drag-handle-grab'),\n this.theme.class('drag-handle-grabbing')\n );\n return;\n }\n if (this._isDragging()) {\n handle.current?.classList.add(this.theme.class('drag-handle-grabbing'));\n handle.current?.classList.remove(this.theme.class('drag-handle-grab'));\n } else {\n handle.current?.classList.add(this.theme.class('drag-handle-grab'));\n handle.current?.classList.remove(this.theme.class('drag-handle-grabbing'));\n }\n }\n}\n","import { Directive, DOCUMENT, effect, ElementRef, inject, input, signal } from '@angular/core';\nimport {\n domEventSignal,\n elementSizeSignal,\n injectThemeTemplate,\n Platform,\n} from '@ngneers/controls/api/ng';\nimport { resizableDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\n\nimport { NgnMovable } from './movable';\n\n@Directive({\n selector: '[ngnResizable]',\n host: {\n '[class]': 'theme.classes({ resizable: !!ngnResizable(), resized: resized()})',\n },\n})\nexport class NgnResizable {\n protected readonly theme = injectThemeTemplate(resizableDirectiveTemplate);\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef<HTMLElement>);\n private readonly _isBrowser = inject(Platform).isBrowser;\n private readonly _document = inject(DOCUMENT);\n private readonly _ngnMovable = inject(NgnMovable, { optional: true });\n private _isPointerDown = false;\n\n /**\n * Whether the element is resizable. The empty string (bare attribute) enables it.\n * @default true\n */\n public readonly ngnResizable = input<boolean | null | undefined | ''>(true);\n /**\n * Minimum and maximum size constraints for the resizable element. Number values\n * are treated as pixels; strings are used as-is. Any bound left `null`/`undefined`\n * is unconstrained (the effective maximum is still clamped to the viewport).\n */\n public readonly ngnResizableSizeLimits = input<{\n minWidth: string | number | null | undefined;\n minHeight: string | number | null | undefined;\n maxWidth: string | number | null | undefined;\n maxHeight: string | number | null | undefined;\n }>();\n\n protected readonly resized = signal(false);\n\n private readonly _pointerDownSignal = domEventSignal(this._el, 'pointerdown');\n private readonly _pointerUpSignal = domEventSignal(this._document, 'pointerup');\n\n private readonly _resizeEvent = elementSizeSignal(this._el);\n\n /**\n * Formats a size value from string | number | null | undefined to a CSS string.\n * @param value The size value to format\n * @returns The formatted CSS string or null if the value is null/undefined\n */\n private formatSizeValue(value: string | number | null | undefined): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n return typeof value === 'number' ? `${value}px` : value;\n }\n\n constructor() {\n effect(() => {\n if (this._pointerDownSignal()) {\n this._isPointerDown = true;\n }\n });\n\n effect(() => {\n if (this._pointerUpSignal()) {\n this._isPointerDown = false;\n }\n });\n\n effect(() => {\n if (!this._isBrowser) {\n return;\n }\n const _size = this._resizeEvent(); // just as the trigger\n if (!this._isPointerDown) {\n // only react to resize events when the pointer is down (user is resizing)\n return;\n }\n\n // If the element is also movable, bake its position to avoid misplacement after resizing\n this._ngnMovable?.bakePosition();\n\n // calculate the max width & height of the element based on the size, position & body\n\n const bodyWidth = this._document.body.clientWidth;\n const bodyHeight = this._document.body.clientHeight;\n\n const elRect = this._el.nativeElement.getBoundingClientRect();\n\n const maxWidth = bodyWidth - elRect.left;\n const maxHeight = bodyHeight - elRect.top;\n\n const inputMaxWidth = this.ngnResizableSizeLimits()?.maxWidth;\n const inputMaxHeight = this.ngnResizableSizeLimits()?.maxHeight;\n const formattedMaxWidth = this.formatSizeValue(inputMaxWidth);\n const formattedMaxHeight = this.formatSizeValue(inputMaxHeight);\n\n this._el.nativeElement.style.maxWidth = formattedMaxWidth\n ? `min(${formattedMaxWidth}, ${maxWidth}px)`\n : `${maxWidth}px`;\n this._el.nativeElement.style.maxHeight = formattedMaxHeight\n ? `min(${formattedMaxHeight}, ${maxHeight}px)`\n : `${maxHeight}px`;\n\n const inputMinWidth = this.ngnResizableSizeLimits()?.minWidth;\n const inputMinHeight = this.ngnResizableSizeLimits()?.minHeight;\n const formattedMinWidth = this.formatSizeValue(inputMinWidth);\n const formattedMinHeight = this.formatSizeValue(inputMinHeight);\n\n if (formattedMinWidth) {\n this._el.nativeElement.style.minWidth = formattedMinWidth;\n }\n if (formattedMinHeight) {\n this._el.nativeElement.style.minHeight = formattedMinHeight;\n }\n\n this.resized.set(true);\n });\n }\n}\n","import {\n afterRenderEffect,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { domEventObservable, elementSizeSignal } from '@ngneers/controls/api/ng';\nimport { map } from 'rxjs';\n\n/** Remaining scrollable distance to the end, clamped at 0. Pure for testing. */\nexport function computeDistanceFromEnd(\n scrollSize: number,\n clientSize: number,\n scrollPos: number\n): number {\n return Math.max(0, scrollSize - clientSize - scrollPos);\n}\n\n/** Whether the current end-distance is within the trigger threshold. Pure for testing. */\nexport function isWithinEndZone(distanceFromEnd: number, threshold: number): boolean {\n return distanceFromEnd <= threshold;\n}\n\n@Directive({\n selector: '[ngnScrollAmount]',\n})\nexport class NgnScrollAmount {\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Optional external scroll container. When set, scroll events and\n * dimensions are tracked on this element instead of the host element.\n */\n public readonly container = input<HTMLElement | undefined>(undefined, {\n alias: 'ngnScrollAmountContainer',\n });\n\n /**\n * Distance (px) from the end at which {@link endReached} fires.\n * @default 0\n */\n public readonly endThreshold = input(0, { alias: 'ngnScrollAmountEndThreshold' });\n\n /**\n * Fires once when scrolling crosses within {@link endThreshold} of the bottom\n * (edge-triggered). For simple \"load more\" lists; guarded consumers should\n * read {@link distanceFromEnd} instead.\n */\n public readonly endReached = output<void>();\n\n public readonly scrollTarget = computed(() => this.container() ?? this._el.nativeElement);\n public readonly scrollTop = signal(this._el.nativeElement.scrollTop);\n public readonly scrollLeft = signal(this._el.nativeElement.scrollLeft);\n\n private readonly _containerSize = elementSizeSignal(this.scrollTarget);\n private readonly _hostSize = elementSizeSignal(this._el);\n\n public readonly scrollHeight = signal(this._el.nativeElement.scrollHeight);\n public readonly clientHeight = signal(this._el.nativeElement.clientHeight);\n public readonly scrollWidth = signal(this._el.nativeElement.scrollWidth);\n public readonly clientWidth = signal(this._el.nativeElement.clientWidth);\n\n /** Remaining vertical scroll distance to the bottom (px), clamped at 0. */\n public readonly distanceFromEnd = computed(() =>\n computeDistanceFromEnd(this.scrollHeight(), this.clientHeight(), this.scrollTop())\n );\n /** Remaining horizontal scroll distance to the right edge (px), clamped at 0. */\n public readonly distanceFromRight = computed(() =>\n computeDistanceFromEnd(this.scrollWidth(), this.clientWidth(), this.scrollLeft())\n );\n\n private readonly _scrollEvent = domEventObservable(this.scrollTarget, 'scroll');\n\n /** Syncs the vertical scroll-size signals. */\n private _syncVerticalGeometry(target: HTMLElement): void {\n this.scrollHeight.set(target.scrollHeight);\n this.clientHeight.set(target.clientHeight);\n }\n\n /** Syncs all four scroll-geometry signals off `target`. */\n private _syncGeometry(target: HTMLElement): void {\n this._syncVerticalGeometry(target);\n this.scrollWidth.set(target.scrollWidth);\n this.clientWidth.set(target.clientWidth);\n }\n\n constructor() {\n afterRenderEffect(() => {\n const obs = this._scrollEvent.pipe(\n map(e => {\n const target = e.target as HTMLElement;\n return { top: target.scrollTop, left: target.scrollLeft, el: target };\n })\n );\n obs.subscribe(scroll => {\n this.scrollTop.set(scroll.top);\n this.scrollLeft.set(scroll.left);\n this._syncVerticalGeometry(scroll.el);\n });\n });\n\n // Resync geometry on container resize or host content growth.\n afterRenderEffect(() => {\n this._containerSize();\n this._hostSize();\n this._syncGeometry(this.scrollTarget());\n });\n\n let wasInZone = false;\n effect(() => {\n const inZone = isWithinEndZone(this.distanceFromEnd(), this.endThreshold());\n if (inZone && !wasInZone) this.endReached.emit();\n wasInZone = inZone;\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -53,12 +53,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
53
53
  class NgnEditInplace extends EditInplaceTemplates {
54
54
  theme = this.injectThemeTemplate(editInplaceControlTemplate, {
55
55
  root: true,
56
- invalid: this.invalid(),
57
- readonly: this.readonly(),
58
- disabled: this.disabled(),
56
+ invalid: () => this.invalidState(),
57
+ readonly: this.readonly,
58
+ disabled: this.disabled,
59
59
  });
60
60
  i18n = inject(I18n).translations;
61
61
  closeContent = this.switchToDisplay.bind(this);
62
+ /**
63
+ * Closes the edit view from a user confirm (Enter / confirm button). Marks the
64
+ * control touched first, so `ngnErrorsShowOn="touched"` reveals errors after an
65
+ * inline confirm — not just after blurring out of the control (see {@link focusOut}).
66
+ */
67
+ confirmEdit = () => {
68
+ this.markTouched();
69
+ this.switchToDisplay();
70
+ };
62
71
  /**
63
72
  * Controls the visibility of the content.
64
73
  */
@@ -100,10 +109,11 @@ class NgnEditInplace extends EditInplaceTemplates {
100
109
  this.element.nativeElement.contains(event.relatedTarget)) {
101
110
  return;
102
111
  }
112
+ this.markTouched();
103
113
  this.switchToDisplay();
104
114
  }
105
115
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnEditInplace, deps: null, target: i0.ɵɵFactoryTarget.Component });
106
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnEditInplace, isStandalone: true, selector: "ngn-edit-inplace", inputs: { editVisible: { classPropertyName: "editVisible", publicName: "editVisible", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editVisible: "editVisibleChange" }, providers: [provideSelf(NgnEditInplace)], usesInheritance: true, ngImport: i0, template: "<ngn-inplace\n [ptInt]=\"this\"\n [ptDep]=\"'inplace'\"\n [templateDisplay]=\"displayTemplate()\"\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\n [templateContent]=\"editTemplate()\"\n [templateContentContext]=\"{\n $implicit: {\n value: value(),\n update: value.set.bind(value),\n close: editVisible.set.bind(editVisible, false),\n },\n }\"\n [contentVisible]=\"editVisible()\"\n (contentVisibleChange)=\"editVisible.set($event)\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n [disabled]=\"disabled() || readonly()\"\n (contentVisibleChange)=\"!$event && touched.set(true)\"\n/>\n\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\n @if (!display.value) {\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\n i18n['editInplace_placeholder']()\n }}</span>\n } @else {\n <span>{{ display.value }}</span>\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ i18n['editInplace_placeholder']() }}</span>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\n <ngn-input-field\n (focusout)=\"focusOut($event)\"\n [label]=\"label()\"\n [inputId]=\"inputId()\"\n [invalid]=\"invalid()\"\n [labelledBy]=\"labelledBy()\"\n >\n <input\n type=\"text\"\n ngnInput\n ngnAutofocus\n [value]=\"edit.value\"\n (valueChange)=\"edit.update($event ?? '')\"\n (keydown.enter)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-input'\"\n (blur)=\"touched.set(true)\"\n />\n <button\n ngnButton\n type=\"button\"\n kind=\"icon\"\n [ngnButtonInline]=\"true\"\n (click)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-close-button'\"\n [attr.aria-label]=\"i18n['editInplace_confirm']()\"\n >\n <ngn-icon defaultIcon=\"edit-confirm\" />\n </button>\n </ngn-input-field>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnInplace, selector: "ngn-inplace", inputs: ["contentVisible", "lazy", "cache", "disabled"], outputs: ["contentVisibleChange"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"], exportAs: ["ngnInput"] }, { kind: "directive", type: NgnAutofocus, selector: "[ngnAutofocus]", inputs: ["ngnAutofocus"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["ngnButtonInline"], exportAs: ["ngnButton"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "component", type: NgnInputField, selector: "ngn-input-field", inputs: ["label", "labelledBy", "labelKind", "inputId", "showClearButton", "iconClearButton", "tabindex", "invalid", "readonly", "disabled"] }] });
116
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnEditInplace, isStandalone: true, selector: "ngn-edit-inplace", inputs: { editVisible: { classPropertyName: "editVisible", publicName: "editVisible", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editVisible: "editVisibleChange" }, providers: [provideSelf(NgnEditInplace)], usesInheritance: true, ngImport: i0, template: "<ngn-inplace\n [ptInt]=\"this\"\n [ptDep]=\"'inplace'\"\n [templateDisplay]=\"displayTemplate()\"\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\n [templateContent]=\"editTemplate()\"\n [templateContentContext]=\"{\n $implicit: {\n value: value(),\n update: value.set.bind(value),\n close: confirmEdit,\n },\n }\"\n [contentVisible]=\"editVisible()\"\n (contentVisibleChange)=\"editVisible.set($event)\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n [disabled]=\"disabled() || readonly()\"\n/>\n\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\n @if (!display.value) {\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\n i18n['editInplace_placeholder']()\n }}</span>\n } @else {\n <span>{{ display.value }}</span>\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ i18n['editInplace_placeholder']() }}</span>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\n <ngn-input-field\n (focusout)=\"focusOut($event)\"\n [label]=\"label()\"\n [inputId]=\"inputId()\"\n [invalid]=\"invalidState()\"\n [labelledBy]=\"labelledBy()\"\n >\n <input\n type=\"text\"\n ngnInput\n ngnAutofocus\n [value]=\"edit.value\"\n (valueChange)=\"edit.update($event ?? '')\"\n (keydown.enter)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-input'\"\n />\n <button\n ngnButton\n type=\"button\"\n kind=\"icon\"\n [ngnButtonInline]=\"true\"\n (click)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-close-button'\"\n [attr.aria-label]=\"i18n['editInplace_confirm']()\"\n >\n <ngn-icon defaultIcon=\"edit-confirm\" />\n </button>\n </ngn-input-field>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnInplace, selector: "ngn-inplace", inputs: ["contentVisible", "lazy", "cache", "disabled"], outputs: ["contentVisibleChange"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "invalidOn", "touched", "value"], outputs: ["touchedChange", "valueChange", "touch"], exportAs: ["ngnInput"] }, { kind: "directive", type: NgnAutofocus, selector: "[ngnAutofocus]", inputs: ["ngnAutofocus"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["ngnButtonInline"], exportAs: ["ngnButton"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "component", type: NgnInputField, selector: "ngn-input-field", inputs: ["label", "labelledBy", "labelKind", "inputId", "showClearButton", "iconClearButton", "tabindex", "invalid", "readonly", "disabled"] }] });
107
117
  }
108
118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnEditInplace, decorators: [{
109
119
  type: Component,
@@ -116,7 +126,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
116
126
  NgnButton,
117
127
  NgnIcon,
118
128
  NgnInputField,
119
- ], providers: [provideSelf(NgnEditInplace)], template: "<ngn-inplace\n [ptInt]=\"this\"\n [ptDep]=\"'inplace'\"\n [templateDisplay]=\"displayTemplate()\"\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\n [templateContent]=\"editTemplate()\"\n [templateContentContext]=\"{\n $implicit: {\n value: value(),\n update: value.set.bind(value),\n close: editVisible.set.bind(editVisible, false),\n },\n }\"\n [contentVisible]=\"editVisible()\"\n (contentVisibleChange)=\"editVisible.set($event)\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n [disabled]=\"disabled() || readonly()\"\n (contentVisibleChange)=\"!$event && touched.set(true)\"\n/>\n\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\n @if (!display.value) {\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\n i18n['editInplace_placeholder']()\n }}</span>\n } @else {\n <span>{{ display.value }}</span>\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ i18n['editInplace_placeholder']() }}</span>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\n <ngn-input-field\n (focusout)=\"focusOut($event)\"\n [label]=\"label()\"\n [inputId]=\"inputId()\"\n [invalid]=\"invalid()\"\n [labelledBy]=\"labelledBy()\"\n >\n <input\n type=\"text\"\n ngnInput\n ngnAutofocus\n [value]=\"edit.value\"\n (valueChange)=\"edit.update($event ?? '')\"\n (keydown.enter)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-input'\"\n (blur)=\"touched.set(true)\"\n />\n <button\n ngnButton\n type=\"button\"\n kind=\"icon\"\n [ngnButtonInline]=\"true\"\n (click)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-close-button'\"\n [attr.aria-label]=\"i18n['editInplace_confirm']()\"\n >\n <ngn-icon defaultIcon=\"edit-confirm\" />\n </button>\n </ngn-input-field>\n </div>\n</ng-template>\n" }]
129
+ ], providers: [provideSelf(NgnEditInplace)], template: "<ngn-inplace\n [ptInt]=\"this\"\n [ptDep]=\"'inplace'\"\n [templateDisplay]=\"displayTemplate()\"\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\n [templateContent]=\"editTemplate()\"\n [templateContentContext]=\"{\n $implicit: {\n value: value(),\n update: value.set.bind(value),\n close: confirmEdit,\n },\n }\"\n [contentVisible]=\"editVisible()\"\n (contentVisibleChange)=\"editVisible.set($event)\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n [disabled]=\"disabled() || readonly()\"\n/>\n\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\n @if (!display.value) {\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\n i18n['editInplace_placeholder']()\n }}</span>\n } @else {\n <span>{{ display.value }}</span>\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ i18n['editInplace_placeholder']() }}</span>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\n <ngn-input-field\n (focusout)=\"focusOut($event)\"\n [label]=\"label()\"\n [inputId]=\"inputId()\"\n [invalid]=\"invalidState()\"\n [labelledBy]=\"labelledBy()\"\n >\n <input\n type=\"text\"\n ngnInput\n ngnAutofocus\n [value]=\"edit.value\"\n (valueChange)=\"edit.update($event ?? '')\"\n (keydown.enter)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-input'\"\n />\n <button\n ngnButton\n type=\"button\"\n kind=\"icon\"\n [ngnButtonInline]=\"true\"\n (click)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-close-button'\"\n [attr.aria-label]=\"i18n['editInplace_confirm']()\"\n >\n <ngn-icon defaultIcon=\"edit-confirm\" />\n </button>\n </ngn-input-field>\n </div>\n</ng-template>\n" }]
120
130
  }], propDecorators: { editVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "editVisible", required: false }] }, { type: i0.Output, args: ["editVisibleChange"] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }] } });
121
131
 
122
132
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-edit-inplace.mjs","sources":["../../src/edit-inplace/edit-inplace-templates.ts","../../src/edit-inplace/edit-inplace.ts","../../src/edit-inplace/edit-inplace.html","../../src/edit-inplace/ngneers-controls-edit-inplace.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { ValueControlBase } from '@ngneers/controls/base';\n\nimport type { DisplayTemplateType, EditTemplateType } from './types';\n\n@Directive()\nexport abstract class EditInplaceTemplates extends ValueControlBase<'editInplace', string> {\n // Display template\n private readonly _defaultDisplayTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.display>>('defaultDisplayTemplate');\n private readonly _userDisplayTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.display>>('display');\n /**\n * Set a custom template for the display.\n * Can also be set using an `<ng-template>` element with `#display` template reference variable.\n */\n public readonly templateDisplay = input<TemplateRef<typeof this.templateTypes.display> | null>(\n null\n );\n protected readonly displayTemplate = computed(\n () => this._userDisplayTemplate() ?? this.templateDisplay() ?? this._defaultDisplayTemplate()\n );\n\n // Edit template\n private readonly _defaultEditTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.edit>>('defaultEditTemplate');\n private readonly _userEditTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.edit>>('edit');\n /**\n * Set a custom template for the edit view.\n * Can also be set using an `<ng-template>` element with `#edit` template reference variable.\n */\n public readonly templateEdit = input<TemplateRef<typeof this.templateTypes.edit> | null>(null);\n protected readonly editTemplate = computed(\n () => this._userEditTemplate() ?? this.templateEdit() ?? this._defaultEditTemplate()\n );\n\n /**\n * Types for the edit-inplace templates.\n */\n public readonly templateTypes = templateTypesFn<{\n /**\n * Type of the template variable for the display template.\n */\n display: DisplayTemplateType;\n /**\n * Type of the template variable for the edit template.\n */\n edit: EditTemplateType;\n }>();\n}\n","import { booleanAttribute, Component, input, model, inject } from '@angular/core';\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnButton } from '@ngneers/controls/button';\nimport { NgnAutofocus } from '@ngneers/controls/directives';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnInplace } from '@ngneers/controls/inplace';\nimport { NgnInput } from '@ngneers/controls/input';\nimport { NgnInputField } from '@ngneers/controls/input-field';\nimport { editInplaceControlTemplate } from '@ngneers/controls-themes/templates/edit-inplace';\n\nimport { EditInplaceTemplates } from './edit-inplace-templates';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-edit-inplace',\n templateUrl: './edit-inplace.html',\n imports: [\n NgnPt,\n NgnInplace,\n NgnTemplate,\n NgnInput,\n NgnAutofocus,\n NgnButton,\n NgnIcon,\n NgnInputField,\n ],\n providers: [provideSelf(NgnEditInplace)],\n})\nexport class NgnEditInplace extends EditInplaceTemplates {\n protected readonly theme = this.injectThemeTemplate(editInplaceControlTemplate, {\n root: true,\n invalid: this.invalid(),\n readonly: this.readonly(),\n disabled: this.disabled(),\n });\n protected readonly i18n = inject(I18n).translations;\n\n protected readonly closeContent = this.switchToDisplay.bind(this);\n\n /**\n * Controls the visibility of the content.\n */\n public readonly editVisible = model<boolean>(false);\n /**\n * Whether the content is loaded lazily.\n * @default true\n */\n public readonly lazy = input(true, { transform: booleanAttribute });\n /**\n * Whether the content is cached when closed.\n * @default false\n */\n public readonly cache = input(false, { transform: booleanAttribute });\n\n /**\n * Switches to the edit view.\n */\n public switchToEdit() {\n this.editVisible.set(true);\n }\n\n /**\n * Switches to the display view.\n */\n public switchToDisplay() {\n this.editVisible.set(false);\n }\n\n /**\n * Toggles between the display and content views.\n */\n public toggle() {\n this.editVisible.update(v => !v);\n }\n\n protected focusOut(event: FocusEvent) {\n if (!this.editVisible()) {\n return;\n }\n if (\n event.relatedTarget instanceof HTMLElement &&\n this.element.nativeElement.contains(event.relatedTarget as HTMLElement)\n ) {\n return;\n }\n this.switchToDisplay();\n }\n}\n","<ngn-inplace\n [ptInt]=\"this\"\n [ptDep]=\"'inplace'\"\n [templateDisplay]=\"displayTemplate()\"\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\n [templateContent]=\"editTemplate()\"\n [templateContentContext]=\"{\n $implicit: {\n value: value(),\n update: value.set.bind(value),\n close: editVisible.set.bind(editVisible, false),\n },\n }\"\n [contentVisible]=\"editVisible()\"\n (contentVisibleChange)=\"editVisible.set($event)\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n [disabled]=\"disabled() || readonly()\"\n (contentVisibleChange)=\"!$event && touched.set(true)\"\n/>\n\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\n @if (!display.value) {\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\n i18n['editInplace_placeholder']()\n }}</span>\n } @else {\n <span>{{ display.value }}</span>\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ i18n['editInplace_placeholder']() }}</span>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\n <ngn-input-field\n (focusout)=\"focusOut($event)\"\n [label]=\"label()\"\n [inputId]=\"inputId()\"\n [invalid]=\"invalid()\"\n [labelledBy]=\"labelledBy()\"\n >\n <input\n type=\"text\"\n ngnInput\n ngnAutofocus\n [value]=\"edit.value\"\n (valueChange)=\"edit.update($event ?? '')\"\n (keydown.enter)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-input'\"\n (blur)=\"touched.set(true)\"\n />\n <button\n ngnButton\n type=\"button\"\n kind=\"icon\"\n [ngnButtonInline]=\"true\"\n (click)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-close-button'\"\n [attr.aria-label]=\"i18n['editInplace_confirm']()\"\n >\n <ngn-icon defaultIcon=\"edit-confirm\" />\n </button>\n </ngn-input-field>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-edit-inplace.mjs","sources":["../../src/edit-inplace/edit-inplace-templates.ts","../../src/edit-inplace/edit-inplace.ts","../../src/edit-inplace/edit-inplace.html","../../src/edit-inplace/ngneers-controls-edit-inplace.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { ValueControlBase } from '@ngneers/controls/base';\n\nimport type { DisplayTemplateType, EditTemplateType } from './types';\n\n@Directive()\nexport abstract class EditInplaceTemplates extends ValueControlBase<'editInplace', string> {\n // Display template\n private readonly _defaultDisplayTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.display>>('defaultDisplayTemplate');\n private readonly _userDisplayTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.display>>('display');\n /**\n * Set a custom template for the display.\n * Can also be set using an `<ng-template>` element with `#display` template reference variable.\n */\n public readonly templateDisplay = input<TemplateRef<typeof this.templateTypes.display> | null>(\n null\n );\n protected readonly displayTemplate = computed(\n () => this._userDisplayTemplate() ?? this.templateDisplay() ?? this._defaultDisplayTemplate()\n );\n\n // Edit template\n private readonly _defaultEditTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.edit>>('defaultEditTemplate');\n private readonly _userEditTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.edit>>('edit');\n /**\n * Set a custom template for the edit view.\n * Can also be set using an `<ng-template>` element with `#edit` template reference variable.\n */\n public readonly templateEdit = input<TemplateRef<typeof this.templateTypes.edit> | null>(null);\n protected readonly editTemplate = computed(\n () => this._userEditTemplate() ?? this.templateEdit() ?? this._defaultEditTemplate()\n );\n\n /**\n * Types for the edit-inplace templates.\n */\n public readonly templateTypes = templateTypesFn<{\n /**\n * Type of the template variable for the display template.\n */\n display: DisplayTemplateType;\n /**\n * Type of the template variable for the edit template.\n */\n edit: EditTemplateType;\n }>();\n}\n","import { booleanAttribute, Component, input, model, inject } from '@angular/core';\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnButton } from '@ngneers/controls/button';\nimport { NgnAutofocus } from '@ngneers/controls/directives';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnInplace } from '@ngneers/controls/inplace';\nimport { NgnInput } from '@ngneers/controls/input';\nimport { NgnInputField } from '@ngneers/controls/input-field';\nimport { editInplaceControlTemplate } from '@ngneers/controls-themes/templates/edit-inplace';\n\nimport { EditInplaceTemplates } from './edit-inplace-templates';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-edit-inplace',\n templateUrl: './edit-inplace.html',\n imports: [\n NgnPt,\n NgnInplace,\n NgnTemplate,\n NgnInput,\n NgnAutofocus,\n NgnButton,\n NgnIcon,\n NgnInputField,\n ],\n providers: [provideSelf(NgnEditInplace)],\n})\nexport class NgnEditInplace extends EditInplaceTemplates {\n protected readonly theme = this.injectThemeTemplate(editInplaceControlTemplate, {\n root: true,\n invalid: () => this.invalidState(),\n readonly: this.readonly,\n disabled: this.disabled,\n });\n protected readonly i18n = inject(I18n).translations;\n\n protected readonly closeContent = this.switchToDisplay.bind(this);\n\n /**\n * Closes the edit view from a user confirm (Enter / confirm button). Marks the\n * control touched first, so `ngnErrorsShowOn=\"touched\"` reveals errors after an\n * inline confirm — not just after blurring out of the control (see {@link focusOut}).\n */\n protected readonly confirmEdit = (): void => {\n this.markTouched();\n this.switchToDisplay();\n };\n\n /**\n * Controls the visibility of the content.\n */\n public readonly editVisible = model<boolean>(false);\n /**\n * Whether the content is loaded lazily.\n * @default true\n */\n public readonly lazy = input(true, { transform: booleanAttribute });\n /**\n * Whether the content is cached when closed.\n * @default false\n */\n public readonly cache = input(false, { transform: booleanAttribute });\n\n /**\n * Switches to the edit view.\n */\n public switchToEdit() {\n this.editVisible.set(true);\n }\n\n /**\n * Switches to the display view.\n */\n public switchToDisplay() {\n this.editVisible.set(false);\n }\n\n /**\n * Toggles between the display and content views.\n */\n public toggle() {\n this.editVisible.update(v => !v);\n }\n\n protected focusOut(event: FocusEvent) {\n if (!this.editVisible()) {\n return;\n }\n if (\n event.relatedTarget instanceof HTMLElement &&\n this.element.nativeElement.contains(event.relatedTarget as HTMLElement)\n ) {\n return;\n }\n this.markTouched();\n this.switchToDisplay();\n }\n}\n","<ngn-inplace\n [ptInt]=\"this\"\n [ptDep]=\"'inplace'\"\n [templateDisplay]=\"displayTemplate()\"\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\n [templateContent]=\"editTemplate()\"\n [templateContentContext]=\"{\n $implicit: {\n value: value(),\n update: value.set.bind(value),\n close: confirmEdit,\n },\n }\"\n [contentVisible]=\"editVisible()\"\n (contentVisibleChange)=\"editVisible.set($event)\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n [disabled]=\"disabled() || readonly()\"\n/>\n\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\n @if (!display.value) {\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\n i18n['editInplace_placeholder']()\n }}</span>\n } @else {\n <span>{{ display.value }}</span>\n <span [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ i18n['editInplace_placeholder']() }}</span>\n }\n </div>\n</ng-template>\n\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\n <ngn-input-field\n (focusout)=\"focusOut($event)\"\n [label]=\"label()\"\n [inputId]=\"inputId()\"\n [invalid]=\"invalidState()\"\n [labelledBy]=\"labelledBy()\"\n >\n <input\n type=\"text\"\n ngnInput\n ngnAutofocus\n [value]=\"edit.value\"\n (valueChange)=\"edit.update($event ?? '')\"\n (keydown.enter)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-input'\"\n />\n <button\n ngnButton\n type=\"button\"\n kind=\"icon\"\n [ngnButtonInline]=\"true\"\n (click)=\"edit.close()\"\n [ptInt]=\"this\"\n [ptClass]=\"'default-edit-close-button'\"\n [attr.aria-label]=\"i18n['editInplace_confirm']()\"\n >\n <ngn-icon defaultIcon=\"edit-confirm\" />\n </button>\n </ngn-input-field>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAOM,MAAgB,oBAAqB,SAAQ,gBAAuC,CAAA;;AAEvE,IAAA,uBAAuB,GACtC,SAAS,CAAC,QAAQ,CAAiD,wBAAwB,CAAC;IAC7E,oBAAoB,GACnC,YAAY,CAAiD,SAAS;6FAAC;AACzE;;;AAGG;IACa,eAAe,GAAG,KAAK,CACrC,IAAI;wFACL;AACkB,IAAA,eAAe,GAAG,QAAQ,CAC3C,MAAM,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,uBAAuB,EAAE;wFAC9F;;AAGgB,IAAA,oBAAoB,GACnC,SAAS,CAAC,QAAQ,CAA8C,qBAAqB,CAAC;IACvE,iBAAiB,GAChC,YAAY,CAA8C,MAAM;0FAAC;AACnE;;;AAGG;IACa,YAAY,GAAG,KAAK,CAAqD,IAAI;qFAAC;AAC3E,IAAA,YAAY,GAAG,QAAQ,CACxC,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE;qFACrF;AAED;;AAEG;IACa,aAAa,GAAG,eAAe,EAS3C;uGA3CgB,oBAAoB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADzC;AAIsE,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,wBAAwB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAE9B,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAcN,qBAAqB,8EAE3B,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACdpE;;AAEG;AAgBG,MAAO,cAAe,SAAQ,oBAAoB,CAAA;AACnC,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,0BAA0B,EAAE;AAC9E,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,KAAA,CAAC;AACiB,IAAA,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY;IAEhC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAEjE;;;;AAIG;IACgB,WAAW,GAAG,MAAW;QAC1C,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,eAAe,EAAE;AACxB,IAAA,CAAC;AAED;;AAEG;IACa,WAAW,GAAG,KAAK,CAAU,KAAK;oFAAC;AACnD;;;AAGG;IACa,IAAI,GAAG,KAAK,CAAC,IAAI,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACnE;;;AAGG;IACa,KAAK,GAAG,KAAK,CAAC,KAAK,6EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAErE;;AAEG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA;;AAEG;IACI,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;AAEA;;AAEG;IACI,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC;AAEU,IAAA,QAAQ,CAAC,KAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB;QACF;AACA,QAAA,IACE,KAAK,CAAC,aAAa,YAAY,WAAW;AAC1C,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA4B,CAAC,EACvE;YACA;QACF;QACA,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,eAAe,EAAE;IACxB;uGArEW,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,EAAA,SAAA,EAFd,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9B1C,uiEAmEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9CI,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,WAAW,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,QAAQ,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,YAAY,qFACZ,SAAS,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACT,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIJ,cAAc,EAAA,UAAA,EAAA,CAAA;kBAf1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EAEnB;wBACP,KAAK;wBACL,UAAU;wBACV,WAAW;wBACX,QAAQ;wBACR,YAAY;wBACZ,SAAS;wBACT,OAAO;wBACP,aAAa;qBACd,EAAA,SAAA,EACU,CAAC,WAAW,CAAA,cAAA,CAAgB,CAAC,EAAA,QAAA,EAAA,uiEAAA,EAAA;;;AE9B1C;;AAEG;;;;"}