@cdevhub/ngx-tw 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/package.json +45 -20
  121. package/theme/index.css +10 -2
  122. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  123. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  124. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  125. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  126. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  127. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  128. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  129. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  130. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  131. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  132. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  133. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  134. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  135. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  136. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  137. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  138. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  139. package/types/cdevhub-ngx-tw.d.ts +7 -0
@@ -107,11 +107,14 @@ class DialogContainer extends CdkDialogContainer {
107
107
  sizeVariant = computed(() => {
108
108
  const size = this._config.size ?? 'md';
109
109
  return dialogContainerVariants({ size });
110
- }, ...(ngDevMode ? [{ debugName: "sizeVariant" }] : /* istanbul ignore next */ []));
111
- hostClasses = computed(() => mergeOverlayPanelClass(this.sizeVariant().host(), this._config.panelClass), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
110
+ }, /* @ts-ignore */
111
+ ...(ngDevMode ? [{ debugName: "sizeVariant" }] : /* istanbul ignore next */ []));
112
+ hostClasses = computed(() => mergeOverlayPanelClass(this.sizeVariant().host(), this._config.panelClass), /* @ts-ignore */
113
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
112
114
  ariaDescribedByAttr = computed(() => this._config.ariaDescribedBy ||
113
115
  this.coordinator.describedByIds()[0] ||
114
- null, ...(ngDevMode ? [{ debugName: "ariaDescribedByAttr" }] : /* istanbul ignore next */ []));
116
+ null, /* @ts-ignore */
117
+ ...(ngDevMode ? [{ debugName: "ariaDescribedByAttr" }] : /* istanbul ignore next */ []));
115
118
  transitionDuration = this.coordinator.transitionDuration;
116
119
  constructor() {
117
120
  super();
@@ -135,10 +138,10 @@ class DialogContainer extends CdkDialogContainer {
135
138
  _removeAriaDescribedBy(id) {
136
139
  this.coordinator.removeAriaDescribedBy(id);
137
140
  }
138
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogContainer, deps: [], target: i0.ɵɵFactoryTarget.Component });
139
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.14", type: DialogContainer, isStandalone: true, selector: "tw-dialog-container", host: { attributes: { "tabindex": "-1" }, properties: { "attr.id": "_config.id || null", "attr.role": "_config.role", "attr.aria-modal": "_config.ariaModal", "attr.aria-labelledby": "_config.ariaLabel ? null : _ariaLabelledByQueue[0]", "attr.aria-label": "_config.ariaLabel", "attr.aria-describedby": "ariaDescribedByAttr()", "attr.data-state": "state()", "class": "hostClasses()", "style.transition-duration.ms": "transitionDuration()" } }, providers: [OverlayContainerCoordinator], usesInheritance: true, ngImport: i0, template: '<ng-template cdkPortalOutlet />', isInline: true, dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
141
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogContainer, deps: [], target: i0.ɵɵFactoryTarget.Component });
142
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: DialogContainer, isStandalone: true, selector: "tw-dialog-container", host: { attributes: { "tabindex": "-1" }, properties: { "attr.id": "_config.id || null", "attr.role": "_config.role", "attr.aria-modal": "_config.ariaModal", "attr.aria-labelledby": "_config.ariaLabel ? null : _ariaLabelledByQueue[0]", "attr.aria-label": "_config.ariaLabel", "attr.aria-describedby": "ariaDescribedByAttr()", "attr.data-state": "state()", "class": "hostClasses()", "style.transition-duration.ms": "transitionDuration()" } }, providers: [OverlayContainerCoordinator], usesInheritance: true, ngImport: i0, template: '<ng-template cdkPortalOutlet />', isInline: true, dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
140
143
  }
141
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogContainer, decorators: [{
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogContainer, decorators: [{
142
145
  type: Component,
143
146
  args: [{
144
147
  selector: 'tw-dialog-container',
@@ -180,7 +183,8 @@ class TwDialogRef {
180
183
  state;
181
184
  /** When `true`, close-via-escape and close-via-backdrop are disabled. */
182
185
  disableClose;
183
- stateSignal = signal('opening', ...(ngDevMode ? [{ debugName: "stateSignal" }] : /* istanbul ignore next */ []));
186
+ stateSignal = signal('opening', /* @ts-ignore */
187
+ ...(ngDevMode ? [{ debugName: "stateSignal" }] : /* istanbul ignore next */ []));
184
188
  afterOpenedSubject = new ReplaySubject(1);
185
189
  beforeClosedSubject = new ReplaySubject(1);
186
190
  afterClosedSubject = new ReplaySubject(1);
@@ -305,7 +309,8 @@ class TwDialog {
305
309
  injector = inject(Injector);
306
310
  defaultOptions = inject(TW_DIALOG_DEFAULT_OPTIONS, { optional: true }) ?? {};
307
311
  parentDialog = inject(TwDialog, { optional: true, skipSelf: true });
308
- openDialogsAtThisLevel = signal([], ...(ngDevMode ? [{ debugName: "openDialogsAtThisLevel" }] : /* istanbul ignore next */ []));
312
+ openDialogsAtThisLevel = signal([], /* @ts-ignore */
313
+ ...(ngDevMode ? [{ debugName: "openDialogsAtThisLevel" }] : /* istanbul ignore next */ []));
309
314
  afterOpenedSubject = new Subject();
310
315
  afterAllClosedSubject = new Subject();
311
316
  /** Reactively-readable list of currently-open dialogs across the full dialog tree. */
@@ -447,10 +452,10 @@ class TwDialog {
447
452
  return createBlockScrollStrategy(this.injector);
448
453
  }
449
454
  }
450
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TwDialog, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
451
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TwDialog });
455
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TwDialog, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
456
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TwDialog });
452
457
  }
453
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TwDialog, decorators: [{
458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: TwDialog, decorators: [{
454
459
  type: Injectable
455
460
  }] });
456
461
  /**
@@ -476,10 +481,10 @@ function provideTwDialog(defaultOptions) {
476
481
  * content below.
477
482
  */
478
483
  class DialogHeaderDirective {
479
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
480
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: DialogHeaderDirective, isStandalone: true, selector: "[twDialogHeader], tw-dialog-header", host: { classAttribute: "flex items-start gap-3 px-6 pt-6 pb-4" }, ngImport: i0 });
484
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
485
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: DialogHeaderDirective, isStandalone: true, selector: "[twDialogHeader], tw-dialog-header", host: { classAttribute: "flex items-start gap-3 px-6 pt-6 pb-4" }, ngImport: i0 });
481
486
  }
482
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogHeaderDirective, decorators: [{
487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogHeaderDirective, decorators: [{
483
488
  type: Directive,
484
489
  args: [{
485
490
  selector: '[twDialogHeader], tw-dialog-header',
@@ -506,16 +511,18 @@ const ICON_COLOR_CLASSES = {
506
511
  */
507
512
  class DialogIconDirective {
508
513
  /** Semantic color for the icon container. Defaults to a neutral surface. */
509
- color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
514
+ color = input(undefined, /* @ts-ignore */
515
+ ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
510
516
  classes = computed(() => {
511
517
  const base = 'flex size-10 shrink-0 items-center justify-center rounded-full';
512
518
  const color = this.color();
513
519
  return color ? `${base} ${ICON_COLOR_CLASSES[color]}` : `${base} bg-surface-muted text-fg`;
514
- }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
515
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
516
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: DialogIconDirective, isStandalone: true, selector: "[twDialogIcon]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
520
+ }, /* @ts-ignore */
521
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
523
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: DialogIconDirective, isStandalone: true, selector: "[twDialogIcon]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
517
524
  }
518
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogIconDirective, decorators: [{
525
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogIconDirective, decorators: [{
519
526
  type: Directive,
520
527
  args: [{
521
528
  selector: '[twDialogIcon]',
@@ -539,7 +546,8 @@ class DialogTitleDirective {
539
546
  // directive lives inside `<tw-dialog-container>`'s DOM tree.
540
547
  container = inject(DialogContainer, { optional: true, skipSelf: true });
541
548
  /** Custom id for the title element. Defaults to a generated unique id. */
542
- id = input(this.generatedId, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
549
+ id = input(this.generatedId, /* @ts-ignore */
550
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
543
551
  ngOnInit() {
544
552
  const containerInstance = this.dialogRef?.containerInstance ?? this.container;
545
553
  if (containerInstance)
@@ -550,10 +558,10 @@ class DialogTitleDirective {
550
558
  if (containerInstance)
551
559
  containerInstance._removeAriaLabelledBy(this.id());
552
560
  }
553
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
554
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: DialogTitleDirective, isStandalone: true, selector: "[twDialogTitle], tw-dialog-title", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "id()" }, classAttribute: "text-sm font-semibold text-fg" }, ngImport: i0 });
561
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
562
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: DialogTitleDirective, isStandalone: true, selector: "[twDialogTitle], tw-dialog-title", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "id()" }, classAttribute: "text-sm font-semibold text-fg" }, ngImport: i0 });
555
563
  }
556
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogTitleDirective, decorators: [{
564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogTitleDirective, decorators: [{
557
565
  type: Directive,
558
566
  args: [{
559
567
  selector: '[twDialogTitle], tw-dialog-title',
@@ -565,10 +573,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
565
573
  }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }] } });
566
574
  /** Secondary line beneath the dialog title — intended for a short description. */
567
575
  class DialogSubtitleDirective {
568
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogSubtitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
569
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: DialogSubtitleDirective, isStandalone: true, selector: "[twDialogSubtitle], tw-dialog-subtitle", host: { classAttribute: "text-sm text-fg-muted" }, ngImport: i0 });
576
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogSubtitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
577
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: DialogSubtitleDirective, isStandalone: true, selector: "[twDialogSubtitle], tw-dialog-subtitle", host: { classAttribute: "text-sm text-fg-muted" }, ngImport: i0 });
570
578
  }
571
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogSubtitleDirective, decorators: [{
579
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogSubtitleDirective, decorators: [{
572
580
  type: Directive,
573
581
  args: [{
574
582
  selector: '[twDialogSubtitle], tw-dialog-subtitle',
@@ -590,7 +598,8 @@ class DialogDescriptionDirective {
590
598
  // Ancestor-DI fallback — see DialogTitleDirective.
591
599
  container = inject(DialogContainer, { optional: true, skipSelf: true });
592
600
  /** Custom id for the description element. Defaults to a generated unique id. */
593
- id = input(this.generatedId, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
601
+ id = input(this.generatedId, /* @ts-ignore */
602
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
594
603
  ngOnInit() {
595
604
  const containerInstance = this.dialogRef?.containerInstance ?? this.container;
596
605
  if (containerInstance)
@@ -601,10 +610,10 @@ class DialogDescriptionDirective {
601
610
  if (containerInstance)
602
611
  containerInstance._removeAriaDescribedBy(this.id());
603
612
  }
604
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
605
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: DialogDescriptionDirective, isStandalone: true, selector: "[twDialogDescription], tw-dialog-description", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "id()" } }, ngImport: i0 });
613
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogDescriptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
614
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: DialogDescriptionDirective, isStandalone: true, selector: "[twDialogDescription], tw-dialog-description", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "id()" } }, ngImport: i0 });
606
615
  }
607
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogDescriptionDirective, decorators: [{
616
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogDescriptionDirective, decorators: [{
608
617
  type: Directive,
609
618
  args: [{
610
619
  selector: '[twDialogDescription], tw-dialog-description',
@@ -619,10 +628,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
619
628
  * strategies and nested scrollables.
620
629
  */
621
630
  class DialogContentDirective {
622
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
623
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: DialogContentDirective, isStandalone: true, selector: "[twDialogContent], tw-dialog-content", host: { classAttribute: "flex-1 overflow-y-auto px-6 py-4 text-sm text-fg" }, hostDirectives: [{ directive: i1.CdkScrollable }], ngImport: i0 });
631
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
632
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: DialogContentDirective, isStandalone: true, selector: "[twDialogContent], tw-dialog-content", host: { classAttribute: "flex-1 overflow-y-auto px-6 py-4 text-sm text-fg" }, hostDirectives: [{ directive: i1.CdkScrollable }], ngImport: i0 });
624
633
  }
625
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogContentDirective, decorators: [{
634
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogContentDirective, decorators: [{
626
635
  type: Directive,
627
636
  args: [{
628
637
  selector: '[twDialogContent], tw-dialog-content',
@@ -638,16 +647,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
638
647
  */
639
648
  class DialogActionsDirective {
640
649
  /** Horizontal alignment of the action buttons. Defaults to `'end'`. */
641
- align = input('end', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
650
+ align = input('end', /* @ts-ignore */
651
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
642
652
  classes = computed(() => {
643
653
  const align = this.align();
644
654
  const justify = align === 'start' ? 'justify-start' : align === 'center' ? 'justify-center' : 'justify-end';
645
655
  return `flex flex-wrap items-center gap-2 px-6 py-4 border-t border-border-muted ${justify}`;
646
- }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
647
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
648
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: DialogActionsDirective, isStandalone: true, selector: "[twDialogActions], tw-dialog-actions", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
656
+ }, /* @ts-ignore */
657
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
658
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
659
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: DialogActionsDirective, isStandalone: true, selector: "[twDialogActions], tw-dialog-actions", inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
649
660
  }
650
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogActionsDirective, decorators: [{
661
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogActionsDirective, decorators: [{
651
662
  type: Directive,
652
663
  args: [{
653
664
  selector: '[twDialogActions], tw-dialog-actions',
@@ -662,19 +673,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
662
673
  */
663
674
  class DialogCloseDirective {
664
675
  /** Value passed to `afterClosed()` when the button is clicked. */
665
- twDialogClose = input(undefined, ...(ngDevMode ? [{ debugName: "twDialogClose" }] : /* istanbul ignore next */ []));
676
+ twDialogClose = input(undefined, /* @ts-ignore */
677
+ ...(ngDevMode ? [{ debugName: "twDialogClose" }] : /* istanbul ignore next */ []));
666
678
  /** Native button `type`. Defaults to `'button'` to avoid accidental form submission. */
667
- type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
679
+ type = input('button', /* @ts-ignore */
680
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
668
681
  dialogRef = inject(TwDialogRef, {
669
682
  optional: true,
670
683
  });
671
684
  onClick() {
672
685
  this.dialogRef?.close(this.twDialogClose());
673
686
  }
674
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogCloseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
675
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: DialogCloseDirective, isStandalone: true, selector: "[twDialogClose]", inputs: { twDialogClose: { classPropertyName: "twDialogClose", publicName: "twDialogClose", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()" }, properties: { "attr.type": "type()" } }, ngImport: i0 });
687
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogCloseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
688
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: DialogCloseDirective, isStandalone: true, selector: "[twDialogClose]", inputs: { twDialogClose: { classPropertyName: "twDialogClose", publicName: "twDialogClose", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()" }, properties: { "attr.type": "type()" } }, ngImport: i0 });
676
689
  }
677
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DialogCloseDirective, decorators: [{
690
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DialogCloseDirective, decorators: [{
678
691
  type: Directive,
679
692
  args: [{
680
693
  selector: '[twDialogClose]',
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-dialog.mjs","sources":["../../../projects/ngx-tw/dialog/dialog-config.ts","../../../projects/ngx-tw/dialog/dialog-container.ts","../../../projects/ngx-tw/dialog/dialog-ref.ts","../../../projects/ngx-tw/dialog/dialog.ts","../../../projects/ngx-tw/dialog/dialog-content.ts","../../../projects/ngx-tw/dialog/cdevhub-ngx-tw-dialog.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport {\n type AutoFocusTarget,\n DialogConfig as CdkDialogConfig,\n type DialogRole,\n type RestoreFocusValue,\n} from '@angular/cdk/dialog';\n\n/** Preset sizes mapped to width constraints for the dialog panel. */\nexport type TwDialogSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen';\n\n/** ARIA role of the dialog element. Use `'alertdialog'` for destructive confirmation prompts. */\nexport type TwDialogRole = DialogRole;\n\n/** Where to move focus when the dialog opens. */\nexport type TwDialogAutoFocus = AutoFocusTarget | string | boolean;\n\n/** How to restore focus on close. `true` restores to the previously focused element; a selector or element targets a specific node. */\nexport type TwDialogRestoreFocus = RestoreFocusValue;\n\n/** Scroll behavior for content underneath the dialog. */\nexport type TwDialogScrollStrategy = 'block' | 'close' | 'reposition' | 'noop';\n\n/**\n * Configuration for opening a dialog with {@link TwDialog.open}.\n *\n * Mirrors the shape of `@angular/cdk/dialog`'s `DialogConfig` with additional\n * tailwind-focused options (`size`, `enterAnimationDuration`, etc.).\n */\nexport class TwDialogConfig<D = unknown, R = unknown> extends CdkDialogConfig<D, R> {\n /** Preset size for the dialog panel. Ignored when `width`/`maxWidth` are provided. Defaults to `'md'`. */\n size?: TwDialogSize = 'md';\n\n /** Duration of the open animation in ms. Defaults to `150`. Use `0` to disable. */\n enterAnimationDuration?: number = 150;\n\n /**\n * Duration of the close animation in ms. Defaults to `120`. Use `0` to disable.\n * Asymmetric with `enterAnimationDuration` by design: the close transition is\n * slightly faster so the dialog feels dismissive rather than reluctant.\n */\n exitAnimationDuration?: number = 120;\n\n /** Scroll strategy preset applied when `scrollStrategy` isn't set. Defaults to `'block'`. */\n scrollBehavior?: TwDialogScrollStrategy = 'block';\n\n /** Maximum width. Number values are treated as pixels. Defaults to `'calc(100vw - 32px)'`. */\n override maxWidth?: number | string = 'calc(100vw - 32px)';\n\n /**\n * Whether the dialog is modal — sets `aria-modal` on the container.\n * Defaults to `true`: a `role=\"dialog\"` opened over the page is modal by\n * default and the rest of the document is inert while it is open. Set to\n * `false` only for non-modal surfaces (rare; consider `popover` instead).\n */\n override ariaModal?: boolean = true;\n\n /** Whether Escape and backdrop clicks are blocked. Defaults to `false`. */\n override disableClose?: boolean = false;\n\n /** Where to move focus when the dialog opens. Defaults to `'first-tabbable'`. */\n override autoFocus?: TwDialogAutoFocus = 'first-tabbable';\n\n /** Whether to restore focus to the previously focused element after close. Defaults to `true`. */\n override restoreFocus?: TwDialogRestoreFocus = true;\n\n /** Whether the dialog renders a backdrop. Defaults to `true`. */\n override hasBackdrop?: boolean = true;\n\n /** Whether navigation (e.g. router) closes the dialog. Defaults to `true`. */\n override closeOnNavigation?: boolean = true;\n}\n\n/** Injection token carrying the `data` value passed via {@link TwDialogConfig.data}. */\nexport const TW_DIALOG_DATA = new InjectionToken<unknown>('TW_DIALOG_DATA');\n\n/** Injection token for application-wide default dialog options. Set via `provideTwDialog()`. */\nexport const TW_DIALOG_DEFAULT_OPTIONS = new InjectionToken<Partial<TwDialogConfig>>(\n 'TW_DIALOG_DEFAULT_OPTIONS',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n type EventEmitter,\n inject,\n type Signal,\n ViewEncapsulation,\n computed,\n} from '@angular/core';\nimport { CdkDialogContainer } from '@angular/cdk/dialog';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n coerceOverlayDuration,\n mergeOverlayPanelClass,\n OverlayContainerCoordinator,\n type OverlayContainerAnimationEvent,\n type OverlayContainerState,\n} from '@cdevhub/ngx-tw/core';\nimport { tv } from 'tailwind-variants';\nimport { type TwDialogConfig } from './dialog-config';\n\n/** Lifecycle states a dialog passes through. */\nexport type DialogState = OverlayContainerState;\n\n/** Event emitted when the dialog's animation state transitions. */\nexport type DialogAnimationEvent = OverlayContainerAnimationEvent;\n\n// Dialog uses a `data-[state]` driven CSS transition rather than the project's\n// `animate.enter`/`animate.leave` keyframes. Justification:\n// 1. The ref owns the open/close lifecycle (state signal, observables) and\n// needs runtime-configurable enter/exit durations per `TwDialog.open()`\n// call — `animate.enter` only accepts a static class name.\n// 2. The container drives the same CSS variables (opacity + scale) for both\n// transitions, so a single `transition-[opacity,transform]` rule with a\n// data-state attribute is simpler than two keyframe declarations.\n// All other library overlays (popover, menu, tooltip) use animate.enter/leave;\n// this divergence is intentional and isolated to the dialog container.\nconst dialogContainerVariants = tv(\n {\n slots: {\n host: 'relative flex flex-col outline-none bg-surface-raised text-fg rounded-lg shadow-md border border-border overflow-hidden transition-[opacity,transform] ease-out motion-reduce:transition-none opacity-0 scale-95 data-[state=open]:opacity-100 data-[state=open]:scale-100 data-[state=closing]:opacity-0 data-[state=closing]:scale-95',\n },\n variants: {\n size: {\n xs: { host: 'w-full max-w-sm max-h-[85vh]' },\n sm: { host: 'w-full max-w-md max-h-[85vh]' },\n md: { host: 'w-full max-w-lg max-h-[85vh]' },\n lg: { host: 'w-full max-w-2xl max-h-[85vh]' },\n xl: { host: 'w-full max-w-4xl max-h-[85vh]' },\n fullscreen: {\n host: 'w-screen h-screen max-w-none max-h-none rounded-none border-0',\n },\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n/**\n * Dialog container rendered inside the CDK overlay. Wraps the user-provided\n * content in a Tailwind-styled surface and coordinates enter/exit transitions\n * with {@link TwDialogRef}.\n *\n * The animation state machine, `aria-describedby` queue, and panel-class\n * merge are shared with `SheetContainer` via {@link OverlayContainerCoordinator}\n * (component-scoped — see `providers: [OverlayContainerCoordinator]`).\n *\n * @docs-private\n */\n@Component({\n selector: 'tw-dialog-container',\n template: '<ng-template cdkPortalOutlet />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CdkPortalOutlet],\n providers: [OverlayContainerCoordinator],\n host: {\n tabindex: '-1',\n '[attr.id]': '_config.id || null',\n '[attr.role]': '_config.role',\n '[attr.aria-modal]': '_config.ariaModal',\n '[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledByQueue[0]',\n '[attr.aria-label]': '_config.ariaLabel',\n '[attr.aria-describedby]': 'ariaDescribedByAttr()',\n '[attr.data-state]': 'state()',\n '[class]': 'hostClasses()',\n '[style.transition-duration.ms]': 'transitionDuration()',\n },\n})\nexport class DialogContainer extends CdkDialogContainer<TwDialogConfig> {\n private readonly coordinator = inject(OverlayContainerCoordinator);\n\n /** Lifecycle state of the dialog's enter/exit animation. */\n readonly state: Signal<DialogState> = this.coordinator.state;\n\n /** Emits whenever the animation state transitions. */\n readonly animationStateChanged: EventEmitter<DialogAnimationEvent> =\n this.coordinator.animationStateChanged;\n\n /** Resolved enter-animation duration in ms. */\n readonly enterAnimationDuration: number;\n /** Resolved exit-animation duration in ms. */\n readonly exitAnimationDuration: number;\n\n private readonly sizeVariant = computed(() => {\n const size = this._config.size ?? 'md';\n return dialogContainerVariants({ size });\n });\n\n protected readonly hostClasses = computed(() =>\n mergeOverlayPanelClass(this.sizeVariant().host(), this._config.panelClass),\n );\n\n protected readonly ariaDescribedByAttr = computed(\n () =>\n this._config.ariaDescribedBy ||\n this.coordinator.describedByIds()[0] ||\n null,\n );\n\n protected readonly transitionDuration = this.coordinator.transitionDuration;\n\n constructor() {\n super();\n this.enterAnimationDuration = coerceOverlayDuration(this._config.enterAnimationDuration, 150);\n this.exitAnimationDuration = coerceOverlayDuration(this._config.exitAnimationDuration, 120);\n this.coordinator.setDurations(this.enterAnimationDuration, this.exitAnimationDuration);\n }\n\n protected override _contentAttached(): void {\n super._contentAttached();\n this.coordinator.startEnterAnimation();\n }\n\n /** Triggered by the dialog ref to play the exit transition before disposing the overlay. */\n _startExitAnimation(): void {\n this.coordinator.startExitAnimation();\n }\n\n /** Registers a description id for the container's `aria-describedby`. */\n _addAriaDescribedBy(id: string): void {\n this.coordinator.addAriaDescribedBy(id);\n }\n\n /** Removes a previously registered description id. */\n _removeAriaDescribedBy(id: string): void {\n this.coordinator.removeAriaDescribedBy(id);\n }\n}\n","import { type ComponentRef, signal, type Signal } from '@angular/core';\nimport { type DialogRef as CdkDialogRef } from '@angular/cdk/dialog';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nimport { filter, merge, type Observable, ReplaySubject, take } from 'rxjs';\nimport type { FocusOrigin } from '@angular/cdk/a11y';\nimport type { TwDialogConfig } from './dialog-config';\nimport type { DialogContainer, DialogState } from './dialog-container';\n\n/**\n * Reference to a dialog opened via {@link TwDialog.open}. Drives the dialog\n * lifecycle (close, state, observables) and forwards useful overlay streams.\n */\nexport class TwDialogRef<R = unknown, C = unknown> {\n /** Unique ID of the dialog. */\n readonly id: string;\n\n /** Instance of the component rendered inside the dialog, or `null` for template dialogs. */\n componentInstance: C | null = null;\n\n /** `ComponentRef` of the content component, or `null` for template dialogs. */\n readonly componentRef: ComponentRef<C> | null = null;\n\n /** Current lifecycle state. Reactively readable. */\n readonly state: Signal<DialogState>;\n\n /** When `true`, close-via-escape and close-via-backdrop are disabled. */\n disableClose: boolean | undefined;\n\n private readonly stateSignal = signal<DialogState>('opening');\n private readonly afterOpenedSubject = new ReplaySubject<void>(1);\n private readonly beforeClosedSubject = new ReplaySubject<R | undefined>(1);\n private readonly afterClosedSubject = new ReplaySubject<R | undefined>(1);\n\n private pendingResult: R | undefined;\n private closeFocusOrigin: FocusOrigin | undefined;\n\n constructor(\n private readonly cdkRef: CdkDialogRef<R, C>,\n readonly config: TwDialogConfig<unknown, R>,\n readonly containerInstance: DialogContainer,\n ) {\n this.id = cdkRef.id;\n this.disableClose = config.disableClose;\n this.state = this.stateSignal.asReadonly();\n\n cdkRef.addPanelClass('tw-dialog-panel');\n\n const animationChanges = containerInstance.animationStateChanged;\n\n animationChanges\n .pipe(\n filter((event) => event.state === 'open'),\n take(1),\n )\n .subscribe(() => {\n this.stateSignal.set('open');\n this.afterOpenedSubject.next();\n this.afterOpenedSubject.complete();\n });\n\n // The container owns the exit-animation fallback timer (see\n // ANIMATION_FALLBACK_PADDING in dialog-container.ts), so we trust its\n // `closed` emission and run finishClose exactly once from here.\n animationChanges\n .pipe(\n filter((event) => event.state === 'closed'),\n take(1),\n )\n .subscribe(() => this.finishClose());\n\n cdkRef.overlayRef.detachments().subscribe(() => {\n if (this.stateSignal() !== 'closed') {\n this.beforeClosedSubject.next(this.pendingResult);\n this.beforeClosedSubject.complete();\n this.finishClose();\n }\n });\n\n merge(\n cdkRef.backdropClick,\n cdkRef.keydownEvents.pipe(\n filter(\n (event) => event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event),\n ),\n ),\n ).subscribe((event) => {\n if (this.disableClose) return;\n event.preventDefault();\n this.closeWithOrigin(event.type === 'keydown' ? 'keyboard' : 'mouse');\n });\n }\n\n /**\n * Closes the dialog. The exit animation runs before the overlay is disposed.\n * @param result Value forwarded to `afterClosed()` subscribers.\n */\n close(result?: R): void {\n this.closeWithOrigin('program', result);\n }\n\n /** Observable that emits once after the enter animation finishes. */\n afterOpened(): Observable<void> {\n return this.afterOpenedSubject.asObservable();\n }\n\n /** Observable that emits once when the close animation starts. */\n beforeClosed(): Observable<R | undefined> {\n return this.beforeClosedSubject.asObservable();\n }\n\n /** Observable that emits once after the dialog has fully closed and the overlay is disposed. */\n afterClosed(): Observable<R | undefined> {\n return this.afterClosedSubject.asObservable();\n }\n\n /** Backdrop click stream (emits even when `disableClose` is set). */\n backdropClick(): Observable<MouseEvent> {\n return this.cdkRef.backdropClick;\n }\n\n /** Keydown event stream for the overlay. */\n keydownEvents(): Observable<KeyboardEvent> {\n return this.cdkRef.keydownEvents;\n }\n\n /** Updates the dialog's width/height. Pass empty string to reset a dimension. */\n updateSize(width: string | number = '', height: string | number = ''): this {\n this.cdkRef.updateSize(width, height);\n return this;\n }\n\n /** Adds CSS classes to the overlay panel. */\n addPanelClass(classes: string | string[]): this {\n this.cdkRef.addPanelClass(classes);\n return this;\n }\n\n /** Removes CSS classes from the overlay panel. */\n removePanelClass(classes: string | string[]): this {\n this.cdkRef.removePanelClass(classes);\n return this;\n }\n\n private closeWithOrigin(origin: FocusOrigin, result?: R): void {\n if (this.stateSignal() === 'closing' || this.stateSignal() === 'closed') return;\n\n const predicate = this.config.closePredicate;\n if (\n predicate &&\n !predicate(\n result,\n this.config as unknown as Parameters<typeof predicate>[1],\n this.componentInstance,\n )\n ) {\n return;\n }\n\n this.pendingResult = result;\n this.closeFocusOrigin = origin;\n this.stateSignal.set('closing');\n\n this.beforeClosedSubject.next(result);\n this.beforeClosedSubject.complete();\n\n this.cdkRef.overlayRef.detachBackdrop();\n this.containerInstance._startExitAnimation();\n }\n\n private finishClose(): void {\n if (this.stateSignal() === 'closed') return;\n this.stateSignal.set('closed');\n\n this.afterClosedSubject.next(this.pendingResult);\n this.afterClosedSubject.complete();\n\n if (this.cdkRef.containerInstance) {\n this.cdkRef.close(this.pendingResult, { focusOrigin: this.closeFocusOrigin });\n }\n\n this.componentInstance = null;\n }\n}\n","import {\n type ComponentRef,\n inject,\n Injectable,\n Injector,\n type OnDestroy,\n type Provider,\n type StaticProvider,\n type TemplateRef,\n signal,\n type Signal,\n makeEnvironmentProviders,\n type EnvironmentProviders,\n} from '@angular/core';\nimport { Dialog, DialogConfig as CdkDialogConfig } from '@angular/cdk/dialog';\nimport {\n createBlockScrollStrategy,\n createCloseScrollStrategy,\n createNoopScrollStrategy,\n createRepositionScrollStrategy,\n type ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport type { ComponentType } from '@angular/cdk/portal';\nimport { defer, type Observable, startWith, Subject } from 'rxjs';\nimport {\n TW_DIALOG_DATA,\n TW_DIALOG_DEFAULT_OPTIONS,\n TwDialogConfig,\n type TwDialogScrollStrategy,\n} from './dialog-config';\nimport { DialogContainer } from './dialog-container';\nimport { TwDialogRef } from './dialog-ref';\n\n/**\n * Opens Tailwind-styled modal dialogs. Composes `@angular/cdk/dialog` for focus\n * trapping, portals, overlay plumbing, and adds a Tailwind container, richer\n * ref API, and animation lifecycle.\n *\n * Not `providedIn: 'root'` — register it via {@link provideTwDialog}.\n */\n@Injectable()\nexport class TwDialog implements OnDestroy {\n private readonly cdkDialog = inject(Dialog);\n private readonly injector = inject(Injector);\n private readonly defaultOptions = inject(TW_DIALOG_DEFAULT_OPTIONS, { optional: true }) ?? {};\n private readonly parentDialog = inject(TwDialog, { optional: true, skipSelf: true });\n\n private readonly openDialogsAtThisLevel = signal<readonly TwDialogRef<unknown, unknown>[]>([]);\n private readonly afterOpenedSubject = new Subject<TwDialogRef<unknown, unknown>>();\n private readonly afterAllClosedSubject = new Subject<void>();\n\n /** Reactively-readable list of currently-open dialogs across the full dialog tree. */\n readonly openDialogs: Signal<readonly TwDialogRef<unknown, unknown>[]> = this.parentDialog\n ? this.parentDialog.openDialogs\n : this.openDialogsAtThisLevel.asReadonly();\n\n /** Emits every time a dialog is opened. */\n readonly afterOpened: Observable<TwDialogRef<unknown, unknown>> = this.parentDialog\n ? this.parentDialog.afterOpened\n : this.afterOpenedSubject.asObservable();\n\n /**\n * Emits when every open dialog has closed. Emits immediately on subscribe if\n * there are none open.\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this.openDialogs().length\n ? this.getAfterAllClosedSource()\n : this.getAfterAllClosedSource().pipe(startWith(undefined as void)),\n );\n\n /**\n * Opens a dialog using the given component or template.\n * @param content Component class or `TemplateRef`.\n * @param config Options merged over the application defaults.\n * @returns Reference controlling the opened dialog.\n */\n open<R = unknown, D = unknown, C = unknown>(\n content: ComponentType<C> | TemplateRef<C>,\n config?: TwDialogConfig<D, R>,\n ): TwDialogRef<R, C> {\n const merged = this.resolveConfig<D, R>(config);\n let twRef!: TwDialogRef<R, C>;\n\n const cdkRef = this.cdkDialog.open<R, D, C>(content, {\n id: merged.id,\n role: merged.role,\n data: merged.data,\n panelClass: merged.panelClass,\n backdropClass: merged.backdropClass ?? 'tw-dialog-backdrop',\n hasBackdrop: merged.hasBackdrop,\n width: merged.width,\n height: merged.height,\n minWidth: merged.minWidth,\n minHeight: merged.minHeight,\n maxWidth: merged.maxWidth,\n maxHeight: merged.maxHeight,\n direction: merged.direction,\n ariaDescribedBy: merged.ariaDescribedBy,\n ariaLabelledBy: merged.ariaLabelledBy,\n ariaLabel: merged.ariaLabel,\n ariaModal: merged.ariaModal,\n autoFocus: merged.autoFocus,\n restoreFocus: merged.restoreFocus,\n scrollStrategy: merged.scrollStrategy ?? this.resolveScrollStrategy(merged.scrollBehavior),\n closeOnNavigation: merged.closeOnNavigation,\n viewContainerRef: merged.viewContainerRef,\n injector: merged.injector,\n // We handle close/Escape/backdrop ourselves so we can run the exit animation.\n disableClose: true,\n closeOnOverlayDetachments: false,\n container: {\n type: DialogContainer,\n providers: () => [\n { provide: TwDialogConfig, useValue: merged },\n { provide: CdkDialogConfig, useValue: merged },\n ],\n },\n providers: (_cdkRef, _cdkConfig, container) => {\n twRef = new TwDialogRef<R, C>(\n _cdkRef,\n merged as unknown as TwDialogConfig<unknown, R>,\n container as DialogContainer,\n );\n const providers: StaticProvider[] = [\n { provide: TwDialogRef, useValue: twRef },\n { provide: TW_DIALOG_DATA, useValue: merged.data ?? null },\n ];\n if (Array.isArray(merged.providers)) providers.push(...merged.providers);\n return providers;\n },\n });\n\n // After CDK attaches the component, copy references onto our ref.\n (twRef as { componentRef: ComponentRef<C> | null }).componentRef = cdkRef.componentRef;\n twRef.componentInstance = cdkRef.componentInstance as C | null;\n\n const scope = this.parentDialog ?? this;\n scope.registerOpen(twRef as unknown as TwDialogRef<unknown, unknown>);\n\n twRef.afterClosed().subscribe(() => {\n scope.unregister(twRef as unknown as TwDialogRef<unknown, unknown>);\n });\n\n return twRef;\n }\n\n /** Closes every open dialog managed by this service (and child services). */\n closeAll(): void {\n const dialogs = [...this.openDialogs()];\n for (let i = dialogs.length - 1; i >= 0; i--) dialogs[i].close();\n }\n\n /** Looks up an open dialog by its id. */\n getDialogById<R = unknown, C = unknown>(id: string): TwDialogRef<R, C> | undefined {\n return this.openDialogs().find((dialog) => dialog.id === id) as TwDialogRef<R, C> | undefined;\n }\n\n ngOnDestroy(): void {\n const dialogs = [...this.openDialogsAtThisLevel()];\n for (let i = dialogs.length - 1; i >= 0; i--) dialogs[i].close();\n this.afterOpenedSubject.complete();\n this.afterAllClosedSubject.complete();\n }\n\n private registerOpen(ref: TwDialogRef<unknown, unknown>): void {\n if (this.parentDialog) {\n this.parentDialog.registerOpen(ref);\n } else {\n this.openDialogsAtThisLevel.update((list) => [...list, ref]);\n this.afterOpenedSubject.next(ref);\n }\n }\n\n private unregister(ref: TwDialogRef<unknown, unknown>): void {\n if (this.parentDialog) {\n this.parentDialog.unregister(ref);\n } else {\n this.openDialogsAtThisLevel.update((list) => list.filter((d) => d !== ref));\n if (this.openDialogsAtThisLevel().length === 0) {\n this.afterAllClosedSubject.next();\n }\n }\n }\n\n private getAfterAllClosedSource(): Subject<void> {\n return this.parentDialog\n ? this.parentDialog.getAfterAllClosedSource()\n : this.afterAllClosedSubject;\n }\n\n private resolveConfig<D, R>(config: TwDialogConfig<D, R> | undefined): TwDialogConfig<D, R> {\n const merged = new TwDialogConfig<D, R>();\n Object.assign(merged, this.defaultOptions, config);\n return merged;\n }\n\n private resolveScrollStrategy(\n strategy: TwDialogScrollStrategy | undefined,\n ): ScrollStrategy {\n switch (strategy) {\n case 'close':\n return createCloseScrollStrategy(this.injector);\n case 'reposition':\n return createRepositionScrollStrategy(this.injector);\n case 'noop':\n return createNoopScrollStrategy();\n case 'block':\n default:\n return createBlockScrollStrategy(this.injector);\n }\n }\n}\n\n/**\n * Registers the {@link TwDialog} service for dependency injection.\n *\n * @param defaultOptions Optional defaults merged into every `open()` call.\n * @example\n * ```ts\n * provideTwDialog({ size: 'lg', hasBackdrop: true })\n * ```\n */\nexport function provideTwDialog(\n defaultOptions?: Partial<TwDialogConfig>,\n): EnvironmentProviders {\n const providers: Provider[] = [TwDialog];\n if (defaultOptions) {\n providers.push({ provide: TW_DIALOG_DEFAULT_OPTIONS, useValue: defaultOptions });\n }\n return makeEnvironmentProviders(providers);\n}\n","import {\n computed,\n Directive,\n inject,\n input,\n type OnDestroy,\n type OnInit,\n} from '@angular/core';\nimport { _IdGenerator } from '@angular/cdk/a11y';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport type { TwColor } from '@cdevhub/ngx-tw/core';\nimport { TwDialogRef } from './dialog-ref';\nimport { DialogContainer } from './dialog-container';\n\n/**\n * Header wrapper for a dialog. Provides consistent padding and spacing for\n * title + subtitle + leading icon, and separates the header from scrollable\n * content below.\n */\n@Directive({\n selector: '[twDialogHeader], tw-dialog-header',\n host: {\n class: 'flex items-start gap-3 px-6 pt-6 pb-4',\n },\n})\nexport class DialogHeaderDirective {}\n\n// Slot tokens own light/dark contrast — no `dark:` overrides, no shade picks.\n// See role slot conventions in `projects/ngx-tw/theme/_semantic.css`.\nconst ICON_COLOR_CLASSES: Record<TwColor, string> = {\n primary: 'bg-primary-soft text-primary-icon',\n secondary: 'bg-secondary-soft text-secondary-icon',\n accent: 'bg-accent-soft text-accent-icon',\n neutral: 'bg-neutral-soft text-neutral-icon',\n info: 'bg-info-soft text-info-icon',\n success: 'bg-success-soft text-success-icon',\n warning: 'bg-warning-soft text-warning-icon',\n error: 'bg-error-soft text-error-icon',\n};\n\n/**\n * Decorative leading icon for a dialog header. Use with a semantic `color` to\n * match destructive / informational / success dialogs.\n */\n@Directive({\n selector: '[twDialogIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class DialogIconDirective {\n /** Semantic color for the icon container. Defaults to a neutral surface. */\n readonly color = input<TwColor | undefined>(undefined);\n\n protected readonly classes = computed(() => {\n const base = 'flex size-10 shrink-0 items-center justify-center rounded-full';\n const color = this.color();\n return color ? `${base} ${ICON_COLOR_CLASSES[color]}` : `${base} bg-surface-muted text-fg`;\n });\n}\n\n/**\n * Dialog title. Registers its ID with the container's `aria-labelledby` queue\n * so screen readers announce it automatically.\n */\n@Directive({\n selector: '[twDialogTitle], tw-dialog-title',\n host: {\n class: 'text-sm font-semibold text-fg',\n '[id]': 'id()',\n },\n})\nexport class DialogTitleDirective implements OnInit, OnDestroy {\n private readonly generatedId = inject(_IdGenerator).getId('tw-dialog-title-');\n private readonly dialogRef = inject<TwDialogRef<unknown, unknown>>(TwDialogRef, {\n optional: true,\n });\n // Ancestor-DI fallback for the rare case where `TwDialogRef` is not in the\n // directive's injector chain (e.g. heavily nested template portals). The\n // container ALWAYS resolves via element-injector traversal because the\n // directive lives inside `<tw-dialog-container>`'s DOM tree.\n private readonly container = inject(DialogContainer, { optional: true, skipSelf: true });\n\n /** Custom id for the title element. Defaults to a generated unique id. */\n readonly id = input<string>(this.generatedId);\n\n ngOnInit(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._addAriaLabelledBy(this.id());\n }\n\n ngOnDestroy(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._removeAriaLabelledBy(this.id());\n }\n}\n\n/** Secondary line beneath the dialog title — intended for a short description. */\n@Directive({\n selector: '[twDialogSubtitle], tw-dialog-subtitle',\n host: {\n class: 'text-sm text-fg-muted',\n },\n})\nexport class DialogSubtitleDirective {}\n\n/**\n * Dialog description. Registers its ID with the container's `aria-describedby`\n * queue so screen readers announce the descriptive paragraph after the title.\n * Mirrors {@link DialogTitleDirective} but for `aria-describedby`.\n */\n@Directive({\n selector: '[twDialogDescription], tw-dialog-description',\n host: {\n '[id]': 'id()',\n },\n})\nexport class DialogDescriptionDirective implements OnInit, OnDestroy {\n private readonly generatedId = inject(_IdGenerator).getId('tw-dialog-description-');\n private readonly dialogRef = inject<TwDialogRef<unknown, unknown>>(TwDialogRef, {\n optional: true,\n });\n // Ancestor-DI fallback — see DialogTitleDirective.\n private readonly container = inject(DialogContainer, { optional: true, skipSelf: true });\n\n /** Custom id for the description element. Defaults to a generated unique id. */\n readonly id = input<string>(this.generatedId);\n\n ngOnInit(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._addAriaDescribedBy(this.id());\n }\n\n ngOnDestroy(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._removeAriaDescribedBy(this.id());\n }\n}\n\n/**\n * Scrollable content region of the dialog. Apply between the header and the\n * actions bar. Inherits CDK's `CdkScrollable` to play nicely with scroll\n * strategies and nested scrollables.\n */\n@Directive({\n selector: '[twDialogContent], tw-dialog-content',\n hostDirectives: [CdkScrollable],\n host: {\n class: 'flex-1 overflow-y-auto px-6 py-4 text-sm text-fg',\n },\n})\nexport class DialogContentDirective {}\n\n/** Horizontal alignment for dialog action buttons. */\nexport type DialogActionsAlign = 'start' | 'center' | 'end';\n\n/**\n * Bottom action bar of a dialog. Use inside the dialog content or template to\n * host Cancel/Confirm buttons. Stays pinned below scrollable content.\n */\n@Directive({\n selector: '[twDialogActions], tw-dialog-actions',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class DialogActionsDirective {\n /** Horizontal alignment of the action buttons. Defaults to `'end'`. */\n readonly align = input<DialogActionsAlign>('end');\n\n protected readonly classes = computed(() => {\n const align = this.align();\n const justify =\n align === 'start' ? 'justify-start' : align === 'center' ? 'justify-center' : 'justify-end';\n return `flex flex-wrap items-center gap-2 px-6 py-4 border-t border-border-muted ${justify}`;\n });\n}\n\n/**\n * Closes the enclosing dialog when the host button is clicked. Provide a\n * `[twDialogClose]` value to pass a result to `afterClosed()` subscribers.\n */\n@Directive({\n selector: '[twDialogClose]',\n host: {\n '(click)': 'onClick()',\n '[attr.type]': 'type()',\n },\n})\nexport class DialogCloseDirective {\n /** Value passed to `afterClosed()` when the button is clicked. */\n readonly twDialogClose = input<unknown>(undefined);\n\n /** Native button `type`. Defaults to `'button'` to avoid accidental form submission. */\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n\n private readonly dialogRef = inject<TwDialogRef<unknown, unknown>>(TwDialogRef, {\n optional: true,\n });\n\n protected onClick(): void {\n this.dialogRef?.close(this.twDialogClose());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CdkDialogConfig"],"mappings":"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"}
1
+ {"version":3,"file":"cdevhub-ngx-tw-dialog.mjs","sources":["../../../projects/ngx-tw/dialog/dialog-config.ts","../../../projects/ngx-tw/dialog/dialog-container.ts","../../../projects/ngx-tw/dialog/dialog-ref.ts","../../../projects/ngx-tw/dialog/dialog.ts","../../../projects/ngx-tw/dialog/dialog-content.ts","../../../projects/ngx-tw/dialog/cdevhub-ngx-tw-dialog.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport {\n type AutoFocusTarget,\n DialogConfig as CdkDialogConfig,\n type DialogRole,\n type RestoreFocusValue,\n} from '@angular/cdk/dialog';\n\n/** Preset sizes mapped to width constraints for the dialog panel. */\nexport type TwDialogSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen';\n\n/** ARIA role of the dialog element. Use `'alertdialog'` for destructive confirmation prompts. */\nexport type TwDialogRole = DialogRole;\n\n/** Where to move focus when the dialog opens. */\nexport type TwDialogAutoFocus = AutoFocusTarget | string | boolean;\n\n/** How to restore focus on close. `true` restores to the previously focused element; a selector or element targets a specific node. */\nexport type TwDialogRestoreFocus = RestoreFocusValue;\n\n/** Scroll behavior for content underneath the dialog. */\nexport type TwDialogScrollStrategy = 'block' | 'close' | 'reposition' | 'noop';\n\n/**\n * Configuration for opening a dialog with {@link TwDialog.open}.\n *\n * Mirrors the shape of `@angular/cdk/dialog`'s `DialogConfig` with additional\n * tailwind-focused options (`size`, `enterAnimationDuration`, etc.).\n */\nexport class TwDialogConfig<D = unknown, R = unknown> extends CdkDialogConfig<D, R> {\n /** Preset size for the dialog panel. Ignored when `width`/`maxWidth` are provided. Defaults to `'md'`. */\n size?: TwDialogSize = 'md';\n\n /** Duration of the open animation in ms. Defaults to `150`. Use `0` to disable. */\n enterAnimationDuration?: number = 150;\n\n /**\n * Duration of the close animation in ms. Defaults to `120`. Use `0` to disable.\n * Asymmetric with `enterAnimationDuration` by design: the close transition is\n * slightly faster so the dialog feels dismissive rather than reluctant.\n */\n exitAnimationDuration?: number = 120;\n\n /** Scroll strategy preset applied when `scrollStrategy` isn't set. Defaults to `'block'`. */\n scrollBehavior?: TwDialogScrollStrategy = 'block';\n\n /** Maximum width. Number values are treated as pixels. Defaults to `'calc(100vw - 32px)'`. */\n override maxWidth?: number | string = 'calc(100vw - 32px)';\n\n /**\n * Whether the dialog is modal — sets `aria-modal` on the container.\n * Defaults to `true`: a `role=\"dialog\"` opened over the page is modal by\n * default and the rest of the document is inert while it is open. Set to\n * `false` only for non-modal surfaces (rare; consider `popover` instead).\n */\n override ariaModal?: boolean = true;\n\n /** Whether Escape and backdrop clicks are blocked. Defaults to `false`. */\n override disableClose?: boolean = false;\n\n /** Where to move focus when the dialog opens. Defaults to `'first-tabbable'`. */\n override autoFocus?: TwDialogAutoFocus = 'first-tabbable';\n\n /** Whether to restore focus to the previously focused element after close. Defaults to `true`. */\n override restoreFocus?: TwDialogRestoreFocus = true;\n\n /** Whether the dialog renders a backdrop. Defaults to `true`. */\n override hasBackdrop?: boolean = true;\n\n /** Whether navigation (e.g. router) closes the dialog. Defaults to `true`. */\n override closeOnNavigation?: boolean = true;\n}\n\n/** Injection token carrying the `data` value passed via {@link TwDialogConfig.data}. */\nexport const TW_DIALOG_DATA = new InjectionToken<unknown>('TW_DIALOG_DATA');\n\n/** Injection token for application-wide default dialog options. Set via `provideTwDialog()`. */\nexport const TW_DIALOG_DEFAULT_OPTIONS = new InjectionToken<Partial<TwDialogConfig>>(\n 'TW_DIALOG_DEFAULT_OPTIONS',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n type EventEmitter,\n inject,\n type Signal,\n ViewEncapsulation,\n computed,\n} from '@angular/core';\nimport { CdkDialogContainer } from '@angular/cdk/dialog';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport {\n coerceOverlayDuration,\n mergeOverlayPanelClass,\n OverlayContainerCoordinator,\n type OverlayContainerAnimationEvent,\n type OverlayContainerState,\n} from '@cdevhub/ngx-tw/core';\nimport { tv } from 'tailwind-variants';\nimport { type TwDialogConfig } from './dialog-config';\n\n/** Lifecycle states a dialog passes through. */\nexport type DialogState = OverlayContainerState;\n\n/** Event emitted when the dialog's animation state transitions. */\nexport type DialogAnimationEvent = OverlayContainerAnimationEvent;\n\n// Dialog uses a `data-[state]` driven CSS transition rather than the project's\n// `animate.enter`/`animate.leave` keyframes. Justification:\n// 1. The ref owns the open/close lifecycle (state signal, observables) and\n// needs runtime-configurable enter/exit durations per `TwDialog.open()`\n// call — `animate.enter` only accepts a static class name.\n// 2. The container drives the same CSS variables (opacity + scale) for both\n// transitions, so a single `transition-[opacity,transform]` rule with a\n// data-state attribute is simpler than two keyframe declarations.\n// All other library overlays (popover, menu, tooltip) use animate.enter/leave;\n// this divergence is intentional and isolated to the dialog container.\nconst dialogContainerVariants = tv(\n {\n slots: {\n host: 'relative flex flex-col outline-none bg-surface-raised text-fg rounded-lg shadow-md border border-border overflow-hidden transition-[opacity,transform] ease-out motion-reduce:transition-none opacity-0 scale-95 data-[state=open]:opacity-100 data-[state=open]:scale-100 data-[state=closing]:opacity-0 data-[state=closing]:scale-95',\n },\n variants: {\n size: {\n xs: { host: 'w-full max-w-sm max-h-[85vh]' },\n sm: { host: 'w-full max-w-md max-h-[85vh]' },\n md: { host: 'w-full max-w-lg max-h-[85vh]' },\n lg: { host: 'w-full max-w-2xl max-h-[85vh]' },\n xl: { host: 'w-full max-w-4xl max-h-[85vh]' },\n fullscreen: {\n host: 'w-screen h-screen max-w-none max-h-none rounded-none border-0',\n },\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n/**\n * Dialog container rendered inside the CDK overlay. Wraps the user-provided\n * content in a Tailwind-styled surface and coordinates enter/exit transitions\n * with {@link TwDialogRef}.\n *\n * The animation state machine, `aria-describedby` queue, and panel-class\n * merge are shared with `SheetContainer` via {@link OverlayContainerCoordinator}\n * (component-scoped — see `providers: [OverlayContainerCoordinator]`).\n *\n * @docs-private\n */\n@Component({\n selector: 'tw-dialog-container',\n template: '<ng-template cdkPortalOutlet />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CdkPortalOutlet],\n providers: [OverlayContainerCoordinator],\n host: {\n tabindex: '-1',\n '[attr.id]': '_config.id || null',\n '[attr.role]': '_config.role',\n '[attr.aria-modal]': '_config.ariaModal',\n '[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledByQueue[0]',\n '[attr.aria-label]': '_config.ariaLabel',\n '[attr.aria-describedby]': 'ariaDescribedByAttr()',\n '[attr.data-state]': 'state()',\n '[class]': 'hostClasses()',\n '[style.transition-duration.ms]': 'transitionDuration()',\n },\n})\nexport class DialogContainer extends CdkDialogContainer<TwDialogConfig> {\n private readonly coordinator = inject(OverlayContainerCoordinator);\n\n /** Lifecycle state of the dialog's enter/exit animation. */\n readonly state: Signal<DialogState> = this.coordinator.state;\n\n /** Emits whenever the animation state transitions. */\n readonly animationStateChanged: EventEmitter<DialogAnimationEvent> =\n this.coordinator.animationStateChanged;\n\n /** Resolved enter-animation duration in ms. */\n readonly enterAnimationDuration: number;\n /** Resolved exit-animation duration in ms. */\n readonly exitAnimationDuration: number;\n\n private readonly sizeVariant = computed(() => {\n const size = this._config.size ?? 'md';\n return dialogContainerVariants({ size });\n });\n\n protected readonly hostClasses = computed(() =>\n mergeOverlayPanelClass(this.sizeVariant().host(), this._config.panelClass),\n );\n\n protected readonly ariaDescribedByAttr = computed(\n () =>\n this._config.ariaDescribedBy ||\n this.coordinator.describedByIds()[0] ||\n null,\n );\n\n protected readonly transitionDuration = this.coordinator.transitionDuration;\n\n constructor() {\n super();\n this.enterAnimationDuration = coerceOverlayDuration(this._config.enterAnimationDuration, 150);\n this.exitAnimationDuration = coerceOverlayDuration(this._config.exitAnimationDuration, 120);\n this.coordinator.setDurations(this.enterAnimationDuration, this.exitAnimationDuration);\n }\n\n protected override _contentAttached(): void {\n super._contentAttached();\n this.coordinator.startEnterAnimation();\n }\n\n /** Triggered by the dialog ref to play the exit transition before disposing the overlay. */\n _startExitAnimation(): void {\n this.coordinator.startExitAnimation();\n }\n\n /** Registers a description id for the container's `aria-describedby`. */\n _addAriaDescribedBy(id: string): void {\n this.coordinator.addAriaDescribedBy(id);\n }\n\n /** Removes a previously registered description id. */\n _removeAriaDescribedBy(id: string): void {\n this.coordinator.removeAriaDescribedBy(id);\n }\n}\n","import { type ComponentRef, signal, type Signal } from '@angular/core';\nimport { type DialogRef as CdkDialogRef } from '@angular/cdk/dialog';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nimport { filter, merge, type Observable, ReplaySubject, take } from 'rxjs';\nimport type { FocusOrigin } from '@angular/cdk/a11y';\nimport type { TwDialogConfig } from './dialog-config';\nimport type { DialogContainer, DialogState } from './dialog-container';\n\n/**\n * Reference to a dialog opened via {@link TwDialog.open}. Drives the dialog\n * lifecycle (close, state, observables) and forwards useful overlay streams.\n */\nexport class TwDialogRef<R = unknown, C = unknown> {\n /** Unique ID of the dialog. */\n readonly id: string;\n\n /** Instance of the component rendered inside the dialog, or `null` for template dialogs. */\n componentInstance: C | null = null;\n\n /** `ComponentRef` of the content component, or `null` for template dialogs. */\n readonly componentRef: ComponentRef<C> | null = null;\n\n /** Current lifecycle state. Reactively readable. */\n readonly state: Signal<DialogState>;\n\n /** When `true`, close-via-escape and close-via-backdrop are disabled. */\n disableClose: boolean | undefined;\n\n private readonly stateSignal = signal<DialogState>('opening');\n private readonly afterOpenedSubject = new ReplaySubject<void>(1);\n private readonly beforeClosedSubject = new ReplaySubject<R | undefined>(1);\n private readonly afterClosedSubject = new ReplaySubject<R | undefined>(1);\n\n private pendingResult: R | undefined;\n private closeFocusOrigin: FocusOrigin | undefined;\n\n constructor(\n private readonly cdkRef: CdkDialogRef<R, C>,\n readonly config: TwDialogConfig<unknown, R>,\n readonly containerInstance: DialogContainer,\n ) {\n this.id = cdkRef.id;\n this.disableClose = config.disableClose;\n this.state = this.stateSignal.asReadonly();\n\n cdkRef.addPanelClass('tw-dialog-panel');\n\n const animationChanges = containerInstance.animationStateChanged;\n\n animationChanges\n .pipe(\n filter((event) => event.state === 'open'),\n take(1),\n )\n .subscribe(() => {\n this.stateSignal.set('open');\n this.afterOpenedSubject.next();\n this.afterOpenedSubject.complete();\n });\n\n // The container owns the exit-animation fallback timer (see\n // ANIMATION_FALLBACK_PADDING in dialog-container.ts), so we trust its\n // `closed` emission and run finishClose exactly once from here.\n animationChanges\n .pipe(\n filter((event) => event.state === 'closed'),\n take(1),\n )\n .subscribe(() => this.finishClose());\n\n cdkRef.overlayRef.detachments().subscribe(() => {\n if (this.stateSignal() !== 'closed') {\n this.beforeClosedSubject.next(this.pendingResult);\n this.beforeClosedSubject.complete();\n this.finishClose();\n }\n });\n\n merge(\n cdkRef.backdropClick,\n cdkRef.keydownEvents.pipe(\n filter(\n (event) => event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event),\n ),\n ),\n ).subscribe((event) => {\n if (this.disableClose) return;\n event.preventDefault();\n this.closeWithOrigin(event.type === 'keydown' ? 'keyboard' : 'mouse');\n });\n }\n\n /**\n * Closes the dialog. The exit animation runs before the overlay is disposed.\n * @param result Value forwarded to `afterClosed()` subscribers.\n */\n close(result?: R): void {\n this.closeWithOrigin('program', result);\n }\n\n /** Observable that emits once after the enter animation finishes. */\n afterOpened(): Observable<void> {\n return this.afterOpenedSubject.asObservable();\n }\n\n /** Observable that emits once when the close animation starts. */\n beforeClosed(): Observable<R | undefined> {\n return this.beforeClosedSubject.asObservable();\n }\n\n /** Observable that emits once after the dialog has fully closed and the overlay is disposed. */\n afterClosed(): Observable<R | undefined> {\n return this.afterClosedSubject.asObservable();\n }\n\n /** Backdrop click stream (emits even when `disableClose` is set). */\n backdropClick(): Observable<MouseEvent> {\n return this.cdkRef.backdropClick;\n }\n\n /** Keydown event stream for the overlay. */\n keydownEvents(): Observable<KeyboardEvent> {\n return this.cdkRef.keydownEvents;\n }\n\n /** Updates the dialog's width/height. Pass empty string to reset a dimension. */\n updateSize(width: string | number = '', height: string | number = ''): this {\n this.cdkRef.updateSize(width, height);\n return this;\n }\n\n /** Adds CSS classes to the overlay panel. */\n addPanelClass(classes: string | string[]): this {\n this.cdkRef.addPanelClass(classes);\n return this;\n }\n\n /** Removes CSS classes from the overlay panel. */\n removePanelClass(classes: string | string[]): this {\n this.cdkRef.removePanelClass(classes);\n return this;\n }\n\n private closeWithOrigin(origin: FocusOrigin, result?: R): void {\n if (this.stateSignal() === 'closing' || this.stateSignal() === 'closed') return;\n\n const predicate = this.config.closePredicate;\n if (\n predicate &&\n !predicate(\n result,\n this.config as unknown as Parameters<typeof predicate>[1],\n this.componentInstance,\n )\n ) {\n return;\n }\n\n this.pendingResult = result;\n this.closeFocusOrigin = origin;\n this.stateSignal.set('closing');\n\n this.beforeClosedSubject.next(result);\n this.beforeClosedSubject.complete();\n\n this.cdkRef.overlayRef.detachBackdrop();\n this.containerInstance._startExitAnimation();\n }\n\n private finishClose(): void {\n if (this.stateSignal() === 'closed') return;\n this.stateSignal.set('closed');\n\n this.afterClosedSubject.next(this.pendingResult);\n this.afterClosedSubject.complete();\n\n if (this.cdkRef.containerInstance) {\n this.cdkRef.close(this.pendingResult, { focusOrigin: this.closeFocusOrigin });\n }\n\n this.componentInstance = null;\n }\n}\n","import {\n type ComponentRef,\n inject,\n Injectable,\n Injector,\n type OnDestroy,\n type Provider,\n type StaticProvider,\n type TemplateRef,\n signal,\n type Signal,\n makeEnvironmentProviders,\n type EnvironmentProviders,\n} from '@angular/core';\nimport { Dialog, DialogConfig as CdkDialogConfig } from '@angular/cdk/dialog';\nimport {\n createBlockScrollStrategy,\n createCloseScrollStrategy,\n createNoopScrollStrategy,\n createRepositionScrollStrategy,\n type ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport type { ComponentType } from '@angular/cdk/portal';\nimport { defer, type Observable, startWith, Subject } from 'rxjs';\nimport {\n TW_DIALOG_DATA,\n TW_DIALOG_DEFAULT_OPTIONS,\n TwDialogConfig,\n type TwDialogScrollStrategy,\n} from './dialog-config';\nimport { DialogContainer } from './dialog-container';\nimport { TwDialogRef } from './dialog-ref';\n\n/**\n * Opens Tailwind-styled modal dialogs. Composes `@angular/cdk/dialog` for focus\n * trapping, portals, overlay plumbing, and adds a Tailwind container, richer\n * ref API, and animation lifecycle.\n *\n * Not `providedIn: 'root'` — register it via {@link provideTwDialog}.\n */\n@Injectable()\nexport class TwDialog implements OnDestroy {\n private readonly cdkDialog = inject(Dialog);\n private readonly injector = inject(Injector);\n private readonly defaultOptions = inject(TW_DIALOG_DEFAULT_OPTIONS, { optional: true }) ?? {};\n private readonly parentDialog = inject(TwDialog, { optional: true, skipSelf: true });\n\n private readonly openDialogsAtThisLevel = signal<readonly TwDialogRef<unknown, unknown>[]>([]);\n private readonly afterOpenedSubject = new Subject<TwDialogRef<unknown, unknown>>();\n private readonly afterAllClosedSubject = new Subject<void>();\n\n /** Reactively-readable list of currently-open dialogs across the full dialog tree. */\n readonly openDialogs: Signal<readonly TwDialogRef<unknown, unknown>[]> = this.parentDialog\n ? this.parentDialog.openDialogs\n : this.openDialogsAtThisLevel.asReadonly();\n\n /** Emits every time a dialog is opened. */\n readonly afterOpened: Observable<TwDialogRef<unknown, unknown>> = this.parentDialog\n ? this.parentDialog.afterOpened\n : this.afterOpenedSubject.asObservable();\n\n /**\n * Emits when every open dialog has closed. Emits immediately on subscribe if\n * there are none open.\n */\n readonly afterAllClosed: Observable<void> = defer(() =>\n this.openDialogs().length\n ? this.getAfterAllClosedSource()\n : this.getAfterAllClosedSource().pipe(startWith(undefined as void)),\n );\n\n /**\n * Opens a dialog using the given component or template.\n * @param content Component class or `TemplateRef`.\n * @param config Options merged over the application defaults.\n * @returns Reference controlling the opened dialog.\n */\n open<R = unknown, D = unknown, C = unknown>(\n content: ComponentType<C> | TemplateRef<C>,\n config?: TwDialogConfig<D, R>,\n ): TwDialogRef<R, C> {\n const merged = this.resolveConfig<D, R>(config);\n let twRef!: TwDialogRef<R, C>;\n\n const cdkRef = this.cdkDialog.open<R, D, C>(content, {\n id: merged.id,\n role: merged.role,\n data: merged.data,\n panelClass: merged.panelClass,\n backdropClass: merged.backdropClass ?? 'tw-dialog-backdrop',\n hasBackdrop: merged.hasBackdrop,\n width: merged.width,\n height: merged.height,\n minWidth: merged.minWidth,\n minHeight: merged.minHeight,\n maxWidth: merged.maxWidth,\n maxHeight: merged.maxHeight,\n direction: merged.direction,\n ariaDescribedBy: merged.ariaDescribedBy,\n ariaLabelledBy: merged.ariaLabelledBy,\n ariaLabel: merged.ariaLabel,\n ariaModal: merged.ariaModal,\n autoFocus: merged.autoFocus,\n restoreFocus: merged.restoreFocus,\n scrollStrategy: merged.scrollStrategy ?? this.resolveScrollStrategy(merged.scrollBehavior),\n closeOnNavigation: merged.closeOnNavigation,\n viewContainerRef: merged.viewContainerRef,\n injector: merged.injector,\n // We handle close/Escape/backdrop ourselves so we can run the exit animation.\n disableClose: true,\n closeOnOverlayDetachments: false,\n container: {\n type: DialogContainer,\n providers: () => [\n { provide: TwDialogConfig, useValue: merged },\n { provide: CdkDialogConfig, useValue: merged },\n ],\n },\n providers: (_cdkRef, _cdkConfig, container) => {\n twRef = new TwDialogRef<R, C>(\n _cdkRef,\n merged as unknown as TwDialogConfig<unknown, R>,\n container as DialogContainer,\n );\n const providers: StaticProvider[] = [\n { provide: TwDialogRef, useValue: twRef },\n { provide: TW_DIALOG_DATA, useValue: merged.data ?? null },\n ];\n if (Array.isArray(merged.providers)) providers.push(...merged.providers);\n return providers;\n },\n });\n\n // After CDK attaches the component, copy references onto our ref.\n (twRef as { componentRef: ComponentRef<C> | null }).componentRef = cdkRef.componentRef;\n twRef.componentInstance = cdkRef.componentInstance as C | null;\n\n const scope = this.parentDialog ?? this;\n scope.registerOpen(twRef as unknown as TwDialogRef<unknown, unknown>);\n\n twRef.afterClosed().subscribe(() => {\n scope.unregister(twRef as unknown as TwDialogRef<unknown, unknown>);\n });\n\n return twRef;\n }\n\n /** Closes every open dialog managed by this service (and child services). */\n closeAll(): void {\n const dialogs = [...this.openDialogs()];\n for (let i = dialogs.length - 1; i >= 0; i--) dialogs[i].close();\n }\n\n /** Looks up an open dialog by its id. */\n getDialogById<R = unknown, C = unknown>(id: string): TwDialogRef<R, C> | undefined {\n return this.openDialogs().find((dialog) => dialog.id === id) as TwDialogRef<R, C> | undefined;\n }\n\n ngOnDestroy(): void {\n const dialogs = [...this.openDialogsAtThisLevel()];\n for (let i = dialogs.length - 1; i >= 0; i--) dialogs[i].close();\n this.afterOpenedSubject.complete();\n this.afterAllClosedSubject.complete();\n }\n\n private registerOpen(ref: TwDialogRef<unknown, unknown>): void {\n if (this.parentDialog) {\n this.parentDialog.registerOpen(ref);\n } else {\n this.openDialogsAtThisLevel.update((list) => [...list, ref]);\n this.afterOpenedSubject.next(ref);\n }\n }\n\n private unregister(ref: TwDialogRef<unknown, unknown>): void {\n if (this.parentDialog) {\n this.parentDialog.unregister(ref);\n } else {\n this.openDialogsAtThisLevel.update((list) => list.filter((d) => d !== ref));\n if (this.openDialogsAtThisLevel().length === 0) {\n this.afterAllClosedSubject.next();\n }\n }\n }\n\n private getAfterAllClosedSource(): Subject<void> {\n return this.parentDialog\n ? this.parentDialog.getAfterAllClosedSource()\n : this.afterAllClosedSubject;\n }\n\n private resolveConfig<D, R>(config: TwDialogConfig<D, R> | undefined): TwDialogConfig<D, R> {\n const merged = new TwDialogConfig<D, R>();\n Object.assign(merged, this.defaultOptions, config);\n return merged;\n }\n\n private resolveScrollStrategy(\n strategy: TwDialogScrollStrategy | undefined,\n ): ScrollStrategy {\n switch (strategy) {\n case 'close':\n return createCloseScrollStrategy(this.injector);\n case 'reposition':\n return createRepositionScrollStrategy(this.injector);\n case 'noop':\n return createNoopScrollStrategy();\n case 'block':\n default:\n return createBlockScrollStrategy(this.injector);\n }\n }\n}\n\n/**\n * Registers the {@link TwDialog} service for dependency injection.\n *\n * @param defaultOptions Optional defaults merged into every `open()` call.\n * @example\n * ```ts\n * provideTwDialog({ size: 'lg', hasBackdrop: true })\n * ```\n */\nexport function provideTwDialog(\n defaultOptions?: Partial<TwDialogConfig>,\n): EnvironmentProviders {\n const providers: Provider[] = [TwDialog];\n if (defaultOptions) {\n providers.push({ provide: TW_DIALOG_DEFAULT_OPTIONS, useValue: defaultOptions });\n }\n return makeEnvironmentProviders(providers);\n}\n","import {\n computed,\n Directive,\n inject,\n input,\n type OnDestroy,\n type OnInit,\n} from '@angular/core';\nimport { _IdGenerator } from '@angular/cdk/a11y';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport type { TwColor } from '@cdevhub/ngx-tw/core';\nimport { TwDialogRef } from './dialog-ref';\nimport { DialogContainer } from './dialog-container';\n\n/**\n * Header wrapper for a dialog. Provides consistent padding and spacing for\n * title + subtitle + leading icon, and separates the header from scrollable\n * content below.\n */\n@Directive({\n selector: '[twDialogHeader], tw-dialog-header',\n host: {\n class: 'flex items-start gap-3 px-6 pt-6 pb-4',\n },\n})\nexport class DialogHeaderDirective {}\n\n// Slot tokens own light/dark contrast — no `dark:` overrides, no shade picks.\n// See role slot conventions in `projects/ngx-tw/theme/_semantic.css`.\nconst ICON_COLOR_CLASSES: Record<TwColor, string> = {\n primary: 'bg-primary-soft text-primary-icon',\n secondary: 'bg-secondary-soft text-secondary-icon',\n accent: 'bg-accent-soft text-accent-icon',\n neutral: 'bg-neutral-soft text-neutral-icon',\n info: 'bg-info-soft text-info-icon',\n success: 'bg-success-soft text-success-icon',\n warning: 'bg-warning-soft text-warning-icon',\n error: 'bg-error-soft text-error-icon',\n};\n\n/**\n * Decorative leading icon for a dialog header. Use with a semantic `color` to\n * match destructive / informational / success dialogs.\n */\n@Directive({\n selector: '[twDialogIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class DialogIconDirective {\n /** Semantic color for the icon container. Defaults to a neutral surface. */\n readonly color = input<TwColor | undefined>(undefined);\n\n protected readonly classes = computed(() => {\n const base = 'flex size-10 shrink-0 items-center justify-center rounded-full';\n const color = this.color();\n return color ? `${base} ${ICON_COLOR_CLASSES[color]}` : `${base} bg-surface-muted text-fg`;\n });\n}\n\n/**\n * Dialog title. Registers its ID with the container's `aria-labelledby` queue\n * so screen readers announce it automatically.\n */\n@Directive({\n selector: '[twDialogTitle], tw-dialog-title',\n host: {\n class: 'text-sm font-semibold text-fg',\n '[id]': 'id()',\n },\n})\nexport class DialogTitleDirective implements OnInit, OnDestroy {\n private readonly generatedId = inject(_IdGenerator).getId('tw-dialog-title-');\n private readonly dialogRef = inject<TwDialogRef<unknown, unknown>>(TwDialogRef, {\n optional: true,\n });\n // Ancestor-DI fallback for the rare case where `TwDialogRef` is not in the\n // directive's injector chain (e.g. heavily nested template portals). The\n // container ALWAYS resolves via element-injector traversal because the\n // directive lives inside `<tw-dialog-container>`'s DOM tree.\n private readonly container = inject(DialogContainer, { optional: true, skipSelf: true });\n\n /** Custom id for the title element. Defaults to a generated unique id. */\n readonly id = input<string>(this.generatedId);\n\n ngOnInit(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._addAriaLabelledBy(this.id());\n }\n\n ngOnDestroy(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._removeAriaLabelledBy(this.id());\n }\n}\n\n/** Secondary line beneath the dialog title — intended for a short description. */\n@Directive({\n selector: '[twDialogSubtitle], tw-dialog-subtitle',\n host: {\n class: 'text-sm text-fg-muted',\n },\n})\nexport class DialogSubtitleDirective {}\n\n/**\n * Dialog description. Registers its ID with the container's `aria-describedby`\n * queue so screen readers announce the descriptive paragraph after the title.\n * Mirrors {@link DialogTitleDirective} but for `aria-describedby`.\n */\n@Directive({\n selector: '[twDialogDescription], tw-dialog-description',\n host: {\n '[id]': 'id()',\n },\n})\nexport class DialogDescriptionDirective implements OnInit, OnDestroy {\n private readonly generatedId = inject(_IdGenerator).getId('tw-dialog-description-');\n private readonly dialogRef = inject<TwDialogRef<unknown, unknown>>(TwDialogRef, {\n optional: true,\n });\n // Ancestor-DI fallback — see DialogTitleDirective.\n private readonly container = inject(DialogContainer, { optional: true, skipSelf: true });\n\n /** Custom id for the description element. Defaults to a generated unique id. */\n readonly id = input<string>(this.generatedId);\n\n ngOnInit(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._addAriaDescribedBy(this.id());\n }\n\n ngOnDestroy(): void {\n const containerInstance = this.dialogRef?.containerInstance ?? this.container;\n if (containerInstance) containerInstance._removeAriaDescribedBy(this.id());\n }\n}\n\n/**\n * Scrollable content region of the dialog. Apply between the header and the\n * actions bar. Inherits CDK's `CdkScrollable` to play nicely with scroll\n * strategies and nested scrollables.\n */\n@Directive({\n selector: '[twDialogContent], tw-dialog-content',\n hostDirectives: [CdkScrollable],\n host: {\n class: 'flex-1 overflow-y-auto px-6 py-4 text-sm text-fg',\n },\n})\nexport class DialogContentDirective {}\n\n/** Horizontal alignment for dialog action buttons. */\nexport type DialogActionsAlign = 'start' | 'center' | 'end';\n\n/**\n * Bottom action bar of a dialog. Use inside the dialog content or template to\n * host Cancel/Confirm buttons. Stays pinned below scrollable content.\n */\n@Directive({\n selector: '[twDialogActions], tw-dialog-actions',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class DialogActionsDirective {\n /** Horizontal alignment of the action buttons. Defaults to `'end'`. */\n readonly align = input<DialogActionsAlign>('end');\n\n protected readonly classes = computed(() => {\n const align = this.align();\n const justify =\n align === 'start' ? 'justify-start' : align === 'center' ? 'justify-center' : 'justify-end';\n return `flex flex-wrap items-center gap-2 px-6 py-4 border-t border-border-muted ${justify}`;\n });\n}\n\n/**\n * Closes the enclosing dialog when the host button is clicked. Provide a\n * `[twDialogClose]` value to pass a result to `afterClosed()` subscribers.\n */\n@Directive({\n selector: '[twDialogClose]',\n host: {\n '(click)': 'onClick()',\n '[attr.type]': 'type()',\n },\n})\nexport class DialogCloseDirective {\n /** Value passed to `afterClosed()` when the button is clicked. */\n readonly twDialogClose = input<unknown>(undefined);\n\n /** Native button `type`. Defaults to `'button'` to avoid accidental form submission. */\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n\n private readonly dialogRef = inject<TwDialogRef<unknown, unknown>>(TwDialogRef, {\n optional: true,\n });\n\n protected onClick(): void {\n this.dialogRef?.close(this.twDialogClose());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CdkDialogConfig"],"mappings":";;;;;;;;;;;;;AAuBA;;;;;AAKG;AACG,MAAO,cAAyC,SAAQA,YAAqB,CAAA;;IAEjF,IAAI,GAAkB,IAAI;;IAG1B,sBAAsB,GAAY,GAAG;AAErC;;;;AAIG;IACH,qBAAqB,GAAY,GAAG;;IAGpC,cAAc,GAA4B,OAAO;;IAGxC,QAAQ,GAAqB,oBAAoB;AAE1D;;;;;AAKG;IACM,SAAS,GAAa,IAAI;;IAG1B,YAAY,GAAa,KAAK;;IAG9B,SAAS,GAAuB,gBAAgB;;IAGhD,YAAY,GAA0B,IAAI;;IAG1C,WAAW,GAAa,IAAI;;IAG5B,iBAAiB,GAAa,IAAI;AAC5C;AAED;MACa,cAAc,GAAG,IAAI,cAAc,CAAU,gBAAgB;AAE1E;MACa,yBAAyB,GAAG,IAAI,cAAc,CACzD,2BAA2B;;ACnD7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAuB,GAAG,EAAE,CAChC;AACE,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EAAE,yUAAyU;AAChV,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE;AAC5C,YAAA,EAAE,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE;AAC5C,YAAA,EAAE,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE;AAC5C,YAAA,EAAE,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE;AAC7C,YAAA,EAAE,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE;AAC7C,YAAA,UAAU,EAAE;AACV,gBAAA,IAAI,EAAE,+DAA+D;AACtE,aAAA;AACF,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AAChC,CAAA,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;AAED;;;;;;;;;;AAUG;AAqBG,MAAO,eAAgB,SAAQ,kBAAkC,CAAA;AACpD,IAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;;AAGzD,IAAA,KAAK,GAAwB,IAAI,CAAC,WAAW,CAAC,KAAK;;AAGnD,IAAA,qBAAqB,GAC5B,IAAI,CAAC,WAAW,CAAC,qBAAqB;;AAG/B,IAAA,sBAAsB;;AAEtB,IAAA,qBAAqB;AAEb,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI;AACtC,QAAA,OAAO,uBAAuB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;oFAAC;IAEiB,WAAW,GAAG,QAAQ,CAAC,MACxC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;oFAC3E;IAEkB,mBAAmB,GAAG,QAAQ,CAC/C,MACE,IAAI,CAAC,OAAO,CAAC,eAAe;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI;4FACP;AAEkB,IAAA,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB;AAE3E,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,sBAAsB,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC;AAC7F,QAAA,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC;AAC3F,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,qBAAqB,CAAC;IACxF;IAEmB,gBAAgB,GAAA;QACjC,KAAK,CAAC,gBAAgB,EAAE;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;IACxC;;IAGA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;IACvC;;AAGA,IAAA,mBAAmB,CAAC,EAAU,EAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACzC;;AAGA,IAAA,sBAAsB,CAAC,EAAU,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC;IAC5C;uGA1DW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,4fAdf,CAAC,2BAA2B,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJ9B,iCAAiC,4DAGjC,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAed,eAAe,EAAA,UAAA,EAAA,CAAA;kBApB3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,QAAQ,EAAE,iCAAiC;oBAC3C,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,OAAO,EAAE,CAAC,eAAe,CAAC;oBAC1B,SAAS,EAAE,CAAC,2BAA2B,CAAC;AACxC,oBAAA,IAAI,EAAE;AACJ,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,WAAW,EAAE,oBAAoB;AACjC,wBAAA,aAAa,EAAE,cAAc;AAC7B,wBAAA,mBAAmB,EAAE,mBAAmB;AACxC,wBAAA,wBAAwB,EAAE,oDAAoD;AAC9E,wBAAA,mBAAmB,EAAE,mBAAmB;AACxC,wBAAA,yBAAyB,EAAE,uBAAuB;AAClD,wBAAA,mBAAmB,EAAE,SAAS;AAC9B,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,gCAAgC,EAAE,sBAAsB;AACzD,qBAAA;AACF,iBAAA;;;ACjFD;;;AAGG;MACU,WAAW,CAAA;AAyBH,IAAA,MAAA;AACR,IAAA,MAAA;AACA,IAAA,iBAAA;;AAzBF,IAAA,EAAE;;IAGX,iBAAiB,GAAa,IAAI;;IAGzB,YAAY,GAA2B,IAAI;;AAG3C,IAAA,KAAK;;AAGd,IAAA,YAAY;IAEK,WAAW,GAAG,MAAM,CAAc,SAAS;oFAAC;AAC5C,IAAA,kBAAkB,GAAG,IAAI,aAAa,CAAO,CAAC,CAAC;AAC/C,IAAA,mBAAmB,GAAG,IAAI,aAAa,CAAgB,CAAC,CAAC;AACzD,IAAA,kBAAkB,GAAG,IAAI,aAAa,CAAgB,CAAC,CAAC;AAEjE,IAAA,aAAa;AACb,IAAA,gBAAgB;AAExB,IAAA,WAAA,CACmB,MAA0B,EAClC,MAAkC,EAClC,iBAAkC,EAAA;QAF1B,IAAA,CAAA,MAAM,GAAN,MAAM;QACd,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;AAE1B,QAAA,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAE1C,QAAA,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC;AAEvC,QAAA,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,qBAAqB;QAEhE;AACG,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,EACzC,IAAI,CAAC,CAAC,CAAC;aAER,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AAC5B,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;AAC9B,YAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;AACpC,QAAA,CAAC,CAAC;;;;QAKJ;AACG,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,EAC3C,IAAI,CAAC,CAAC,CAAC;aAER,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEtC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAK;AAC7C,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;gBACnC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AACjD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;gBACnC,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,KAAK,CACH,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,aAAa,CAAC,IAAI,CACvB,MAAM,CACJ,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CACpF,CACF,CACF,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;YACpB,IAAI,IAAI,CAAC,YAAY;gBAAE;YACvB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AACvE,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,KAAK,CAAC,MAAU,EAAA;AACd,QAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC;IACzC;;IAGA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;IAC/C;;IAGA,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;IAChD;;IAGA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;IAC/C;;IAGA,aAAa,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa;IAClC;;IAGA,aAAa,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa;IAClC;;AAGA,IAAA,UAAU,CAAC,KAAA,GAAyB,EAAE,EAAE,SAA0B,EAAE,EAAA;QAClE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC;AACrC,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,aAAa,CAAC,OAA0B,EAAA;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;AAClC,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,gBAAgB,CAAC,OAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACrC,QAAA,OAAO,IAAI;IACb;IAEQ,eAAe,CAAC,MAAmB,EAAE,MAAU,EAAA;AACrD,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ;YAAE;AAEzE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;AAC5C,QAAA,IACE,SAAS;AACT,YAAA,CAAC,SAAS,CACR,MAAM,EACN,IAAI,CAAC,MAAoD,EACzD,IAAI,CAAC,iBAAiB,CACvB,EACD;YACA;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM;AAC3B,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAE/B,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;AACrC,QAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;AAEnC,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE;AACvC,QAAA,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE;IAC9C;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ;YAAE;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAE9B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAChD,QAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;AACjC,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC/E;AAEA,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAC/B;AACD;;ACrJD;;;;;;AAMG;MAEU,QAAQ,CAAA;AACF,IAAA,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;AAC1B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,cAAc,GAAG,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;AAC5E,IAAA,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEnE,sBAAsB,GAAG,MAAM,CAA2C,EAAE;+FAAC;AAC7E,IAAA,kBAAkB,GAAG,IAAI,OAAO,EAAiC;AACjE,IAAA,qBAAqB,GAAG,IAAI,OAAO,EAAQ;;IAGnD,WAAW,GAAqD,IAAI,CAAC;AAC5E,UAAE,IAAI,CAAC,YAAY,CAAC;AACpB,UAAE,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE;;IAGnC,WAAW,GAA8C,IAAI,CAAC;AACrE,UAAE,IAAI,CAAC,YAAY,CAAC;AACpB,UAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;AAE1C;;;AAGG;IACM,cAAc,GAAqB,KAAK,CAAC,MAChD,IAAI,CAAC,WAAW,EAAE,CAAC;AACjB,UAAE,IAAI,CAAC,uBAAuB;AAC9B,UAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAiB,CAAC,CAAC,CACtE;AAED;;;;;AAKG;IACH,IAAI,CACF,OAA0C,EAC1C,MAA6B,EAAA;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAO,MAAM,CAAC;AAC/C,QAAA,IAAI,KAAyB;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAU,OAAO,EAAE;YACnD,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;AAC7B,YAAA,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,oBAAoB;YAC3D,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;AACjC,YAAA,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,cAAc,CAAC;YAC1F,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;;AAEzB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,yBAAyB,EAAE,KAAK;AAChC,YAAA,SAAS,EAAE;AACT,gBAAA,IAAI,EAAE,eAAe;gBACrB,SAAS,EAAE,MAAM;AACf,oBAAA,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC7C,oBAAA,EAAE,OAAO,EAAEA,YAAe,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC/C,iBAAA;AACF,aAAA;YACD,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,KAAI;gBAC5C,KAAK,GAAG,IAAI,WAAW,CACrB,OAAO,EACP,MAA+C,EAC/C,SAA4B,CAC7B;AACD,gBAAA,MAAM,SAAS,GAAqB;AAClC,oBAAA,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE;oBACzC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE;iBAC3D;AACD,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;AACxE,gBAAA,OAAO,SAAS;YAClB,CAAC;AACF,SAAA,CAAC;;AAGD,QAAA,KAAkD,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACtF,QAAA,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAA6B;AAE9D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI;AACvC,QAAA,KAAK,CAAC,YAAY,CAAC,KAAiD,CAAC;AAErE,QAAA,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAK;AACjC,YAAA,KAAK,CAAC,UAAU,CAAC,KAAiD,CAAC;AACrE,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;;IAGA,QAAQ,GAAA;QACN,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAAE,YAAA,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;IAClE;;AAGA,IAAA,aAAa,CAA2B,EAAU,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE,CAAkC;IAC/F;IAEA,WAAW,GAAA;QACT,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAClD,QAAA,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAAE,YAAA,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAChE,QAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;AAClC,QAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;IACvC;AAEQ,IAAA,YAAY,CAAC,GAAkC,EAAA;AACrD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC;QACrC;aAAO;AACL,YAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;QACnC;IACF;AAEQ,IAAA,UAAU,CAAC,GAAkC,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QACnC;aAAO;YACL,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3E,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9C,gBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;YACnC;QACF;IACF;IAEQ,uBAAuB,GAAA;QAC7B,OAAO,IAAI,CAAC;AACV,cAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB;AAC3C,cAAE,IAAI,CAAC,qBAAqB;IAChC;AAEQ,IAAA,aAAa,CAAO,MAAwC,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,cAAc,EAAQ;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;AAClD,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,qBAAqB,CAC3B,QAA4C,EAAA;QAE5C,QAAQ,QAAQ;AACd,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjD,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtD,YAAA,KAAK,MAAM;gBACT,OAAO,wBAAwB,EAAE;AACnC,YAAA,KAAK,OAAO;AACZ,YAAA;AACE,gBAAA,OAAO,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAErD;uGA1KW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAR,QAAQ,EAAA,CAAA;;2FAAR,QAAQ,EAAA,UAAA,EAAA,CAAA;kBADpB;;AA8KD;;;;;;;;AAQG;AACG,SAAU,eAAe,CAC7B,cAAwC,EAAA;AAExC,IAAA,MAAM,SAAS,GAAe,CAAC,QAAQ,CAAC;IACxC,IAAI,cAAc,EAAE;AAClB,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAClF;AACA,IAAA,OAAO,wBAAwB,CAAC,SAAS,CAAC;AAC5C;;ACzNA;;;;AAIG;MAOU,qBAAqB,CAAA;uGAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,uCAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oCAAoC;AAC9C,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,uCAAuC;AAC/C,qBAAA;AACF,iBAAA;;AAGD;AACA;AACA,MAAM,kBAAkB,GAA4B;AAClD,IAAA,OAAO,EAAE,mCAAmC;AAC5C,IAAA,SAAS,EAAE,uCAAuC;AAClD,IAAA,MAAM,EAAE,iCAAiC;AACzC,IAAA,OAAO,EAAE,mCAAmC;AAC5C,IAAA,IAAI,EAAE,6BAA6B;AACnC,IAAA,OAAO,EAAE,mCAAmC;AAC5C,IAAA,OAAO,EAAE,mCAAmC;AAC5C,IAAA,KAAK,EAAE,+BAA+B;CACvC;AAED;;;AAGG;MAOU,mBAAmB,CAAA;;IAErB,KAAK,GAAG,KAAK,CAAsB,SAAS;8EAAC;AAEnC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,IAAI,GAAG,gEAAgE;AAC7E,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,OAAO,KAAK,GAAG,CAAA,EAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,GAAG,CAAA,EAAG,IAAI,2BAA2B;IAC5F,CAAC;gFAAC;uGARS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,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,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;AAYD;;;AAGG;MAQU,oBAAoB,CAAA;IACd,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC5D,IAAA,SAAS,GAAG,MAAM,CAAgC,WAAW,EAAE;AAC9E,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;;;;;AAKe,IAAA,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG/E,IAAA,EAAE,GAAG,KAAK,CAAS,IAAI,CAAC,WAAW;2EAAC;IAE7C,QAAQ,GAAA;QACN,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS;AAC7E,QAAA,IAAI,iBAAiB;YAAE,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACxE;IAEA,WAAW,GAAA;QACT,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS;AAC7E,QAAA,IAAI,iBAAiB;YAAE,iBAAiB,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3E;uGAtBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,+BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kCAAkC;AAC5C,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,+BAA+B;AACtC,wBAAA,MAAM,EAAE,MAAM;AACf,qBAAA;AACF,iBAAA;;AA0BD;MAOa,uBAAuB,CAAA;uGAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wCAAwC;AAClD,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,uBAAuB;AAC/B,qBAAA;AACF,iBAAA;;AAGD;;;;AAIG;MAOU,0BAA0B,CAAA;IACpB,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAClE,IAAA,SAAS,GAAG,MAAM,CAAgC,WAAW,EAAE;AAC9E,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;;AAEe,IAAA,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG/E,IAAA,EAAE,GAAG,KAAK,CAAS,IAAI,CAAC,WAAW;2EAAC;IAE7C,QAAQ,GAAA;QACN,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS;AAC7E,QAAA,IAAI,iBAAiB;YAAE,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACzE;IAEA,WAAW,GAAA;QACT,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS;AAC7E,QAAA,IAAI,iBAAiB;YAAE,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC5E;uGAnBW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBANtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8CAA8C;AACxD,oBAAA,IAAI,EAAE;AACJ,wBAAA,MAAM,EAAE,MAAM;AACf,qBAAA;AACF,iBAAA;;AAuBD;;;;AAIG;MAQU,sBAAsB,CAAA;uGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,kDAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,aAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sCAAsC;oBAChD,cAAc,EAAE,CAAC,aAAa,CAAC;AAC/B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,kDAAkD;AAC1D,qBAAA;AACF,iBAAA;;AAMD;;;AAGG;MAOU,sBAAsB,CAAA;;IAExB,KAAK,GAAG,KAAK,CAAqB,KAAK;8EAAC;AAE9B,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,MAAM,OAAO,GACX,KAAK,KAAK,OAAO,GAAG,eAAe,GAAG,KAAK,KAAK,QAAQ,GAAG,gBAAgB,GAAG,aAAa;QAC7F,OAAO,CAAA,yEAAA,EAA4E,OAAO,CAAA,CAAE;IAC9F,CAAC;gFAAC;uGATS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,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,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sCAAsC;AAChD,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;AAaD;;;AAGG;MAQU,oBAAoB,CAAA;;IAEtB,aAAa,GAAG,KAAK,CAAU,SAAS;sFAAC;;IAGzC,IAAI,GAAG,KAAK,CAAgC,QAAQ;6EAAC;AAE7C,IAAA,SAAS,GAAG,MAAM,CAAgC,WAAW,EAAE;AAC9E,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IAEQ,OAAO,GAAA;QACf,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7C;uGAbW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,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,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,aAAa,EAAE,QAAQ;AACxB,qBAAA;AACF,iBAAA;;;AC5LD;;AAEG;;;;"}