@frame-ui-ng/components 0.3.0-beta.0 → 0.4.1

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 (172) hide show
  1. package/button/src/styles/button.css +5 -1
  2. package/button-group/src/styles/button-group.css +6 -0
  3. package/confirm-popover/src/styles/confirm-popover.css +20 -0
  4. package/drag-drop/src/styles/_vars.css +28 -0
  5. package/drag-drop/src/styles/drag-drop.css +132 -0
  6. package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
  7. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  8. package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
  9. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  10. package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
  11. package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
  12. package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
  13. package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
  14. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
  15. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  16. package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
  17. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
  19. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
  21. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
  23. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
  25. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
  27. package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
  29. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-combobox.mjs +113 -68
  31. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
  33. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +165 -0
  35. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -0
  36. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
  37. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
  38. package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
  39. package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
  41. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  42. package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
  43. package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
  44. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +74 -37
  45. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
  47. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
  49. package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
  51. package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
  53. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-input-otp.mjs +69 -69
  55. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
  57. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
  59. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
  61. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-modal.mjs +221 -129
  63. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
  65. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-pagination.mjs +45 -36
  67. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
  69. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-progress.mjs +4 -1
  71. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
  73. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-resizable.mjs +22 -26
  75. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
  77. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
  79. package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components-sheet.mjs +118 -104
  81. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  82. package/fesm2022/frame-ui-ng-components-sidebar.mjs +45 -24
  83. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  84. package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
  85. package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
  86. package/fesm2022/frame-ui-ng-components-slider.mjs +82 -75
  87. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  88. package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
  89. package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
  90. package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
  91. package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
  92. package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
  93. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  94. package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
  95. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  96. package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
  97. package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
  98. package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
  99. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  100. package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
  101. package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
  102. package/fesm2022/frame-ui-ng-components-tooltip.mjs +74 -25
  103. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  104. package/fesm2022/frame-ui-ng-components-utils.mjs +20 -0
  105. package/fesm2022/frame-ui-ng-components-utils.mjs.map +1 -0
  106. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +36 -20
  107. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  108. package/fesm2022/frame-ui-ng-components.mjs +1737 -845
  109. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  110. package/item/src/styles/item.css +188 -187
  111. package/modal/src/styles/modal.css +10 -1
  112. package/package.json +18 -2
  113. package/popover/src/styles/popover.css +106 -101
  114. package/sidebar/src/styles/sidebar.css +10 -4
  115. package/src/styles/blueprint.css +98 -0
  116. package/src/styles/components.css +2 -0
  117. package/styles/blueprint.css +98 -0
  118. package/styles/components.css +2 -0
  119. package/styles.css +2 -0
  120. package/tooltip/src/styles/tooltip.css +4 -4
  121. package/types/frame-ui-ng-components-accordion.d.ts +11 -4
  122. package/types/frame-ui-ng-components-alert.d.ts +4 -0
  123. package/types/frame-ui-ng-components-avatar.d.ts +7 -0
  124. package/types/frame-ui-ng-components-badge.d.ts +4 -0
  125. package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
  126. package/types/frame-ui-ng-components-button-group.d.ts +1 -0
  127. package/types/frame-ui-ng-components-button.d.ts +5 -0
  128. package/types/frame-ui-ng-components-calendar.d.ts +1 -0
  129. package/types/frame-ui-ng-components-card.d.ts +8 -3
  130. package/types/frame-ui-ng-components-carousel.d.ts +11 -2
  131. package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
  132. package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
  133. package/types/frame-ui-ng-components-combobox.d.ts +33 -4
  134. package/types/frame-ui-ng-components-command.d.ts +26 -4
  135. package/types/frame-ui-ng-components-confirm-modal.d.ts +50 -0
  136. package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
  137. package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
  138. package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
  139. package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
  140. package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
  141. package/types/frame-ui-ng-components-empty.d.ts +6 -0
  142. package/types/frame-ui-ng-components-field.d.ts +9 -0
  143. package/types/frame-ui-ng-components-forms.d.ts +1 -0
  144. package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
  145. package/types/frame-ui-ng-components-input-otp.d.ts +5 -1
  146. package/types/frame-ui-ng-components-input.d.ts +13 -0
  147. package/types/frame-ui-ng-components-item.d.ts +10 -0
  148. package/types/frame-ui-ng-components-menubar.d.ts +15 -0
  149. package/types/frame-ui-ng-components-modal.d.ts +30 -7
  150. package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
  151. package/types/frame-ui-ng-components-pagination.d.ts +8 -0
  152. package/types/frame-ui-ng-components-popover.d.ts +14 -2
  153. package/types/frame-ui-ng-components-progress.d.ts +2 -0
  154. package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
  155. package/types/frame-ui-ng-components-resizable.d.ts +3 -0
  156. package/types/frame-ui-ng-components-select.d.ts +23 -2
  157. package/types/frame-ui-ng-components-separator.d.ts +1 -0
  158. package/types/frame-ui-ng-components-sheet.d.ts +13 -0
  159. package/types/frame-ui-ng-components-sidebar.d.ts +23 -2
  160. package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
  161. package/types/frame-ui-ng-components-slider.d.ts +5 -2
  162. package/types/frame-ui-ng-components-spinner.d.ts +1 -0
  163. package/types/frame-ui-ng-components-switch.d.ts +6 -0
  164. package/types/frame-ui-ng-components-table.d.ts +26 -0
  165. package/types/frame-ui-ng-components-tabs.d.ts +4 -0
  166. package/types/frame-ui-ng-components-textarea.d.ts +1 -0
  167. package/types/frame-ui-ng-components-toast.d.ts +2 -0
  168. package/types/frame-ui-ng-components-toggle.d.ts +8 -2
  169. package/types/frame-ui-ng-components-tooltip.d.ts +11 -2
  170. package/types/frame-ui-ng-components-utils.d.ts +5 -0
  171. package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
  172. package/types/frame-ui-ng-components.d.ts +525 -96
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, Renderer2, input, effect, RendererStyleFlags2, Directive, NgModule } from '@angular/core';
2
+ import { input, computed, Directive, NgModule } from '@angular/core';
3
3
 
4
4
  const FR_CARD_SIZES = ['default', 'sm'];
5
5
  const FR_CARD_SPACINGS = ['sm', 'md', 'lg', 'xl'];
@@ -10,23 +10,16 @@ const FR_CARD_SPACING_VALUES = {
10
10
  lg: '1.25rem',
11
11
  xl: '2rem',
12
12
  };
13
+ /** Card container with size and spacing controls. */
13
14
  class FrCard {
14
- elementRef = inject(ElementRef);
15
- renderer = inject(Renderer2);
16
15
  size = input('default', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
17
16
  spacing = input(null, ...(ngDevMode ? [{ debugName: "spacing" }] : /* istanbul ignore next */ []));
18
- constructor() {
19
- effect(() => {
20
- const spacing = this.spacing();
21
- if (!spacing) {
22
- this.renderer.removeStyle(this.elementRef.nativeElement, '--frame-card-spacing', RendererStyleFlags2.DashCase);
23
- return;
24
- }
25
- this.renderer.setStyle(this.elementRef.nativeElement, '--frame-card-spacing', FR_CARD_SPACING_VALUES[spacing], RendererStyleFlags2.DashCase);
26
- });
27
- }
17
+ spacingValue = computed(() => {
18
+ const spacing = this.spacing();
19
+ return spacing ? FR_CARD_SPACING_VALUES[spacing] : null;
20
+ }, ...(ngDevMode ? [{ debugName: "spacingValue" }] : /* istanbul ignore next */ []));
28
21
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCard, deps: [], target: i0.ɵɵFactoryTarget.Directive });
29
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCard, isStandalone: true, selector: "[frCard], frame-card", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-spacing": "spacing()" }, classAttribute: "frame-card" }, ngImport: i0 });
22
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCard, isStandalone: true, selector: "[frCard], frame-card", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-spacing": "spacing()", "style.--frame-card-spacing": "spacingValue()" }, classAttribute: "frame-card" }, ngImport: i0 });
30
23
  }
31
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCard, decorators: [{
32
25
  type: Directive,
@@ -36,9 +29,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
36
29
  class: 'frame-card',
37
30
  '[attr.data-size]': 'size()',
38
31
  '[attr.data-spacing]': 'spacing()',
32
+ '[style.--frame-card-spacing]': 'spacingValue()',
39
33
  },
40
34
  }]
41
- }], ctorParameters: () => [], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }] } });
35
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }] } });
36
+ /** Header slot for card. */
42
37
  class FrCardHeader {
43
38
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
44
39
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardHeader, isStandalone: true, selector: "[frCardHeader]", host: { classAttribute: "frame-card__header" }, ngImport: i0 });
@@ -52,6 +47,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
52
47
  },
53
48
  }]
54
49
  }] });
50
+ /** Title slot for card. */
55
51
  class FrCardTitle {
56
52
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
57
53
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardTitle, isStandalone: true, selector: "[frCardTitle]", host: { classAttribute: "frame-card__title" }, ngImport: i0 });
@@ -65,6 +61,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
65
61
  },
66
62
  }]
67
63
  }] });
64
+ /** Description slot for card. */
68
65
  class FrCardDescription {
69
66
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
70
67
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardDescription, isStandalone: true, selector: "[frCardDescription]", host: { classAttribute: "frame-card__description" }, ngImport: i0 });
@@ -78,6 +75,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
78
75
  },
79
76
  }]
80
77
  }] });
78
+ /** Action slot for card. */
81
79
  class FrCardAction {
82
80
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
83
81
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardAction, isStandalone: true, selector: "[frCardAction]", host: { classAttribute: "frame-card__action" }, ngImport: i0 });
@@ -91,6 +89,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
91
89
  },
92
90
  }]
93
91
  }] });
92
+ /** Content slot for card. */
94
93
  class FrCardContent {
95
94
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
96
95
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCardContent, isStandalone: true, selector: "[frCardContent]", host: { classAttribute: "frame-card__content" }, ngImport: i0 });
@@ -104,6 +103,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
104
103
  },
105
104
  }]
106
105
  }] });
106
+ /** Footer slot for card. */
107
107
  class FrCardFooter {
108
108
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
109
109
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCardFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-card.mjs","sources":["../../../projects/components/card/src/card.ts","../../../projects/components/card/card.module.ts","../../../projects/components/card/frame-ui-ng-components-card.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n Renderer2,\n RendererStyleFlags2,\n effect,\n inject,\n input,\n} from '@angular/core';\n\nexport const FR_CARD_SIZES = ['default', 'sm'] as const;\nexport const FR_CARD_SPACINGS = ['sm', 'md', 'lg', 'xl'] as const;\nexport const FR_CARD_FOOTER_ALIGNS = ['start', 'end', 'between'] as const;\n\nexport type FrCardSize = (typeof FR_CARD_SIZES)[number];\nexport type FrCardSpacing = (typeof FR_CARD_SPACINGS)[number];\nexport type FrCardFooterAlign = (typeof FR_CARD_FOOTER_ALIGNS)[number];\n\nconst FR_CARD_SPACING_VALUES: Record<FrCardSpacing, string> = {\n sm: '0.75rem',\n md: '1rem',\n lg: '1.25rem',\n xl: '2rem',\n};\n\n@Directive({\n selector: '[frCard], frame-card',\n host: {\n class: 'frame-card',\n '[attr.data-size]': 'size()',\n '[attr.data-spacing]': 'spacing()',\n },\n})\nexport class FrCard {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n readonly size = input<FrCardSize>('default');\n readonly spacing = input<FrCardSpacing | null>(null);\n\n constructor() {\n effect(() => {\n const spacing = this.spacing();\n if (!spacing) {\n this.renderer.removeStyle(\n this.elementRef.nativeElement,\n '--frame-card-spacing',\n RendererStyleFlags2.DashCase,\n );\n return;\n }\n\n this.renderer.setStyle(\n this.elementRef.nativeElement,\n '--frame-card-spacing',\n FR_CARD_SPACING_VALUES[spacing],\n RendererStyleFlags2.DashCase,\n );\n });\n }\n}\n\n@Directive({\n selector: '[frCardHeader]',\n host: {\n class: 'frame-card__header',\n },\n})\nexport class FrCardHeader {}\n\n@Directive({\n selector: '[frCardTitle]',\n host: {\n class: 'frame-card__title',\n },\n})\nexport class FrCardTitle {}\n\n@Directive({\n selector: '[frCardDescription]',\n host: {\n class: 'frame-card__description',\n },\n})\nexport class FrCardDescription {}\n\n@Directive({\n selector: '[frCardAction]',\n host: {\n class: 'frame-card__action',\n },\n})\nexport class FrCardAction {}\n\n@Directive({\n selector: '[frCardContent]',\n host: {\n class: 'frame-card__content',\n },\n})\nexport class FrCardContent {}\n\n@Directive({\n selector: '[frCardFooter]',\n host: {\n class: 'frame-card__footer',\n '[attr.data-align]': 'align()',\n },\n})\nexport class FrCardFooter {\n readonly align = input<FrCardFooterAlign>('start');\n}\n","import { NgModule } from '@angular/core';\nimport {\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n} from './src/card';\n\n@NgModule({\n imports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n exports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n})\nexport class FrCardModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-ui-ng-components-card.mjs","sources":["../../../projects/components/card/src/card.ts","../../../projects/components/card/card.module.ts","../../../projects/components/card/frame-ui-ng-components-card.ts"],"sourcesContent":["import { Directive, computed, input } from '@angular/core';\r\n\r\nexport const FR_CARD_SIZES = ['default', 'sm'] as const;\r\nexport const FR_CARD_SPACINGS = ['sm', 'md', 'lg', 'xl'] as const;\r\nexport const FR_CARD_FOOTER_ALIGNS = ['start', 'end', 'between'] as const;\r\n\r\nexport type FrCardSize = (typeof FR_CARD_SIZES)[number];\r\nexport type FrCardSpacing = (typeof FR_CARD_SPACINGS)[number];\r\nexport type FrCardFooterAlign = (typeof FR_CARD_FOOTER_ALIGNS)[number];\r\n\r\nconst FR_CARD_SPACING_VALUES: Record<FrCardSpacing, string> = {\r\n sm: '0.75rem',\r\n md: '1rem',\r\n lg: '1.25rem',\r\n xl: '2rem',\r\n};\r\n\r\n/** Card container with size and spacing controls. */\r\n@Directive({\r\n selector: '[frCard], frame-card',\r\n host: {\r\n class: 'frame-card',\r\n '[attr.data-size]': 'size()',\r\n '[attr.data-spacing]': 'spacing()',\r\n '[style.--frame-card-spacing]': 'spacingValue()',\r\n },\r\n})\r\nexport class FrCard {\r\n readonly size = input<FrCardSize>('default');\r\n readonly spacing = input<FrCardSpacing | null>(null);\r\n protected readonly spacingValue = computed(() => {\r\n const spacing = this.spacing();\r\n return spacing ? FR_CARD_SPACING_VALUES[spacing] : null;\r\n });\r\n}\r\n\r\n/** Header slot for card. */\r\n@Directive({\r\n selector: '[frCardHeader]',\r\n host: {\r\n class: 'frame-card__header',\r\n },\r\n})\r\nexport class FrCardHeader {}\r\n\r\n/** Title slot for card. */\r\n@Directive({\r\n selector: '[frCardTitle]',\r\n host: {\r\n class: 'frame-card__title',\r\n },\r\n})\r\nexport class FrCardTitle {}\r\n\r\n/** Description slot for card. */\r\n@Directive({\r\n selector: '[frCardDescription]',\r\n host: {\r\n class: 'frame-card__description',\r\n },\r\n})\r\nexport class FrCardDescription {}\r\n\r\n/** Action slot for card. */\r\n@Directive({\r\n selector: '[frCardAction]',\r\n host: {\r\n class: 'frame-card__action',\r\n },\r\n})\r\nexport class FrCardAction {}\r\n\r\n/** Content slot for card. */\r\n@Directive({\r\n selector: '[frCardContent]',\r\n host: {\r\n class: 'frame-card__content',\r\n },\r\n})\r\nexport class FrCardContent {}\r\n\r\n/** Footer slot for card. */\r\n@Directive({\r\n selector: '[frCardFooter]',\r\n host: {\r\n class: 'frame-card__footer',\r\n '[attr.data-align]': 'align()',\r\n },\r\n})\r\nexport class FrCardFooter {\r\n readonly align = input<FrCardFooterAlign>('start');\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n} from './src/card';\n\n@NgModule({\n imports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n exports: [\n FrCard,\n FrCardAction,\n FrCardContent,\n FrCardDescription,\n FrCardFooter,\n FrCardHeader,\n FrCardTitle,\n ],\n})\nexport class FrCardModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAEa,aAAa,GAAG,CAAC,SAAS,EAAE,IAAI;AACtC,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;AAChD,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS;AAM/D,MAAM,sBAAsB,GAAkC;AAC5D,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,EAAE,EAAE,MAAM;CACX;AAED;MAUa,MAAM,CAAA;AACR,IAAA,IAAI,GAAG,KAAK,CAAa,SAAS,2EAAC;AACnC,IAAA,OAAO,GAAG,KAAK,CAAuB,IAAI,8EAAC;AACjC,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,IAAI;AACzD,IAAA,CAAC,mFAAC;wGANS,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,4BAAA,EAAA,gBAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAN,MAAM,EAAA,UAAA,EAAA,CAAA;kBATlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,YAAY;AACnB,wBAAA,kBAAkB,EAAE,QAAQ;AAC5B,wBAAA,qBAAqB,EAAE,WAAW;AAClC,wBAAA,8BAA8B,EAAE,gBAAgB;AACjD,qBAAA;AACF,iBAAA;;AAUD;MAOa,YAAY,CAAA;wGAAZ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC5B,qBAAA;AACF,iBAAA;;AAGD;MAOa,WAAW,CAAA;wGAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC3B,qBAAA;AACF,iBAAA;;AAGD;MAOa,iBAAiB,CAAA;wGAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,yBAAyB;AACjC,qBAAA;AACF,iBAAA;;AAGD;MAOa,YAAY,CAAA;wGAAZ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC5B,qBAAA;AACF,iBAAA;;AAGD;MAOa,aAAa,CAAA;wGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,qBAAqB;AAC7B,qBAAA;AACF,iBAAA;;AAGD;MAQa,YAAY,CAAA;AACd,IAAA,KAAK,GAAG,KAAK,CAAoB,OAAO,4EAAC;wGADvC,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,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,iBAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAPxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,mBAAmB,EAAE,SAAS;AAC/B,qBAAA;AACF,iBAAA;;;MCzDY,YAAY,CAAA;wGAAZ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,YAlBrB,MAAM;YACN,YAAY;YACZ,aAAa;YACb,iBAAiB;YACjB,YAAY;YACZ,YAAY;AACZ,YAAA,WAAW,aAGX,MAAM;YACN,YAAY;YACZ,aAAa;YACb,iBAAiB;YACjB,YAAY;YACZ,YAAY;YACZ,WAAW,CAAA,EAAA,CAAA;yGAGF,YAAY,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBApBxB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,MAAM;wBACN,YAAY;wBACZ,aAAa;wBACb,iBAAiB;wBACjB,YAAY;wBACZ,YAAY;wBACZ,WAAW;AACZ,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,MAAM;wBACN,YAAY;wBACZ,aAAa;wBACb,iBAAiB;wBACjB,YAAY;wBACZ,YAAY;wBACZ,WAAW;AACZ,qBAAA;AACF,iBAAA;;;AC9BD;;AAEG;;;;"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, DestroyRef, input, booleanAttribute, output, signal, computed, effect, Directive, ElementRef, NgModule } from '@angular/core';
2
+ import { InjectionToken, inject, DestroyRef, input, booleanAttribute, output, signal, computed, Directive, ElementRef, NgModule } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { fromEvent } from 'rxjs';
5
5
  import * as i1 from '@frame-ui-ng/components/button';
@@ -9,6 +9,7 @@ const FR_CAROUSEL_ORIENTATIONS = ['horizontal', 'vertical'];
9
9
  const FR_CAROUSEL_ALIGNS = ['start', 'center', 'end'];
10
10
  const FR_CAROUSEL_DIRECTIONS = ['ltr', 'rtl'];
11
11
  const FR_CAROUSEL = new InjectionToken('FrCarousel');
12
+ /** Carousel root that coordinates scroll state and navigation. */
12
13
  class FrCarousel {
13
14
  destroyRef = inject(DestroyRef);
14
15
  listeners = new Map();
@@ -20,6 +21,8 @@ class FrCarousel {
20
21
  loopBoundaryClone = null;
21
22
  contentElement = null;
22
23
  itemElements = [];
24
+ lastLoop = false;
25
+ lastPlugins = null;
23
26
  align = input('start', ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
24
27
  loop = input(false, { ...(ngDevMode ? { debugName: "loop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
25
28
  orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
@@ -43,27 +46,20 @@ class FrCarousel {
43
46
  on: (event, callback) => this.on(event, callback),
44
47
  };
45
48
  constructor() {
46
- effect(() => {
47
- const plugins = this.plugins();
48
- this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());
49
- for (const plugin of plugins) {
50
- const cleanup = plugin(this.api);
51
- if (typeof cleanup === 'function') {
52
- this.pluginCleanups.push(cleanup);
53
- }
54
- }
55
- });
56
- effect(() => {
57
- if (!this.effectiveLoop()) {
58
- this.removeLoopClone();
59
- }
60
- });
61
49
  this.destroyRef.onDestroy(() => {
62
50
  this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());
63
51
  this.clearLoopResetTimer();
64
52
  this.clearScrollSyncTimer();
65
53
  });
66
54
  }
55
+ ngDoCheck() {
56
+ this.syncPlugins();
57
+ const loop = this.effectiveLoop();
58
+ if (!loop && loop !== this.lastLoop) {
59
+ this.removeLoopClone();
60
+ }
61
+ this.lastLoop = loop;
62
+ }
67
63
  ngAfterViewInit() {
68
64
  queueMicrotask(() => {
69
65
  this.recalculate();
@@ -137,6 +133,20 @@ class FrCarousel {
137
133
  emit(event) {
138
134
  this.listeners.get(event)?.forEach((callback) => callback());
139
135
  }
136
+ syncPlugins() {
137
+ const plugins = this.plugins();
138
+ if (plugins === this.lastPlugins) {
139
+ return;
140
+ }
141
+ this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());
142
+ for (const plugin of plugins) {
143
+ const cleanup = plugin(this.api);
144
+ if (typeof cleanup === 'function') {
145
+ this.pluginCleanups.push(cleanup);
146
+ }
147
+ }
148
+ this.lastPlugins = plugins;
149
+ }
140
150
  recalculate() {
141
151
  this.snapCount.set(this.itemElements.length);
142
152
  this.emit('reInit');
@@ -145,6 +155,7 @@ class FrCarousel {
145
155
  if (this.isProgrammaticScroll || !this.contentElement || !this.itemElements.length) {
146
156
  return;
147
157
  }
158
+ // Derive the active item from the nearest snap point during user-driven scrolling.
148
159
  const current = this.getCurrentScrollOffset();
149
160
  const closest = this.itemElements.reduce((best, item, index) => {
150
161
  const targetOffset = this.getItemScrollOffset(item);
@@ -216,6 +227,7 @@ class FrCarousel {
216
227
  if (!this.contentElement || !this.effectiveLoop() || this.snapCount() < 2) {
217
228
  return;
218
229
  }
230
+ // Scroll to a temporary clone first, then jump back to the real edge item invisibly.
219
231
  const finalIndex = direction === 'next' ? 0 : this.snapCount() - 1;
220
232
  const cloneSource = direction === 'next' ? this.itemElements[0] : this.itemElements[this.snapCount() - 1];
221
233
  const resetTarget = this.itemElements[finalIndex];
@@ -263,6 +275,7 @@ class FrCarousel {
263
275
  if (!this.contentElement) {
264
276
  return;
265
277
  }
278
+ // `scrollend` is not universal, so keep a timeout fallback for the loop reset.
266
279
  let didReset = false;
267
280
  const reset = () => {
268
281
  if (didReset) {
@@ -321,6 +334,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
321
334
  providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }],
322
335
  }]
323
336
  }], ctorParameters: () => [], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], opts: [{ type: i0.Input, args: [{ isSignal: true, alias: "opts", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "plugins", required: false }] }], apiReady: [{ type: i0.Output, args: ["apiReady"] }], selectedChange: [{ type: i0.Output, args: ["selectedChange"] }] } });
337
+ /** Content slot for carousel. */
324
338
  class FrCarouselContent {
325
339
  carousel = inject(FR_CAROUSEL);
326
340
  elementRef = inject(ElementRef);
@@ -340,6 +354,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
340
354
  },
341
355
  }]
342
356
  }] });
357
+ /** Item slot for carousel. */
343
358
  class FrCarouselItem {
344
359
  carousel = inject(FR_CAROUSEL);
345
360
  destroyRef = inject(DestroyRef);
@@ -362,6 +377,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
362
377
  },
363
378
  }]
364
379
  }] });
380
+ /** Previous-slide control for carousel. */
365
381
  class FrCarouselPrevious {
366
382
  carousel = inject(FR_CAROUSEL);
367
383
  label = input('Previous slide', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
@@ -387,6 +403,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
387
403
  },
388
404
  }]
389
405
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
406
+ /** Next-slide control for carousel. */
390
407
  class FrCarouselNext {
391
408
  carousel = inject(FR_CAROUSEL);
392
409
  label = input('Next slide', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-carousel.mjs","sources":["../../../projects/components/carousel/src/carousel.ts","../../../projects/components/carousel/carousel.module.ts","../../../projects/components/carousel/frame-ui-ng-components-carousel.ts"],"sourcesContent":["import {\n AfterViewInit,\n DestroyRef,\n Directive,\n ElementRef,\n InjectionToken,\n Renderer2,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { FrButton } from '@frame-ui-ng/components/button';\n\nexport const FR_CAROUSEL_ORIENTATIONS = ['horizontal', 'vertical'] as const;\nexport const FR_CAROUSEL_ALIGNS = ['start', 'center', 'end'] as const;\nexport const FR_CAROUSEL_DIRECTIONS = ['ltr', 'rtl'] as const;\n\nexport type FrCarouselOrientation = (typeof FR_CAROUSEL_ORIENTATIONS)[number];\nexport type FrCarouselAlign = (typeof FR_CAROUSEL_ALIGNS)[number];\nexport type FrCarouselDirection = (typeof FR_CAROUSEL_DIRECTIONS)[number];\nexport type FrCarouselEvent = 'init' | 'select' | 'reInit';\nexport type FrCarouselPlugin = (api: FrCarouselApi) => void | (() => void);\n\nexport type FrCarouselOptions = {\n align?: FrCarouselAlign;\n direction?: FrCarouselDirection;\n loop?: boolean;\n};\n\nexport type FrCarouselApi = {\n canScrollNext: () => boolean;\n canScrollPrev: () => boolean;\n scrollNext: () => void;\n scrollPrev: () => void;\n scrollTo: (index: number) => void;\n scrollSnapList: () => number[];\n selectedScrollSnap: () => number;\n on: (event: FrCarouselEvent, callback: () => void) => () => void;\n};\n\nconst FR_CAROUSEL = new InjectionToken<FrCarousel>('FrCarousel');\n\n@Directive({\n selector: '[frCarousel], frame-carousel',\n exportAs: 'frCarousel',\n host: {\n class: 'frame-carousel',\n role: 'region',\n tabindex: '0',\n '[attr.aria-roledescription]': '\"carousel\"',\n '[attr.data-align]': 'effectiveAlign()',\n '[attr.data-orientation]': 'orientation()',\n '[attr.dir]': 'effectiveDirection()',\n '(keydown)': 'handleKeydown($event)',\n },\n providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }],\n})\nexport class FrCarousel implements AfterViewInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly listeners = new Map<FrCarouselEvent, Set<() => void>>();\n private readonly pluginCleanups: Array<() => void> = [];\n private loopResetTimer: number | null = null;\n private loopResetScrollEndCleanup: (() => void) | null = null;\n private scrollSyncTimer: number | null = null;\n private isProgrammaticScroll = false;\n private loopBoundaryClone: HTMLElement | null = null;\n private contentElement: HTMLElement | null = null;\n private itemElements: HTMLElement[] = [];\n\n readonly align = input<FrCarouselAlign>('start');\n readonly loop = input(false, { transform: booleanAttribute });\n readonly orientation = input<FrCarouselOrientation>('horizontal');\n readonly opts = input<FrCarouselOptions | null>(null);\n readonly plugins = input<readonly FrCarouselPlugin[]>([]);\n\n readonly apiReady = output<FrCarouselApi>();\n readonly selectedChange = output<number>();\n\n readonly selectedIndex = signal(0);\n readonly snapCount = signal(0);\n\n protected readonly effectiveAlign = computed(() => this.opts()?.align ?? this.align());\n protected readonly effectiveDirection = computed<FrCarouselDirection>(() => this.opts()?.direction ?? 'ltr');\n private readonly effectiveLoop = computed(() => this.opts()?.loop ?? this.loop());\n\n readonly api: FrCarouselApi = {\n canScrollNext: () => this.canScrollNext(),\n canScrollPrev: () => this.canScrollPrev(),\n scrollNext: () => this.scrollNext(),\n scrollPrev: () => this.scrollPrev(),\n scrollTo: (index: number) => this.scrollTo(index),\n scrollSnapList: () => this.itemElements.map((_, index) => index),\n selectedScrollSnap: () => this.selectedIndex(),\n on: (event: FrCarouselEvent, callback: () => void) => this.on(event, callback),\n };\n\n constructor() {\n effect(() => {\n const plugins = this.plugins();\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\n\n for (const plugin of plugins) {\n const cleanup = plugin(this.api);\n if (typeof cleanup === 'function') {\n this.pluginCleanups.push(cleanup);\n }\n }\n });\n\n effect(() => {\n if (!this.effectiveLoop()) {\n this.removeLoopClone();\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\n this.clearLoopResetTimer();\n this.clearScrollSyncTimer();\n });\n }\n\n ngAfterViewInit(): void {\n queueMicrotask(() => {\n this.recalculate();\n this.emit('init');\n this.apiReady.emit(this.api);\n });\n }\n\n registerContent(element: HTMLElement): void {\n this.contentElement = element;\n fromEvent(element, 'scroll')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.syncSelectedFromScroll());\n }\n\n registerItem(element: HTMLElement): void {\n this.itemElements.push(element);\n this.recalculate();\n }\n\n unregisterItem(element: HTMLElement): void {\n this.itemElements = this.itemElements.filter((item) => item !== element);\n this.recalculate();\n }\n\n canScrollPrev(): boolean {\n return this.effectiveLoop() || this.selectedIndex() > 0;\n }\n\n canScrollNext(): boolean {\n return this.effectiveLoop() || this.selectedIndex() < this.snapCount() - 1;\n }\n\n scrollPrev(): void {\n const nextIndex = this.selectedIndex() - 1;\n if (this.effectiveLoop() && nextIndex < 0) {\n this.scrollLoopBoundary('previous');\n return;\n }\n\n this.scrollTo(nextIndex < 0 ? this.snapCount() - 1 : nextIndex);\n }\n\n scrollNext(): void {\n const nextIndex = this.selectedIndex() + 1;\n if (this.effectiveLoop() && nextIndex >= this.snapCount()) {\n this.scrollLoopBoundary('next');\n return;\n }\n\n this.scrollTo(nextIndex >= this.snapCount() ? 0 : nextIndex);\n }\n\n scrollTo(index: number): void {\n const target = this.itemElements[index];\n if (!target || (!this.effectiveLoop() && (index < 0 || index >= this.snapCount()))) {\n return;\n }\n\n this.pauseScrollSync();\n this.scrollItemIntoView(target);\n this.setSelectedIndex(index);\n }\n\n handleKeydown(event: KeyboardEvent): void {\n const nextKey = this.orientation() === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const prevKey = this.orientation() === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (event.key === nextKey) {\n event.preventDefault();\n this.scrollNext();\n }\n\n if (event.key === prevKey) {\n event.preventDefault();\n this.scrollPrev();\n }\n }\n\n private on(event: FrCarouselEvent, callback: () => void): () => void {\n const callbacks = this.listeners.get(event) ?? new Set<() => void>();\n callbacks.add(callback);\n this.listeners.set(event, callbacks);\n\n return () => callbacks.delete(callback);\n }\n\n private emit(event: FrCarouselEvent): void {\n this.listeners.get(event)?.forEach((callback) => callback());\n }\n\n private recalculate(): void {\n this.snapCount.set(this.itemElements.length);\n this.emit('reInit');\n }\n\n private syncSelectedFromScroll(): void {\n if (this.isProgrammaticScroll || !this.contentElement || !this.itemElements.length) {\n return;\n }\n\n const current = this.getCurrentScrollOffset();\n const closest = this.itemElements.reduce(\n (best, item, index) => {\n const targetOffset = this.getItemScrollOffset(item);\n const distance = Math.abs(targetOffset - current);\n return distance < best.distance ? { distance, index } : best;\n },\n { distance: Number.POSITIVE_INFINITY, index: this.selectedIndex() },\n );\n\n this.setSelectedIndex(closest.index);\n }\n\n private scrollItemIntoView(target: HTMLElement, behavior: ScrollBehavior = 'smooth'): void {\n if (\n !this.contentElement ||\n typeof this.contentElement.getBoundingClientRect !== 'function' ||\n typeof target.getBoundingClientRect !== 'function'\n ) {\n return;\n }\n\n const next = this.getItemScrollOffset(target);\n const isVertical = this.orientation() === 'vertical';\n\n if (typeof this.contentElement.scrollTo === 'function') {\n this.contentElement.scrollTo({\n [isVertical ? 'top' : 'left']: next,\n behavior,\n });\n return;\n }\n\n if (isVertical) {\n this.contentElement.scrollTop = next;\n return;\n }\n\n this.contentElement.scrollLeft = next;\n }\n\n private getItemScrollOffset(target: HTMLElement): number {\n if (!this.contentElement) {\n return 0;\n }\n\n const contentRect = this.contentElement.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const isVertical = this.orientation() === 'vertical';\n const current = this.getCurrentScrollOffset();\n const contentSize = isVertical ? this.contentElement.clientHeight : this.contentElement.clientWidth;\n const targetSize = isVertical ? target.offsetHeight : target.offsetWidth;\n const targetStart = isVertical\n ? targetRect.top - contentRect.top\n : targetRect.left - contentRect.left;\n\n let next = current + targetStart;\n if (this.effectiveAlign() === 'center') {\n next -= (contentSize - targetSize) / 2;\n }\n\n if (this.effectiveAlign() === 'end') {\n next -= contentSize - targetSize;\n }\n\n return Math.max(0, Math.min(next, this.getMaxScrollOffset()));\n }\n\n private getCurrentScrollOffset(): number {\n if (!this.contentElement) {\n return 0;\n }\n\n return this.orientation() === 'vertical'\n ? this.contentElement.scrollTop\n : this.contentElement.scrollLeft;\n }\n\n private getMaxScrollOffset(): number {\n if (!this.contentElement) {\n return 0;\n }\n\n return this.orientation() === 'vertical'\n ? Math.max(0, this.contentElement.scrollHeight - this.contentElement.clientHeight)\n : Math.max(0, this.contentElement.scrollWidth - this.contentElement.clientWidth);\n }\n\n private scrollLoopBoundary(direction: 'previous' | 'next'): void {\n if (!this.contentElement || !this.effectiveLoop() || this.snapCount() < 2) {\n return;\n }\n\n const finalIndex = direction === 'next' ? 0 : this.snapCount() - 1;\n const cloneSource = direction === 'next' ? this.itemElements[0] : this.itemElements[this.snapCount() - 1];\n const resetTarget = this.itemElements[finalIndex];\n\n if (!cloneSource || !resetTarget) {\n this.scrollTo(finalIndex);\n return;\n }\n\n this.clearLoopResetTimer();\n this.removeLoopClone();\n this.loopBoundaryClone = this.createLoopClone(cloneSource);\n this.pauseScrollSync();\n\n if (direction === 'next') {\n this.contentElement.appendChild(this.loopBoundaryClone);\n } else {\n this.contentElement.insertBefore(this.loopBoundaryClone, this.contentElement.firstChild);\n this.scrollItemIntoView(this.itemElements[0], 'auto');\n }\n\n this.scrollItemIntoView(this.loopBoundaryClone);\n this.setSelectedIndex(finalIndex);\n\n this.scheduleLoopReset(resetTarget);\n }\n\n private createLoopClone(item: HTMLElement): HTMLElement {\n const clone = item.cloneNode(true) as HTMLElement;\n clone.setAttribute('aria-hidden', 'true');\n clone.setAttribute('data-frame-carousel-clone', 'true');\n clone.removeAttribute('FrCarouselItem');\n clone.inert = true;\n return clone;\n }\n\n private removeLoopClone(): void {\n this.loopBoundaryClone?.remove();\n this.loopBoundaryClone = null;\n }\n\n private clearLoopResetTimer(): void {\n this.loopResetScrollEndCleanup?.();\n this.loopResetScrollEndCleanup = null;\n\n if (this.loopResetTimer === null) {\n return;\n }\n\n window.clearTimeout(this.loopResetTimer);\n this.loopResetTimer = null;\n }\n\n private scheduleLoopReset(resetTarget: HTMLElement): void {\n if (!this.contentElement) {\n return;\n }\n\n let didReset = false;\n const reset = () => {\n if (didReset) {\n return;\n }\n\n didReset = true;\n this.clearLoopResetTimer();\n this.scrollItemIntoView(resetTarget, 'auto');\n this.removeLoopClone();\n };\n\n this.contentElement.addEventListener('scrollend', reset, { once: true });\n this.loopResetScrollEndCleanup = () => this.contentElement?.removeEventListener('scrollend', reset);\n\n this.loopResetTimer = window.setTimeout(reset, 1200);\n }\n\n private pauseScrollSync(duration = 1300): void {\n this.isProgrammaticScroll = true;\n this.clearScrollSyncTimer();\n\n this.scrollSyncTimer = window.setTimeout(() => {\n this.isProgrammaticScroll = false;\n this.scrollSyncTimer = null;\n }, duration);\n }\n\n private clearScrollSyncTimer(): void {\n if (this.scrollSyncTimer === null) {\n return;\n }\n\n window.clearTimeout(this.scrollSyncTimer);\n this.scrollSyncTimer = null;\n }\n\n private setSelectedIndex(index: number): void {\n if (index === this.selectedIndex()) {\n return;\n }\n\n this.selectedIndex.set(index);\n this.selectedChange.emit(index);\n this.emit('select');\n }\n}\n\n@Directive({\n selector: '[frCarouselContent]',\n host: {\n class: 'frame-carousel__content',\n '[attr.data-orientation]': 'carousel.orientation()',\n },\n})\nexport class FrCarouselContent implements AfterViewInit {\n protected readonly carousel = inject(FR_CAROUSEL);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n ngAfterViewInit(): void {\n this.carousel.registerContent(this.elementRef.nativeElement);\n }\n}\n\n@Directive({\n selector: '[frCarouselItem]',\n host: {\n class: 'frame-carousel__item',\n role: 'group',\n '[attr.aria-roledescription]': '\"slide\"',\n },\n})\nexport class FrCarouselItem implements AfterViewInit {\n private readonly carousel = inject(FR_CAROUSEL);\n private readonly destroyRef = inject(DestroyRef);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n ngAfterViewInit(): void {\n this.carousel.registerItem(this.elementRef.nativeElement);\n this.destroyRef.onDestroy(() => this.carousel.unregisterItem(this.elementRef.nativeElement));\n }\n}\n\n@Directive({\n selector: 'button[frCarouselPrevious]',\n hostDirectives: [\n {\n directive: FrButton,\n inputs: ['appearance', 'disabled', 'radius', 'size'],\n },\n ],\n host: {\n class: 'frame-carousel__control frame-carousel__control--previous',\n '[attr.type]': '\"button\"',\n '[attr.aria-label]': 'label()',\n '[attr.disabled]': 'carousel.canScrollPrev() ? null : \"\"',\n '(click)': 'carousel.scrollPrev()',\n },\n})\nexport class FrCarouselPrevious {\n protected readonly carousel = inject(FR_CAROUSEL);\n readonly label = input('Previous slide');\n}\n\n@Directive({\n selector: 'button[frCarouselNext]',\n hostDirectives: [\n {\n directive: FrButton,\n inputs: ['appearance', 'disabled', 'radius', 'size'],\n },\n ],\n host: {\n class: 'frame-carousel__control frame-carousel__control--next',\n '[attr.type]': '\"button\"',\n '[attr.aria-label]': 'label()',\n '[attr.disabled]': 'carousel.canScrollNext() ? null : \"\"',\n '(click)': 'carousel.scrollNext()',\n },\n})\nexport class FrCarouselNext {\n protected readonly carousel = inject(FR_CAROUSEL);\n readonly label = input('Next slide');\n}\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n} from './src/carousel';\n\n@NgModule({\n imports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n exports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n})\nexport class FrCarouselModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-ui-ng-components-carousel.mjs","sources":["../../../projects/components/carousel/src/carousel.ts","../../../projects/components/carousel/carousel.module.ts","../../../projects/components/carousel/frame-ui-ng-components-carousel.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n DestroyRef,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n InjectionToken,\r\n Renderer2,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { fromEvent } from 'rxjs';\r\nimport { FrButton } from '@frame-ui-ng/components/button';\r\n\r\nexport const FR_CAROUSEL_ORIENTATIONS = ['horizontal', 'vertical'] as const;\r\nexport const FR_CAROUSEL_ALIGNS = ['start', 'center', 'end'] as const;\r\nexport const FR_CAROUSEL_DIRECTIONS = ['ltr', 'rtl'] as const;\r\n\r\nexport type FrCarouselOrientation = (typeof FR_CAROUSEL_ORIENTATIONS)[number];\r\nexport type FrCarouselAlign = (typeof FR_CAROUSEL_ALIGNS)[number];\r\nexport type FrCarouselDirection = (typeof FR_CAROUSEL_DIRECTIONS)[number];\r\nexport type FrCarouselEvent = 'init' | 'select' | 'reInit';\r\nexport type FrCarouselPlugin = (api: FrCarouselApi) => void | (() => void);\r\n\r\nexport type FrCarouselOptions = {\r\n align?: FrCarouselAlign;\r\n direction?: FrCarouselDirection;\r\n loop?: boolean;\r\n};\r\n\r\nexport type FrCarouselApi = {\r\n canScrollNext: () => boolean;\r\n canScrollPrev: () => boolean;\r\n scrollNext: () => void;\r\n scrollPrev: () => void;\r\n scrollTo: (index: number) => void;\r\n scrollSnapList: () => number[];\r\n selectedScrollSnap: () => number;\r\n on: (event: FrCarouselEvent, callback: () => void) => () => void;\r\n};\r\n\r\nconst FR_CAROUSEL = new InjectionToken<FrCarousel>('FrCarousel');\r\n\r\n/** Carousel root that coordinates scroll state and navigation. */\r\n@Directive({\r\n selector: '[frCarousel], frame-carousel',\r\n exportAs: 'frCarousel',\r\n host: {\r\n class: 'frame-carousel',\r\n role: 'region',\r\n tabindex: '0',\r\n '[attr.aria-roledescription]': '\"carousel\"',\r\n '[attr.data-align]': 'effectiveAlign()',\r\n '[attr.data-orientation]': 'orientation()',\r\n '[attr.dir]': 'effectiveDirection()',\r\n '(keydown)': 'handleKeydown($event)',\r\n },\r\n providers: [{ provide: FR_CAROUSEL, useExisting: FrCarousel }],\r\n})\r\nexport class FrCarousel implements AfterViewInit, DoCheck {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly listeners = new Map<FrCarouselEvent, Set<() => void>>();\r\n private readonly pluginCleanups: Array<() => void> = [];\r\n private loopResetTimer: number | null = null;\r\n private loopResetScrollEndCleanup: (() => void) | null = null;\r\n private scrollSyncTimer: number | null = null;\r\n private isProgrammaticScroll = false;\r\n private loopBoundaryClone: HTMLElement | null = null;\r\n private contentElement: HTMLElement | null = null;\r\n private itemElements: HTMLElement[] = [];\r\n private lastLoop = false;\r\n private lastPlugins: readonly FrCarouselPlugin[] | null = null;\r\n\r\n readonly align = input<FrCarouselAlign>('start');\r\n readonly loop = input(false, { transform: booleanAttribute });\r\n readonly orientation = input<FrCarouselOrientation>('horizontal');\r\n readonly opts = input<FrCarouselOptions | null>(null);\r\n readonly plugins = input<readonly FrCarouselPlugin[]>([]);\r\n\r\n readonly apiReady = output<FrCarouselApi>();\r\n readonly selectedChange = output<number>();\r\n\r\n readonly selectedIndex = signal(0);\r\n readonly snapCount = signal(0);\r\n\r\n protected readonly effectiveAlign = computed(() => this.opts()?.align ?? this.align());\r\n protected readonly effectiveDirection = computed<FrCarouselDirection>(() => this.opts()?.direction ?? 'ltr');\r\n private readonly effectiveLoop = computed(() => this.opts()?.loop ?? this.loop());\r\n\r\n readonly api: FrCarouselApi = {\r\n canScrollNext: () => this.canScrollNext(),\r\n canScrollPrev: () => this.canScrollPrev(),\r\n scrollNext: () => this.scrollNext(),\r\n scrollPrev: () => this.scrollPrev(),\r\n scrollTo: (index: number) => this.scrollTo(index),\r\n scrollSnapList: () => this.itemElements.map((_, index) => index),\r\n selectedScrollSnap: () => this.selectedIndex(),\r\n on: (event: FrCarouselEvent, callback: () => void) => this.on(event, callback),\r\n };\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => {\r\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\r\n this.clearLoopResetTimer();\r\n this.clearScrollSyncTimer();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n this.syncPlugins();\r\n\r\n const loop = this.effectiveLoop();\r\n if (!loop && loop !== this.lastLoop) {\r\n this.removeLoopClone();\r\n }\r\n this.lastLoop = loop;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n queueMicrotask(() => {\r\n this.recalculate();\r\n this.emit('init');\r\n this.apiReady.emit(this.api);\r\n });\r\n }\r\n\r\n registerContent(element: HTMLElement): void {\r\n this.contentElement = element;\r\n fromEvent(element, 'scroll')\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncSelectedFromScroll());\r\n }\r\n\r\n registerItem(element: HTMLElement): void {\r\n this.itemElements.push(element);\r\n this.recalculate();\r\n }\r\n\r\n unregisterItem(element: HTMLElement): void {\r\n this.itemElements = this.itemElements.filter((item) => item !== element);\r\n this.recalculate();\r\n }\r\n\r\n canScrollPrev(): boolean {\r\n return this.effectiveLoop() || this.selectedIndex() > 0;\r\n }\r\n\r\n canScrollNext(): boolean {\r\n return this.effectiveLoop() || this.selectedIndex() < this.snapCount() - 1;\r\n }\r\n\r\n scrollPrev(): void {\r\n const nextIndex = this.selectedIndex() - 1;\r\n if (this.effectiveLoop() && nextIndex < 0) {\r\n this.scrollLoopBoundary('previous');\r\n return;\r\n }\r\n\r\n this.scrollTo(nextIndex < 0 ? this.snapCount() - 1 : nextIndex);\r\n }\r\n\r\n scrollNext(): void {\r\n const nextIndex = this.selectedIndex() + 1;\r\n if (this.effectiveLoop() && nextIndex >= this.snapCount()) {\r\n this.scrollLoopBoundary('next');\r\n return;\r\n }\r\n\r\n this.scrollTo(nextIndex >= this.snapCount() ? 0 : nextIndex);\r\n }\r\n\r\n scrollTo(index: number): void {\r\n const target = this.itemElements[index];\r\n if (!target || (!this.effectiveLoop() && (index < 0 || index >= this.snapCount()))) {\r\n return;\r\n }\r\n\r\n this.pauseScrollSync();\r\n this.scrollItemIntoView(target);\r\n this.setSelectedIndex(index);\r\n }\r\n\r\n handleKeydown(event: KeyboardEvent): void {\r\n const nextKey = this.orientation() === 'vertical' ? 'ArrowDown' : 'ArrowRight';\r\n const prevKey = this.orientation() === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\r\n\r\n if (event.key === nextKey) {\r\n event.preventDefault();\r\n this.scrollNext();\r\n }\r\n\r\n if (event.key === prevKey) {\r\n event.preventDefault();\r\n this.scrollPrev();\r\n }\r\n }\r\n\r\n private on(event: FrCarouselEvent, callback: () => void): () => void {\r\n const callbacks = this.listeners.get(event) ?? new Set<() => void>();\r\n callbacks.add(callback);\r\n this.listeners.set(event, callbacks);\r\n\r\n return () => callbacks.delete(callback);\r\n }\r\n\r\n private emit(event: FrCarouselEvent): void {\r\n this.listeners.get(event)?.forEach((callback) => callback());\r\n }\r\n\r\n private syncPlugins(): void {\r\n const plugins = this.plugins();\r\n\r\n if (plugins === this.lastPlugins) {\r\n return;\r\n }\r\n\r\n this.pluginCleanups.splice(0).forEach((cleanup) => cleanup());\r\n\r\n for (const plugin of plugins) {\r\n const cleanup = plugin(this.api);\r\n if (typeof cleanup === 'function') {\r\n this.pluginCleanups.push(cleanup);\r\n }\r\n }\r\n\r\n this.lastPlugins = plugins;\r\n }\r\n\r\n private recalculate(): void {\r\n this.snapCount.set(this.itemElements.length);\r\n this.emit('reInit');\r\n }\r\n\r\n private syncSelectedFromScroll(): void {\r\n if (this.isProgrammaticScroll || !this.contentElement || !this.itemElements.length) {\r\n return;\r\n }\r\n\r\n // Derive the active item from the nearest snap point during user-driven scrolling.\r\n const current = this.getCurrentScrollOffset();\r\n const closest = this.itemElements.reduce(\r\n (best, item, index) => {\r\n const targetOffset = this.getItemScrollOffset(item);\r\n const distance = Math.abs(targetOffset - current);\r\n return distance < best.distance ? { distance, index } : best;\r\n },\r\n { distance: Number.POSITIVE_INFINITY, index: this.selectedIndex() },\r\n );\r\n\r\n this.setSelectedIndex(closest.index);\r\n }\r\n\r\n private scrollItemIntoView(target: HTMLElement, behavior: ScrollBehavior = 'smooth'): void {\r\n if (\r\n !this.contentElement ||\r\n typeof this.contentElement.getBoundingClientRect !== 'function' ||\r\n typeof target.getBoundingClientRect !== 'function'\r\n ) {\r\n return;\r\n }\r\n\r\n const next = this.getItemScrollOffset(target);\r\n const isVertical = this.orientation() === 'vertical';\r\n\r\n if (typeof this.contentElement.scrollTo === 'function') {\r\n this.contentElement.scrollTo({\r\n [isVertical ? 'top' : 'left']: next,\r\n behavior,\r\n });\r\n return;\r\n }\r\n\r\n if (isVertical) {\r\n this.contentElement.scrollTop = next;\r\n return;\r\n }\r\n\r\n this.contentElement.scrollLeft = next;\r\n }\r\n\r\n private getItemScrollOffset(target: HTMLElement): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n const contentRect = this.contentElement.getBoundingClientRect();\r\n const targetRect = target.getBoundingClientRect();\r\n const isVertical = this.orientation() === 'vertical';\r\n const current = this.getCurrentScrollOffset();\r\n const contentSize = isVertical ? this.contentElement.clientHeight : this.contentElement.clientWidth;\r\n const targetSize = isVertical ? target.offsetHeight : target.offsetWidth;\r\n const targetStart = isVertical\r\n ? targetRect.top - contentRect.top\r\n : targetRect.left - contentRect.left;\r\n\r\n let next = current + targetStart;\r\n if (this.effectiveAlign() === 'center') {\r\n next -= (contentSize - targetSize) / 2;\r\n }\r\n\r\n if (this.effectiveAlign() === 'end') {\r\n next -= contentSize - targetSize;\r\n }\r\n\r\n return Math.max(0, Math.min(next, this.getMaxScrollOffset()));\r\n }\r\n\r\n private getCurrentScrollOffset(): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n return this.orientation() === 'vertical'\r\n ? this.contentElement.scrollTop\r\n : this.contentElement.scrollLeft;\r\n }\r\n\r\n private getMaxScrollOffset(): number {\r\n if (!this.contentElement) {\r\n return 0;\r\n }\r\n\r\n return this.orientation() === 'vertical'\r\n ? Math.max(0, this.contentElement.scrollHeight - this.contentElement.clientHeight)\r\n : Math.max(0, this.contentElement.scrollWidth - this.contentElement.clientWidth);\r\n }\r\n\r\n private scrollLoopBoundary(direction: 'previous' | 'next'): void {\r\n if (!this.contentElement || !this.effectiveLoop() || this.snapCount() < 2) {\r\n return;\r\n }\r\n\r\n // Scroll to a temporary clone first, then jump back to the real edge item invisibly.\r\n const finalIndex = direction === 'next' ? 0 : this.snapCount() - 1;\r\n const cloneSource = direction === 'next' ? this.itemElements[0] : this.itemElements[this.snapCount() - 1];\r\n const resetTarget = this.itemElements[finalIndex];\r\n\r\n if (!cloneSource || !resetTarget) {\r\n this.scrollTo(finalIndex);\r\n return;\r\n }\r\n\r\n this.clearLoopResetTimer();\r\n this.removeLoopClone();\r\n this.loopBoundaryClone = this.createLoopClone(cloneSource);\r\n this.pauseScrollSync();\r\n\r\n if (direction === 'next') {\r\n this.contentElement.appendChild(this.loopBoundaryClone);\r\n } else {\r\n this.contentElement.insertBefore(this.loopBoundaryClone, this.contentElement.firstChild);\r\n this.scrollItemIntoView(this.itemElements[0], 'auto');\r\n }\r\n\r\n this.scrollItemIntoView(this.loopBoundaryClone);\r\n this.setSelectedIndex(finalIndex);\r\n\r\n this.scheduleLoopReset(resetTarget);\r\n }\r\n\r\n private createLoopClone(item: HTMLElement): HTMLElement {\r\n const clone = item.cloneNode(true) as HTMLElement;\r\n clone.setAttribute('aria-hidden', 'true');\r\n clone.setAttribute('data-frame-carousel-clone', 'true');\r\n clone.removeAttribute('FrCarouselItem');\r\n clone.inert = true;\r\n return clone;\r\n }\r\n\r\n private removeLoopClone(): void {\r\n this.loopBoundaryClone?.remove();\r\n this.loopBoundaryClone = null;\r\n }\r\n\r\n private clearLoopResetTimer(): void {\r\n this.loopResetScrollEndCleanup?.();\r\n this.loopResetScrollEndCleanup = null;\r\n\r\n if (this.loopResetTimer === null) {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.loopResetTimer);\r\n this.loopResetTimer = null;\r\n }\r\n\r\n private scheduleLoopReset(resetTarget: HTMLElement): void {\r\n if (!this.contentElement) {\r\n return;\r\n }\r\n\r\n // `scrollend` is not universal, so keep a timeout fallback for the loop reset.\r\n let didReset = false;\r\n const reset = () => {\r\n if (didReset) {\r\n return;\r\n }\r\n\r\n didReset = true;\r\n this.clearLoopResetTimer();\r\n this.scrollItemIntoView(resetTarget, 'auto');\r\n this.removeLoopClone();\r\n };\r\n\r\n this.contentElement.addEventListener('scrollend', reset, { once: true });\r\n this.loopResetScrollEndCleanup = () => this.contentElement?.removeEventListener('scrollend', reset);\r\n\r\n this.loopResetTimer = window.setTimeout(reset, 1200);\r\n }\r\n\r\n private pauseScrollSync(duration = 1300): void {\r\n this.isProgrammaticScroll = true;\r\n this.clearScrollSyncTimer();\r\n\r\n this.scrollSyncTimer = window.setTimeout(() => {\r\n this.isProgrammaticScroll = false;\r\n this.scrollSyncTimer = null;\r\n }, duration);\r\n }\r\n\r\n private clearScrollSyncTimer(): void {\r\n if (this.scrollSyncTimer === null) {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.scrollSyncTimer);\r\n this.scrollSyncTimer = null;\r\n }\r\n\r\n private setSelectedIndex(index: number): void {\r\n if (index === this.selectedIndex()) {\r\n return;\r\n }\r\n\r\n this.selectedIndex.set(index);\r\n this.selectedChange.emit(index);\r\n this.emit('select');\r\n }\r\n}\r\n\r\n/** Content slot for carousel. */\r\n@Directive({\r\n selector: '[frCarouselContent]',\r\n host: {\r\n class: 'frame-carousel__content',\r\n '[attr.data-orientation]': 'carousel.orientation()',\r\n },\r\n})\r\nexport class FrCarouselContent implements AfterViewInit {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n ngAfterViewInit(): void {\r\n this.carousel.registerContent(this.elementRef.nativeElement);\r\n }\r\n}\r\n\r\n/** Item slot for carousel. */\r\n@Directive({\r\n selector: '[frCarouselItem]',\r\n host: {\r\n class: 'frame-carousel__item',\r\n role: 'group',\r\n '[attr.aria-roledescription]': '\"slide\"',\r\n },\r\n})\r\nexport class FrCarouselItem implements AfterViewInit {\r\n private readonly carousel = inject(FR_CAROUSEL);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n ngAfterViewInit(): void {\r\n this.carousel.registerItem(this.elementRef.nativeElement);\r\n this.destroyRef.onDestroy(() => this.carousel.unregisterItem(this.elementRef.nativeElement));\r\n }\r\n}\r\n\r\n/** Previous-slide control for carousel. */\r\n@Directive({\r\n selector: 'button[frCarouselPrevious]',\r\n hostDirectives: [\r\n {\r\n directive: FrButton,\r\n inputs: ['appearance', 'disabled', 'radius', 'size'],\r\n },\r\n ],\r\n host: {\r\n class: 'frame-carousel__control frame-carousel__control--previous',\r\n '[attr.type]': '\"button\"',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.disabled]': 'carousel.canScrollPrev() ? null : \"\"',\r\n '(click)': 'carousel.scrollPrev()',\r\n },\r\n})\r\nexport class FrCarouselPrevious {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n readonly label = input('Previous slide');\r\n}\r\n\r\n/** Next-slide control for carousel. */\r\n@Directive({\r\n selector: 'button[frCarouselNext]',\r\n hostDirectives: [\r\n {\r\n directive: FrButton,\r\n inputs: ['appearance', 'disabled', 'radius', 'size'],\r\n },\r\n ],\r\n host: {\r\n class: 'frame-carousel__control frame-carousel__control--next',\r\n '[attr.type]': '\"button\"',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.disabled]': 'carousel.canScrollNext() ? null : \"\"',\r\n '(click)': 'carousel.scrollNext()',\r\n },\r\n})\r\nexport class FrCarouselNext {\r\n protected readonly carousel = inject(FR_CAROUSEL);\r\n readonly label = input('Next slide');\r\n}\r\n\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n} from './src/carousel';\n\n@NgModule({\n imports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n exports: [\n FrCarousel,\n FrCarouselContent,\n FrCarouselItem,\n FrCarouselNext,\n FrCarouselPrevious,\n ],\n})\nexport class FrCarouselModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAmBa,wBAAwB,GAAG,CAAC,YAAY,EAAE,UAAU;AAC1D,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK;MAC9C,sBAAsB,GAAG,CAAC,KAAK,EAAE,KAAK;AAyBnD,MAAM,WAAW,GAAG,IAAI,cAAc,CAAa,YAAY,CAAC;AAEhE;MAgBa,UAAU,CAAA;AACJ,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,SAAS,GAAG,IAAI,GAAG,EAAoC;IACvD,cAAc,GAAsB,EAAE;IAC/C,cAAc,GAAkB,IAAI;IACpC,yBAAyB,GAAwB,IAAI;IACrD,eAAe,GAAkB,IAAI;IACrC,oBAAoB,GAAG,KAAK;IAC5B,iBAAiB,GAAuB,IAAI;IAC5C,cAAc,GAAuB,IAAI;IACzC,YAAY,GAAkB,EAAE;IAChC,QAAQ,GAAG,KAAK;IAChB,WAAW,GAAuC,IAAI;AAErD,IAAA,KAAK,GAAG,KAAK,CAAkB,OAAO,4EAAC;IACvC,IAAI,GAAG,KAAK,CAAC,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACpD,IAAA,WAAW,GAAG,KAAK,CAAwB,YAAY,kFAAC;AACxD,IAAA,IAAI,GAAG,KAAK,CAA2B,IAAI,2EAAC;AAC5C,IAAA,OAAO,GAAG,KAAK,CAA8B,EAAE,8EAAC;IAEhD,QAAQ,GAAG,MAAM,EAAiB;IAClC,cAAc,GAAG,MAAM,EAAU;AAEjC,IAAA,aAAa,GAAG,MAAM,CAAC,CAAC,oFAAC;AACzB,IAAA,SAAS,GAAG,MAAM,CAAC,CAAC,gFAAC;AAEX,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,qFAAC;AACnE,IAAA,kBAAkB,GAAG,QAAQ,CAAsB,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,IAAI,KAAK,yFAAC;AAC3F,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,oFAAC;AAExE,IAAA,GAAG,GAAkB;AAC5B,QAAA,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,UAAU,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;AACnC,QAAA,UAAU,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;QACnC,QAAQ,EAAE,CAAC,KAAa,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjD,QAAA,cAAc,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;AAChE,QAAA,kBAAkB,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AAC9C,QAAA,EAAE,EAAE,CAAC,KAAsB,EAAE,QAAoB,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC/E;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7D,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;QACjC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE;QACxB;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEA,eAAe,GAAA;QACb,cAAc,CAAC,MAAK;YAClB,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,eAAe,CAAC,OAAoB,EAAA;AAClC,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO;AAC7B,QAAA,SAAS,CAAC,OAAO,EAAE,QAAQ;AACxB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,OAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA,IAAA,cAAc,CAAC,OAAoB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,OAAO,CAAC;QACxE,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;IACzD;IAEA,aAAa,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;IAC5E;IAEA,UAAU,GAAA;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;QAC1C,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;YACnC;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IACjE;IAEA,UAAU,GAAA;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAC/B;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9D;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QACvC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE;YAClF;QACF;QAEA,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAC9B;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,GAAG,WAAW,GAAG,YAAY;AAC9E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,GAAG,SAAS,GAAG,WAAW;AAE3E,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,UAAU,EAAE;QACnB;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEQ,EAAE,CAAC,KAAsB,EAAE,QAAoB,EAAA;AACrD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAc;AACpE,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;QAEpC,OAAO,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;IACzC;AAEQ,IAAA,IAAI,CAAC,KAAsB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;IAC9D;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAE9B,QAAA,IAAI,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;AAE7D,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAChC,YAAA,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;AACjC,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YACnC;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO;IAC5B;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IACrB;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAClF;QACF;;AAGA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CACtC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,KAAI;YACpB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC;AACjD,YAAA,OAAO,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI;AAC9D,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CACpE;AAED,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC;AAEQ,IAAA,kBAAkB,CAAC,MAAmB,EAAE,QAAA,GAA2B,QAAQ,EAAA;QACjF,IACE,CAAC,IAAI,CAAC,cAAc;AACpB,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,qBAAqB,KAAK,UAAU;AAC/D,YAAA,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU,EAClD;YACA;QACF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU;QAEpD,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,KAAK,UAAU,EAAE;AACtD,YAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;gBAC3B,CAAC,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI;gBACnC,QAAQ;AACT,aAAA,CAAC;YACF;QACF;QAEA,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,IAAI;YACpC;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI;IACvC;AAEQ,IAAA,mBAAmB,CAAC,MAAmB,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,OAAO,CAAC;QACV;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;AAC/D,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU;AACpD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW;AACnG,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW;QACxE,MAAM,WAAW,GAAG;AAClB,cAAE,UAAU,CAAC,GAAG,GAAG,WAAW,CAAC;cAC7B,UAAU,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;AAEtC,QAAA,IAAI,IAAI,GAAG,OAAO,GAAG,WAAW;AAChC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,QAAQ,EAAE;YACtC,IAAI,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,CAAC;QACxC;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,KAAK,EAAE;AACnC,YAAA,IAAI,IAAI,WAAW,GAAG,UAAU;QAClC;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC/D;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;AAC5B,cAAE,IAAI,CAAC,cAAc,CAAC;AACtB,cAAE,IAAI,CAAC,cAAc,CAAC,UAAU;IACpC;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;AAC5B,cAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY;AACjF,cAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;IACpF;AAEQ,IAAA,kBAAkB,CAAC,SAA8B,EAAA;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;YACzE;QACF;;AAGA,QAAA,MAAM,UAAU,GAAG,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;AAClE,QAAA,MAAM,WAAW,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACzG,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;AAEjD,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE;AAChC,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzB;QACF;QAEA,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;QAC1D,IAAI,CAAC,eAAe,EAAE;AAEtB,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACzD;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;AACxF,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACvD;AAEA,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC/C,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AAEjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;IACrC;AAEQ,IAAA,eAAe,CAAC,IAAiB,EAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAgB;AACjD,QAAA,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;AACzC,QAAA,KAAK,CAAC,YAAY,CAAC,2BAA2B,EAAE,MAAM,CAAC;AACvD,QAAA,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAAC;AACvC,QAAA,KAAK,CAAC,KAAK,GAAG,IAAI;AAClB,QAAA,OAAO,KAAK;IACd;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE;AAChC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAC/B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,yBAAyB,IAAI;AAClC,QAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AAErC,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;YAChC;QACF;AAEA,QAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACxC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;IAC5B;AAEQ,IAAA,iBAAiB,CAAC,WAAwB,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB;QACF;;QAGA,IAAI,QAAQ,GAAG,KAAK;QACpB,MAAM,KAAK,GAAG,MAAK;YACjB,IAAI,QAAQ,EAAE;gBACZ;YACF;YAEA,QAAQ,GAAG,IAAI;YACf,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC;YAC5C,IAAI,CAAC,eAAe,EAAE;AACxB,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxE,QAAA,IAAI,CAAC,yBAAyB,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC;QAEnG,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;IACtD;IAEQ,eAAe,CAAC,QAAQ,GAAG,IAAI,EAAA;AACrC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAChC,IAAI,CAAC,oBAAoB,EAAE;QAE3B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AAC5C,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B,CAAC,EAAE,QAAQ,CAAC;IACd;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;YACjC;QACF;AAEA,QAAA,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AACzC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACpC,QAAA,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE;YAClC;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IACrB;wGA1XW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,SAAA,EAFV,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAEnD,UAAU,EAAA,UAAA,EAAA,CAAA;kBAftB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,gBAAgB;AACvB,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,6BAA6B,EAAE,YAAY;AAC3C,wBAAA,mBAAmB,EAAE,kBAAkB;AACvC,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,YAAY,EAAE,sBAAsB;AACpC,wBAAA,WAAW,EAAE,uBAAuB;AACrC,qBAAA;oBACD,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,UAAY,EAAE,CAAC;AAC/D,iBAAA;;AA8XD;MAQa,iBAAiB,CAAA;AACT,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;IAEzE,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IAC9D;wGANW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,yBAAyB;AAChC,wBAAA,yBAAyB,EAAE,wBAAwB;AACpD,qBAAA;AACF,iBAAA;;AAUD;MASa,cAAc,CAAA;AACR,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;IAEzE,eAAe,GAAA;QACb,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9F;wGARW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,WAAA,EAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAR1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,sBAAsB;AAC7B,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,6BAA6B,EAAE,SAAS;AACzC,qBAAA;AACF,iBAAA;;AAYD;MAiBa,kBAAkB,CAAA;AACV,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AACxC,IAAA,KAAK,GAAG,KAAK,CAAC,gBAAgB,4EAAC;wGAF7B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,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,SAAA,EAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,wCAAA,EAAA,EAAA,cAAA,EAAA,2DAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAhB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,cAAc,EAAE;AACd,wBAAA;AACE,4BAAA,SAAS,EAAE,QAAQ;4BACnB,MAAM,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;AACrD,yBAAA;AACF,qBAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,2DAA2D;AAClE,wBAAA,aAAa,EAAE,UAAU;AACzB,wBAAA,mBAAmB,EAAE,SAAS;AAC9B,wBAAA,iBAAiB,EAAE,sCAAsC;AACzD,wBAAA,SAAS,EAAE,uBAAuB;AACnC,qBAAA;AACF,iBAAA;;AAMD;MAiBa,cAAc,CAAA;AACN,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AACxC,IAAA,KAAK,GAAG,KAAK,CAAC,YAAY,4EAAC;wGAFzB,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,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,SAAA,EAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,wCAAA,EAAA,EAAA,cAAA,EAAA,uDAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAhB1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,cAAc,EAAE;AACd,wBAAA;AACE,4BAAA,SAAS,EAAE,QAAQ;4BACnB,MAAM,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;AACrD,yBAAA;AACF,qBAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,uDAAuD;AAC9D,wBAAA,aAAa,EAAE,UAAU;AACzB,wBAAA,mBAAmB,EAAE,SAAS;AAC9B,wBAAA,iBAAiB,EAAE,sCAAsC;AACzD,wBAAA,SAAS,EAAE,uBAAuB;AACnC,qBAAA;AACF,iBAAA;;;MC/eY,gBAAgB,CAAA;wGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YAdzB,UAAU;YACV,iBAAiB;YACjB,cAAc;YACd,cAAc;AACd,YAAA,kBAAkB,aAGlB,UAAU;YACV,iBAAiB;YACjB,cAAc;YACd,cAAc;YACd,kBAAkB,CAAA,EAAA,CAAA;yGAGT,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAhB5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACV,iBAAiB;wBACjB,cAAc;wBACd,cAAc;wBACd,kBAAkB;AACnB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACV,iBAAiB;wBACjB,cAAc;wBACd,cAAc;wBACd,kBAAkB;AACnB,qBAAA;AACF,iBAAA;;;ACxBD;;AAEG;;;;"}
@@ -1,16 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, booleanAttribute, effect, Directive, NgModule } from '@angular/core';
2
+ import { input, booleanAttribute, Directive, NgModule } from '@angular/core';
3
3
 
4
+ /** Checkbox input styled as a FrameUI control. */
4
5
  class FrCheckbox {
5
- elementRef = inject((ElementRef));
6
6
  indeterminate = input(false, { ...(ngDevMode ? { debugName: "indeterminate" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
7
- constructor() {
8
- effect(() => {
9
- this.elementRef.nativeElement.indeterminate = this.indeterminate();
10
- });
11
- }
12
7
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCheckbox, isStandalone: true, selector: "input[type=checkbox][frCheckbox]", inputs: { indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-checked": "indeterminate() ? \"mixed\" : null", "attr.data-indeterminate": "indeterminate() ? \"\" : null" }, classAttribute: "frame-checkbox" }, ngImport: i0 });
8
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.16", type: FrCheckbox, isStandalone: true, selector: "input[type=checkbox][frCheckbox]", inputs: { indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-checked": "indeterminate() ? \"mixed\" : null", "attr.data-indeterminate": "indeterminate() ? \"\" : null", "indeterminate": "indeterminate()" }, classAttribute: "frame-checkbox" }, ngImport: i0 });
14
9
  }
15
10
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckbox, decorators: [{
16
11
  type: Directive,
@@ -20,9 +15,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
20
15
  class: 'frame-checkbox',
21
16
  '[attr.aria-checked]': 'indeterminate() ? "mixed" : null',
22
17
  '[attr.data-indeterminate]': 'indeterminate() ? "" : null',
18
+ '[indeterminate]': 'indeterminate()',
23
19
  },
24
20
  }]
25
- }], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
21
+ }], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }] } });
22
+ /** Field slot for checkbox. */
26
23
  class FrCheckboxField {
27
24
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckboxField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
28
25
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCheckboxField, isStandalone: true, selector: "label[frCheckboxField]", host: { classAttribute: "frame-checkbox-field" }, ngImport: i0 });
@@ -36,6 +33,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
36
33
  },
37
34
  }]
38
35
  }] });
36
+ /** Label slot for checkbox. */
39
37
  class FrCheckboxLabel {
40
38
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCheckboxLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
41
39
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrCheckboxLabel, isStandalone: true, selector: "[frCheckboxLabel]", host: { classAttribute: "frame-checkbox-label" }, ngImport: i0 });
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-checkbox.mjs","sources":["../../../projects/components/checkbox/src/checkbox.ts","../../../projects/components/checkbox/checkbox.module.ts","../../../projects/components/checkbox/frame-ui-ng-components-checkbox.ts"],"sourcesContent":["import { Directive, ElementRef, booleanAttribute, effect, inject, input } from '@angular/core';\n\n@Directive({\n selector: 'input[type=checkbox][frCheckbox]',\n host: {\n class: 'frame-checkbox',\n '[attr.aria-checked]': 'indeterminate() ? \"mixed\" : null',\n '[attr.data-indeterminate]': 'indeterminate() ? \"\" : null',\n },\n})\nexport class FrCheckbox {\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n constructor() {\n effect(() => {\n this.elementRef.nativeElement.indeterminate = this.indeterminate();\n });\n }\n}\n\n@Directive({\n selector: 'label[frCheckboxField]',\n host: {\n class: 'frame-checkbox-field',\n },\n})\nexport class FrCheckboxField {}\n\n@Directive({\n selector: '[frCheckboxLabel]',\n host: {\n class: 'frame-checkbox-label',\n },\n})\nexport class FrCheckboxLabel {}\n","import { NgModule } from '@angular/core';\nimport {\n FrCheckbox,\n FrCheckboxField,\n FrCheckboxLabel,\n} from './src/checkbox';\n\n@NgModule({\n imports: [\n FrCheckbox,\n FrCheckboxField,\n FrCheckboxLabel,\n ],\n exports: [\n FrCheckbox,\n FrCheckboxField,\n FrCheckboxLabel,\n ],\n})\nexport class FrCheckboxModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-ui-ng-components-checkbox.mjs","sources":["../../../projects/components/checkbox/src/checkbox.ts","../../../projects/components/checkbox/checkbox.module.ts","../../../projects/components/checkbox/frame-ui-ng-components-checkbox.ts"],"sourcesContent":["import { Directive, booleanAttribute, input } from '@angular/core';\r\n\r\n/** Checkbox input styled as a FrameUI control. */\r\n@Directive({\r\n selector: 'input[type=checkbox][frCheckbox]',\r\n host: {\r\n class: 'frame-checkbox',\r\n '[attr.aria-checked]': 'indeterminate() ? \"mixed\" : null',\r\n '[attr.data-indeterminate]': 'indeterminate() ? \"\" : null',\r\n '[indeterminate]': 'indeterminate()',\r\n },\r\n})\r\nexport class FrCheckbox {\r\n readonly indeterminate = input(false, { transform: booleanAttribute });\r\n}\r\n\r\n/** Field slot for checkbox. */\r\n@Directive({\r\n selector: 'label[frCheckboxField]',\r\n host: {\r\n class: 'frame-checkbox-field',\r\n },\r\n})\r\nexport class FrCheckboxField {}\r\n\r\n/** Label slot for checkbox. */\r\n@Directive({\r\n selector: '[frCheckboxLabel]',\r\n host: {\r\n class: 'frame-checkbox-label',\r\n },\r\n})\r\nexport class FrCheckboxLabel {}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrCheckbox,\n FrCheckboxField,\n FrCheckboxLabel,\n} from './src/checkbox';\n\n@NgModule({\n imports: [\n FrCheckbox,\n FrCheckboxField,\n FrCheckboxLabel,\n ],\n exports: [\n FrCheckbox,\n FrCheckboxField,\n FrCheckboxLabel,\n ],\n})\nexport class FrCheckboxModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,25 +1,31 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, effect, Directive, signal, input, booleanAttribute, output, computed, NgModule } from '@angular/core';
2
+ import { InjectionToken, inject, ElementRef, Directive, linkedSignal, input, booleanAttribute, output, computed, NgModule } from '@angular/core';
3
3
 
4
4
  const FR_COLLAPSIBLE = new InjectionToken('FrCollapsible');
5
5
 
6
+ /** Content slot for collapsible. */
6
7
  class FrCollapsibleContent {
7
8
  host = inject(ElementRef);
8
9
  collapsible = inject(FR_COLLAPSIBLE);
9
10
  initialized = false;
11
+ lastOpen = false;
10
12
  rafId = -1;
11
- constructor() {
12
- effect((onCleanup) => {
13
- const open = this.collapsible.open();
14
- this.cancelAnimationFrame();
15
- if (!this.initialized) {
16
- this.applyStaticState(open);
17
- this.initialized = true;
18
- return;
19
- }
20
- this.animate(open);
21
- onCleanup(() => this.cancelAnimationFrame());
22
- });
13
+ ngAfterViewInit() {
14
+ this.lastOpen = this.collapsible.open();
15
+ this.applyStaticState(this.lastOpen);
16
+ this.initialized = true;
17
+ }
18
+ ngDoCheck() {
19
+ const open = this.collapsible.open();
20
+ if (!this.initialized || open === this.lastOpen) {
21
+ return;
22
+ }
23
+ this.cancelAnimationFrame();
24
+ this.lastOpen = open;
25
+ this.animate(open);
26
+ }
27
+ ngOnDestroy() {
28
+ this.cancelAnimationFrame();
23
29
  }
24
30
  onTransitionEnd(event) {
25
31
  if (event.target !== this.host.nativeElement || event.propertyName !== 'height') {
@@ -81,12 +87,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
81
87
  role: 'region',
82
88
  },
83
89
  }]
84
- }], ctorParameters: () => [] });
90
+ }] });
85
91
 
86
92
  let collapsibleId = 0;
93
+ /** Root controller for expandable collapsible content. */
87
94
  class FrCollapsible {
88
95
  collapsibleId = ++collapsibleId;
89
- internalOpen = signal(false, ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
96
+ internalOpen = linkedSignal(() => this.defaultOpen(), ...(ngDevMode ? [{ debugName: "internalOpen" }] : /* istanbul ignore next */ []));
90
97
  defaultOpen = input(false, { ...(ngDevMode ? { debugName: "defaultOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
91
98
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
92
99
  openInput = input(undefined, { ...(ngDevMode ? { debugName: "openInput" } : /* istanbul ignore next */ {}), alias: 'open' });
@@ -94,13 +101,6 @@ class FrCollapsible {
94
101
  open = computed(() => this.openInput() ?? this.internalOpen(), ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
95
102
  triggerId = computed(() => `frame-collapsible-trigger-${this.collapsibleId}`, ...(ngDevMode ? [{ debugName: "triggerId" }] : /* istanbul ignore next */ []));
96
103
  contentId = computed(() => `frame-collapsible-content-${this.collapsibleId}`, ...(ngDevMode ? [{ debugName: "contentId" }] : /* istanbul ignore next */ []));
97
- constructor() {
98
- effect(() => {
99
- if (this.openInput() === undefined) {
100
- this.internalOpen.set(this.defaultOpen());
101
- }
102
- });
103
- }
104
104
  toggle() {
105
105
  if (this.disabled()) {
106
106
  return;
@@ -132,8 +132,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
132
132
  '[attr.data-state]': 'open() ? "open" : "closed"',
133
133
  },
134
134
  }]
135
- }], ctorParameters: () => [], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], openInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
135
+ }], propDecorators: { defaultOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultOpen", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], openInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
136
136
 
137
+ /** Trigger control for collapsible. */
137
138
  class FrCollapsibleTrigger {
138
139
  collapsible = inject(FR_COLLAPSIBLE);
139
140
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrCollapsibleTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });